Python/Debugging

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] 해결

jimmy_AI 2022. 8. 26. 17:30
반응형

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)