미세조정: 전체 미세조정 · 지시 미세조정(SFT) · LoRA · QLoRA
언제 미세조정할지와 SFT · 전체 미세조정 · LoRA · QLoRA를 메모리 계산으로 비교하는 수업
먼저 알아야 할 것
다루는 내용
프롬프트 · RAG · 미세조정 중 무엇을 고를지 기준을 세우고, 지시 미세조정(SFT)과 채팅 템플릿 · 손실 마스킹을 설명합니다. 혼합 정밀도 Adam의 파라미터당 16바이트로 전체 미세조정 메모리를 계산하고, LoRA를 2×2 예로 손계산하며 학습 파라미터 비율을 셉니다. QLoRA의 NF4 · 이중 양자화 · 페이지드 옵티마이저를 정리합니다.
해설
미세조정: 전체 미세조정 · 지시 미세조정(SFT) · LoRA · QLoRA
프롬프트만으로 원하는 행동이 안 나올 때, 모델의 가중치를 우리 데이터로 조금 더 학습시키는 것이 미세조정(fine-tuning) 입니다. 이 수업에서는 사전학습 모델이 '대화하는 비서'가 되기까지의 지시 미세조정(SFT), 모든 가중치를 고치는 전체 미세조정, 일부만 고치는 LoRA · QLoRA를 비교하고, 메모리와 파라미터 수를 직접 계산해 "내 GPU로 무엇을 할 수 있나"를 판단하는 법을 익힙니다.
| 항목 | 내용 |
|---|---|
| 참고 출처 | Hugging Face LLM 강좌 11장 지도 미세조정 · FLAN(arXiv 2109.01652) · Self-Instruct(arXiv 2212.10560) · LIMA(arXiv 2305.11206) · LoRA(arXiv 2106.09685) · QLoRA(arXiv 2305.14314) · ZeRO(arXiv 1910.02054) |
| 트랙 · 수준 | LLM 활용·에이전트 · 중급 |
| 이 수업이 다루는 범위 | 언제 미세조정하나, 지시 미세조정과 채팅 템플릿, 손실 마스킹, 데이터 품질, 전체 미세조정 메모리, LoRA 원리 · 손계산, QLoRA, 하이퍼파라미터 감각, 평가 |
들어가기 전에
- 프롬프트 설계와 인컨텍스트 학습 — 미세조정 전에 프롬프트로 어디까지 되는지 먼저 확인합니다.
- 언어 모델의 기본 — 다음 토큰 교차 엔트로피 손실. 미세조정도 같은 손실을 씁니다.
- 행렬 곱과 '랭크(rank)'라는 말을 들어 봤으면 충분합니다(아래에서 다시 설명).
한눈에 보기
- 프롬프트 · RAG · 미세조정 중 무엇을 고를지 판단 기준을 갖습니다.
- 지시 미세조정(SFT)이 무엇을 바꾸는지, 왜 '질문 부분은 손실에서 뺀다'고 하는지 압니다.
- 전체 미세조정이 파라미터당 약 16바이트를 쓰는 이유를 알고, 7B 모델에 대입해 봅니다.
- LoRA의 를 2×2 예로 직접 계산하고, 학습 파라미터가 몇 %로 줄어드는지 셉니다.
- QLoRA가 4비트 양자화와 LoRA를 어떻게 합쳤는지 압니다.
1. 언제 미세조정하나
직관(해설용 비유). 프롬프트는 "업무 지시서", RAG는 "참고 자료 서랍", 미세조정은 "직무 교육"입니다. 지시서로 되는 일에 교육을 보낼 필요는 없고, 자료가 없어서 못 하는 일을 교육으로 해결하려 하면 비용만 듭니다.
| 문제 | 먼저 해 볼 것 | 미세조정이 맞는 경우 |
|---|---|---|
| 답의 형식 · 말투가 들쭉날쭉 | 프롬프트 · 예시 · 구조화 출력 | 매우 많은 호출에서 일정한 형식이 필요하고 프롬프트가 너무 길어질 때 |
| 최신 · 사내 지식을 모름 | RAG(자료 넣기) | 거의 쓰지 않음 — 지식 주입은 RAG가 대개 더 싸고 갱신이 쉬움 |
| 특정 과제 품질이 부족 | 퓨샷 · 더 큰 모델 | 정답이 있는 예제가 충분하고, 작은 모델을 싸게 돌리고 싶을 때 |
| 비용 · 지연을 줄이고 싶음 | 작은 모델 + 프롬프트 | 큰 모델 출력으로 작은 모델을 학습(증류)할 때 |
(이 표는 해설용 판단 기준입니다.)
2. 지시 미세조정(SFT)
무엇을 바꾸나. 사전학습만 한 모델은 "인터넷 글 이어 쓰기"를 합니다. 질문을 넣으면 답하는 대신 비슷한 질문을 더 써 내려가기도 합니다. 지시 미세조정(instruction tuning, supervised fine-tuning)은 (지시, 좋은 응답) 쌍으로 추가 학습해, 지시를 받으면 응답하는 습관 을 들입니다.
대표 결과(원문에서 확인).
- FLAN(Wei 외, 2021): 137B 모델을 자연어 지시 템플릿으로 바꾼 60개 넘는 NLP 데이터셋에 지시 미세조정했더니, 처음 보는 과제에서의 제로샷 성능이 평가한 25개 데이터셋 중 20개에서 175B GPT-3의 제로샷을 넘었습니다.
- Self-Instruct(Wang 외, 2022): 모델이 스스로 만든 지시 데이터 약 5만 2천 개로 GPT-3를 미세조정해 Super-NaturalInstructions에서 원래 GPT-3보다 33%p 높은 성능을 보고했습니다.
- LIMA(Zhou 외, 2023): 65B 모델을 정성껏 고른 1,000개 예제로만 미세조정(강화학습 없이)했는데, 사람 평가에서 GPT-4와 비교해 43%의 경우 같거나 더 낫다고 평가받았습니다. 저자들은 지식은 대부분 사전학습에서 오고, 미세조정은 주로 '형식과 태도'를 가르친다는 가설을 폈습니다.
교훈. 데이터는 양보다 질과 다양성 이 중요하다는 쪽으로 근거가 쌓였습니다(위 LIMA). 다만 이것이 모든 과제에 1,000개면 충분하다는 뜻은 아닙니다.
채팅 템플릿(chat template). 대화형 모델은 "시스템 · 사용자 · 어시스턴트" 역할을 특수 토큰으로 구분한 정해진 형식으로 학습됩니다. Hugging Face 강좌 11장도 채팅 템플릿을 SFT의 첫 단계로 다룹니다. 학습 때와 쓸 때 템플릿이 다르면 성능이 크게 떨어질 수 있으므로, 토크나이저가 제공하는 템플릿 함수를 그대로 쓰는 것이 안전합니다.
손실 마스킹. 손실을 응답 토큰에만 걸고 지시(프롬프트) 토큰은 빼는 경우가 많습니다. 모델이 "질문 쓰는 법"이 아니라 "답하는 법"을 배우게 하려는 것입니다.
| 기호 | 뜻 |
|---|---|
| 응답에 해당하는 토큰 위치들의 집합 | |
| 위치 의 정답 토큰 | |
| 그 앞의 모든 토큰(지시 + 앞선 응답) |
숫자로 해 보기(해설용). 지시 3토큰, 응답 2토큰이고, 응답 두 토큰에 모델이 준 확률이 0.5, 0.25라면 손실은 입니다. 지시 토큰의 확률은 계산에 들어가지 않습니다.
3. 전체 미세조정과 메모리
방식. 모든 가중치를 갱신합니다. 표현력은 가장 크지만 메모리가 많이 듭니다.
왜 파라미터당 16바이트인가(ZeRO 논문의 계산). 혼합 정밀도로 Adam을 쓰면 파라미터 하나당
- 16비트 가중치 2바이트 + 16비트 기울기 2바이트
- Adam 상태 12바이트(32비트 가중치 사본 4 + 1차 모멘트 4 + 2차 모멘트 4)
합계 바이트입니다. 활성값(중간 계산 결과)은 따로입니다.
숫자로 해 보기. 7B(70억) 모델이면 — 활성값을 빼고도 80GB GPU 한 장에 들어가지 않습니다. 그래서 여러 GPU에 나누거나(분산 학습), 아래의 파라미터 효율 기법을 씁니다.
치명적 망각(catastrophic forgetting). 좁은 데이터로 전체 가중치를 많이 고치면 원래 잘하던 능력이 줄어들 수 있습니다. 학습률을 작게, 에폭을 적게 두고 일반 능력 평가를 함께 보는 이유입니다.
4. LoRA: 바뀌는 부분만 작게 배우기
직관. 큰 가중치 행렬 는 얼려 두고, 변화량 만 배웁니다. 그런데 를 통째로 배우지 않고, 얇은 두 행렬의 곱 로 표현합니다. 미세조정에 필요한 변화는 '몇 가지 방향'만으로 충분하다는 가정(낮은 랭크)입니다.
식(LoRA 논문).
| 기호 | 크기 | 뜻 |
|---|---|---|
| 사전학습 가중치(얼림, 학습 안 함) | ||
| 학습 행렬. 0으로 초기화 | ||
| 학습 행렬. 무작위 가우스 초기화 | ||
| — | 랭크. 보다 훨씬 작게(예: 8) | |
| — | 크기 조절 상수. 변화량을 배 합니다 |
를 0으로 두므로 학습 시작 때 , 즉 원래 모델과 똑같이 출발합니다.
숫자로 해 보기(해설용, 2×2 · · ). , 학습 뒤 , , 입력 이라 합시다.
- ,
- ,
학습한 숫자는 의 2개 + 의 2개 = 4개로, 원래 행렬 원소 수(4개)와 같습니다. 이 작은 예에서는 이득이 없지만, 큰 행렬에서는 차이가 극적입니다.
파라미터 세기. , 이면 LoRA는 개, 원래 행렬은 만 개로 0.39% 입니다( 이면 0.78%). 층 32개의 에 모두 달아도 약 839만 개로 7B 모델의 약 0.12%입니다(파이썬으로 계산).
논문이 보고한 것. GPT-3 175B 기준으로 전체 미세조정 대비 학습 파라미터 수를 1만 분의 1로, GPU 메모리를 3분의 1로 줄이면서 품질은 비슷하거나 더 나았다고 합니다. 학습 뒤 를 에 더해 합쳐 두면 추론 지연이 늘지 않는다 는 점도 장점입니다. 자세한 내용은 LoRA 해설.
5. QLoRA: 얼린 부분을 4비트로
직관. LoRA에서 는 어차피 얼려 둡니다. 그렇다면 를 아주 작게(4비트) 저장해도 되지 않을까? QLoRA는 얼린 기반 모델을 4비트로 양자화하고, 그 위에 16비트 LoRA를 학습합니다. 기울기는 4비트 모델을 '거쳐' LoRA로만 흐릅니다.
세 가지 장치(QLoRA 논문).
- 4비트 NormalFloat(NF4): 정규분포를 따르는 가중치에 맞춘 4비트 자료형
- 이중 양자화: 양자화에 쓰는 상수까지 다시 양자화해 메모리를 더 줄임
- 페이지드 옵티마이저: 메모리가 순간적으로 튈 때 옵티마이저 상태를 CPU 메모리로 넘겨 버팀
결과(논문 보고). 65B 모델을 16비트로 일반 미세조정하려면 780GB 넘는 GPU 메모리가 필요한데, QLoRA로 48GB GPU 한 장에서 미세조정했습니다. 이렇게 만든 Guanaco 모델은 Vicuna 벤치마크에서 ChatGPT 성능의 99.3%에 도달했다고 보고했습니다(QLoRA 해설).
숫자로 해 보기(해설용, 가중치만). 7B 모델 가중치는 16비트로 , 4비트로 약 입니다. 양자화 상수 · LoRA · 활성값은 별도라 실제 사용량은 이보다 큽니다. 양자화 원리는 수치 형식 · 혼합 정밀도 · 양자화에서 다룹니다.
flowchart LR
D[데이터 준비<br/>지시 · 응답 쌍, 채팅 템플릿] --> C{방식 선택}
C -->|GPU 넉넉| F[전체 미세조정]
C -->|GPU 보통| L[LoRA: W0 얼리고 BA 학습]
C -->|GPU 적음| Q[QLoRA: W0를 4비트로 + LoRA]
F --> E[평가: 과제 점수 + 일반 능력]
L --> E
Q --> E
E --> M[LoRA라면 BA를 W0에 합쳐 배포]6. 실무 감각
- 데이터: 형식을 통일하고, 중복 · 오답을 걸러 냅니다. 평가 세트는 학습 세트와 겹치지 않게 따로 둡니다.
- 하이퍼파라미터: 랭크 , , 학습률, 에폭이 핵심입니다. 공개 레시피마다 값이 달라 '정답'은 없으므로, 작은 실험으로 평가 점수를 비교해 정합니다.
- 평가: 목표 과제 점수와 함께, 원래 잘하던 일반 능력이 무너지지 않았는지 확인합니다(LLM 평가).
- 그다음 단계: SFT 뒤에 사람 선호로 다듬는 단계(RLHF · DPO)가 이어지는 경우가 많습니다(정렬 개요와 RLHF 파이프라인).
연습 문제
- 13B 모델을 혼합 정밀도 Adam으로 전체 미세조정할 때 모델 상태 메모리는?
- 풀이: 입니다(활성값 제외).
- 행렬에 LoRA를 달면 학습 파라미터는 몇 개이고 원래의 몇 %인가요?
- 풀이: 개, 입니다.
- LoRA에서 를 0으로 초기화하는 이유는?
- 풀이: 시작 시점에 이 되어 미세조정 전 모델과 출력이 똑같이 출발하기 때문입니다. 학습이 원래 모델에서 조금씩 벗어나는 방향으로 진행됩니다.
- SFT 예제에서 응답 토큰 확률이 일 때 손실은?
- 풀이: 입니다.
스스로 점검
- 사내 규정 문서를 모델이 "알게" 하려고 미세조정부터 하는 것이 대개 좋은 선택이 아닌 이유는?
- 답: 지식은 문서가 바뀔 때마다 다시 학습해야 하고 출처를 보여 주기 어렵습니다. 자료를 검색해 넣어 주는 RAG가 갱신 · 근거 제시 면에서 대개 유리합니다.
- LoRA가 추론 속도를 늦추지 않는 이유는?
- 답: 학습이 끝나면 를 에 더해 하나의 행렬로 합칠 수 있어, 추론 때 추가 계산이 없기 때문입니다.
- QLoRA에서 4비트로 저장하는 것과 16비트로 두는 것은 각각 무엇인가요?
- 답: 얼려 둔 기반 모델 가중치는 4비트(NF4)로, 학습하는 LoRA 행렬은 16비트로 둡니다.
용어 정리
| 용어 | 쉬운 뜻 |
|---|---|
| 미세조정(fine-tuning) | 사전학습 모델을 원하는 데이터로 추가 학습하는 것 |
| 지시 미세조정(SFT) | (지시, 좋은 응답) 쌍으로 학습해 지시를 따르게 하는 것 |
| 채팅 템플릿 | 역할(시스템 · 사용자 · 어시스턴트)을 구분하는 정해진 입력 형식 |
| 손실 마스킹 | 응답 토큰에만 손실을 거는 것 |
| 전체 미세조정 | 모든 가중치를 갱신하는 방식 |
| 파라미터 효율 미세조정(PEFT) | 일부 파라미터만 학습하는 방식들의 총칭 |
| LoRA | 가중치 변화량을 낮은 랭크 행렬 두 개의 곱으로 배우는 방식 |
| 랭크(rank) | 행렬이 표현하는 독립된 방향의 개수 |
| QLoRA | 4비트 양자화한 기반 모델 위에 LoRA를 학습하는 방식 |
| 치명적 망각 | 새 데이터로 학습하다 원래 능력을 잃는 현상 |
더 깊이 보려면
- LoRA: 저차원 적응으로 대형 모델 미세조정
- QLoRA: 양자화한 LLM 효율적으로 미세조정
- 사람 피드백으로 지시를 따르게 학습하기 (InstructGPT) — SFT 다음 단계까지 포함한 전체 과정
- Hugging Face LLM 강좌 11장(채팅 템플릿 · SFT · LoRA · 평가): huggingface.co/learn/llm-course/chapter11…
다음에 볼 것
- LLM 평가: 벤치마크 · pass@k · LLM 심판 · 데이터 오염 — 미세조정한 모델이 정말 나아졌는지 재는 법
- 정렬 개요와 RLHF 파이프라인 — SFT 다음에 오는 선호 학습
라이선스
본문은 KAITABASE 자체 해설입니다. 참고 자료 Hugging Face LLM Course는 Apache 2.0으로 공개되어 있습니다. 논문 수치는 각 원문에서 확인한 것만 옮겼고, 행렬 · 메모리 계산은 해설용 예로 파이썬으로 검산했습니다.
출처
- Wei 외, Finetuned Language Models Are Zero-Shot Learners (FLAN, 2021): arxiv.org/abs/2109.01652
- Wang 외, Self-Instruct (2022): arxiv.org/abs/2212.10560
- Zhou 외, LIMA: Less Is More for Alignment (2023): arxiv.org/abs/2305.11206
- Hu 외, LoRA: Low-Rank Adaptation of Large Language Models (2021): arxiv.org/abs/2106.09685
- Dettmers 외, QLoRA: Efficient Finetuning of Quantized LLMs (2023): arxiv.org/abs/2305.14314
- Rajbhandari 외, ZeRO: Memory Optimizations Toward Training Trillion Parameter Models (2019): arxiv.org/abs/1910.02054
- Hugging Face LLM Course 11장: huggingface.co/learn/llm-course/chapter11…
AI 원리부터 이해하기 · LLM 활용·에이전트 모듈
LLM 활용·에이전트 모듈 학습
이 글은 LLM 활용·에이전트 모듈의 학습 자료입니다. 전체 19개 자료 중 6번째입니다.
출처·원문
원문 보기요약만