본문 바로가기
머신러닝_공부/파이썬

[파이썬/huggingface] tokenizer.encode한 뒤 모델사용 시 안되는 문제

by Oliver_Candy 2024. 1. 9.

 huggingface에 있는 모델을 직접 사용하는 경우 tokenizer.encode를 한 뒤에 모델에 적용하였는데도 오류가 발생하는 문제가 있어서 정리해보려고 한다.

 

 

 

 문제

from transformers import RobertaTokenizer, RobertaForSequenceClassification 

tokenizer = RobertaTokenizer.from_pretrained(HUGGINGFACE_ID)
model = RobertaForSequenceClassification.from_pretrained(HUGGINGFACE_ID)

input_ids = tokenizer.encode('''import json
                                import os
                                print('hello')''')
logits = model(input_ids)[0]
         
         
'''--------------------------------------------------------------------
if self.config.pad_token_id in input_ids[:, [-1, 0]]:
TypeError: list indices must be integers or slices, not tuple
--------------------------------------------------------------------'''

 

위에 코드같이 작성을 하면 주석과 같은 오류가 발생한다. 이에 대해서 교수님이 알려주신 stackoverflow 주소를 참고해 보니 'tokenizer.encode('<code>', return_tensors = 'pt')로 변경하여 모델에 적용하니 쉽게 해결되었다.

이에 대해서 tokenizer.encode()를 그냥 사용하는 것이랑 return_tensors = 'pt' 매개변수를 집어넣는 결과값의 차이를 알아보았다.

 

 

 

 

 tokenizer.encode() 메소드 매개변수 있냐 없냐의 차이

from transformers import RobertaTokenizer, RobertaForSequenceClassification 
#HUGGINGFACE_ID는 어떤 모델의 ID
tokenizer = RobertaTokenizer.from_pretrained(HUGGINGFACE_ID)
model = RobertaForSequenceClassification.from_pretrained(HUGGINGFACE_ID)

input_ids = tokenizer.encode('''import json
                                import os
                                print('hello')''', return_tensors = 'pt')
input_id_test = tokenizer.encode('''import json
                                import os
                                print('hello')''')
print(input_ids)
print(input_id_test)

         
         
'''--------------------------------------------------------------------
tensor([[    0,  3578,  1644,   203,  1288,  1946,  1393,   203,  1288,  1492,
           394, 15418,   505,     2]])
[0, 3578, 1644, 203, 1288, 1946, 1393, 203, 1288, 1492, 394, 15418, 505, 2]
--------------------------------------------------------------------'''

 위에 코드를 살펴보면 return_tensors = 'pt'를 넣은 input_ids는 결과값이 tensor(<list>)의 형태로 반환되었고 그냥 tokenizer.encode() 메소드를 사용한 결과값인 input_id_test는 <list> 형태로 반환되었다.

 

 

 결론

 tokenizer.encode()메소드를 사용하여 모델에 적용할 때, 오류가 발생한다면 return_tensors = 'pt'처럼 return 형태가 제대로 되어있는지 확인을 해봐야 한다. 각각의 모델마다 입력을 받는 형태(type)가 다르기 때문에 발생하는 문제인 것 같다.

tensor()와의 차이와 왜 오류가 발생했는지는 아직까지 정확하게 이해하지 못했다. 좀 더 찾아보면서 각 반환 값 형태가 어떻게 다르고 왜 다른 것을 만들었는지 찾아봐야겠다.

 

 

 

댓글