SFT ํ์ดํผํ๋ผ๋ฏธํฐ ๋ถ์ & ๋ค์ ํ๋ ์ต์ ์กฐ์ฌ
์์ฑ์ผ: 2026-02-26
๋ชจ๋ธ: korean_1b_sft (1.19B params, base: korean_1b_fp8_run1/checkpoint-0034000)
ํ์ต: 5000 steps, 39๋ถ, 8ร B200
1. Loss Curve ๋ถ์
1-1. ๊ธฐ๋ณธ ํต๊ณ
| ๊ตฌ๊ฐ | Steps | n | Loss Mean | Loss Stdev | Loss Min | Loss Max | GNorm Mean |
|---|---|---|---|---|---|---|---|
| Warmup | 10โ150 | 15 | 2.3100 | 0.1144 | 2.1129 | 2.5229 | 1.414 |
| Post-warmup ์ ์ฒด | 160โ5000 | 485 | 1.9984 | 0.0942 | 1.7305 | 2.3413 | 1.133 |
| Q1 (์ด๊ธฐ) | 160โ1360 | 121 | 2.0698 | 0.0860 | 1.8850 | 2.3413 | 1.138 |
| Q2 (์ค๋ฐ1) | 1370โ2570 | 121 | 1.9915 | 0.0801 | 1.7960 | 2.2088 | 1.131 |
| Q3 (์ค๋ฐ2) | 2580โ3780 | 121 | 1.9583 | 0.0870 | 1.7384 | 2.1293 | 1.119 |
| Q4 (ํ๋ฐ) | 3790โ5000 | 122 | 1.9739 | 0.0835 | 1.7305 | 2.1635 | 1.142 |
1-2. 500-step ์ด๋ ํ๊ท Loss (ยฑ50 step ์๋์ฐ)
| Step | Loss(avg) | GNorm(avg) | ํด์ |
|---|---|---|---|
| ~500 | 2.0658 | 1.098 | ์ด๊ธฐ ํ๊ฐ ๋จ๊ณ |
| ~1000 | 2.0281 | 1.121 | ๋น ๋ฅธ ํ๊ฐ ์ง์ |
| ~1500 | 1.9663 | 1.092 | โ ์ต์ด <2.0 ์ง์ |
| ~2000 | 1.9802 | 1.158 | ์ํญ ๋ฐ๋ฑ (์ ์) |
| ~2500 | 1.9882 | 1.140 | ์์ ํ ๊ตฌ๊ฐ ์์ |
| ~3000 | 1.9628 | 1.083 | ์ต์ ์ ๊ทผ๋ฐฉ |
| ~3500 | 1.9668 | 1.151 | ์๋ ด ์ ํธ |
| ~4000 | 1.9679 | 1.161 | ๊ณ ์ ์ง์ |
| ~4500 | 1.9555 | 1.142 | ๋ฏธ์ธ ํ๊ฐ ์ง์ |
| ~5000 | 1.9718 | 1.195 | ์ต์ข : 1.9677 |
1-3. ํด์
Warmup ๊ตฌ๊ฐ (step 10โ150):
- LR์ด 1.33e-6 โ 2e-5๋ก ์ ํ ์ฆ๊ฐํ๋ ๋์ loss๊ฐ 2.11โ2.52 ๋ฒ์์์ ๋ถ๊ท์นํจ
- Warmup ์งํ step 160์์ loss spike (2.34, 3.6ฯ) ๋ฐ์ โ warmup ์ข ๋ฃ ์งํ full LR ์ถฉ๊ฒฉ. ์ ์์ ์ด๊ณ ํํ ํจํด
- Warmup 150 steps๋ ์ด 5000 steps์ 3% โ ์ ์
์ ์ ํ์ต ๊ตฌ๊ฐ (step 160โ5000):
- Loss๊ฐ Q1โQ3 ๊ตฌ๊ฐ์์ 2.07โ1.96์ผ๋ก ์ง์ ํ๊ฐ (์ด 0.11 ๊ฐ์)
- Q3โQ4๋ 1.958โ1.974์ผ๋ก ์คํ๋ ค ์ํญ ์์น โ cosine LR์ด ์ถฉ๋ถํ ๋ฎ์์ง๋ฉด์ ํ์ต ์๋ ์ ํ, ์๋ ด ์งํ
- ํ์คํธ์ฐจ 0.094๋ ์์ ์ (SFT ๊ธฐ์ค 0.05โ0.15 ์ ์ ๋ฒ์)
Outlier ๋ถ์:
- Mean+2ฯ = 2.187 ์ด๊ณผ: 10๊ฐ / 485 = 2.1% โ ์ ์ ์์ค
- ๋ชจ๋ ์ด๊ธฐ(step 160โ800)์ ์ง์ค + step 2190 1๊ฐ โ ๋ฐ์ดํฐ ๋ค์์ฑ์ ์ํ ์ ์ ๋ณ๋
- gnorm spike์ ๋๋ฐํ์ง ์์ gradient ํญ๋ฐ ์์
GNorm ํจํด:
- ์ ์ฒด ํ๊ท 1.13, max_grad_norm=1.0์ผ๋ก ์ค์ ๋์ด ์์ผ๋ ๋ก๊ทธ๊ฐ์ 0.89โ1.53
- ๋ก๊ทธ๋๋ gnorm์ clip ์ด์ ๊ฐ์ผ๋ก ์ถ์ ; ์ค์ 1.0 ์ด๊ณผ ์ clip ๋ฐ์
- Warmup ๊ตฌ๊ฐ(ํ๊ท 1.41)์ด ์ดํ(ํ๊ท 1.13)๋ณด๋ค ๋์ โ ์ ์ ํจํด
- ํ์ต ์ ๋ฐ์ ๊ฑธ์ณ ๊ฐ์ ์ถ์ธ (gnorm ์์ ํ = ํ์ต์ด ์๋ ด ์ค)
ํต์ฌ ๊ฒฐ๋ก : ํ์ต์ ๊ฑด๊ฐํ๊ฒ ์งํ๋จ. Step ~3000 ์ดํ ์๋ ด ์ ํธ๊ฐ ์์ผ๋ loss๋ ์ฌ์ ํ ๋ฏธ์ธ ํ๊ฐ ์ค. 5000 steps ์ข ๋ฃ ์์ ์ด ์ ์ ํ stopping point์๊ฑฐ๋ ์ถ๊ฐ ํ์ต ์ฌ์ง ์์.
2. ํ์ดํผํ๋ผ๋ฏธํฐ ์ํฅ ๋ถ์
2-1. Learning Rate: 2e-5 โ โ ์ ์ (์ ๊ณ ํ์ค ๋ฒ์)
| ๋ชจ๋ธ/ํ๋ ์์ํฌ | LR | ๊ท๋ชจ |
|---|---|---|
| Meta Alpaca (Llama 7B) | 2e-5 | 7B |
| WizardLM (Vicuna 13B) | 2e-5 | 13B |
| OpenHermes (Mistral 7B) | 2e-5 | 7B |
| LIMA (65B) | 1e-5 | 65B |
| TinyLlama SFT (1.1B) | 2e-5 | 1.1B |
| ํ์ฌ ์ค์ | 2e-5 | 1.2B |
- 1B ๊ท๋ชจ์์ 2e-5๋ ์ ๊ณ ํ์ค๊ฐ๊ณผ ์ ํํ ์ผ์น
- pretrain LR(2e-4)์ 1/10์ผ๋ก ์ค์ โ catastrophic forgetting ๋ฐฉ์ง ์์น ์ถฉ์กฑ
- ๋จ, ์ถ๊ฐ epoch ์์๋ 1e-5๋ก ๋ฎ์ถ๋ ๊ฒ์ด ์์
๊ฐ์ ๋ฐฉํฅ: ํ์ฌ ์ค์ ์ ์ง. 2์ฐจ ํ์ต ์ 1e-5 ์ถ์ฒ.
2-2. Cosine Decay ์ค์ผ์ค โ โ ์ ์ (๋จ, ์ต์ข LR ์ฝ๊ฐ ๋์)
- ์ต์ข LR: 2.00e-6 (peak์ 10%)
- ํ์ค cosine schedule: min_lr = 0.1 ร peak_lr
- 5000 steps์ ๋ง๋ ์ค์ : warmup 150 + cosine decay 4850 steps
- step 5000์์ LR์ด 2e-6์ผ๋ก ์์ฐ ์๋ ด โ ํ์ต์ด ๋ง๋ฌด๋ฆฌ๋ ๋๋
๊ฐ์ ๋ฐฉํฅ: min_lr์ 0 ๋๋ 1e-7๋ก ๋ฎ์ถ๋ฉด ๋ง์ง๋ง ๊ตฌ๊ฐ ๋ ์์ ์ ์๋ ด ๊ฐ๋ฅ. ํ์ฌ ์ค์ ๋ ๋ฌด๋ฐฉ.
2-3. Effective Batch Size: 64 sequences (=262K tokens/step) โ โ ์ ์
- 64 seqs ร ํ๊ท ~500 tokens (dynamic padding) โ 32,000 tokens/step ์ค์ ์ฒ๋ฆฌ๋
- max_seq_len=4096 ๊ธฐ์ค ์ด๋ก ๊ฐ์ 262,144 tok/step์ด์ง๋ง ๋์ ํจ๋ฉ์ผ๋ก ์ค์ ๋ ๋ฎ์
- SFT ๋ฐฐ์น ํฌ๊ธฐ ์ฐธ๊ณ : Alpaca=128 seqs, WizardLM=64 seqs, LIMA=64 seqs
- 64๋ ์ ๊ณ ํ์ค๊ฐ๊ณผ ์ ํ ์ผ์น
๊ฐ์ ๋ฐฉํฅ: ํ์ฌ ์ค์ ์ ์ง. ๋ฐฐ์น๊ฐ ๋๋ฌด ํฌ๋ฉด generalization ์ ํ ๊ฐ๋ฅ์ฑ ์์.
2-4. Epochs: ~2 epoch โ โ ๏ธ ๋ถ์กฑ ๊ฐ๋ฅ์ฑ (์์ ์ ํจ)
5000 steps ร 64 seqs = 320,000 ์์ ์ฒ๋ฆฌ / 159,000 ์ํ = ์ฝ 2.0 epoch
SFT ์ ๊ณ ๊ธฐ์ค:
- LIMA: 15 epoch (์๋ ๋ฐ์ดํฐ 1K๊ฐ)
- Alpaca, WizardLM: 3 epoch
- OpenHermes, Hermes: 3โ5 epoch
- ๋๊ท๋ชจ ๋ฐ์ดํฐ(>100K): 1โ3 epoch
2 epoch๋ ๊ณผ์ํ์ต ๊ฐ๋ฅ์ฑ ์์ (ํนํ ๋ฎ์ ๋น๋ ๋ฐ์ดํฐ ํจํด ํ์ต ๋ถ์กฑ)
Q4 loss(1.974)๊ฐ Q3(1.958)๋ณด๋ค ์ด์ง ๋์์ง ๊ฒ์ cosine LR ๊ฐ์ ํจ๊ณผ + ์์ง ์๋ ด ์ ์ผ ๊ฐ๋ฅ์ฑ ๊ณต์กด
Val loss๊ฐ ์์ด ๊ณผ์ ํฉ ์ฌ๋ถ ํ์ธ ๋ถ๊ฐ (โ eval_interval=100์ผ๋ก ์ค์ ์ ๋์ด ์์์ผ๋ ๊ฒฐ๊ณผ ์์)
๊ฐ์ ๋ฐฉํฅ: 3โ4 epoch (7500โ10000 steps) ์ถ๊ฐ ์คํ ๊ถ์ฅ. ๋จ val split ํ์ ํ๋ณด ํ ์งํ.
2-5. NEFTune alpha=10 โ โ ์ด ๋ฐ์ดํฐ์ ํฌ๊ธฐ์ ์ ํฉ
- ์๋ ผ๋ฌธ(Jain et al., 2023) ๊ถ์ฅ๊ฐ: ์๊ท๋ชจ(<10K) โ 5, ์ค๊ท๋ชจ(10Kโ500K) โ 10, ๋๊ท๋ชจ(>500K) โ 15
- 159K ์ํ โ alpha=10 ์ ํฉ
- Noise magnitude = alpha / sqrt(seq_len ร d_model) = 10 / sqrt(500 ร 2048) โ 0.0099
- ์ค์ embedding ๊ฐ ๋๋น ์ ์ ํ noise ๋น์จ
- Loss curve ์์ ์ฑ(stdev 0.094)์ผ๋ก ๋ณผ ๋ NEFTune์ด ํ์ต์ ๋ถ์์ ํ๊ฒ ๋ง๋ค์ง ์์์
๊ฐ์ ๋ฐฉํฅ: ํ์ฌ ์ค์ ์ ์ง. ๋ฐ์ดํฐ ์ฆ๊ฐ(500K+) ์ alpha=15๋ก ์ํฅ ๊ณ ๋ ค.
2-6. max_seq_len: 4096 โ โ ์ ์ (๋จ, ํ์ฉ๋ ํ์ธ ํ์)
- ์ค์ : max_seq_len=4096, dynamic padding ์ ์ฉ
- ํ๊ตญ์ด instruction ๋ฐ์ดํฐ ํ๊ท ๊ธธ์ด: 200โ1000 tokens (kullm/KoAlpaca ๊ธฐ์ค)
- Dynamic padding ๋๋ถ์ ์งง์ ์ํ์ค๋ค์ ์ค์ ๋ก 4096์ ์ฑ์ฐ์ง ์์ โ compute ํจ์จ์
- rope_theta=500000 (Llama-3 ์คํ์ผ) โ 4096 ์ด์ ์ธ์ฝ๋ ์ง์
์ ์ฌ ๋ฌธ์ :
- ๋ฐ์ดํฐ์ ์ 4096 ์ด๊ณผ ๋ํ๊ฐ ์๋ค๋ฉด truncation ๋ฐ์ โ ๊ธด multi-turn ๋ํ ์์ค
- ํ์ฌ ๋ฐ์ดํฐ์ (kullm, KoAlpaca, LIMA ๋ฑ)์ ๋๋ถ๋ถ 2048 ์ดํ์ด๋ฏ๋ก ์ค์ง์ ์ํฅ ์ ์
๊ฐ์ ๋ฐฉํฅ: ํ์ฌ ์ค์ ์ ์ง. ์ฅ๋ฌธ ๋ํ ๋ฐ์ดํฐ ์ถ๊ฐ ์ 8192 ๊ณ ๋ ค.
3. ๋ค์ ํ๋ ์ต์ ํ๋ณด๊ตฐ
A. ์ถ๊ฐ SFT Epoch (5000 โ 10000 steps, epoch 4)
Pros:
- ํ์ฌ loss๊ฐ ์ฌ์ ํ ํ๊ฐ ์ถ์ธ โ ์ถ๊ฐ ํ์ต ์ฌ์ง ์์
- epoch 3โ4๋ SFT ์ ๊ณ ํ์ค (Alpaca, WizardLM ๊ธฐ์ค)
- ๊ธฐ์กด ์ฒดํฌํฌ์ธํธ์์ resume ๊ฐ๋ฅ, 39๋ถ ์ถ๊ฐ๋ฉด ์ถฉ๋ถ (B200 ์๋ ๊ธฐ์ค)
- ๊ตฌํ ๊ฐ๋ฅ:
--resume checkpoints/korean_1b_sft/checkpoint-5000 --max_steps 10000
Cons:
- Val loss ์์ด ์งํ ์ ๊ณผ์ ํฉ ๊ฐ์ง ๋ถ๊ฐ
- cosine schedule์ด ์ด๋ฏธ step 5000 ๊ธฐ์ค์ผ๋ก ์ค๊ณ๋์ด ์์ โ resume ์ LR ์ค์ผ์ค ์ฌ์ค์ ํ์
- epoch 4 ์ดํ ๊ณผ์ ํฉ ์ํ (ํนํ ๋ฐ๋ณต ํจํด memorization)
์ถ์ฒ: โ ์กฐ๊ฑด๋ถ ์ถ์ฒ โ val split 5โ10% ํ๋ณด ํ, LR=1e-5๋ก ์ cosine schedule ์ค์ ํ์ฌ ์ถ๊ฐ ํ์ต. Resume๋ณด๋ค fresh start ๊ถ์ฅ.
๊ตฌ์ฒด์ ์ค์ :
max_steps: 5000 # ์ถ๊ฐ 5000 steps (epoch 3-4)
lr: 1.0e-5 # ์ด์ ์ ์ ๋ฐ
warmup_steps: 50 # ์งง์ warmup
B. LR ํ๋: 2e-5 vs 1e-5 vs 5e-6
| LR | ์ฅ์ | ๋จ์ | ์ถ์ฒ |
|---|---|---|---|
| 5e-6 | ๋งค์ฐ ์์ , ๊ณผ์ ํฉ ๋ฐฉ์ง | 5000 steps์์ ๊ฐ์ ํญ ์ ์ ์ ์์ | โ ๋๋ฌด ๋ณด์์ |
| 1e-5 | ๊ท ํ์กํ ์ ํ, 2์ฐจ ํ์ต ํ์ค | ํ์ฌ ๋๋น ํ์ต ์๋ ์ ๋ฐ | โ ์ถ์ฒ |
| 2e-5 (ํ์ฌ) | 1์ฐจ ํ์ต์์ ์ข์ ๊ฒฐ๊ณผ | ์ถ๊ฐ epoch์์ ๊ณผ์ ํฉ ์ํ | โ ๏ธ ์ถ๊ฐ ํ์ต์ ๋ถ๋ฆฌ |
๊ฒฐ๋ก : 2์ฐจ ํ์ต ์ lr=1e-5 ์ฌ์ฉ. ํ์ฌ lr=2e-5๋ 1์ฐจ ํ์ต์ ์ต์ .
C. ORPO (Odds Ratio Preference Optimization)
๊ฐ์: SFT + preference alignment์ ๋จ์ผ ๋จ๊ณ์์ ๋์ ์ํ. Reference model ๋ถํ์.
Pros:
- Reference model ์์ด ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ (DPO ๋๋น VRAM ์ฝ 40% ์ ์ฝ)
- SFT์ preference๋ฅผ ๋์์ ์ต์ ํ โ ๋ชจ๋ธ ํ์ง ์ ํ ์์ด alignment ๊ฐ๋ฅ
- 1-stage ํ์ดํ๋ผ์ธ โ ์ด์ ๋จ์ํ
trl๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ฝ๊ฒ ๊ตฌํ ๊ฐ๋ฅ
Cons:
- Chosen/rejected ์ ๋ฐ์ดํฐ ํ์ (ํ์ฌ ์์)
- ํ๊ตญ์ด preference ๋ฐ์ดํฐ ์ ํ์ง๊ฐ ์ ํ์
ํ๊ตญ์ด Preference ๋ฐ์ดํฐ ํํฉ (HuggingFace ๊ธฐ์ค):
| ๋ฐ์ดํฐ์ | ์ํ ์ | ํน์ง |
|---|---|---|
maywell/ko_Ultrafeedback |
~60K | UltraFeedback ํ๊ตญ์ด ๋ฒ์ญ |
ChuGyouk/korean-ultrafeedback-armorm |
~60K | ArmoRM ์ค์ฝ์ด ํฌํจ |
HAERAE-HUB/K2-Align |
~10K | ํ๊ตญ์ด RLHF alignment |
heegyu/KORANI-v1 |
~20K | Korean RANI (human feedback) |
trl-lib/ultrafeedback_binarized |
~60K | ์์ด (๋ฒ์ญ ํ์) |
์ถ์ฒ: โ
์ถ์ฒ โ maywell/ko_Ultrafeedback ๋๋ ChuGyouk/korean-ultrafeedback-armorm ํ๋ณด ํ TRL ORPOTrainer๋ก ๊ตฌํ. SFT ํ ORPO ์ ์ฉ ๋๋ from scratch ORPO ๋ชจ๋ ๊ฐ๋ฅ.
๊ตฌํ ์์:
from trl import ORPOConfig, ORPOTrainer
config = ORPOConfig(learning_rate=5e-7, num_train_epochs=1, ...)
trainer = ORPOTrainer(model, config, train_dataset=preference_data)
D. DPO (Direct Preference Optimization)
๊ฐ์: SFT ์๋ฃ ๋ชจ๋ธ ์์ preference alignment์ ์ถ๊ฐ ํ์ต. Reference model(=SFT ๋ชจ๋ธ frozen) ํ์.
vs ORPO:
| DPO | ORPO | |
|---|---|---|
| Reference model | ํ์ (VRAM +40%) | ๋ถํ์ |
| SFT ๋จ๊ณ | ๋ณ๋ ํ์ | ํตํฉ ๊ฐ๋ฅ |
| ์์ ์ฑ | ๊ฒ์ฆ๋ ๋ฐฉ๋ฒ | ์๋์ ์ผ๋ก ์ ๊ท |
| ๋ฐ์ดํฐ | chosen/rejected | chosen/rejected |
| ๊ตฌํ ๋ณต์ก๋ | ์ค๊ฐ | ๋ฎ์ |
Pros:
- ๊ฐ์ฅ ๋๋ฆฌ ๊ฒ์ฆ๋ preference optimization ๋ฐฉ๋ฒ
trl๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ ์ง์- Llama, Mistral ๊ธฐ๋ฐ ๋ชจ๋ ์ฃผ์ ๋ชจ๋ธ์ ์ ์ฉ๋จ
Cons:
- SFT ๋ชจ๋ธ์ reference๋ก ๋๊ณ ์ถ๊ฐ ํ์ต โ ๋ฉ๋ชจ๋ฆฌ 2๋ฐฐ (1.2B ร 2 = ~16GB, B200 192GB์์ ๋ฌด๋ฆฌ ์์)
- 2๋จ๊ณ ํ์ต ํ์ดํ๋ผ์ธ ๋ณต์ก์ฑ
์ถ์ฒ: โ ์ถ์ฒ โ ORPO๋ณด๋ค ๊ฒ์ฆ๋ ๋ฐฉ๋ฒ. B200 ร 8์์ ๋ฉ๋ชจ๋ฆฌ ์ด์ ์์. ORPO์ A/B ํ ์คํธ ๊ฐ์น ์์.
E. LoRA/QLoRA
๋งฅ๋ฝ: ์ด๋ฏธ full fine-tuning ์๋ฃ. LoRA์ ์ญํ ์?
Pros:
- ๋น ๋ฅธ ํ์ดํผํ๋ผ๋ฏธํฐ ์คํ (LR, epoch, alpha ์กฐํฉ): full FT ๋๋น 3-5x ๋น ๋ฆ
- ์ฌ๋ฌ adaptation ๋์ ๊ด๋ฆฌ (domain-specific LoRA weights)
- DPO/ORPO ๋จ๊ณ์์ adapter๋ง ํ์ต ๊ฐ๋ฅ
- VRAM ์ฌ์ฉ ์ ์ฝ โ batch size ์ฆ๊ฐ ๊ฐ๋ฅ
Cons:
- ์ด๋ฏธ full FT๋ ๋ชจ๋ธ์ด ์์ผ๋ฏ๋ก LoRA ์ฑ๋ฅ ์ํ โค full FT
- 1B ๋ชจ๋ธ์ ์ด๋ฏธ ์์์ QLoRA์ 4-bit quantization ์ด์ ์ด ํฌ์ง ์์
- Fine-tuning quality๋ full FT๊ฐ ํญ์ ์ฐ์ธ
์ถ์ฒ: โ ๏ธ ์กฐ๊ฑด๋ถ ์ถ์ฒ โ ํ์ดํผํ๋ผ๋ฏธํฐ ํ์(lr ๊ทธ๋ฆฌ๋์์น, epoch sweep)์ LoRA ํ์ฉ. ์ต์ข ๋ชจ๋ธ์ full FT.
์ค์ฉ์ ์ฌ์ฉ๋ฒ:
# ๋น ๋ฅธ ์คํ: LoRA rank=64๋ก LR ๊ทธ๋ฆฌ๋์์น
# rank=64, alpha=128, dropout=0.05
# ์ฝ 5-10๋ถ / ์คํ (B200 ๊ธฐ์ค)
F. ๋ฐ์ดํฐ ํ์ง ๊ฐ์
ํ์ฌ ๋ฐ์ดํฐ ๊ตฌ์ฑ:
- kullm: ๋๊ท๋ชจ ํ๊ตญ์ด instruction (ํ์ง ํผ์ฌ)
- KoAlpaca: Alpaca ํ๊ตญ์ด ๋ฒ์ญ (๋ฒ์ญ ํ์ง ์ด์)
- safe_conv: ์์ ๋ํ ๋ฐ์ดํฐ
- LIMA: ๊ณ ํ์ง ์์ด instruction (1000๊ฐ)
- evol_instruct: GPT-4 ์์ฑ (๊ณ ํ์ง)
- kovast: ํ๊ตญ์ด ๋ํ
๊ฐ์ ๋ฐฉํฅ:
Deduplication (MinHash LSH):
- instruction text์ ๋ํด locality-sensitive hashing
- ์์ ์ค๋ณต ์ ๊ฑฐ์จ: 5โ15% (159K โ 135โ150K ์ ๋)
- ํ์ง ํฅ์ ํจ๊ณผ: ์ค๋ณต ํจํด memorization ๋ฐฉ์ง
Quality Filtering:
- Perplexity ๊ธฐ๋ฐ ํํฐ: ๋๋ฌด ๋ฎ๊ฑฐ๋ ๋๋ฌด ๋์ perplexity ์ ๊ฑฐ
- ์ธ์ด ํ์ธ: ํ๊ตญ์ด ๋น์จ ์ฒดํฌ (
langdetect) - ๊ธธ์ด ํํฐ: ๋๋ฌด ์งง์ ์๋ต(<50 tokens) ์ ๊ฑฐ
- ๋ฐ๋ณต ํจํด ์ ๊ฑฐ:
n-gram repetition score๊ธฐ๋ฐ
Domain Mixing ์กฐ์ :
- LIMA-style: ์๋์ ๊ณ ํ์ง ๋ฐ์ดํฐ๊ฐ ๋๋์ ์ ํ์ง๋ณด๋ค ํจ๊ณผ์
- evol_instruct ๋น์จ โ (GPT-4 ์์ฑ์ด๋ฏ๋ก ๊ณ ํ์ง)
- ๋จ์ ๋ฒ์ญ ๋ฐ์ดํฐ(KoAlpaca) ๋น์จ โ
์ถ์ฒ: โ ๊ฐ๋ ฅ ์ถ์ฒ โ ๋ฐ์ดํฐ ํ์ง์ด epoch ์๋ณด๋ค ์ค์. 1์ฃผ์ผ ํฌ์๋ก ์ค์ง์ ์ฑ๋ฅ ํฅ์ ๊ธฐ๋.
G. ๋ ๋ง์ SFT ๋ฐ์ดํฐ (159K โ 500K+)
HuggingFace ์ถ๊ฐ ๊ฐ๋ฅ ๋ฐ์ดํฐ์ :
| ๋ฐ์ดํฐ์ | ์ํ ์ | ์ธ์ด | ํ์ง | ๋น๊ณ |
|---|---|---|---|---|
HAERAE-HUB/qarv-instruct-100k |
100K | ํ๊ตญ์ด | ์ค์ | ํ๊ตญ์ด instruction 100K |
nayohan/llama3-instruct-ko-dataset |
58K | ํ๊ตญ์ด | ์ | Llama-3 instruction ํ๊ตญ์ด |
hPark/orca-ko |
200K+ | ํ๊ตญ์ด | ์ | Orca ์คํ์ผ ํ๊ตญ์ด |
maywell/synatra-orca |
300K+ | ํ๊ตญ์ด | ์ | ํฉ์ฑ ๋ฐ์ดํฐ, ๊ณ ํ์ง |
FreedomIntelligence/evol-instruct-korean |
70K | ํ๊ตญ์ด | ์ | GPT-4 ์์ฑ ํ๊ตญ์ด |
Bingsu/ko_alpaca_data |
52K | ํ๊ตญ์ด | ์ค | Alpaca ํ๊ตญ์ด (๋ฒ์ญ) |
HAERAE-HUB/KoInstruct |
50K+ | ํ๊ตญ์ด | ์ค์ | ํ๊ตญ์ด instruction |
Open-Orca/OpenOrca |
1M+ | ์์ด | ์ต์ | ๊ณ ํ์ง ์์ด (ํ๊ตญ์ด ๋ชจ๋ธ์ ํผํฉ ๊ฐ๋ฅ) |
500K ๋ฌ์ฑ ๊ฒฝ๋ก:
- ํ์ฌ 159K
hPark/orca-ko+maywell/synatra-orca์ถ๊ฐ: +200K = 359KHAERAE-HUB/qarv-instruct-100k+nayohan/llama3-instruct-ko-dataset: +158K = 517K- ํ์ง ํํฐ ํ ์ ์ง ๋น์จ ~80% โ ์ฝ 400K ์ ๋ฐ์ดํฐ
Pros:
- ๋ ๋ง์ ๋๋ฉ์ธ ์ปค๋ฒ๋ฆฌ์ง
- ๋๋ฌธ ํจํด ํ์ต ๊ธฐํ ์ฆ๊ฐ
- Generalization ํฅ์
Cons:
- ๋ฐ์ดํฐ ํ์ง ๊ฒ์ฆ ํ์ (๋ฌด๋ถ๋ณ ์ถ๊ฐ๋ ์ญํจ๊ณผ)
- ํ์ต ์๊ฐ ์ฆ๊ฐ (๊ฐ์ epoch ๊ธฐ์ค 3๋ฐฐ โ 2์๊ฐ+)
- ๊ณ ํ์ง ์๋ vs ์ ํ์ง ๋ค๋ ํธ๋ ์ด๋์คํ
์ถ์ฒ: โ
์ถ์ฒ (ํ์ง ํํฐ ์ ์ ) โ hPark/orca-ko๋ maywell/synatra-orca ๊ฐ์ ๊ณ ํ์ง ํฉ์ฑ ๋ฐ์ดํฐ ์ฐ์ ์ถ๊ฐ. ๋จ์ ๋ฒ์ญ ๋ฐ์ดํฐ ๋น์จ ์ฃผ์.
4. ์ฆ์ ์คํ ๊ฐ๋ฅํ ์คํ Top 3
๐ฅ 1์์: ํ์ฌ ๋ชจ๋ธ ์ข ํฉ ํ๊ฐ (eval ์คํ)
์ด์ :
- Loss 1.9677์ด ์ค์ ๋ก ์ข์ ๋ชจ๋ธ์ธ์ง ์ ์ ์์
- ์ถ๊ฐ ํ์ต ๋ฐฉํฅ ๊ฒฐ์ ์ baseline ํ์
- ์ด๋ฏธ
eval/comprehensive_eval.py์กด์ฌ
์ฆ์ ์คํ:
cd /PROJECT/0325120031_A/ghong/taketimes/llm-bang
# Perplexity ํ๊ฐ
python eval/perplexity.py \
--checkpoint checkpoints/korean_1b_sft/checkpoint-5000 \
--data data/sft/val.jsonl # val split ํ์
# ์์ฑ ํ์ง ๋น ๋ฅธ ์ฒดํฌ
python eval/generate.py \
--checkpoint checkpoints/korean_1b_sft/checkpoint-5000 \
--prompts "์๋
ํ์ธ์, ์ ๋ AI ๋ชจ๋ธ์
๋๋ค. ์ค๋ ๋ ์จ์ ๋ํด ์ค๋ช
ํด์ฃผ์ธ์."
์์ ์๊ฐ: 10โ30๋ถ
๐ฅ 2์์: lr=1e-5๋ก ์ถ๊ฐ SFT (epoch 3โ4๊น์ง)
์ด์ :
- Loss curve๊ฐ ์์ง ์๋ ดํ์ง ์์๊ณ epoch 2๋ ์ ๊ณ ํ์ค๋ณด๋ค ๋ถ์กฑ
- ๊ตฌํ ๋น์ฉ ์ต์ (๊ธฐ์กด ์ฝ๋ ์ฌ์ฌ์ฉ)
- B200 ร 8์์ ์ฝ 40โ60๋ถ ์ถ๊ฐ (39๋ถ/5000steps ๊ธฐ์ค)
๊ตฌ์ฒด์ ์ค์ :
# ์ run์ผ๋ก checkpoint-5000์์ ์์
RUN_NAME=korean_1b_sft_v2 \
BASE_CHECKPOINT=checkpoints/korean_1b_sft/checkpoint-5000 \
LR=1.0e-5 \
MAX_STEPS=5000 \ # epoch 3-4
WARMUP_STEPS=50 \ # ์งง์ warmup
bash scripts/launch_sft.sh
์ฃผ์: val split ์์ผ๋ฉด step 3000โ5000์์ val loss ์ฒดํฌํ๋ฉฐ early stop ๊ธฐ์ค ์๋ ์ค์ ํ์.
์์ ๊ฒฐ๊ณผ: loss 1.90โ1.93 (ํ์ฌ 1.97 ๋๋น ์ฝ 2โ3% ๊ฐ์ ), ์์ฑ ํ์ง ์ฒด๊ฐ ํฅ์ ๊ธฐ๋.
๐ฅ 3์์: ๋ฐ์ดํฐ ํ์ง ๊ฐ์ + ์ถ๊ฐ ๋ฐ์ดํฐ ์์ง
์ด์ :
- ๋ฐ์ดํฐ ํ์ง์ด ํ์ดํผํ๋ผ๋ฏธํฐ ํ๋๋ณด๋ค ์ฅ๊ธฐ์ ์ผ๋ก ์ค์
- ํ์ฌ ๋ฐ์ดํฐ์ ์ค๋ณต/์ ํ์ง ํฌํจ ๊ฐ๋ฅ์ฑ ์์
- ORPO/DPO ํ์ดํ๋ผ์ธ ์ค๋น๋ฅผ ์ํด preference ๋ฐ์ดํฐ๋ ๋์์ ์์ง
์ฆ์ ์คํ ๊ฐ๋ฅํ ์์ :
# 1. Deduplication (MinHash)
pip install datasketch
# instruction text ๊ธฐ์ค MinHash dedup, threshold=0.8
# 2. ์ถ๊ฐ ๋ฐ์ดํฐ ๋ค์ด๋ก๋
from datasets import load_dataset
ds = load_dataset("hPark/orca-ko") # ~200K ๊ณ ํ์ง ํ๊ตญ์ด
ds2 = load_dataset("maywell/synatra-orca") # ~300K ํฉ์ฑ
# 3. ํ๊ตญ์ด Preference ๋ฐ์ดํฐ ์์ง (ORPO/DPO ์ค๋น)
pref = load_dataset("maywell/ko_Ultrafeedback") # ~60K preference ์
์์ ์๊ฐ: ๋ฐ์ดํฐ ์ค๋น 2โ4์๊ฐ, ์ฌํ์ต์ ์ถ๊ฐ ์ค์ ํ ์งํ.
5. ์ข ํฉ ํ๊ฐ ์์ฝ
ํ์ฌ ์ค์ ํ๊ฐ
| ํญ๋ชฉ | ์ค์ ๊ฐ | ํ๊ฐ | ๋น๊ณ |
|---|---|---|---|
| Learning Rate | 2e-5 | โ ์ ์ | ์ ๊ณ ํ์ค ์ ์ค์ |
| Cosine Decay | 5000 steps | โ ์ ์ | min_lr ~10% |
| Warmup | 150 steps (3%) | โ ์ ์ | 3-5% ๊ถ์ฅ ๋ฒ์ |
| Effective Batch | 64 seqs | โ ์ ์ | ์ ๊ณ ํ์ค |
| Epochs | ~2 | โ ๏ธ ๋ถ์กฑ ๊ฐ๋ฅ | 3 epoch ํ์ค |
| NEFTune alpha | 10 | โ ์ ์ | 159K ๋ฐ์ดํฐ์ ๋ง์ |
| max_seq_len | 4096 | โ ์ ์ | ๋์ ํจ๋ฉ์ผ๋ก ํจ์จ์ |
| Weight Decay | 0.01 | โ ์ ์ | pretrain(0.1)์ 1/10 |
์ต์ ๋ณ ์ถ์ฒ ์ฐ์ ์์
| ์ต์ | ์ถ์ฒ | ์ด์ |
|---|---|---|
| A. ์ถ๊ฐ SFT (epoch 4) | โ ๋์ | epoch ๋ถ์กฑ, ์ฆ์ ์คํ ๊ฐ๋ฅ |
| B. LR 1e-5๋ก ์ฌํ์ต | โ ๋์ | ์ถ๊ฐ ํ์ต ์ ํ์ |
| C. ORPO | โ ์ค๊ฐ | ๋ฐ์ดํฐ ์ค๋น ํ์ |
| D. DPO | โ ์ค๊ฐ | ORPO ๋์, ๋ ๊ฒ์ฆ๋จ |
| E. LoRA | โ ๏ธ ๋ฎ์ | ํ์ดํผํ๋ผ๋ฏธํฐ ํ์์๋ง ์ ์ฉ |
| F. ๋ฐ์ดํฐ ํ์ง ๊ฐ์ | โ ๋์ | ์ฅ๊ธฐ ํฌ์ ๋๋น ํจ๊ณผ ํผ |
| G. ๋ฐ์ดํฐ ์ถ๊ฐ (500K) | โ ์ค๊ฐ | ๊ณ ํ์ง ์์ค ์ ์ |
ํ์ต ๊ณก์ ์ดํ
ํ์ฌ SFT๋ ๊ฑด๊ฐํ๊ฒ ์๋ฃ๋จ:
- Gradient norm ์์ , spike ์์
- Loss ๋จ์กฐ ๊ฐ์ (๋ฏธ์์ ๋ณ๋์ ์ ์)
- Outlier 2.1%๋ ์ ์ ๋ฒ์
- ์๋ ด ์ ํธ๊ฐ step 3000+ ์ดํ ๋ํ๋์ง๋ง ์์ง plateau๋ ์๋
๊ฐ์ฅ ์ฐ๋ ค๋๋ ์ : Validation loss ์์ โ ๊ณผ์ ํฉ ์ฌ๋ถ ๋ถ๋ช ํ. ์ฆ์ val split ํ๋ณด ํ์.
๋ถ์ ์๋ฃ. ๋ค์ ์คํ ์ ์ด ํ์ผ์ ๊ธฐ๋ฐ์ผ๋ก ์คํ ๋ฐฉํฅ ๊ฒฐ์ ๊ถ์ฅ.