Transformers 라이브러리 공부

안녕하세요! 9기 허깅페이스 참가자 이유준입니다.
이번에는 transformers 라이브러리를 공부해 보았습니다.
저번 글: 허깅페이스 탐방 및 짧막 실습



[목차]

  1. 저번 주차 추가 시도할 것

  2. transformers에 대해서 GPT와 대화

  3. 실습

  4. 추가 시도할 것



[저번 주차 추가 시도할 것]

- Llama-2 모델 사용

허가가 아직 안 났습니다..ㅎㅎ


- phi 실행 중 오류 해결

오류메시지를 찾아본 결과, auto-gptq라는 패키지가 설치되지 않았어서 오류가 났던 것이었습니다.

그래서 auto-gptq를 pip install하려고 했는데, PyTorch가 설치되지 않았다고 오류가 났습니다..

저는 PyTorch를 설치했던 기억이 있었지만, 일단 에러가 나니까 PyTorch부터 다시 설치했는데, 이미 installed라고 표시되더라고요..

PyTorch가 있음에도 불구하고 없다고 말하길래 뭔가 이상하다 싶어 찾아보았습니다.

그 결과..

저는 맥북을 사용하고 있는데, PyTorch는 MacOS에서 Default만 설치할 수 있다고 하더군요.. 그러나..

auto-gptq를 설치하기 위해서는 CUDA 혹은 ROCm의 PyTorch가 필요하다고 합니다.

다음을 기약하며 아쉬운 마음을 달래봅니다…


- transformers 라이브러리 공부

공식 자료를 읽으려고 했으나.. 너무 길더군요..ㅠ

그래서 GPT에게 물어보면서 공부했습니다.

공부한 내용은 바로 다음 목차에~~!!!



[transformers에 대하여 GPT와 대화]

질의응답 내용을 어떻게 정리하는 것이 좋을까 생각한 결과.. 토글의 형태로 정리하는 것이 좋겠다는 생각이 들어 토글로 정리해 보았습니다.

글쓰는 플랫폼이 Notion이랑 비슷해서 토글이 있을 줄 알았는데 아쉽게도 없네요.. 그래서 Notion에 따로 정리해 두었습니다.

내용이 좀 길어서.. 본문에 옮기기엔 부담스러운 감도 있어서, 이렇게 진행하는 점 양해 부탁드립니다.

0213 GPT와 대화: transformers에 대하여 | Notion

GPT와 대화하면서, 또 Notion에 정리하면서 배웠던 점을 몇 가지 정리해 보았습니다.

  1. pipeline 함수의 사용에 대해서 틀이 잡혔습니다.

  2. 별개로, Model의 아키텍처를 커스텀할 수도 있다는 사실을 알아내었습니다. 물론.. PyTorch나 TenserFlow에 대한 기본 지식이 필요하지만, transformers로 로드된 모델에 기반하여 아키텍처 변형이 가능하다는 사실을 알게 되었습니다.

  3. transformers에서 모델 로드, PyTorch 혹은 TenserFlow로 모델 수정, transformers에서 fine-tuning, tokenizers에서 토크나이저 변형 등의 과정, 그리고 huggingface의 dataset을 중간중간에 끼어서 사용하면 웬만한 시도는 가능하겠다는 생각이 들었습니다.



[실습]

이번 실습에서는 크게 3가지 정도 하려고 합니다.

  1. 모델 불러와서 사용

  2. 모델의 토크나이저를 변경하여 사용

  3. 모델을 fine tuning하여 사용


- 모델 불러와서 사용

저는 챗봇 개발에 관심이 있어서, Next Token Prediction의 대명사인 GPT를 사용하여 실습을 진행하였습니다.

우선 허깅페이스에서 GPT2를 검색하고, 로컬 컴퓨터에 저장하였습니다.

그리고 다음의 코드를 작성하였습니다.

[코드 1]

from transformers import GPT2LMHeadModel, GPT2Tokenizer, pipeline

# 모델과 토크나이저의 경로 지정
model_path = './gpt2'
tokenizer_path = './gpt2'

# 모델 로드
model = GPT2LMHeadModel.from_pretrained(model_path)

# 토크나이저 로드
tokenizer = GPT2Tokenizer.from_pretrained(tokenizer_path)

# 텍스트 생성 파이프라인 생성
gpt2 = pipeline("text-generation", model=model, tokenizer=tokenizer)

# 텍스트 생성 실행
generated_texts = gpt2("나는 학생이다. 그래서 ", max_length=80, truncation=True)
print(generated_texts[0]['generated_text'])

[실행 결과]

“클요부질 전요들며 했다. 포캐대 햰다의 인”이라는 해괴망측한 단어를 예측했습니다..

그러나 프롬프트 부분을 영어로 바꿔보면…

[코드 2]

from transformers import GPT2LMHeadModel, GPT2Tokenizer, pipeline

# 모델과 토크나이저의 경로 지정
model_path = './gpt2'
tokenizer_path = './gpt2'

# 모델 로드
model = GPT2LMHeadModel.from_pretrained(model_path)

