본문 바로가기
LLM 생성할레나

[OpenAI] LLM 파인 튜닝하기

by LENA-cfg 2024. 8. 6.

환경 설정

우선, OpenAI의 API Key가 필요하다. 해당 키는 https://platform.openai.com/api-keys 여기서 발급 받으면 됩니다.

 

키를 웹사이트에서 발급 받으면 키를 환경 변수로 설정합니다. 

.env 파일을 만들어 API_KEY에 나의 키를 담아줍니다.

os와 dotenv를 사용해서 키를 실제 학습 시킬 파이썬 파일에서

load_dotenv()와 os.environ.get("API_Key")로 가져와줍니다. 

# 필요한 라이브러리 임포트
import os
from dotenv import load_dotenv
from openai import OpenAI

# api_key .env파일에 넣어줌
load_dotenv()
api_key = os.environ.get("API_KEY")

# openai에 api_key를 넣어줌
client = OpenAI(
    api_key=api_key,
)

 

동일한 환경을 위해 필요한 라이브러리 설치를 해줍니다.

얼마전까진 0.28.1인가를 쓰면 에러가 많이 발생했던 거 같은데 1.38.0버전은 호환이 되게 개발이 된거 같네요.

pip install openai==1.38.0

 


학습 데이터 준비

openai 공식문서에 가면 어떤 데이터셋을 만들어서 학습해야하는지 예시 포맷을 보여줍니다.
저는 빨간색 네모로 표시된 형식을 사용했습니다.

 

데이터 셋은 인터넷에 있는 데이터를 다운받아 사용했습니다.

윈도우에 wget을 설치하고 데이터를 다운받아줍니다.

 

데이터 다운 받는 곳

wget https://raw.githubusercontent.com/ukairia777/finance_sentiment_corpus/main/finance_data.csv

다운로드 데이터 이미지

데이터를 받은 후 학습/검증 데이터로 분할합니다.

이때는 openai의 명령어를 사용합니다. 

 

터미널에 아래의 명령어를 쳐주면 됩니다.

openai tools fine_tunes.prepare_data -f "finance_data.jsonl"
openai api fine_tunes.create -t "finance_data_prepared_train.jsonl" -v "finance_data_prepared_valid.jsonl" --compute_classification_metrics --classification_n_classes 3 -m ada

 

그러면, 아래처럼 데이터 셋이 분할됩니다.


파인튜닝

오픈에이아이 공식문서에서 파인튜닝 가능한 모델리스트를 확인했습니다.

저는 원래 gpt-3.5를 학습 하고 싶었지만, 재정난으로 davinci-002모델을 파인튜닝했습니다.

train_data_file = client.files.create(
    file=open("finance_data_prepared_train.jsonl", "rb"),
    purpose="fine-tune",
)
validation_data_file = client.files.create(
    file=open("finance_data_prepared_valid.jsonl", "rb"),
    purpose="fine-tune",
)

response = client.fine_tuning.jobs.create(
  training_file=train_data_file.id,
  validation_file=validation_data_file.id,
  model="davinci-002",
  hyperparameters={
    "n_epochs": 1,
	"batch_size": 3,
	"learning_rate_multiplier": 0.3
  }
)

job_id = response.id
status = response.status

print(f'Fine-tunning model with jobID: {job_id}.')
print(f"Training Response: {response}")
print(f"Training Status: {status}")

학습 소스입니다. 

각각파일들을  client.files.create 함수에 인자로 넣어줍니다.

그리고 학습 할 모델과 하이퍼파라미터는 아래의 client.fine_tuning.jobs.create 함수에 인자로 주었습니다.

프린트되는 부분은 학습이 시작되면서 작업 아이디와 상태를 확인 할 수 있습니다. 

학습 진행 과정은 openai 플랫폼에서 확인할 수 있습니다. 

학습을 오래 진행하지도 데이터도 충분하지 않아서 로스가 높게 나왔지만 데이터 양을 늘리고 하이퍼 파라미터를 수정하면 결과는 더 좋아질 것으로 보입니다.


파인튜닝

모델에 대한 추론은 단 몇줄의 코드로 확인이 가능합니다.

저는 밸리드 파일로 추론을 해봤습니다.

import pandas as pd

test = pd.read_json('finance_data_prepared_valid.jsonl', lines=True)
result = client.fine_tuning.jobs.list()
fine_tuned_model = result.data[0].fine_tuned_model
res = client.completions.create(model=fine_tuned_model, prompt=test['prompt'][0])

 

응답 결과 positive로 정답에 맞게 나온것을 확인했습니다.