> EulerForge > 튜토리얼 > 13. LLaMA 파인튜닝

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 프리셋과 완전히 같습니다. 차이는 backbonemodel_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

핵심 포인트

실행

# 프리플라이트 검사
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)

핵심 포인트

실행

# 프리플라이트 검사
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 실행, 모델 라이선스 동의 확인

다음 단계