에러 발생 원인과 해결 방법 찾아 주실 수 있을까요...부탁드립니다ㅠ

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가 발생하는 위치가 계속 바뀝니다.
공부한지 얼마 되지 않아서 어렵네요..

해결방법 부탁드리겠습니다...!

  • 아래 답변은 OpenAI의 GPT-4 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
  • 잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다. :sweat_smile:

안녕하세요, whguswns88님. PyTorch와 BERT를 이용한 지문 요약 모델 파인튜닝에 어려움을 겪고 계시군요. 질문을 통해 주신 코드와 에러 메시지를 보니, DataLoader를 통해 데이터를 불러올 때 KeyError: 247라는 에러가 발생하고 있습니다. 이는 일반적으로 해당 키가 데이터셋에 없을 때 발생하는 에러입니다.

먼저, __getitem__ 메소드에서 반환하는 딕셔너리의 키를 확인해보시기 바랍니다. 코드에서는 'input_ids', 'attention_mask', 'labels'를 반환하고 있습니다. 그러나 학습 루프에서는 'decoder_input_ids'를 참조하려고 하고 있습니다. 이는 __getitem__에서 반환하는 딕셔너리에 없는 키이므로 KeyError가 발생합니다.

따라서, 'decoder_input_ids'를 생성하고 이를 반환하는 코드를 __getitem__에 추가해야 합니다. 'decoder_input_ids'는 일반적으로 타겟 시퀀스의 시작 부분을 나타냅니다. 따라서 'labels'와 동일한 데이터를 사용하되, 마지막 토큰을 제거하면 됩니다. 아래는 수정된 __getitem__ 메소드입니다:

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)
    
    decoder_input_ids = target_ids[:-1]  # 마지막 토큰 제거
    
    return {
        'input_ids': input_ids['input_ids'].squeeze(),
        'attention_mask': input_ids['attention_mask'].squeeze(),
        'labels': target_ids['input_ids'].squeeze(),
        'decoder_input_ids': decoder_input_ids
    }

그리고 학습 루프에서 'decoder_input_ids'를 디바이스로 이동시키는 코드를 추가해야 합니다:

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)
    ...

이렇게 수정하면 KeyError 문제를 해결할 수 있을 것입니다.

더 자세한 정보는 PyTorch 공식 문서나 튜토리얼을 참조하시면 도움이 될 것입니다. 아래 링크를 참조해주세요.

그럼에도 불구하고 문제가 해결되지 않거나 다른 문제가 발생하면 언제든지 추가 질문을 남겨주세요. 도움이 될 수 있도록 최선을 다하겠습니다. 하지만 제가 제공한 해결책이 항상 정확하다는 보장은 없으니, 여러 자료를 참고하시면서 문제를 해결해 나가시는 것을 권장드립니다.


  • 답변이 어떠셨나요? 괜찮았다고 생각하신다면 아래 :heart:를 한 번 눌러주시길 부탁드려요!
  • 아래 답변은 OpenAI의 GPT-3.5(ChatGPT) 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
  • 잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다. :sweat_smile:

안녕하세요 whguswns88님,

지문 요약 모델을 파인튜닝하면서 발생하는 에러에 대해 도움을 주려고 합니다. 에러 메시지를 살펴보니 KeyError가 발생하고 있는 것 같습니다. 이 에러는 데이터셋에서 특정 키에 대한 값을 찾지 못해서 발생하는 것으로 보입니다.

에러 메시지에서는 KeyError: 247라는 메시지가 나오고 있습니다. 이 에러는 데이터셋에서 input_ids와 관련된 키에 대한 값을 찾지 못해서 발생하는 것으로 보입니다. 데이터셋 클래스의 __getitem__ 메서드에서 input_ids를 반환하는 부분을 확인해보시기 바랍니다.

또한, 데이터셋 클래스의 __getitem__ 메서드에서 decoder_input_idslabels에 대한 처리가 없는 것으로 보입니다. 이 부분도 수정해주셔야 합니다.

아래는 수정된 코드 예시입니다.

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(),
        'decoder_input_ids': target_ids['input_ids'].squeeze(),
        'labels': target_ids['input_ids'].squeeze()
    }

위의 코드에서 decoder_input_idslabels를 추가로 반환하도록 수정하였습니다.

이렇게 수정하신 후에 다시 실행해보시기 바랍니다. 그리고 에러가 여전히 발생하는 경우, 추가적인 정보를 제공해주시면 더 자세한 도움을 드릴 수 있습니다.

또한, PyTorch 공식 튜토리얼과 한국어 튜토리얼을 참고하시면 PyTorch와 관련된 다양한 내용을 학습하실 수 있습니다.

이해가 되지 않는 부분이 있거나 추가적인 도움이 필요하시면 언제든지 질문해주세요. 답변이 틀리거나 잘못된 부분이 있을 수 있으니 참고 부탁드립니다.


  • 답변이 어떠셨나요? 괜찮았다고 생각하신다면 아래 :heart:를 한 번 눌러주시길 부탁드려요!
  • 아래 답변은 Anthropic의 Claude-2 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
  • 잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다. :sweat_smile:

안녕하세요 whguswns88님!

지문 요약 모델 파인튜닝 중 발생한 KeyError 문제로 고민이 많으시겠어요. 제가 문제를 잘 이해했다면요,

요약하자면 데이터로더에서 배치를 가져올 때 KeyError가随机으로 발생하는 것 같은데, 원인이 무엇인지 모르겠다는 것이 맞나요?

KeyError는 보통 접근하려는 키가 존재하지 않을 때 발생합니다. 파인튜닝 코드를 보면 배치를 가져와서 input_ids, attention_mask, labels 등을 배치에서 얻어오려고 하는데, 가끔 이 과정에서 키가 없다고 에러가 난다는 것 같습니다.

이는 데이터셋이나 데이터로더 준비 과정에서 뭔가 잘못되었을 가능성이 높습니다. 몇 가지 확인해볼 수 있는 점들이 있습니다:

  • getitem 메소드에서 return하는 dict keys가 맞는지 확인 (input_ids, attention_mask, labels)
  • 데이터셋의 각 샘플에 이 키들이 모두 존재하는지 확인
  • 배치 크기가 데이터셋 크기보다 크지 않은지 확인

한번 이 부분들을 점검해보시길 바랍니다.

만약 계속 해결되지 않는다면, 에러 메시지의 키 값이 무엇인지 확인하시고 그 키가 어디서 생성되는지 따져보시면 문제의 실마리를 찾을 수 있을 것 같습니다.

추가적인 정보가 필요하시면 주저 없이 댓글 남겨주세요! 파이토치와 머신러닝 입문자로서 크고 작은 문제들을 겪으며 성장하는 과정이 중요하다고 생각합니다. 함께 고민하며 문제를 해결해 나가길 바랍니다. 화이팅!


  • 답변이 어떠셨나요? 괜찮았다고 생각하신다면 아래 :heart:를 한 번 눌러주시길 부탁드려요!