GPT-3.5 Turbo fine tuning 파인튜닝(2)
https://platform.openai.com/docs/guides/fine-tuning/common-use-cases
OpenAI Platform
Explore developer resources, tutorials, API docs, and dynamic examples to get the most out of OpenAI's platform.
platform.openai.com
OpenAI를 가보면 파인튜닝 방법이 잘~ 설명되어 있습니다.
다만 GPT3 버전이 혼재 되어있어 잘 읽어보고 따라해야 합니다.
전체적이 절차는 세가지 단계로 나뉩니다.
1.데이터준비
gpt가 이해할수 있는 jsonl 양식으로 올려줍니다.
json 양식을 나열한 형태를 jsonl 이라고 합니다.
{"prompt": "<prompt text>", "completion": "<ideal generated text>"}
{"prompt": "<prompt text>", "completion": "<ideal generated text>"}
{"prompt": "<prompt text>", "completion": "<ideal generated text>"}
자 여기서 주의할점.
위 양식은 3버전까지의 학습 방식입니다.
3.5 turbo 부터는 jsonl 양식이 다름처럼 바뀌었습니다.
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the capital of France?"}, {"role": "assistant", "content": "Paris, as if everyone doesn't know that already."}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'Romeo and Juliet'?"}, {"role": "assistant", "content": "Oh, just some guy named William Shakespeare. Ever heard of him?"}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "How far is the Moon from Earth?"}, {"role": "assistant", "content": "Around 384,400 kilometers. Give or take a few, like that really matters."}]}
여기서부터 좀 혼란이 옵니다.
role: system, user, assistant 세가지 입니다.
content: role에 해당하는 설명을 해 주면됩니다.
이해하기 쉽게 제가 작성한 jsonl 파일을 한번 보시죠
저는 제 딸이 다니는 초등학교에 대해 학습을 시켜주려고 합니다.
{"messages":[{"role":"system","content":"한국초등학교에 대한 정보를 안내 해 주는 AI 입니다"},{"role":"user","content":"한국초등학교의 교장선생님 이름은 무엇인가요?"},{"role":"assistant","content": "교장선생님 이름은 홍길동입니다."}]}
{"messages":[{"role":"system","content":"한국초등학교에 대한 정보를 안내 해 주는 AI 입니다"},{"role":"user","content":"한국초등학교의 교목은 무엇인가요?"},{"role":"assistant","content": "교목은 소나무입니다."}]}
{"messages":[{"role":"system","content":"한국초등학교에 대한 정보를 안내 해 주는 AI 입니다"},{"role":"user","content":"한국초등학교의 교가 가사를 알려주세요."},{"role":"assistant","content": "동해물과백두산이마르고닳도록"}]}
{"messages":[{"role":"system","content":"한국초등학교에 대한 정보를 안내 해 주는 AI 입니다"},{"role":"user","content":"한국초등학교의 교화는 무엇인가요?"},{"role":"assistant","content": "교화는 개나리입니다."}]}
{"messages":[{"role":"system","content":"한국초등학교에 대한 정보를 안내 해 주는 AI 입니다"},{"role":"user","content":"2023년 4월 1일 기준, 한국초등학교의 총 학생수는 몇 명인가요?"},{"role":"assistant","content": "2023년 4월 1일 기준, 한국초등학교의 총 학생수는 476명입니다. (남자 263명, 여자 213명)"}]}
{"messages":[{"role":"system","content":"한국초등학교에 대한 정보를 안내 해 주는 AI 입니다"},{"role":"user","content":"한국초등학교의 교무실 전화번호는 무엇인가요?"},{"role":"assistant","content":"교무실 전화번호는 051-26-7348입니다."}]}
{"messages":[{"role":"system","content":"한국초등학교에 대한 정보를 안내 해 주는 AI 입니다"},{"role":"user","content":"한국초등학교의 행정실 전화번호는 무엇인가요?"},{"role":"assistant","content":"행정실 전화번호는 051-26-7349입니다."}]}
{"messages":[{"role":"system","content":"한국초등학교에 대한 정보를 안내 해 주는 AI 입니다"},{"role":"user","content":"한국초등학교의 학교 팩스번호는 무엇인가요?"},{"role":"assistant","content":"학교 팩스번호는 051-28-8028입니다."}]}
{"messages":[{"role":"system","content":"한국초등학교에 대한 정보를 안내 해 주는 AI 입니다"},{"role":"user","content":"한국초등학교의 유치원 전화번호는 무엇인가요?"},{"role":"assistant","content":"유치원 전화번호는 051-26-7424입니다."}]}
{"messages":[{"role":"system","content":"한국초등학교에 대한 정보를 안내 해 주는 AI 입니다"},{"role":"user","content":"한국초등학교의 주소는 어떻게 되나요?"},{"role":"assistant","content": "한국초등학교의 주소는 용인시 땡땡라면입니다."}]}
뭔가 이해하기 쉽죵?
2.데이터업로드 및 학습
이제 데이터는 준비되었고, jsonl 파일을 업로드하고 파인튜닝을 시켜 보겠습니다.
import openai
openai.api_key = "sk-J5TdZAmA5iUNZMslN3BlbkFJj41HcqHBY9tUpII8dm"
file_name = "prepared_data_prepared.jsonl"
upload_response = openai.File.create( #학습파일업로드
file=open(file_name, "rb"),purpose='fine-tune'
)
file_id = upload_response.id #업로드후 받은 학습 file_id를 파인튜닝을 실행할때 전달해줘야합니다.
#file_id와 모델을 지정하여 파인튜닝 실시
fine_tune_response=openai.FineTuningJob.create(training_file=file_id, model="gpt-3.5-turbo")
print(fine_tune_response )
그런데 엥?
Traceback (most recent call last):
File "C:\Users\souls\OneDrive\바탕 화면\gpt\tunedGpt\tuneProcess.py", line 47, in <module>
fine_tune_response=openai.FineTuningJob.create(training_file=file_id, model="gpt-3.5-turbo")
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Python311\Lib\site-packages\openai\api_resources\abstract\createable_api_resource.py", line 57, in create
response, _, api_key = requestor.request(
^^^^^^^^^^^^^^^^^^
File "C:\Python311\Lib\site-packages\openai\api_requestor.py", line 298, in request
resp, got_stream = self._interpret_response(result, stream)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Python311\Lib\site-packages\openai\api_requestor.py", line 700, in _interpret_response
self._interpret_response_line(
File "C:\Python311\Lib\site-packages\openai\api_requestor.py", line 765, in _interpret_response_line
raise self.handle_error_response(
openai.error.InvalidRequestError: File file-7sUErJsXc2G5HbUQwPwICbWO is not ready
마지막에 보면 파일이 is not ready 라네요!
저 글자가 의미하는 말이 무슨말인지는 알지
근데 3버전에서는 이런문제가 없었는데?
구글링을 해도 파일양식이 틀릴거라고 해서
jsonl 포맷을 이렇게 바꿔보고 저렇게 바꿔보고 3버전으로 바까보고 쌩쇼만 몇시간...
삽질 끝에 알았지만, 정작 jsonl 양식 문제가 아니라.
3.5 버전부터, 파일업로드 후 준비하는데 딜레이가 좀 있다는것!
일시적일 수도 있지만, 그래서 파일업로드와 파인튜닝 로직을 분리해서 실행하니 잘 된다는?!
1. 파일을 업로드 하고 file_id를 출력한다
import openai
openai.api_key = "sk-J5TdZAmA5iUNZMslN3BlbkFJj41HcqHBY9tUpII8dm"
file_name = "prepared_data_prepared.jsonl"
upload_response = openai.File.create(
file=open(file_name, "rb"),purpose='fine-tune'
)
file_id = upload_response.id
print(file_id)
2. 위에서 받은 file_id를 이용해 모델을 gpt3.5 turbo롤 지정하여 파인튜닝실시!
import openai
openai.api_key = "sk-J5TdZAmAtM5iUNZMlN3T3BlkFJj1HcqHBYUpIb1I8dm"
fine_tune_response=openai.FineTuningJob.create(training_file="바로전에저장한fileid를넣어주세요", model="gpt-3.5-turbo")
print(fine_tune_response )

에러안나고 잘 돌아갔다 ㅜㅜ
하루종일 삽질했는데... ㅜㅜ
3. 그리고 기다린다~!
학습이 완료되면 플레이그라운드 에서 내 모델이 나옴 !
감격의 순간 ㅜㅜ
번외로 파인튜닝 진행 시 업로드 파일의 처리 상태, 내 모델 조회 및 삭제, 파인튜닝 잡 조회하기는 다음 글에서!!