🐰 Dongyoung:
GPT fine tuning 데이터가 준비되었고, fine tuning 은 어떻게 해야하는가?🦄 ChatGPT:
GPT 미세 조정을 위해 데이터가 준비되면 다음 단계에 따라 미세 조정을 수행할 수 있습니다.
사전 훈련된 모델 로드: GPT 사전 훈련된 모델을 로드합니다. 미세 조정을 원합니다.
데이터 준비: 모델에 입력할 수 있는 형식으로 데이터를 준비합니다. 데이터는 교육, 검증 및 테스트 세트로 나누어야 합니다.
교육 루프 정의: 교육 루프를 정의하여 GPT 모델을 미세 조정합니다. 루프에는 정방향 전파, 역방향 전파, 그래디언트 업데이트 및 손실 계산과 같은 단계가 포함되어야 합니다.
모델 미세 조정: 준비된 데이터를 사용하여 GPT 모델 미세 조정 정의된 훈련 루프. 교육 중에 손실 및 정확도 메트릭을 모니터링하여 모델의 성능을 확인합니다.
모델 평가: 테스트 데이터 세트에서 미세 조정된 모델을 평가하여 본 적이 없는 데이터에 대한 성능을 확인합니다.
미세 조정된 모델 저장: 나중에 사용할 수 있도록 미세 조정된 모델을 저장합니다.
미세 조정된 모델 사용 조정된 모델: 텍스트 분류, 질문 답변 등과 같은 특정 NLP 작업에 대해 미세 조정된 모델을 사용합니다.
이러한 단계에 따라 GPT 모델을 만들고 특정 NLP 작업에 사용하세요.
앞선 포스트에 이어 준비된 데이터를 가지고 fine-tuning 을 진행합니다.
fine-tuning 은 다음의 명령어로 수행 가능합니다
openai api fine_tunes.create -t "./데이터.jsonl" -m 모델이름 --n_epochs 에폭수
외에도 learning rate 등 조절가능한 파라메터들이 있습니다 (https://platform.openai.com/docs/guides/fine-tuning/hyperparameters).
모델은 davinci, curie, babbage, and ada. 중에 선택하여 사용합니다. 이는 모델 크기에 대한 분류로, 175B, 6.7B, 1.3B, and 0.35B 파라메터를 가지며, openai 에서 각 모델별 사용 용도에 대해 잘 정리해두었습니다 (https://platform.openai.com/docs/models/feature-specific-models). 거거익선이지만, 비용 및 속도면에 있어 적당한 모델로 골라야 할것 같습니다. 저는 curie 로 작업하였습니다.
참고로 위 모델은 ChatGPT 의 그 모델이 아닌, GPT-3 모델의 어느것 같습니다. ChatGPT 의 CoT(chain of thought), RLHF(reinforcement learning with human feedback) 등은 아마 없는것 같고, inference 수행을 해보면 그 성능이 ChatGPT 의 대답에는 한참 못미치는듯 합니다. openai 도 다른 모델이라고 이야기하고 있습니다 (https://platform.openai.com/docs/guides/fine-tuning/what-models-can-be-fine-tuned).
위 명령어를 실행하면, 데이터를 업로드하고, 모델 이름을 만들어주고, 가격 및 대기표를 뽑아줍니다. 기다리면 training 이 수행되고 종료됩니다.
Upload progress: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 717k/717k [00:00<00:00, 570Mit/s]
Uploaded file from ./data/exp1_filtered_prepared.jsonl: file-데이터
Created fine-tune: ft-모델
Streaming events until fine-tuning is complete...
(Ctrl-C will interrupt the stream, but not cancel the fine-tune)
[2023-02-23 12:26:12] Created fine-tune: ft-모델
[2023-02-23 12:42:23] Fine-tune costs $7.08
[2023-02-23 12:42:24] Fine-tune enqueued. Queue number: 0
[2023-02-23 12:42:24] Fine-tune started
[2023-02-23 12:46:39] Completed epoch 1/4
[2023-02-23 12:56:08] Completed epoch 4/4
[2023-02-23 12:56:23] Uploaded model: curie:ft-모델
[2023-02-23 12:56:24] Uploaded result file: file-파일
[2023-02-23 12:56:24] Fine-tune succeeded
Job complete! Status: succeeded 🎉
Try out your fine-tuned model:
openai api completions.create -m curie:ft-모델 -p <YOUR_PROMPT>
fine tuning 결과가 저장되고 inference 할수 있는 command 를 출력해줍니다.
수행후에 training 과정을 보고싶다면 w&b
를 통해 결과를 확인할 수 있습니다. (https://wandb.ai/ 가입후 cli 설치 및 login 필요 https://docs.wandb.ai/quickstart 참고)
openai wandb sync
을 하면 fine tuning 결과가 wandb에 sync 되고, 다음과 같은 화면을 볼 수 있습니다.
inference 를 할수있는 다양한 방법들이 있습니다 (playground, cli, restapi, python). 저는 python 에서 간단히 확인합니다.
상세 옵션은 https://platform.openai.com/docs/api-reference/completions/create 에 설명되어 있습니다.
import os
import openai
openai.api_key = "sk-****"
def gptqna(questions,p=True):
response = openai.Completion.create(
model="모델명",
prompt="Q: "+questions+"\nA:",
temperature=0.1,
max_tokens=1000,
top_p=1,
frequency_penalty=0,
presence_penalty=0,
stop=["END"]
)
if p:
print("Q: " + questions)
print("A: " +response["choices"][0]["text"])
return response["choices"][0]["text"]
res = gptqna("펀드운용보고서 통보방법을 인터넷으로 변경 가능한가")
Q: 펀드운용보고서 통보방법을 인터넷으로 변경 가능한가
A: 가능합니다.
이로서 Q&A 를 할 수 있는 모델이 완성될수 있다면 좋겠습니다만, 이렇게 쉬울리가 없겠지요.