반응형
Transformers token size error debugging
transformers 모듈로 모델 학습 과정 중 너무 긴 토큰 사이즈로 인해 발생가능한
에러를 고치는 방법에 대하여 간략하게 다루어보도록 하겠습니다.
오류 원인
trainer로 bert 모델을 학습하는 과정 도중 학습이 잘 진행되다가 중간에 특정 데이터에
도달했을 때, 다음과 같은 오류 메시지가 발생하였습니다.
(batch size = 8이었으며, batch 내 문제가 되는 데이터가 포함된 것으로 보입니다.)
trainer.train()
# RuntimeError: The expanded size of the tensor (1002) must match the existing size (512) at non-singleton dimension 1. Target sizes: [8, 1002]. Tensor sizes: [1, 512]
# 참고 : 1,000 steps 이상의 구간에서 학습이 잘되다가 중간에 발생
오류가 등장한 문장의 input_ids 길이를 살펴보니 1002였으며,
이는 bert의 최대 토큰 길이인 512를 초과하는 길이로
텐서를 모델 학습 과정에 이용할 수 없기에 에러가 발생하였습니다.
print(len(dataset['train'][1172]['input_ids'])) # 1002
반응형
오류 해결 방법
데이터 전처리 과정에 따라 여러 가지 해결책이 있는데
토큰의 길이를 모델이 처리할 수 있는 max_length 이하가 되도록 만들어주어야 합니다.
대표적인 해결법 몇 가지를 정리해보면 다음과 같습니다.
1. tokenizer 단에서 truncation 옵션 사용
tokenizer = AutoTokenizer.from_pretrained('bert-base-uncased', truncation=True, max_length = 512)
2. dataset 전처리 과정에서 토큰 길이 조절
def truncation(sample, max_length = 512):
for i in range(len(sample['tokens'])):
if len(sample['tokens'][i]) > max_length:
sample['tokens'][i] = sample['tokens'][i][:max_length]
return sample
truncated_dataset = dataset.map(truncation, batched=True)