PART 9 · 강의 3/3
파인튜닝 실전
실제 파인튜닝 워크플로우와 트러블슈팅
01
파인튜닝 워크플로우
단계별 실전 가이드
1
목표 정의
무엇을 개선하고 싶은지 명확히 정의합니다.
스타일 변경? 특정 태스크? 도메인 적응?
프롬프팅으로 해결 가능한지 먼저 확인하세요.
2
데이터 수집 및 준비
고품질 학습 데이터 수집. 최소 수백~수천 개.
형식 통일, 정제, Train/Val/Test 분할.
3
베이스 모델 선택
태스크와 리소스에 맞는 모델 선택.
7B 모델이 많은 경우 충분히 좋은 성능.
4
학습 실행
하이퍼파라미터 설정 후 학습 시작.
Loss 모니터링, 체크포인트 저장.
5
평가 및 반복
Validation 성능 확인, 샘플 출력 검토.
필요시 하이퍼파라미터 조정 후 재학습.
6
배포
최종 모델 또는 어댑터 배포.
추론 최적화 (양자화, vLLM 등) 적용.
02
코드 예시 (QLoRA + Hugging Face)
실전 파인튜닝 코드
📦 환경 설정 및 모델 로딩
from transformers import AutoModelForCausalLM, AutoTokenizer
from transformers import BitsAndBytesConfig, TrainingArguments
from peft import LoraConfig, get_peft_model
from trl import SFTTrainer
import torch
# 4bit 양자화 설정
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.bfloat16,
bnb_4bit_use_double_quant=True,
)
# 모델 로드
model_name = "meta-llama/Llama-2-7b-hf"
model = AutoModelForCausalLM.from_pretrained(
model_name,
quantization_config=bnb_config,
device_map="auto",
)
tokenizer = AutoTokenizer.from_pretrained(model_name)
⚡ LoRA 설정 및 적용
# LoRA 설정
lora_config = LoraConfig(
r=16, # rank
lora_alpha=32, # 스케일링 (보통 2*r)
target_modules=[
"q_proj", "k_proj", "v_proj", "o_proj",
"gate_proj", "up_proj", "down_proj"
],
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM",
)
# LoRA 적용
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()
# trainable params: 33,554,432 (0.19%)
🚀 학습 실행
# 학습 설정
training_args = TrainingArguments(
output_dir="./output",
num_train_epochs=3,
per_device_train_batch_size=4,
gradient_accumulation_steps=4,
learning_rate=2e-4,
warmup_ratio=0.03,
logging_steps=10,
save_strategy="epoch",
fp16=True,
)
# SFT Trainer로 학습
trainer = SFTTrainer(
model=model,
args=training_args,
train_dataset=train_dataset,
tokenizer=tokenizer,
max_seq_length=512,
)
trainer.train()
03
핵심 하이퍼파라미터
권장 설정값
| 파라미터 | 권장 값 | 설명 |
|---|---|---|
| learning_rate | 1e-4 ~ 5e-4 | LoRA는 Full FT보다 높은 학습률 사용 |
| num_epochs | 1 ~ 3 | 과적합 방지. 작은 데이터셋은 1-2 에폭 |
| batch_size | 4 ~ 16 | 메모리 한도 내 최대값. gradient_accum으로 보완 |
| warmup_ratio | 0.03 ~ 0.1 | 초기 학습률 증가 구간 |
| lora_r | 8 ~ 64 | 16-32가 일반적으로 좋은 균형 |
| max_seq_length | 512 ~ 2048 | 데이터 길이에 맞게. 메모리 고려 |
04
데이터 준비 체크리스트
학습 전 필수 확인 사항
형식 통일
모든 데이터가 같은 JSON/JSONL 형식
품질 검증
오타, 불완전한 응답, 잘못된 정보 제거
다양성 확보
다양한 유형의 입력과 응답 포함
길이 확인
max_seq_length 초과 데이터 처리
분할 완료
Train 80% / Val 10% / Test 10%
셔플링
데이터 순서 랜덤화
05
학습 모니터링
주요 관찰 지표
Train Loss
↓ 감소
Val Loss
↓ 유지
학습률
스케줄
GPU 메모리
안정
⚠️ 과적합 징후
- Train Loss는 계속 감소하는데 Val Loss가 증가
- 학습 데이터와 비슷한 입력에만 잘 답함
- 새로운 입력에 대해 이상한 응답 생성
해결: 에폭 수 감소, Dropout 증가, 데이터 증강
06
문제 해결 가이드
자주 발생하는 문제와 해결책
CUDA Out of Memory (OOM)
해결:
- batch_size 줄이기 (gradient_accumulation으로 보완)
- max_seq_length 줄이기
- QLoRA 사용 (4bit 양자화)
- gradient_checkpointing 활성화
Loss가 감소하지 않음
해결:
- 학습률 증가 (LoRA는 1e-4 ~ 5e-4)
- 데이터 형식 확인 (토큰화가 제대로 되었는지)
- target_modules 확인
- warmup 구간 조정
파인튜닝 후 성능 저하
해결:
- 데이터 품질 점검 (garbage in, garbage out)
- 에폭 수 줄이기 (과적합)
- 학습률 낮추기
- 더 다양한 데이터 추가
반복적인 출력 생성
해결:
- 추론 시 Temperature 높이기 (0.7-1.0)
- Repetition penalty 적용
- 학습 데이터에서 반복 패턴 확인
07
파인튜닝 플랫폼 선택
상황에 맞는 도구 선택
🤗
Hugging Face
오픈소스, 유연함
자체 GPU 필요
자체 GPU 필요
🌐
OpenAI
GPT-3.5 FT
가장 간단함
가장 간단함
⚡
Together AI
Llama, Mistral
API + 호스팅
API + 호스팅
🔥
Axolotl
오픈소스 도구
다양한 기법
다양한 기법
☁️
Lambda Labs
GPU 클라우드
시간당 과금
시간당 과금
📊
W&B
실험 추적
모니터링
모니터링
SUMMARY
핵심 요약
- 워크플로우 — 목표 정의 → 데이터 준비 → 학습 → 평가 → 배포
- 데이터 품질이 성공의 핵심 (형식 통일, 품질 검증, 다양성)
- 모니터링 — Train/Val Loss 추적, 과적합 감지
- 트러블슈팅 — OOM, Loss 정체, 성능 저하 대응 방법 숙지
- 상황에 맞는 플랫폼 선택 (간편함 vs 유연성 vs 비용)