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 필요
OpenAI
GPT-3.5 FT
가장 간단함
Together AI
Llama, Mistral
API + 호스팅
Axolotl
오픈소스 도구
다양한 기법
Lambda Labs
GPU 클라우드
시간당 과금
W&B
실험 추적
모니터링
SUMMARY

핵심 요약

  • 워크플로우 — 목표 정의 → 데이터 준비 → 학습 → 평가 → 배포
  • 데이터 품질이 성공의 핵심 (형식 통일, 품질 검증, 다양성)
  • 모니터링 — Train/Val Loss 추적, 과적합 감지
  • 트러블슈팅 — OOM, Loss 정체, 성능 저하 대응 방법 숙지
  • 상황에 맞는 플랫폼 선택 (간편함 vs 유연성 vs 비용)