본문 바로가기

오류 해결

TypeError: stat: path should be string, bytes, os.PathLike or integer, not NoneType 오류 해결 (transformers pipeline)

728x90
반응형

별거 아닌거에도 오랜 시간을 투자해서 오류를 잡아냈는데, 이런 것들이 경험이겠지만서도 나와 같은 실수를 오랫동안 붙잡고 있는 사람들이 많이 없길 바라는 마음에 오류 해결을 할 때마다 하나씩 올리기 위해서 카테고리를 정리해뒀다.

 


Transformers의 pipeline


 

Transformers package 안에는 pipeline이라는 모듈이 존재한다. pipeline을 사용하면 huggingface에서 모델명만 가지고 와도 손쉽게 이용할 수 있다.

하지만 가끔 huggingface에서 가져온 모델을 로컬로 다운 받아서 돌려야 할 때가 있다. 그럴 때는 pipeline을 조금 다르게 사용해줘야 한다.

from transformers import pipeline

nlp1 = pipeline('question-answering', model='')

위의 코드는 기존 pipeline을 사용하는 코드이다. model에 내가 원하는 huggingface의 모델 명을 가지고 오면 손쉽게 이용할 수 있다. 하지만 로컬로 다운 받는다면 model과 tokenizer를 각각 따로 불러와준 뒤에 pipeline을 이용해야 한다.

from transformers import pipeline
from transformers import ElectraForQuestionAnswering, ElectraTokenizer

model_path = './path'
model1 = ElectraForQuestionAnswering.from_pretrained(model_path)
tokenizer1 = ElectraTokenizer.from_pretrained(model_path)
nlp1 = pipeline('question-answering', model=model1, tokenizer=tokenizer1)

이런 식으로 model과 tokenizer를 따로 불러와야 한다. 

 


오류 내용


오류가 난 곳을 잘 살펴보자. TypeError와 함께 path는 반드시 string, bytes, os.PathLike, integer 형태어야 한다고 되어있다.

주목할 점은, not {}에서 {} 안에 들어가는 내용이 현재 내가 입력한 내용이라는 것.

내가 들어간 것은 NoneType이었다.

분명히 model folder path를 잘 입력했고 디버깅을 통해서 model_path가 정상적인 str 형태라는 것도 파악했는데 왜 안되는걸까?

 


디버깅 및 문제해결


디버깅을 통해 실행 순서를 하나씩 따라가보니, os.path.isfile(vocab_file)을 찾았다.

이는 내가 설정한 폴더 안에 vocab_file이 있는가를 물어보는 것이었다.

Tokenizer를 불러오는 과정에서 vocab_file은 반드시 필요한 상태였고, 내가 불러오고자 했던 모델 2개 중 1개는 정상적으로 vocab.txt 파일이 존재했지만 위와 같은 에러가 뜬 모델은 vocab 파일이 없기 때문에 NoneType이 입력되는 것이었다.

 

따라서, 기존 코드는 

model1 = ElectraForQuestionAnswering.from_pretrained(model_dir1)
tokenizer1 = ElectraTokenizer.from_pretrained(model_dir1)

model2 = DebertaV2ForQuestionAnswering.from_pretrained(model_dir2)
tokenizer2 = DebertaV2Tokenizer.from_pretrained(model_dir2)

이렇게 되어 있었는데 여기서 Tokenizer들을 Fast로 바꿔주었다. 이렇게 Fast version으로 바꾸면 vocab_file 없이도 충분히 잘 돌아가는 것을 확인할 수 있다.

model1 = ElectraForQuestionAnswering.from_pretrained(model_dir1)
tokenizer1 = ElectraTokenizerFast.from_pretrained(model_dir1)

model2 = DebertaV2ForQuestionAnswering.from_pretrained(model_dir2)
tokenizer2 = DebertaV2TokenizerFast.from_pretrained(model_dir2)

 

 

이런 오류들을 보면 옛날에는 무조건 구글링 해보고 어떻게 해야 하나.. chatGPT도 방문했다가 이리저리 헤맸었는데 최근에 트러블 슈팅을 엄청 자주 하게 되고 여러 코드들을 만지다 보니까 이제는 오류 구문을 보고 조금씩 디버깅하면 빠르게 오류를 잡아내게 되었다.

나중에는 오류 없이도 코드를 뚝딱뚝딱 짤 수 있는 멋진 사람이 되길 !

728x90
반응형