13. LLaMA 파인튜닝
개요
EulerForge는 LLaMA 계열 모델을 네이티브로 지원합니다. backbone: llama 설정으로 LLaMA 2/3, TinyLlama, Mistral(dense) 등의 모델에 동일한 인젝션 전략과 훈련 방식을 적용할 수 있습니다.
이 튜토리얼에서는 두 가지 대표적인 조합을 다룹니다:
| 모델 | 훈련 타입 | 프리셋 |
|---|---|---|
| Meta Llama-3.2-1B | SFT | configs/presets/llama3_1b_dense_lora_sft.yml |
| TinyLlama-1.1B-Chat | DPO | configs/presets/tinyllama_1.1b_dense_lora_dpo.yml |
1. LLaMA 백본 어댑터
backbone: llama를 설정하면 LlamaAdapter가 자동 선택됩니다.
호환 모델
| 모델 | HuggingFace ID | 파라미터 |
|---|---|---|
| Llama 3.2 1B | meta-llama/Llama-3.2-1B |
1.24B |
| Llama 3.2 3B | meta-llama/Llama-3.2-3B |
3.21B |
| Llama 3.1 8B | meta-llama/Llama-3.1-8B |
8.03B |
| TinyLlama 1.1B Chat | TinyLlama/TinyLlama-1.1B-Chat-v1.0 |
1.10B |
| Mistral 7B (dense) | mistralai/Mistral-7B-v0.3 |
7.24B |
참고: Mixtral(MoE)은
backbone: mixtral을 사용합니다.backbone: llama는 dense 아키텍처 전용입니다.
Qwen3와의 구조 비교
| 항목 | Qwen3 | LLaMA |
|---|---|---|
| FFN 프로젝션 | gate_proj, up_proj, down_proj |
gate_proj, up_proj, down_proj |
| 어텐션 프로젝션 | q_proj, k_proj, v_proj, o_proj |
q_proj, k_proj, v_proj, o_proj |
backbone 값 |
qwen3 |
llama |
target_keywords |
동일 | 동일 |
FFN과 어텐션 프로젝션 이름이 동일하므로, injection 섹션의 설정은 Qwen3 프리셋과 완전히 같습니다. 차이는 backbone과 model_name뿐입니다.
2. 프리셋 A: Llama-3.2-1B SFT
설정 파일
configs/presets/llama3_1b_dense_lora_sft.yml:
device: cuda:0
backbone: llama
model_name: meta-llama/Llama-3.2-1B
injection:
strategy: dense_lora
lora_r: 48
lora_alpha: 96
lora_dropout: 0.05
target_keywords: [gate_proj, up_proj, down_proj]
start_layer: 0
num_layers: 0 # 0 = all layers
attn_lora:
enabled: true
keywords: [q_proj, v_proj]
training:
type: sft
phases:
- step: 0
trainable: ["lora", "attn_lora"]
lr: 1.0e-5
weight_decay: 0.01
warmup_steps: 200
max_train_steps: 5000
batch_size: 4
grad_accum_steps: 4
max_grad_norm: 1.0
log_steps: 50
save_steps: 1000
val_steps: 500
핵심 포인트
backbone: llama: LlamaAdapter 사용 (Llama 2/3 모두 호환)model_name: meta-llama/Llama-3.2-1B: Llama 3.2 1B Base 모델dense_lora+ 단일 페이즈: 가장 단순한 LoRA 구성- 훈련 가능 파라미터: ~28.7M (LoRA 파라미터만)
실행
# 프리플라이트 검사
eulerforge train --preset configs/presets/llama3_1b_dense_lora_sft.yml --preflight
# SFT 훈련
eulerforge train --preset configs/presets/llama3_1b_dense_lora_sft.yml \
--set data.format=raw \
--set data.task=sft \
--set data.path=data/sft_10k_raw.jsonl \
--set data.max_length=512
3. 프리셋 B: TinyLlama-1.1B-Chat DPO
설정 파일
configs/presets/tinyllama_1.1b_dense_lora_dpo.yml:
device: cuda:0
backbone: llama
model_name: TinyLlama/TinyLlama-1.1B-Chat-v1.0
injection:
strategy: dense_lora
lora_r: 48
lora_alpha: 96
lora_dropout: 0.05
target_keywords: [gate_proj, up_proj, down_proj]
start_layer: 0
num_layers: 0 # 0 = all layers
attn_lora:
enabled: true
keywords: [q_proj, v_proj]
training:
type: dpo
dpo_beta: 0.1
phases:
- step: 0
trainable: ["lora", "attn_lora"]
lr: 5.0e-6
weight_decay: 0.01
warmup_steps: 100
max_train_steps: 5000
batch_size: 2
grad_accum_steps: 8
max_grad_norm: 1.0
log_steps: 50
save_steps: 1000
val_steps: 500
SFT 프리셋과의 차이
-model_name: meta-llama/Llama-3.2-1B
+model_name: TinyLlama/TinyLlama-1.1B-Chat-v1.0
training:
- type: sft
+ type: dpo
+ dpo_beta: 0.1
- lr: 1.0e-5
+ lr: 5.0e-6
- warmup_steps: 200
+ warmup_steps: 100
- batch_size: 4
+ batch_size: 2
- grad_accum_steps: 4
+ grad_accum_steps: 8
| 변경 | 이유 |
|---|---|
type: dpo |
DPO 손실 함수 + 참조 모델 로직 |
dpo_beta: 0.1 |
선호 강도 파라미터 |
lr 절반 |
DPO는 이미 학습된 모델 미세 조정 |
batch_size 절반 |
DPO는 chosen+rejected 2배 토큰 처리 |
grad_accum_steps 2배 |
유효 배치 크기 유지 (2×8 ≈ 4×4) |
핵심 포인트
- TinyLlama-1.1B-Chat: Llama 2 아키텍처 기반,
backbone: llama동일 - Chat 모델: SFT가 이미 적용된 모델 → DPO로 추가 정렬에 적합
- 훈련 가능 파라미터: ~31.1M
실행
# 프리플라이트 검사
eulerforge train --preset configs/presets/tinyllama_1.1b_dense_lora_dpo.yml --preflight
# DPO 훈련
eulerforge train --preset configs/presets/tinyllama_1.1b_dense_lora_dpo.yml \
--set data.format=raw \
--set data.task=prompted_preference \
--set data.path=data/dpo_10k_raw.jsonl \
--set data.max_length=512
4. SFT → DPO 파이프라인
LLaMA 모델에서 SFT를 먼저 수행하고 DPO로 이어가는 전형적인 파이프라인입니다.
단계 1: SFT 훈련
eulerforge train --preset configs/presets/llama3_1b_dense_lora_sft.yml \
--set data.format=raw \
--set data.task=sft \
--set data.path=data/sft_10k_raw.jsonl \
--set data.max_length=512
# → outputs/run_YYYYMMDD_HHMMSS/ 에 체크포인트 저장
단계 2: DPO 훈련 (SFT 체크포인트에서 시작)
# TinyLlama DPO 프리셋에서 model_name만 SFT 체크포인트로 오버라이드
eulerforge train --preset configs/presets/tinyllama_1.1b_dense_lora_dpo.yml \
--set model_name=outputs/run_YYYYMMDD_HHMMSS/checkpoint_final \
--set data.format=raw \
--set data.task=prompted_preference \
--set data.path=data/dpo_10k_raw.jsonl \
--set data.max_length=512
참고: SFT와 DPO에 같은 모델을 사용할 수도 있고, 다른 LLaMA 모델을 사용할 수도 있습니다.
model_name만 변경하면 됩니다.
5. 하이퍼파라미터 조정
LoRA 파라미터
# lora_r 감소 (메모리 절약, 파라미터 수 감소)
eulerforge train --preset configs/presets/llama3_1b_dense_lora_sft.yml \
--set injection.lora_r=16 \
--set injection.lora_alpha=32 \
--set data.format=raw --set data.task=sft \
--set data.path=data/sft_10k_raw.jsonl --set data.max_length=512
DPO beta 조정
# 보수적 정렬 (참조 모델에 가깝게 유지)
eulerforge train --preset configs/presets/tinyllama_1.1b_dense_lora_dpo.yml \
--set training.dpo_beta=0.05 \
--set data.format=raw --set data.task=prompted_preference \
--set data.path=data/dpo_10k_raw.jsonl --set data.max_length=512
레이어 범위 제한
# 후반 8개 레이어만 LoRA 적용 (Llama-3.2-1B = 16 레이어)
eulerforge train --preset configs/presets/llama3_1b_dense_lora_sft.yml \
--set injection.start_layer=8 \
--set injection.num_layers=8 \
--set data.format=raw --set data.task=sft \
--set data.path=data/sft_10k_raw.jsonl --set data.max_length=512
6. 벤치마크
훈련 후 eulerforge bench로 결과를 평가할 수 있습니다.
Target-only (SFT 결과 확인)
eulerforge bench --preset configs/bench/sft_target_only.yml \
--set bench.models.target.provider=local_hf \
--set bench.models.target.model=null \
--target-output-dir outputs/run_YYYYMMDD_HHMMSS \
--checkpoint final
Pairwise 비교 (DPO 전후 비교)
eulerforge bench --preset configs/bench/preference_pairwise.yml \
--set bench.models.target.provider=local_hf \
--set bench.models.target.model=null \
--target-output-dir outputs/run_YYYYMMDD_HHMMSS \
--checkpoint final
7. 트러블슈팅
| 증상 | 원인 | 해결 |
|---|---|---|
backbone 'llama' not found |
LlamaAdapter 미등록 | EulerForge 최신 버전 확인 |
| OOM (메모리 부족) | LLaMA 1B도 LoRA+DPO에 VRAM 필요 | batch_size 감소, lora_r 감소, model.load_precision.mode: int4 추가 |
| SFT loss가 0으로 수렴하지 않음 | max_length가 너무 짧아 데이터 잘림 |
data.max_length 증가 (512 → 1024) |
DPO accuracy가 0.5에서 변하지 않음 |
dpo_beta가 너무 작거나 데이터 품질 문제 |
dpo_beta 증가 또는 데이터 확인 |
model_name 다운로드 실패 |
HuggingFace 액세스 제한 | huggingface-cli login 실행, 모델 라이선스 동의 확인 |
다음 단계
- SFT 상세: Plain LoRA 튜토리얼
- DPO 상세: DPO 훈련 가이드
- 다른 전략 결합: LoRA MoE, FFN MoE Expert LoRA
- 벤치마크 상세: Bench 가이드
- Grid Search로 하이퍼파라미터 최적화: Grid Search 가이드