미세 조정
작업 목적에 맞게 모델을 조정하는 방법을 알아보세요.
개요
미세 조정을 통해 모델이 학습하지 못했던 작업에 대해서 더 나은 결과를 얻을 수 있게 해줍니다. 미세 조정을 하지 않고도 모델에게 몇 가지 예시를 제공해주는 방식(퓨샷 학습)으로 모델이 학습하지 못했던 작업에 대해서 더 좋은 결과를 내보내게 만들 수 있습니다. 그러나 모델이 미세 조정되면 프롬프트에 들어갈 수 있는 것보다 더 많은 예제를 모델이 미리 학습하여(미세 조정) 다양한 작업에 대해서 더 나은 결과를 얻을 수 있도록 해줍니다. 또한 프롬프트에 많은 예시를 사전에 제공할 필요가 없어서 비용 절감과 요청 시간의 단축 효과를 얻을 수 있습니다.
미세 조정을 통해 다음과 같은 효과를 얻을 수 있습니다.
- 프롬프트 보다 더 높은 품질의 결과
- 짧은 프롬프트로 토큰 절약과 응답 시간 단축
미세 조정이 필요한 경우
코난 LLM을 미세 조정하면 특정 작업에 맞는 더 나은 모델을 만들 수 있지만 시간과 노력이 필요한 작업이므로 신중한 투자가 필요합니다. 미세 조정을 하기 전에 프롬프트 엔지니어링, 프롬프트 체인(복잡한 작업을 여러 프롬프트로 나누는 방법) 등을 통해서 좋은 결과를 얻으려는 시도를 하는 것이 좋습니다.
- 모델이 처음에는 잘 수행되지 않는 것처럼 보이는 많은 작업이 있지만 올바른 프롬프트를 사용하면 결과가 향상될 수 있으므로 미세 조정이 필요하지 않을 수 있습니다.
- 학습 데이터셋을 생성하고, 모델 학습을 진행해야 하는 미세 조정으로 반복하는 것 보다, 프롬프트를 수정하는 것이 피드백이 훨씬 빠릅니다.
- 미세 조정이 필요한 경우 초기 프롬프트 엔지니어링 작업을 활용할 수 있습니다. 일반적으로 미세 조정 데이터에 좋은 프롬프트를 사용할 때 최상의 결과를 얻을 수 있습니다.
미세 조정 사례
미세 조정을 통해 결과를 개선할 수 있는 몇 가지 사례는 다음과 같습니다.
-
스타일, 톤, 형식 또는 기타 질적 측면 설정
✔ 문서 초안 작성
✔ 요약
✔ 대화
-
원하는 출력을 생산할 때 신뢰성 향상
✔ 질의/응답
-
복잡한 프롬프트를 모델이 따르지 못하는 경우
✔ 참고 문서 기반 질의/응답
✔ 참고 문서 기반 문서 초안 작성
-
고정된 방식으로 많은 엣지 케이스 처리
✔ 번역
✔ 분류
-
프롬프트에서 명확하게 표현하기 어려운 새로운 기술이나 작업 수행
대부분의 작업에 대해서 파라미터 수가 많은 모델이 적은 모델 보다 더 나은 성능을 보여주지만, 미세 조정된 적은 모델이 파라미터 수가 더 많은 모델과 비슷한 품질 혹은 더 나은 품질에 도달할 수 있는 경우가 많습니다.
미세 조정 절차
미세 조정은 크게 아래와 같은 단계로 수행합니다.
- 데이터셋 준비
- 미세 조정 모델 만들기
- 미세 조정 모델 사용
데이터셋 준비
미세 조정이 필요하다고 판단되면 모델 학습을 위한 데이터셋을 준비해야 합니다. 실제 사용자들이 사용할 프롬프트와 유사하게 다양한 대화 데이터셋을 만듭니다.
1) 데이터 형식
학습 데이터는 각 라인이 하나의 대화 셋을 의미하는 JSONL, 혹은 CSV 형식을 사용할 수 있습니다.
-
싱글턴
✔ JSONL 형식
{"prompt": "<prompt text>", "completion": "<ideal generated text>"}
{"prompt": "<prompt text>", "completion": "<ideal generated text>"}
{"prompt": "<prompt text>", "completion": "<ideal generated text>"}
✔ CSV 형식
prompt,completion
<prompt text>,<ideal generated text>
<prompt text>,<ideal generated text>
<prompt text>,<ideal generated text>
각 예제는 모델에 대한 사용자의 지시가 포함된 <prompt text>와, 모델이 생성하기를 기대하는 답변이 포함된 <ideal generated text>로 구성됩니다.
-
멀티턴
✔ JSONL 형식
아래 예제와 같이 각 라인이 하나의 멀티턴 대화셋을 의미하는 JSONL 형식을 준비하십시오.
{“messages”: [{“role”: “system”, “content”: “너는 냉소적인 사실 기반 챗봇이야.”}, {“role”: “user”, “content”: “프랑스의 수도는 어디야”}, {“role”: “assistant”: “content”, “프랑스의 수도는 파리야.”}, {“role”: “user”, “content”: “더 냉소적으로 답해봐”}, {“role”: “assistant”: “content”, “응, 프랑스의 수도는 파리야. 다른 나라들처럼 수도를 자주 바꾸지 않아서 다행이지.”}]}
{“messages”: [{“role”: “system”, “content”: “너는 냉소적인 사실 기반 챗봇이야.”}, {“role”: “user”, “content”: “로미오와 줄리엣을 쓴 작가는 누구야”}, {“role”: “assistant”: “content”, “로미오와 줄리엣은 윌리엄 셰익스피어가 쓴 희곡입니다.”}, {“role”: “user”, “content”: “더 냉소적으로 말할 수 있어”}, {“role”: “assistant”: “content”, “물론이죠. 로미오와 줄리엣은 윌리엄 셰익스피어가 쓴 희곡입니다. 그분이 아니면 누가 쓸 수 있겠습니까?”}]}
2) 프롬프트 작성하기
미세 조정 예시를 참고하세요.
3) 권장 예제 개수
- 미세 조정을 위해서는 최소 200개 이상의 학습 데이터가 필요합니다.
- 일반적으로 200개의 이상의 학습 데이터로 미세 조정을 하면 명확한 개선을 볼 수 있지만, 학습 난이도에 따라서 적절한 권장 데이터 수는 크게 달라질 수 있습니다.
- 잘 만들어진 200개의 학습 데이터로 시작하여, 모델의 성능을 평가하면서, 추가 데이터 수집을 고려하는 것이 좋습니다.
- 모델의 개선이 있을 경우, 원하는 품질이 나올 때까지 학습 데이터의 수를 동일한 방법으로 늘려갈 수 있습니다.
- 모델의 개선이 없을 경우, 개선이 나올 때까지 학습 데이터의 수를 늘려갈 수도 있고, 데이터를 재구성하는 것을 검토할 필요가 있습니다.
4) 토큰 길이 제한
각 학습 데이터는 모델 마다 적용된 토큰 길이 제한을 가집니다. 이 보다 긴 데이터는 모델 마다 적용된 토큰 길이 까지만 잘라서 사용합니다.
미세 조정 모델 만들기
충분한 양의 학습 데이터셋을 업로드하고 나면 모델을 미세 조정할 수 있습니다. 미세 조정은 LLM 스튜디오 UI를 통해서 하거나 REST API를 호출하여 사용할 수 있습니다.
조정 방법
미세 조정 방법은 크게 전체 미세 조정(Full Fine-Tuning)과 매개변수 효율적인 미세 조정(Parameter-Efficient Fine-Tuning)으로 나뉩니다.
전체 미세 조정은 모델의 모든 매개변수를 업데이트하므로, 매우 복잡한 태스크에 맞게 모델을 조정하기에 적합하고 더 높은 품질을 달성할 가능성이 있습니다. 그러나 전체 미세 조정에는 조정 및 서빙을 위해 더 높은 컴퓨팅 리소스가 필요하므로 전체 비용이 증가합니다.
매개변수 효율적인 미세 조정은 모델의 특정 매개변수만 학습시키는 방법으로 전체 미세 조정 보다 적은 장비로 모델을 학습할 수 있습니다.
1) LLM 스튜디오
시작하기 페이지에서 모델 학습 탭을 클릭합니다.
학습 방법 선택 페이지에서 미세 조정 라디오 버튼을 선택합니다.
계속을 클릭합니다.
모델 설정 페이지에서 미세 조정을 위한 옵션을 설정합니다.
-
모델 기본 정보 설정
✔ 모델명: 미세 조정된 모델의 이름을 입력합니다.
✔ 기본 모델: 미세 조정하려는 기본 모델을 선택합니다.
✔ 설명: 모델에 대한 간략한 설명을 입력합니다. 입력한 설명은 모델 관리 페이지에서 해당 모델을 클릭하여 확인할 수 있습니다. -
조정 방법 설정
✔ FULL: 전체 미세 조정을 수행합니다.
✔ LoRA: 매개변수 효율적인 미세 조정을 수행합니다. -
학습 파라미터 설정
✔ 배치 크기: 한 스텝 당 처리하는 데이터 수
✔ 학습 횟수: 전체 데이터셋을 처리하는 횟수
✔ 학습률: 학습 중 매개변수를 변경하는 속도
✔ 중간 결과 저장: 각 학습 에포크 마다 전체 모델에 대한 체크포인트를 남깁니다. 학습 취소나 비정상적인 학습 종료 후 다시 학습을 재개할 때 마지막 체크포인트 부터 다시 학습할 수 있습니다.
계속을 클릭합니다.
학습 데이터 설정 페이지에서 미세 조정에 사용할 데이터셋을 설정합니다.
- JSONL 또는 CSV 파일을 업로드: 로컬 PC에서 업로드할 데이터셋 파일을 선택합니다.
- 데이터셋의 기존 JSONL 파일: 미세조정 데이터셋에서 JSONL 파일을 선택합니다.
계속을 클릭합니다.
학습 데이터 검증 페이지에서 업로드된 학습 데이터의 이상 여부와 예상 학습 시간을 확인합니다.
계속을 클릭합니다.
GPU선택 페이지에서 학습을 수행할 노드 및 해당 노드 별 GPU를 선택합니다.
조정 시작을 클릭합니다.
모델 학습 상태는 모델 관리 페이지에서 확인할 수 있습니다.
2) REST API
REST API를 통해 미세 조정 작업을 시작하기 위해서는 아래와 같이 요청을 보냅니다.
curl “https://api.konantech.com/v2/training/fine_tune” \
–X POST \
–H “Content-Type: application/json” \
-d ‘{ \
“base_model”: “konan-llm-pro-10”,
“suffix”: “custom-name”,
“training_file”: “URL_OF_DATASET_FILE”,
“train_method”: “full”,
“hyperparams”: {
“epochs”: 3,
“lr”: 0.0001
}
}’
미세 조정된 모델을 적용하기 위해서는 작업이 완료될 때까지 기다려야 하며 데이터세트 크기에 따라 몇 분 혹은 몇 시간이 걸릴 수 있습니다.
미세 조정 모델 사용
미세 조정 작업이 완료되면 모델 상태가 학습 완료로 표시됩니다. 학습 완료 모델은 모델 관리 페이지에서 [로드] 버튼을 클릭하여 로드한 후 플레이그라운드에서 사용해볼 수 있습니다.
미세 조정 모델 평가
완료된 모델을 직접 사용하면서, 모델의 성능을 평가하고, 다음과 같은 방법을 통해서 모델의 성능을 향상시킬 수 있습니다.
1) 학습 데이터의 품질을 높여가며 반복
-
생성 품질이 낮은 사례를 조사하세요.
✔ 해당 사례를 올바르게 수행하는 방법을 학습 데이터에 추가해주세요.
✔ 모델에 문법, 논리 또는 스타일 문제가 있는 경우, 학습 데이터에 동일한 문제가 있는 확인한 후 수정해주세요. -
학습 데이터의 일관성을 확인하세요.
✔ 다양한 사람이 학습 데이터를 생성해, 학습 데이터가 일관되지 않으면, 모델은 일관되지 않은 답변을 할 수 있습니다. -
학습 데이터의 형식과 추론을 위해 사용하는 형식이 동일한지 확인하세요.
-
학습 데이터의 균형과 다양성을 확인하세요.
✔ 학습 데이터의 비율 중 약 60%가 “답변을 할 수 없습니다”이고, 원하는 결과가 생성의 5%만 “답변을 할 수 없습니다”라고 답변해야 한다면, 원하는 결과 보다 더 과도하게 “답변을 할 수 없습니다”라고 모델이 답변할 수 있습니다.
2) 학습 데이터의 수를 늘려가며 반복
-
생성 품질이 만족스러우면, 학습 데이터의 수를 늘리는 것을 고려할 수 있습니다.
-
다음을 통해서 학습 데이터의 수를 늘려 예상되는 품질 향상을 대략적으로 추정할 수 있습니다.
✔ 현재 학습 데이터 세트로 미세 조정
✔ 현재 학습 데이터 세트의 절반으로 미세 조정
✔ 둘 사이의 품질 격차를 관찰 -
일반적으로 저품질 학습 데이터를 많이 사용하는 것보다, 고품질 학습 데이터를 적게 사용하는 것이 더 효과적입니다.
3) 모델 학습에 사용하는 하이퍼 파라미터를 조절하며 반복
- 처음에는 모델 학습에 사용하는 하이퍼 파라미터의 기본 값을 사용하는 것이 좋습니다.
- 만약 모델의 생성 결과가 훈련 데이터의 양상과 다르다고 판단된다면, Epoch을 1 또는 2만큼 늘립니다.
- 만약 모델의 생성 결과의 다양성이 떨어진다고 판단된다면, Epoch을 1 또는 2만큼 줄입니다.
- 만약 모델의 Loss가 수렴하지 않는다면, 학습률을 지수로 높입니다. (ex, 0.002 -> 0.02)
미세 조정 예시
해당 예시는 각 작업에 맞는 최적의 프롬프트는 아닐 수 있으므로, 프롬프트 엔지니어링을 통해서 최적의 프롬프트를 찾는 것을 권장합니다.
⚠️ 아래 JSONL 예제들은 가독성을 높이기 위해 개행 문자를 다음 줄에 표시하고 있습니다. 실제 학습 데이터 구축 시에는 prompt, completion 쌍을 한 줄에 입력하고 개행은 \n 으로 바꾸어야 합니다.
⚠️ 학습 데이터 구축 시 LLM을 활용할 수 있습니다.
미세조정을 위한 데이터 생성을 참조하세요.
작성
1) 문서 초안 작성
{"prompt": "중고차 매매사이트에서, 사용자에게 더욱 다양한 정보 제공을 위한 피드백 기능을 추가할 예정입니다. 피드백 기능에 대한 계획서 초안을 작성해주세요."},
{"completion": "1. 개요
- 중고차 매매사이트에서 피드백 기능을 추가하여 사용자에게 더욱 다양한 정보를 제공하고, 사용자들 간의 의견 교류와 신뢰도 향상을 목표로 함.
...
6. 기대효과
- 사용자들의 다양한 의견 제공으로, 매물 정보의 신뢰도 및 정확도 향상에 기여.
- 다양한 정보를 제공하는 중고차 매매사이트로 성장함으로써, 사용자 수 및 매출 증대에 기여."}
- prompt 필드는 문서를 작성하기 위해서 사용자가 입력하는 지시문의 형태입니다.
- completion 필드는 사용자가 입력하는 지시문에 맞춰 모델이 생성해야 하는 문서의 형태입니다.
질의/응답
{"prompt": "장례를 주관할 수 있는 사람의 범위가 어떻게 되나요?"},
{"completion": "장례는 배우자, 자녀 또는 부모 등 법령에서 정하는 연고자가 주관할 수 있습니다."}
- prompt 필드는 답변을 위해서 사용자가 입력하는 질문의 형태입니다.
- completion 필드는 사용자가 입력하는 질문에 맞춰 모델이 생성해야 하는 답변의 형태입니다.
요약
1) 보고서 요약
{"prompt": "다음 글을 핵심 단어 위주로 요약해주세요. 다른 부차적인 말 없이 요약 결과만을 출력해주세요.
[요약 대상 글]
청년에게 주거·일자리·교육 등 맞춤형 지원 (국조실·국토부·고용부·중기부·교육부)
□ 과제목표
ㅇ 청년세대의 내 집 마련 기회 확대 등 주거사다리 복원
...
[요약]},
{"completion": "국조실 및 국토부, 고용부, 중기부, 교육부는 청년의 주거, 일자리, 교육 지원을 강화하기 위해 내 집 마련 기회 확대, 취·창업 지원, 신기술 인재 양성을 주요 내용으로 제시하였다. 이를 통해 청년들의 주거 안정, 일자리 창출 및 교육 기회 확대를 목표로 한다."}
2) 회의록 요약
{“prompt”: “[문서 시작]
소위원장:성원이 되었으므로 제246회국회(임시회) 문화관광위원회 제1차 법안심사소위원회를 개의하겠습니다.
소위원장:의사일정 제1항 문화예술진흥법중개정법률안을 계속 상정하겠습니다.
...
[문서 종료]
위 국회 회의록의 핵심적인 내용을 간략히 요약해 주세요.”}
{“completion”: “문화관광위원회 제1차 법안심사소위원회에서 문화예술진흥법에 대한 개정법률안이 상정되었습니다...”}
- prompt 필드는 문서를 요약하기 위해서 사용자가 입력하는 지시문의 형태입니다.
- completion 필드는 사용자가 입력하는 지시문에 맞춰 모델이 생성해야 하는 요약 결과의 형태입니다.
번역
{"prompt": "다음 문장을 한국어로 번역해주세요.
Wally buys bears at the park. A bear is priced at $4.00 for the first bear and a discount of 50 cents per bear is given after that. How much does Wally pay for 101 bears?"},
{"completion": "월리는 공원에서 곰 인형을 사고 있습니다. 첫 번째 곰 인형의 가격은 4.00달러이고, 그 이후부터는 인형 하나당 50센트의 할인이 적용됩니다. 월리는 101마리의 곰 인형에 얼마를 지불하게 될까요?"}
- prompt 필드는 번역을 위해서 사용자가 입력하는 지시문의 형태입니다.
- completion 필드는 사용자가 입력하는 지시문에 맞춰 모델이 생성해야 하는 번역 결과의 형태입니다.
분류
1) 뉴스 분류
{"prompt": "'한국과 비공개 평가전' 세네갈의 핵심 선수는?
세네갈 국가 대표팀 에이스 사디오 마네. 사진=뉴스1한국 축구대표팀이...
이 문서를 보고 이 문서가 어떤 카테고리에 속하는지 분류해주세요"},
{"completion": "이 문서는 \"스포츠\"로 분류할 수 있습니다."}
- prompt 필드는 분류를 위해서 사용자가 입력하는 지시문의 형태입니다.
- completion 필드는 사용자가 입력하는 지시문에 맞춰 모델이 생성해야 하는 답변의 형태입니다.