# 토크나이저 로드
tokenizer = GPT2Tokenizer.from_pretrained(tokenizer_path)

# 텍스트 생성 파이프라인 생성
gpt2 = pipeline("text-generation", model=model, tokenizer=tokenizer)

# 텍스트 생성 실행
generated_texts = gpt2("I am a student. So ", max_length=80, truncation=True)
print(generated_texts[0]['generated_text'])

[실행 결과]

“ive had to ask, was this a way to use it? My mom said it always made me feel more free when I am in public. It wasn't until I first showed up at Cineworld that I thought about it. I wanted to find out where I wanted this, and even though my mom thought it was a really good idea, the city has”

꽤 괜찮은 결과를 제공합니다..

토크나이저가 영어 기준일 테니 한국어의 예측 수준에 기대를 안 하고 있었습니다만.. 이정도일 줄은 몰랐습니다ㅋㅋ

얼른 한국어로 된 토크나이저를 찾아서, 적용시킨 후에 어떤 답을 내놓는지 보고 싶어졌습니다.


- 모델의 토크나이저를 변경하여 사용

한국어 토크나이저를 찾기 위해 KoGPT라고 검색하였고, SKT의 KoGPT에서 tokenizer.json을 다운받았습니다.

그 후, 폴더에 tokenizer.json 파일을 변경하기만 하고, 코드는 건들이지 않았습니다.
(… 기대하는 마음으로 후딱 실행시켜버려서.. 캡처파일이 하나네요..)

[코드 3, 4]

from transformers import GPT2LMHeadModel, GPT2Tokenizer, pipeline

# 모델과 토크나이저의 경로 지정
model_path = './gpt2'
tokenizer_path = './gpt2'

# 모델 로드
model = GPT2LMHeadModel.from_pretrained(model_path)

# 토크나이저 로드
tokenizer = GPT2Tokenizer.from_pretrained(tokenizer_path)

# 텍스트 생성 파이프라인 생성
gpt2 = pipeline("text-generation", model=model, tokenizer=tokenizer)

# 텍스트 생성 실행
# generated_texts = gpt2("나는 학생이다. 그래서 ", max_length=80, truncation=True)
generated_texts = gpt2("I am a student. So ", max_length=80, truncation=True)
print(generated_texts[0]['generated_text'])

[실행 결과]

흠.. 코드 2의 실행 결과에서 엔터 2번 치고 실행된 코드가 tokenizer.json을 바꾸고 난 뒤의 코드이고… 각각 한국어/영어를 입력한 결과인데요…

제가 사실 토크나이저에 대해서 깊게 알고 있지는 않아서, 어째서 이렇게 나왔는지는 정확히는 모르겠지만.. 추측상으로는
1. SKT의 KoGPT2는 NTP가 아니라 NEP(Next Emoticon Prediction)였다. ㅋㅋ농담입니다ㅋㅋㅋㅋ
2. 모델은 기존 OpenAI의 GPT2이지만, 토크나이저는 SKT의 토크나이저를 사용하여, 모델의 예측값과 토크나이저 사이의 오차가 있었다.
라는 생각이 드네요..

근데 1번은 절대 아닌게, HuggingFace에서 KoGPT2를 이용해 보면 일단 단어는 제대로 말하긴 합니다..


그래서 2번이거나.. 아니면 제가 모르는 더욱 심오하고 전문적인 문제일 수도 있다고 생각합니다..


- 갑작스런 계획의 변경

원래 계획은 pipeline 함수의 매개변수인 model과 tokenizer를 자유자재로 다루는 실습을 진행하는 것이었습니다.

tokenizer를 변경해보고, model을 fine tuning해보려고 했으나.. 알 수 없는 난관에 봉착하게 되어, 공부의 필요성을 느끼고 이번 실습은 여기서 종료하였습니다.

transformers 라이브러리를 ChatGPT와 대화하면서 공부하긴 했지만, 사전에 “🤗Transformers (신경망 언어모델 라이브러리) 강좌”로 공부하고 있었습니다.

일단 transformer의 구조와 내부 연산 과정에 대한 공부를 하다가 복잡해서 ChatGPT한테 도망쳤었는데..ㅠ

그 공부를 하고 추가 실습을 진행해야겠다는 판단이 들었습니다!



[추가 시도할 것]

  1. transformer의 구조와 내부 연산 과정을 공부하여 tokenizer를 영리하게 바꾸는 방법에 대해 연구해 본다.

  2. HuggingFace의 모델을 fine-tuning해 본다.

  3. HuggingFace의 모델을 이용하여 Long-term memory 챗봇을 개발해 본다.


원래 계획은 pipeline함수를 완벽히 익혀 모델을 자유자재로 삶아 구울 수 있는 수준에 오르는 게 목표였긴 했으나.. 아쉽네요..


이번 주.. 개인적인 일정이 좀 있어서 3개 전체 다 가능할지는 모르겠지만.. 최대한 해보겠습니다!!!!!!

아자아자 파이팅~~~!!!!!


#9기HuggingFace

4

👉 이 게시글도 읽어보세요!

📚 AI 활용 사례 더 보기