bert를 이용하여 지문요약 모델을 파인튜닝 하고 있습니다.
그런데 며칠 째 에러가 나서 정말 힘듭니다...chatGPT는 데이터가 문제라고 하는데 저는 다른 사람이 결과까지 본 코드, 데이터를 그대로 가지고 와서 사용하는 거거든요...
데이터와 코드 공유 드립니다...
데이터 로더 생성
import torch
from torch.utils.data import Dataset, DataLoader
from transformers import BartTokenizer
from transformers import PreTrainedTokenizerFast
tokenizer = PreTrainedTokenizerFast.from_pretrained('gogamza/kobart-summarization')
class summarization(Dataset):
def init(self, data, tokenizer, max_input_length = 800, max_target_length = 150):
self.data = data
self.tokenizer = tokenizer
self.max_input_length = max_input_length
self.max_target_length = max_target_length
def __len__(self):
return len(self.data)
def __getitem__(self, idx):
data_point = self.data[idx]
input_text, target_text = data_point[0], data_point[1]
input_ids = self.tokenizer.encode(input_text, add_special_tokens = True, padding = 'max_length',
max_length = self.max_input_length, truncation = True)
target_ids = self.tokenizer.encode(target_text, add_special_tokens = True, padding = 'max_length',
max_length = self.max_target_length, truncation = True)
return {
'input_ids': input_ids['input_ids'].squeeze(),
'attention_mask': input_ids['attention_mask'].squeeze(),
'labels': target_ids['input_ids'].squeeze()
}
데이터셋 객체 생성
dataset = summarization(data, tokenizer)
데이터 로더 생성
batch_size = 4
dataloader = DataLoader(dataset, batch_size = batch_size, shuffle = True)
파인듀닝
import torch
from transformers import PreTrainedTokenizerFast, BartForConditionalGeneration, AdamW
from torch.utils.data import DataLoader, RandomSampler
from tqdm import tqdm
모델 및 토크나이저 로드
tokenizer = PreTrainedTokenizerFast.from_pretrained('gogamza/kobart-summarization')
model = BartForConditionalGeneration.from_pretrained('gogamza/kobart-base-v2')
GPU 사용 / GPU로 이동
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model.to(device)
데이터 로더
batch_size = 4
dataset = summarization(data, tokenizer,max_input_length = 800, max_target_length = 200)
train_dataloader = DataLoader(dataset, batch_size=batch_size, shuffle=True)
옵티마이저 설정
optimizer = AdamW(model.parameters(), lr = 1e-5)
epochs 수와 파인튜닝 진행
num_epochs = 3
for epoch in range(num_epochs):
model.train()
total_loss = 0.0
for batch in tqdm(train_dataloader, desc = f'Epoch {epoch}'):
input_ids = batch['input_ids'].to(device)
attention_mask = batch['attention_mask'].to(device)
decoder_input_ids = batch['decoder_input_ids'].to(device)
labels = batch['labels'].to(device)
optimizer.zero_grad()
# Forward 패스
outputs = model(input_ids=input_ids,
attention_mask=attention_mask,
decoder_input_ids=decoder_input_ids,
labels=labels
)
loss = outputs.loss
total_loss += loss.item()
# Backward 패스 및 가중치 업데이트
loss.backward()
optimizer.step()
avg_loss = total_loss / len(dataloader)
print(f'Epoch {epoch} - Average Loss: {avg_loss}')
파인튜닝 모델 저장
model.save_pretrained('fine_tuned_model')
에러내용
KeyError Traceback (most recent call last) [c:\Users\chohj\anaconda3\envs\gpu_py3.7\lib\site-packages\pandas\core\indexes\base.py](file:///C:/Users/chohj/anaconda3/envs/gpu_py3.7/lib/site-packages/pandas/core/indexes/base.py) in get_loc(self, key, method, tolerance) 3360 try: -> 3361 return self._engine.get_loc(casted_key) 3362 except KeyError as err: [c:\Users\chohj\anaconda3\envs\gpu_py3.7\lib\site-packages\pandas_libs\index.pyx](file:///C:/Users/chohj/anaconda3/envs/gpu_py3.7/lib/site-packages/pandas/_libs/index.pyx) in pandas._libs.index.IndexEngine.get_loc() [c:\Users\chohj\anaconda3\envs\gpu_py3.7\lib\site-packages\pandas_libs\index.pyx](file:///C:/Users/chohj/anaconda3/envs/gpu_py3.7/lib/site-packages/pandas/_libs/index.pyx) in pandas._libs.index.IndexEngine.get_loc() pandas_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item() pandas_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item() KeyError: 247 The above exception was the direct cause of the following exception: KeyError Traceback (most recent call last) ~\AppData\Local\Temp\ipykernel_4924\2491321320.py in 28 total_loss = 0.0 29 ---> 30 for batch in tqdm(train_dataloader, desc = f'Epoch {epoch}'): 31 input_ids = batch['input_ids'].to(device)
...
-> 3363 raise KeyError(key) from err 3364 3365 if is_scalar(key) and isna(key) and not self.hasnans: KeyError: 247
다시 실행하면 KeyError가 발생하는 위치가 계속 바뀝니다.
공부한지 얼마 되지 않아서 어렵네요..
해결방법 부탁드리겠습니다...!