Ssul's Blog

chatgpt3 파인튜닝(fine-tuning)하기 본문

AI & ML/학습하기

chatgpt3 파인튜닝(fine-tuning)하기

Ssul 2023. 5. 2. 16:23

업무상 파인튜닝 성능을 알아봐야 할 일이 생김. 그래서 파인튜닝 경험기를 작성한다.

 

#1. 파인튜닝 개념 제대로 알기

1-1. pre-train 모델 - downstream task

pre-train모델은 엄청난 파라미터를 가지고 있는 거대모델로 생각하면 된다. gpt나 dalee2같은.

downstream task는 pre-train된 모델을 가지고, 조금 더 추가 훈련시켜서 내가 원하는 작업(task)를 수행하는 것을 말한다. 문서의 종류를 분류하거나, 문장의 감정을 분석하는 것 같은.

 

1-2. 전이학습(transfer learning) 종류 이해하기

Fine-tuning

- downstream task 데이터를 학습하면서 pre-train 파라미터 전체가 수정됨

 

Prompt-tuning

- downstream task 데이터를 학습하면서 pre-train 파라미터중 일부만 수정됨 

 

In-Context-Learning

- pre-train 파라미터 수정 없음

- 제로샷 러닝: downstream task 데이터 없음, 바로 사용

- 원샷러닝: downstream task 데이터 한건, 그리고 사용(예: gpt에게 넌 이제부터 내가 입력하는 것은 영어로 해석해줘)

- 퓨샷러닝: downstream task 데이터 몇건, 그리고 사용

 

파인튜닝을 하려고 검색했을때, 많은 한국 유튜브 영상의 경우, in-context-learning을 이야기하고 있었다.

 

#2. 파인튜닝 전 준비

2-1. openai 계정 생성 및 카드 등록, api키 발급

- openai.com 회원가입

- developers > overview > 오른쪽 내계정 클릭

- myaccount들어가서 카드 등록

- api key 들어가서, create new secret key 생성

api key 생성화면

2-2. (스킵해도 됨)파인튜닝 분석을 위해서 wandb 계정생성

- wandb.ai 회원가입

- 내 계정에서 api키 생성/확인

 

 

#3. 파인튜닝 하기

3-1. 파인튜닝을 위한 데이터 파일(jsonl)생성

- 우선 각자 추가 학습시키고 싶은 데이터 셋을 아래와 같은 형태의 jsonl파일로 변경해야 한다

{"prompt": "<prompt text>", "completion": "<ideal generated text>"}
{"prompt": "<prompt text>", "completion": "<ideal generated text>"}
{"prompt": "<prompt text>", "completion": "<ideal generated text>"}
...

- 나의 경우, prompt/comletion이 모두 한글문장이었다. 그래서 아래와 같은 코드를 통해서 파일을 생성하였다.

import pandas as pd
import json

# Load the conversation data from the Excel file
df = pd.read_excel("./fine_tuning/data/fine_tuning_data_20230501.xlsx")

# Create a list of prompt and completion pairs
pairs = []
for i in range(len(df)):
    prompt = df.iloc[i]["prompt"]
    completion = df.iloc[i]["completion"]
    pair = {"prompt": prompt, "completion": completion}
    pairs.append(pair)

# Write the pairs to a JSONL file with UTF-8 encoding
with open("./fine_tuning/data/fine_tuning_data_20230501.jsonl", "w", encoding="utf-8") as f:
    for pair in pairs:
        json.dump(pair, f, ensure_ascii=False)
        f.write("\n")

 

3-2. 파인튜닝을 위해 필요한 패키지 설치 및 api 키설정

- 필수

pip install --upgrade pip
pip install --upgrade openai

- 선택

pip install wandb

- 본인계정의 openai의 api키 입력

export OPENAI_API_KEY="<OPENAI_API_KEY>"

 

3-3. 파인튜닝을 위한 openai 포맷파일(train file) 생성

- 아래 명력어를 입력한다. 자신의 jsonl파일 위치에 따라 수정

openai tools fine_tunes.prepare_data -f ./data/fine_tuning_data_20230501.jsonl

