파인튜닝 및 전이학습: 모델 학습 가이드
파인튜닝은 사전 학습된 모델을 특정 작업 또는 도메인에 맞게 최적화하는 과정입니다. 올바른 파인튜닝 전략을 적용하면 엔터프라이즈 AI 솔루션에서 최대 40%까지 성능 향상을 달성할 수 있습니다.
전이학습 기본 개념
전이학습은 한 작업에서 학습된 지식을 다른 작업에 이전하는 것입니다.
전이학습의 장점
- 데이터 효율성: 적은 데이터로도 좋은 결과
- 시간 절약: 처음부터 학습하는 것보다 훨씬 빠름
- 비용 절감: 적은 컴퓨팅 자원
- 성능 향상: 사전 학습된 지식 활용
사전 학습 vs 파인튜닝
1Pre-training: 2- Large, general dataset (TBs) 3- Learning general language/task understanding 4- Training takes months 5- Cost in millions of dollars 6 7Fine-tuning: 8- Small, domain-specific dataset (MB-GB) 9- Specific task adaptation 10- Training takes hours-days 11- Cost in thousands of dollars
Full Fine-Tuning
모든 모델 파라미터를 업데이트하는 방식.
장점
- 최대 적응 능력
- 가장 높은 잠재 성능
단점
- 높은 메모리 요구량
- Catastrophic forgetting 위험
- 작업별로 별도의 모델 복사본 필요
하드웨어 요구사항
| Model Size | GPU Memory (FP32) | GPU Memory (FP16) |
|---|---|---|
| 7B | 28 GB | 14 GB |
| 13B | 52 GB | 26 GB |
| 70B | 280 GB | 140 GB |
파라미터 효율적 파인튜닝 (PEFT)
모델의 일부분 파라미터만 업데이트하는 방식.
PEFT 장점
- 메모리 효율성: 90% 이상 절감
- 속도: 더 빠른 학습
- 모듈성: 하나의 기본 모델로 여러 어댑터 사용 가능
- Catastrophic Forgetting: 위험 최소화
LoRA (Low-Rank Adaptation)
가장 널리 사용되는 PEFT 방식.
LoRA 이론
저랭크 행렬을 사용하여 가중치 행렬을 근사적으로 업데이트:
1W' = W + ΔW = W + BA 2 3Where: 4- W: Original weight matrix (d × k) 5- B: Low-rank matrix (d × r) 6- A: Low-rank matrix (r × k) 7- r: Rank (typical: 8-64)
파라미터 절감
1Original: d × k parameters 2LoRA: r × (d + k) parameters 3 4Example (d=4096, k=4096, r=16): 5Original: 16.7M parameters 6LoRA: 131K parameters 7Savings: ~127x
LoRA 구성
1from peft import LoraConfig, get_peft_model 2 3config = LoraConfig( 4 r=16, # Rank 5 lora_alpha=32, # Scaling factor 6 target_modules=[ # Which layers to apply 7 "q_proj", 8 "k_proj", 9 "v_proj", 10 "o_proj" 11 ], 12 lora_dropout=0.05, 13 bias="none", 14 task_type="CAUSAL_LM" 15) 16 17model = get_peft_model(base_model, config)
LoRA 하이퍼파라미터
Rank (r):
- 낮음 (4-8): 단순 작업, 데이터 적음
- 중간 (16-32): 일반적 용도
- 높음 (64-128): 복잡한 적응
Alpha:
- 일반적으로 alpha = 2 × r
Target Modules:
- Attention 레이어: q_proj, k_proj, v_proj, o_proj
- MLP 레이어: gate_proj, up_proj, down_proj
QLoRA (Quantized LoRA)
LoRA + 4-bit 양자화를 결합한 방식.
QLoRA 특징
- 4-bit NormalFloat (NF4): 맞춤형 양자화 포맷
- Double Quantization: 양자화 상수까지 양자화
- Paged Optimizers: GPU 메모리 초과 방지 관리
QLoRA 메모리 비교
| Method | 7B Model | 70B Model |
|---|---|---|
| Full FT (FP32) | 28 GB | 280 GB |
| Full FT (FP16) | 14 GB | 140 GB |
| LoRA (FP16) | 12 GB | 120 GB |
| QLoRA (4-bit) | 6 GB | 48 GB |
QLoRA 구현
1from transformers import BitsAndBytesConfig 2import torch 3 4bnb_config = BitsAndBytesConfig( 5 load_in_4bit=True, 6 bnb_4bit_use_double_quant=True, 7 bnb_4bit_quant_type="nf4", 8 bnb_4bit_compute_dtype=torch.bfloat16 9) 10 11model = AutoModelForCausalLM.from_pretrained( 12 "meta-llama/Llama-2-7b-hf", 13 quantization_config=bnb_config, 14 device_map="auto" 15) 16## 기타 PEFT 방법 17 18### Prefix Tuning 19 20입력 임베딩에 학습 가능한 프리픽스를 추가합니다: 21
Input: [PREFIX_1, PREFIX_2, ..., PREFIX_N, token_1, token_2, ...]
1 2### Prompt Tuning 3 4Soft prompt를 학습합니다: 5
[SOFT_PROMPT] + "Actual input text"
1 2### Adapter Layers 3 4Transformer 레이어 사이에 작은 네트워크를 추가합니다: 5
Attention → Adapter → LayerNorm → FFN → Adapter → LayerNorm
1 2### (IA)³ - Infused Adapter 3 4활성값을 학습된 벡터와 곱합니다: 5
output = activation × learned_vector
1 2## 데이터 준비 3 4### 데이터 형식 5 6**Instruction 형식:** 7```json 8{ 9 "instruction": "Summarize this text", 10 "input": "Long text...", 11 "output": "Summary..." 12}
Chat 형식:
1{ 2 "messages": [ 3 {"role": "system", "content": "You are a helpful assistant"}, 4 {"role": "user", "content": "Question..."}, 5 {"role": "assistant", "content": "Answer..."} 6 ] 7}
데이터 품질
좋은 데이터의 특징:
- 다양성 (다양한 예시)
- 일관성 (일관된 형식)
- 정확성 (정확한 레이블)
- 충분한 양 (일반적으로 1K–100K 예시)
데이터 증강
1# Paraphrasing 2augmented_data = paraphrase(original_data) 3 4# Back-translation 5translated = translate(text, "tr") 6back_translated = translate(translated, "en") 7 8# Synonym replacement 9augmented = replace_synonyms(text)
학습 전략
하이퍼파라미터 선택
1training_args = TrainingArguments( 2 learning_rate=2e-4, # Typical for LoRA 3 num_train_epochs=3, 4 per_device_train_batch_size=4, 5 gradient_accumulation_steps=4, 6 warmup_ratio=0.03, 7 lr_scheduler_type="cosine", 8 fp16=True, 9 logging_steps=10, 10 save_strategy="epoch", 11 evaluation_strategy="epoch" 12)
Learning Rate
- Full fine-tuning: 1e-5 - 5e-5
- LoRA: 1e-4 - 3e-4
- QLoRA: 2e-4 - 5e-4
Regularization
1# Weight decay 2weight_decay=0.01 3 4# Dropout 5lora_dropout=0.05 6 7# Gradient clipping 8max_grad_norm=1.0
평가 및 검증
메트릭
Perplexity:
PPL = exp(average cross-entropy loss) Lower = better
BLEU/ROUGE: 텍스트 생성 품질
Task-specific: Accuracy, F1, custom metrics
오버피팅 감지
1Train loss ↓ + Validation loss ↑ = Overfitting 2 3Solutions: 4- Early stopping 5- More dropout 6- Data augmentation 7- Fewer epochs
배포
모델 병합
LoRA 어댑터를 기반 모델에 병합:
merged_model = model.merge_and_unload() merged_model.save_pretrained("merged_model")
Multi-Adapter 서빙
하나의 기본 모델로 여러 어댑터를 사용:
1from peft import PeftModel 2 3base_model = AutoModelForCausalLM.from_pretrained("base") 4model_a = PeftModel.from_pretrained(base_model, "adapter_a") 5model_b = PeftModel.from_pretrained(base_model, "adapter_b")
엔터프라이즈 파인튜닝 파이프라인
1┌─────────────┐ ┌─────────────┐ ┌─────────────┐ 2│ Data │────▶│ Training │────▶│ Evaluation │ 3│ Preparation │ │ (LoRA/QLoRA)│ │ & Testing │ 4└─────────────┘ └─────────────┘ └──────┬──────┘ 5 │ 6 ┌─────────────┐ ┌──────▼──────┐ 7 │ Production │◀────│ Model │ 8 │ Deployment │ │ Registry │ 9 └─────────────┘ └─────────────┘
일반적인 문제와 해결책
1. 메모리 부족
해결: QLoRA, gradient checkpointing, batch size 감소
2. Catastrophic Forgetting
해결: 낮은 learning rate, replay buffer, elastic weight consolidation
3. 오버피팅
해결: 더 많은 데이터, regularization, early stopping
4. 일반화 성능 저하
해결: 데이터 다양성 증가, instruction 다양성 증가
결론
파인튜닝은 사전 학습된 모델을 엔터프라이즈 요구사항에 맞게 적응시키는 가장 효과적인 방법입니다. LoRA와 QLoRA와 같은 PEFT 방식을 사용하면 제한된 리소스만으로도 강력한 커스터마이징이 가능합니다.
Veni AI는 엔터프라이즈 파인튜닝 프로젝트를 위한 컨설팅 및 구현 서비스를 제공합니다. 필요한 사항이 있으시면 언제든지 문의하십시오.