- 실행하면, 나의 데이터를 openai가 점검해서, 아래와 같은 사항을 추천하고, y/n를 선택하게 해서, 수정된 파일을 생성해준다(원래파일명_prepared.jsonl)

openai가 추천하는 데이터 수정사항

 

3-4. 파인튜닝을 위한 openai 포맷파일(train file) 생성

- 파인튜닝할 모델을 설정하여, 파인튜닝 시장

- *(중요) 현재시점(20230502)에서 gpt3모델인 davinci까지 파인튜닝 가능, gpt3.5, gpt4는 파인 튜닝 불가

openai api fine_tunes.create -t fine_tuning_data_20230501_prepared.jsonl -m davinci

- 실행되고 나타나는 텍스트 중에 id: ft-f****는 잘 기억해두자!

- 끝

 

3-5. 파인튜닝 기다리며(중요)

- 우선 예상 금액이 출력되면서, 명령어 에러가 없다면 파인튜닝이 시작된것! 괜히 당황해서 명령어를 또 실행하지 말자

- 아래 명령어를 통해서 현재 진행중인 파인튜닝 확인이 가능하다

# 내 파인튜닝한 모델들 리스트
openai api fine_tunes.list

# 파인튜닝 현황
openai api fine_tunes.get -i ft-f*****(파인튜닝 아이디값)

# 혹시나 똑같은 내용을 파인튜닝 중복해서 명령했을경우, 아직 학습 시작 안된 id를 찾아서 취소
openai api fine_tunes.cancel -i ft-f***(중복실행된 파인튜닝 아이디)

- get을 실행해보면, 몇번째 epoch을 하고 있는지 등 파인튜닝 현황을 확인 가능하다

openai api fine_tunes.get -i ft-f*****(파인튜닝 아이디값)

 

3-6. 하이퍼 파라미터 조정방법

- 기본 epoch 4, lr 0.01(이건 확실치 않음)인데... 수정 가능하다.

- https://platform.openai.com/docs/guides/fine-tuning/advanced-usage 접속하면 확인 가능 

 

#4. 파인튜닝 된 나만의 모델 사용하기

4-1. 모델은 여기서 테스트 해보셈

- openai 계정에 들어가서, playground입장

- 오른쪽에 모델 클릭 > 맨 밑에 생성된 나의 모델이 있음 > 선택

- 테스트 진행

 

4-2. 개발시 파인튜닝 모델 사용하기

- 원래 사용하던 gpt3.5 api 대신 나의 모델명으로 변경

# gpt-3.5-turbo 대신에 파인튜닝된 모델의 이름 입력하시면 됩니다.
# 해당 코드는 langchain 사용해서 모델 불러온 예시
chatgpt_chain = LLMChain(
    llm=OpenAI(model_name="gpt-3.5-turbo",temperature=0.8),
    prompt=prompt, 
    memory=ConversationBufferWindowMemory(k=2),
)

 

4-3. wandb연결(선택)

- 학습내용을 자세히 확인하기 위해 wandb연결

- 명령어 한줄로 연결가능

openai wandb sync

 

 

#5. 파인튜닝 후기

우선 파인튜닝을 하려고 했던 목적은 gpt3.5 api만으로 우리가 만들고 싶은 서비스 한계가 존재하여, 파인튜닝하여 사용해보고 싶었다. 하지만, davinci까지만 파인튜닝을 제공하여... 아쉽.

결론적으로 이번 파인튜닝결과는 gpt3.5 api win!

 

우선 몇개를 개선해서 튜닝해보고 다시 비교해야 할듯하다.

#0. 비용: 33달러정도 사용. 한글로 된 텍스트 데이터 총 800개 사용

#1. 한글데이터 파일 학습 최적화

#2. 데이터셋 구성 정교화: 이번 데이터셋은 그야말로 책/논문의 내용을 분류해서 복붙한 것인데... 그랬더니 파인튜닝된 모델은 완전 바보가 되었다.

#3. 하이퍼파라미터 조정: 이번 파인튜닝은 openai에서 설정한 기본값으로 진행하였다. lr등을 조절해서 진행해 봐야 겠다.