"์ฒ์๋ถํฐ ๋ค์ ์์" ์๋๋ฆฌ์ค ์์ ๋ถ์
์์ฑ์ผ: 2026-02-26
์ญํ : "์ฒ์๋ถํฐ ์ ๋๋ก ๋ค์" ์นํธ์
๊ฒฐ๋ก : โ
1B SFT ์ฌํ์ต ๊ฐ๋ ฅ ๊ถ์ฅ (40๋ถ), 3B ์ ํ์ ๋ณ๋ ฌ ์ค๋น
1. ํ์ฌ ์ ๊ทผ๋ฒ์ ๊ทผ๋ณธ์ ํ๊ณ
1.1 ๋ฐ๊ฒฌ๋ ๋ฒ๊ทธ/๋ฌธ์ ๊ฐ ๊ฐ์ค์น์ ๋ฏธ์น ์ํฅ
์ง๊ธ๊น์ง ๋ฐ๊ฒฌ๋ ๋ฌธ์ ๋ค์ ์ ๋ฆฌํ๋ฉด:
| # | ๋ฒ๊ทธ/๋ฌธ์ | ๊ฐ์ค์น ์ค์ผ ์ ๋ | ์ ๊ฑฐ ๊ฐ๋ฅ? |
|---|---|---|---|
| 1 | ํ๋กฌํํธ ํฌ๋งท ๋ถ์ผ์น (### ์ง๋ฌธ: vs <|user|>) |
โ ๊ฐ์ค์น ๋ฌด๊ด (์ถ๋ก ๋ฒ๊ทธ) | ์ถ๋ก ์ฝ๋๋ง ์์ |
| 2 | Dynamic padding ๋ฏธ์๋ (4096 ๊ณ ์ ํจ๋ฉ) | ๐ก ๊ฐ์ ์ํฅ โ ํ์ต ํจ์จ ์ ํ๋ก ์ค์ง epoch ๋ถ์กฑ | ์ฌํ์ต ํ์ |
| 3 | ํธ๋ ์ผ์ด์ ์ EOS ์์ค (0.04%) | ๐ข ๋ฏธ๋ฏธ (61/159K ์ํ) | ์ฝ๋ ์ด๋ฏธ ์์ ๋จ |
| 4 | </s> ๋ฆฌํฐ๋ด ์ค์ผ ๋ฐ์ดํฐ 113๊ฑด |
๐ก EOS ๊ฒฝ๊ณ ํผ๋ ์ ๋ฐ | ๋ฐ์ดํฐ ํํฐ ํ์ |
| 5 | Output ๋ด Q/A ๋ง์ปค ~550๊ฑด | ๐ก ์์ฒด ๋ฃจํ ํจํด ํ์ต | ๋ฐ์ดํฐ ํํฐ ํ์ |
| 6 | OpenOrca 5๋ฐฐ ์ ์ํ๋ง โ ๊ณผ์ ํฉ | ๐ด ๊ฐ์ค์น์ ๊น์ด ๊ฐ์ธ | ์ฌํ์ต ํ์ |
| 7 | Val split ์์ โ ๊ณผ์ ํฉ ๊ฐ์ง ๋ถ๊ฐ | โ | ์ฌํ์ต ์ ์ถ๊ฐ |
| 8 | ~2 epoch๋ง ํ์ต (์ ๊ณ ํ์ค 3-5) | ๐ด underfitting | ์ฌํ์ต ํ์ |
| 9 | ์งง์ output 10.4% (50์ ๋ฏธ๋ง) | ๐ก EOS ํ์ด๋ฐ ํ์ต ๋ถ์์ | ๋ฐ์ดํฐ ํํฐ ํ์ |
1.2 "์ค์ผ๋ ํ์ต"์ ๊ฐ์ค์น ์๋ฅ ์ฌ๋ถ
๊ฒฐ๋ก : ๋ถ๋ถ์ ์ผ๋ก ๋จ์์๊ณ , ์์ ์ ๊ฑฐ ๋ถ๊ฐ๋ฅ.
SFT๋ base model ์์ ์์ layer๋ฅผ ๋ฏธ์ธ์กฐ์ ํ ๊ฒ์ด ์๋๋ผ ์ ์ฒด ๊ฐ์ค์น๋ฅผ ์ ๋ฐ์ดํธํ๋ค. 5000 steps ร lr=2e-5๋ก ํ์ต๋ gradient update๋ ๋ชจ๋ layer์ ๋ถํฌ๋์ด ์์ผ๋ฉฐ:
- OpenOrca 5๋ฐฐ ์ ์ํ๋ง์ผ๋ก ์ธํด ํด๋น ์์ค์ ํจํด์ด ๊ณผ๋ํ๊ฒ ๊ฐ์ธ
- Q/A ๋ง์ปค ์ค์ผ ๋ฐ์ดํฐ(550๊ฑด)์ ํจํด๋ ๊ฐ์ค์น์ ๋ถ์ฐ ์ ์ฅ
</s>๋ฆฌํฐ๋ด์ด ํฌํจ๋ 113๊ฑด์ด EOS ํ ํฐ ์์ธก ํ๋ฅ ๋ถํฌ๋ฅผ ์๊ณก
์ด๋ค์ ์ถ๊ฐ ํ์ต(continual training)์ผ๋ก "๋ฎ์ด์ธ" ์๋ ์์ง๋ง, ๊ธฐ์กด ์ค์ผ์ ์ ํํ ์ญ์ ์ํค๋ ๊ฒ์ ๋ถ๊ฐ๋ฅ. ์ถ๊ฐ ํ์ต์ ์๋ก์ด gradient๋ก ๊ธฐ์กด ๊ฐ์ค์น๋ฅผ ์์ ํ์ง๋ง, ์ด๋ฏธ ํ์ต๋ ์๋ชป๋ ํจํด์ ํ์ (ํนํ low-rank subspace์์)์ ์์ ํ ์ฌ๋ผ์ง์ง ์๋๋ค.
1.3 ๋ฐ๋ณต ํดํ 17.7%: ํ๋ผ๋ฏธํฐ ๋ฌธ์ vs ๊ฐ์ค์น ๋ฌธ์
์์ ํ ๋ฐ๋ณต๋ฅ ๋ณํ๋ฅผ ๋ณด๋ฉด:
ํฌ๋งท ๋ถ์ผ์น ์ํ: 57% โ ํฌ๋งท ์์ ๋ง์ผ๋ก โ 30.7% โ +์ถ๋ก ํ๋ผ๋ฏธํฐ โ 17.7%
๋ถ์:
- 57% โ 30.7% (ํฌ๋งท ์์ ): ์ถ๋ก ๋ฒ๊ทธ โ ๊ฐ์ค์น ๋ฌด๊ด โ
- 30.7% โ 17.7% (rep_penalty + no_repeat_ngram): ์ถ๋ก ํ๋ผ๋ฏธํฐ โ ๊ฐ์ค์น ๋ฌด๊ด โ
- ์์ฌ 17.7%: ์ด๊ฒ์ด ๊ฐ์ค์น ์์ค์ ๋ฌธ์
17.7%์ ๊ตฌ์ฑ:
- ์ฝ๋ ์ค๋ช ์ ์ํ๋ฒณ ๋์ด ๋ฐ๋ณต (์ํ #2: 30.5%)
- ๋ฆฌ์คํธํ ๋ต๋ณ์์ ์ ์ฌ ํญ๋ชฉ ๋ฐ๋ณต (์ํ #4: 21.3%, #7: 24.4%, #8: 23.8%)
- ๋จ์ ์ฌ์ค ๋ต๋ณ์ ์ ์ (์ํ #1: 0.0%, #9: 13.3%)
๊ฒฐ๋ก : 17.7%๋ ๊ฐ์ค์น ์์ค ๋ฌธ์ . ์์ธ:
- ํ์ต ๋ฐ์ดํฐ ์์ฒด์ ๋ฐ๋ณต ํจํด (57๊ฑด ์ง์ ๋ฐ๋ณต + ์๋ฐฑ ๊ฑด ๊ฐ์ )
- 2 epoch์ underfitting์ผ๋ก EOS ์์ฑ ์ ๋ขฐ๋ ๋ถ์กฑ
- OpenOrca ๊ณผ์ ๋ํ๋ก ์ธํ ๋ค์์ฑ ๊ฒฐํ
2. ์ฒ์๋ถํฐ ๋ค์ ํ๋ค๋ฉด: ๊ตฌ์ฒด์ ๊ฐ์ ์ฌํญ
2.1 SFT ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ
| ํญ๋ชฉ | ํ์ฌ | ์ฌ์์ ์ |
|---|---|---|
| ํฌ๋งท | <|user|>/<|assistant|> โ
|
๋์ผ ์ ์ง |
| EOS ์ฒ๋ฆฌ | ํธ๋ ์ผ์ด์ ์ ์์ค ๊ฐ๋ฅ | ์ฝ๋ ์ด๋ฏธ ์์ ๋จ (response_ids[-1] = eos_token_id) |
| Dynamic padding | ๋ฏธ์๋ (๊ณ ์ 4096) | ์ฝ๋ ์ด๋ฏธ ์์ ๋จ (๊ฐ๋ณ ๊ธธ์ด ๋ฐํ) |
| ํ์ง ํํฐ | ๊ธฐ๋ณธ (50์, 30% ํ๊ธ) | ๊ฐํ: 80์, 40% ํ๊ธ, EOS/Q&A ์ค์ผ ์ ๊ฑฐ, 5-gram ๋ฐ๋ณต ํํฐ |
| Val split | ์์ | 5% val split (prepare_sft_data.py์ ์ด๋ฏธ ๊ตฌํ๋จ) |
| ๊ฐ์ค์น ์ํ๋ง | OpenOrca 5.0ร | OpenOrca 2.0ร (์ด๋ฏธ ์์ ๋จ) |
| ์์ ๋ฐ์ดํฐ | 159K | ~120-130K (ํํฐ๋ง ํ) |
ํต์ฌ ๋ณ๊ฒฝ: prepare_sft_data.py๋ฅผ ๋ค์ ์คํํ๋ฉด ๋๋ค. ์ฝ๋์ ์ด๋ฏธ enhanced filter์ ์์ ๋ ๊ฐ์ค์น๊ฐ ๋ฐ์๋์ด ์๋ค.
2.2 ํ์ต ํ์ดํผํ๋ผ๋ฏธํฐ
| ํ๋ผ๋ฏธํฐ | ํ์ฌ | ์ฌ์์ ์ | ๊ทผ๊ฑฐ |
|---|---|---|---|
| max_steps | 5,000 (~2 epoch) | 7,500-10,000 (3-4 epoch) | ์ ๊ณ ํ์ค 3-5 epoch |
| lr | 2e-5 | 2e-5 ์ ์ง | ์ ๊ณ ํ์ค, loss curve ์์ |
| warmup | 150 (3%) | 225-300 (3%) | steps ์ฆ๊ฐ์ ๋น๋ก |
| NEFTune alpha | 10.0 | 10.0 ์ ์ง | 159K ๋ฐ์ดํฐ์ ์ ํฉ |
| val_data | ์์ | val.jsonl ์ ๋ฌ | ๊ณผ์ ํฉ ๋ชจ๋ํฐ๋ง |
| save_interval | 500 | 500 ์ ์ง | best checkpoint ์ ํ ๊ฐ๋ฅ |
2.3 ์ถ๊ฐ ๊ณ ๋ ค์ฌํญ
<|user|>/<|assistant|>ํน์ ํ ํฐ ๋ฑ๋ก: ํ์ฌ ์๋ธ์๋ ๋ถํ ๋จ. ๋จ์ผ ํ ํฐ์ผ๋ก ๋ฑ๋กํ๋ฉด ๋ robustํ๋ base model ์ฌํ์ต ํ์ โ SFT์์๋ ํํ ์ ์ง, 3B์์ ๋ฐ์- Repetition penalty loss (Unlikelihood Training): ์ค๊ธฐ ์ต์ . ์ฌ์์ 1์ฐจ์๋ ๋ฐ์ดํฐ ํ์ง ๊ฐ์ ๋ง์ผ๋ก ์ถฉ๋ถํ ๊ฒ
3. ์ ๊ณ ์ต๊ณ ์์ค SFT ํ์ดํ๋ผ์ธ ๋น๊ต
3.1 ์ฃผ์ ํ๋ ์์ํฌ ๋น๊ต
| ๊ธฐ๋ฅ | ํ ํ๋ก์ ํธ (์์ ํ) | LLaMA-Factory | TRL SFTTrainer | Axolotl |
|---|---|---|---|---|
| Completion-only loss | โ (labels=-1) | โ | โ (DataCollator) | โ |
| Dynamic padding | โ (์์ ๋จ) | โ | โ | โ |
| Sample packing | โ | โ | โ
(packing=True) |
โ |
| EOS ๋ณด์ฅ | โ (์์ ๋จ) | โ | โ | โ |
| Val monitoring | โ (๊ตฌํ๋จ) | โ | โ | โ |
| Flash Attention | โ (64-align) | โ | โ | โ |
| NEFTune | โ | โ | โ | โ |
3.2 packing=True + completion_only_loss ๋ถ์
Sample Packing: ์ฌ๋ฌ ์งง์ ์ํ์ ํ๋์ ์ํ์ค์ ์ฐ๊ฒฐํ์ฌ ํจ๋ฉ ์์ ์ ๊ฑฐ.
Before packing (dynamic padding):
[sample1 (200 tok)] [pad pad pad ... (312 pad)] = 512 total
[sample2 (480 tok)] [pad pad pad ... (32 pad)] = 512 total
After packing:
[sample1 (200 tok)][sample2 (480 tok)][pad ... (344)] = 1024 total
โ 2 samples in 1 sequence, less padding waste
ํ ํ๋ก์ ํธ ์ ์ฉ ๊ฐ๋ฅ์ฑ:
- ํ๊ท ์ํ์ค ~500 ํ ํฐ์ด๋ฏ๋ก packing ํจ๊ณผ ๋งค์ฐ ํผ (4096 ๋๋น 88% ์ ์ฝ โ packing์ผ๋ก ์ถ๊ฐ 20-30% ์ ์ฝ)
- ๊ทธ๋ฌ๋ ๊ตฌํ ๋ณต์ก๋ ๋์: attention mask์ sample boundary ์ฒ๋ฆฌ ํ์
- ๊ถ์ฅ: ํ์ฌ dynamic padding๋ง์ผ๋ก๋ ์ถฉ๋ถํ ๊ฐ์ . Packing์ 3B ๋๋ TRL ์ ํ ์ ๋์ .
3.3 ํ ํ๋ก์ ํธ์ ๋ฐ๋ก ์ ์ฉ ๊ฐ๋ฅํ ๊ฒ
- โ ์ด๋ฏธ ์ ์ฉ๋จ: Dynamic padding, EOS ๋ณด์ฅ, completion-only loss, NEFTune
- ๐ก ๋ฏธ์ ์ฉ์ด๋ ์ค์๋ ๋ฎ์: Sample packing (๊ตฌํ ๋ณต์ก, ํ์ฌ ํจ์จ ์ถฉ๋ถ)
- ๐ก ๋ฏธ์ ์ฉ์ด๋ ๊ณ ๋ ค ๊ฐ์น: TRL SFTTrainer ์ ํ (์ปค์คํ LLM ํด๋์ค ํธํ์ฑ ํ์ธ ํ์)
4. 3B ๋ชจ๋ธ๋ก์ ์ ํ ํ์ด๋ฐ
4.1 1B ์ฌํ์ต vs ๋ฐ๋ก 3B
| ๊ธฐ์ค | 1B ์ฌํ์ต | ๋ฐ๋ก 3B |
|---|---|---|
| ์์ ์๊ฐ | ~40๋ถ SFT | ~26์๊ฐ pretrain + ~2์๊ฐ SFT |
| ๋ฆฌ์คํฌ | ๋ฎ์ (๊ฒ์ฆ๋ ํ์ดํ๋ผ์ธ) | ์ค๊ฐ (์ ์ํคํ ์ฒ ์ค์ ํ์) |
| ๊ธฐ๋ ํ์ง | ๋ฐ๋ณต๋ฅ 17.7% โ 5-8% ์์ | ๋ฐ๋ณต๋ฅ 2-5% ์์ |
| ko_ifeval | 20-30% ์์ | 35-45% ์์ |
| ํ์ต ๊ฒ์ฆ | ์ฆ์ ๊ฐ๋ฅ | 26์๊ฐ ํ์์ผ ํ์ธ ๊ฐ๋ฅ |
4.2 Chinchilla Scaling Law ๋ถ์
Chinchilla ์ต์ ํ์ต ๋ฐ์ดํฐ = 20 ร ํ๋ผ๋ฏธํฐ ์
1B ๋ชจ๋ธ: 20 ร 1B = 20B tokens (ํ์ฌ ~8.91B โ ๋ถ์กฑํ์ง๋ง SFT์๋ ์ถฉ๋ถ)
3B ๋ชจ๋ธ: 20 ร 3B = 60B tokens (ํ์ฌ ๋ฐ์ดํฐ ~150B โ ์ถฉ๋ถ)
70 ร 3B = 210B tokens (์ต์ โ 150B๋ก 71% ์์ค)
ํ์ฌ 150B tokens ๋ฐ์ดํฐ๋ 3B ํ์ต์ ์ถฉ๋ถํ๋ค (Chinchilla ์ต์ ๊ธฐ์ค์ 2.5๋ฐฐ).
4.3 3B๊ฐ ๋ฐ๋ณต ํดํ๋ฅผ ๊ตฌ์กฐ์ ์ผ๋ก ๋ ๊ฒช๋๊ฐ?
์, ์ค์ผ์ผ ํจ๊ณผ๊ฐ ์๋ค. ๊ทผ๊ฑฐ:
- Representation capacity: 3B๋ 1B ๋๋น ~2.5๋ฐฐ ํ๋ผ๋ฏธํฐ โ EOS ์์ธก, ๋ฐ๋ณต ํํผ ๋ฑ ๋ณต์กํ ํจํด์ ๋ ์ ํํ๊ฒ ํ์ต
- Attention head ์ ์ฆ๊ฐ: ๋ ๋ง์ head๊ฐ "์ด์ ์ ๋งํ ๊ฒ" ์ถ์ ์ ์ ์ฉ ๊ฐ๋ฅ
- ๊ฒฝํ์ ์ฆ๊ฑฐ: Open Ko-LLM ๋ฆฌ๋๋ณด๋์์ 3B ๋ชจ๋ธ๋ค์ 1B ๋๋น ์ผ๊ด๋๊ฒ ๋ฐ๋ณต๋ฅ ๋ฎ์
- ๊ฐ์ SFT ๋ฐ์ดํฐ๋ผ๋ 3B๊ฐ ๋ ์ ์ผ๋ฐํ: ๋ ํฐ ๋ชจ๋ธ์ด same data์์ ๋ ๋ง์ ํจํด ์ถ์ถ
4.4 ๊ถ์ฅ: 1B ์ฌํ์ต ๋จผ์ , 3B ๋ณ๋ ฌ ์ค๋น
Day 0: ๋ฐ์ดํฐ ์ฌ์ค๋น (30๋ถ) + 1B SFT ์ฌํ์ต (40๋ถ) = ์ค๋ ์๋ฃ
Day 0: ๊ฒฐ๊ณผ ํ๊ฐ (30๋ถ) โ 1B ๊ธฐ์ค์ ํ๋ณด
Day 1-2: 3B ์ํคํ
์ฒ ์ค์ + pretrain ์์ (26์๊ฐ)
Day 2-3: 3B SFT (2์๊ฐ) + ํ๊ฐ
์ด์ :
- 1B ์ฌํ์ต์ ๋น์ฉ์ด ๋๋ฌด ๋ฎ๋ค (40๋ถ). ์ ํ ์ด์ ๊ฐ ์๋ค.
- 1B ๊ฒฐ๊ณผ๋ก ํ์ดํ๋ผ์ธ ๊ฒ์ฆ โ 3B์ ๋์ผํ (๊ฒ์ฆ๋) ํ์ดํ๋ผ์ธ ์ ์ฉ
- 3B pretrain ๋์ 1B ๋ชจ๋ธ์ ๋ฐฐํฌ/๋ฐ๋ชจ์ ์ฌ์ฉ ๊ฐ๋ฅ
5. "๋ค์ ์์"์ ํ์๋ผ์ธ
5.1 ์์ธ ํ์๋ผ์ธ
| ๋จ๊ณ | ์์ | ์์ ์๊ฐ | ๋์ |
|---|---|---|---|
| A. ๋ฐ์ดํฐ ์ฌ์ค๋น | prepare_sft_data.py ์ฌ์คํ (๊ฐํ ํํฐ ์ ์ฉ) |
20-30๋ถ | 30๋ถ |
| B. 1B SFT ์ฌํ์ต | 7500 steps, 8รB200, dynamic padding ์ ์ฉ | 30-40๋ถ | 1์๊ฐ |
| C. 1B ํ๊ฐ | ๋ฐ๋ณต๋ฅ + ์์ฑ ํ์ง + (์ ํ) ko_ifeval | 30๋ถ-2์๊ฐ | 1.5-3์๊ฐ |
| D. 3B pretrain | 150B tokens, 8รB200 | ~26์๊ฐ | 27-29์๊ฐ |
| E. 3B SFT | ๋์ผ ๋ฐ์ดํฐ, 10000 steps | 1.5-2์๊ฐ | 29-31์๊ฐ |
| F. 3B ํ๊ฐ | ์ ์ฒด ๋ฒค์น๋งํฌ | 2-4์๊ฐ | 31-35์๊ฐ |
5.2 ํ์ฌ ๊ณ ์ณ์ ๊ฐ๋ ์๊ฐ vs ์ฌ์์
| ๊ฒฝ๋ก | ์์ ์๊ฐ | ์์ ์ต์ข ํ์ง |
|---|---|---|
| ๊ฒฝ๋ก A: ํ์ฌ ๋ชจ๋ธ์์ ์ถ๊ฐ ํ์ต | ์ถ๊ฐ SFT 40๋ถ + ํ๊ฐ 2์๊ฐ = ~3์๊ฐ | ๋ฐ๋ณต๋ฅ 12-15%, ์์ฌ ์ค์ผ |
| ๊ฒฝ๋ก B: 1B ํด๋ฆฐ ์ฌํ์ต | ๋ฐ์ดํฐ 30๋ถ + SFT 40๋ถ + ํ๊ฐ 2์๊ฐ = ~3์๊ฐ | ๋ฐ๋ณต๋ฅ 5-8%, ์ค์ผ ์์ |
| ๊ฒฝ๋ก C: 3B ์ฒ์๋ถํฐ | ๋ฐ์ดํฐ 30๋ถ + pretrain 26์๊ฐ + SFT 2์๊ฐ + ํ๊ฐ 4์๊ฐ = ~33์๊ฐ | ๋ฐ๋ณต๋ฅ 2-5%, ko_ifeval 35-45% |
๊ฒฝ๋ก A์ B์ ์๊ฐ์ด ๊ฑฐ์ ๊ฐ์๋ฐ, B๊ฐ ํ์ง์ด ํ์คํ ๋๋ค. ์ด๊ฒ์ด ์ฌ์์์ ๊ถ์ฅํ๋ ํต์ฌ ์ด์ ๋ค.
6. ์ฌ์์์ ๋ฆฌ์คํฌ์ ์๋ฐฉ
6.1 "๋ค์ ํด๋ ๋ ์๋ก์ด ๋ฌธ์ ๊ฐ ๋์ฌ ์ ์๋ค"
| ๋ฆฌ์คํฌ | ํ๋ฅ | ์๋ฐฉ ๋ฐฉ๋ฒ |
|---|---|---|
| ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ ์ ๋ฒ๊ทธ | ๋ฎ์ | ์ฝ๋ ์ด๋ฏธ ์์ /๊ฒ์ฆ๋จ, ๋จ์ ํ ์คํธ ์ถ๊ฐ |
| ๊ณผ์ ํฉ ๊ฐ์ง ์คํจ | ๋ฎ์ | val split ์ด๋ฒ์ ๋ฐ๋์ ์ฌ์ฉ |
| ์๋ก์ด ์ ํ์ ๋ฐ๋ณต | ์ค๊ฐ | ๋ค์ํ ํ๋กฌํํธ๋ก ํ๊ฐ, rep_penalty ๋ณดํ |
| ํ์ต ๋ถ์์ (loss spike) | ๋ฎ์ | ๊ธฐ์กด ํ์ต์์ ์์ ์ ์ด์์, ๋์ผ lr ์ฌ์ฉ |
| ๋ฐ์ดํฐ ํํฐ ๊ณผ๋ โ ๋ฐ์ดํฐ ๋ถ์กฑ | ๋ฎ์ | 120K ์ฌ์ ํ ์ถฉ๋ถ (3-4 epoch์ ์ ํฉ) |
6.2 ์ง๊ธ๊น์ง์ ๊ตํ ๋ฐ์ ์ฒดํฌ๋ฆฌ์คํธ
โ
์ถ๋ก ์ ์ฌ๋ฐ๋ฅธ ํ๋กฌํํธ ํฌ๋งท (<|user|>/<|assistant|>) ์ฌ์ฉ
โ
Dynamic padding ์ค์ ์๋ ํ์ธ (๋ฐฐ์น๋ณ ๊ฐ๋ณ ๊ธธ์ด)
โ
ํธ๋ ์ผ์ด์
์ EOS ๊ฐ์ ์ฝ์
โ
EOS ๋ฆฌํฐ๋ด / Q&A ๋ง์ปค ์ค์ผ ๋ฐ์ดํฐ ํํฐ๋ง
โ
๊ฐ์ค์น ์ํ๋ง ์ ์ํ (5.0 โ 2.0)
โ
Val split์ผ๋ก ๊ณผ์ ํฉ ๋ชจ๋ํฐ๋ง
โ
3-4 epoch ์ถฉ๋ถํ ํ์ต
โ
ํ๊ฐ ์ rep_penalty=1.1 + no_repeat_ngram=3 ๊ธฐ๋ณธ ์ ์ฉ
โ
๋ค์ํ ํ๋กฌํํธ ์ ํ์ผ๋ก ์ข
ํฉ ํ๊ฐ
6.3 ์ฑ๊ณต ํ๋ฅ ์ถ์
- ์ ์ฒดํฌ๋ฆฌ์คํธ 100% ๋ฐ์ ์: ๋ฐ๋ณต๋ฅ 5-8% ๋ฌ์ฑ ํ๋ฅ 85-90%
- ๊ธฐ์กด ๋๋น ๊ฐ์ : ๋ฐ๋ณต๋ฅ 17.7% โ 5-8% (55-70% ๊ฐ์)
- ์คํจ ์๋๋ฆฌ์ค: ๋ฐ๋ณต๋ฅ ์ด 10-15%์ ๋จธ๋ฌด๋ ๊ฒฝ์ฐ โ ์ถ๊ฐ ๋์ (ORPO/DPO)
7. ์ต์ข ๊ฒฐ๋ก ๋ฐ ๊ถ์ฅ
7.1 "๋ค์ ์์"์ด ํ์ํ ๊ทผ๋ณธ์ ์ด์
ํ์ํ๋ค. ์ด์ :
- ๋น์ฉ์ด ๊ฑฐ์ ์๋ค โ 1B SFT ์ฌํ์ต์ 40๋ถ. ๊ธฐ์กด ๋ชจ๋ธ์์ ์ถ๊ฐ ํ์ตํ๋ ์๊ฐ๊ณผ ๋์ผ.
- ์ค์ผ๋ ๊ฐ์ค์น ์์ ์๋ ๊ฒ์ ๋นํจ์จ์ โ OpenOrca 5๋ฐฐ ์ ์ํ๋ง + Q/A ๋ง์ปค ์ค์ผ์ ํ์ ์ด ๋จ์์๋ ์ํ์์ ์ถ๊ฐ ํ์ตํ๋ฉด, ์ gradient๊ฐ ์ค๋๋ ์ค์ผ์ ์์ ํ ๋ฎ์ง ๋ชปํจ.
- ๋ชจ๋ ์์ ์ฌํญ์ด ์ด๋ฏธ ์ฝ๋์ ๋ฐ์๋จ โ sft_dataset.py (dynamic padding, EOS ๋ณด์ฅ), prepare_sft_data.py (๊ฐํ ํํฐ, ๊ฐ์ค์น ์์ ) ๋ชจ๋ ์์ ์๋ฃ. ์คํ๋ง ํ๋ฉด ๋จ.
- ๊นจ๋ํ ๊ธฐ์ค์ ์ด ํ์ โ 3B๋ก ์ค์ผ์ผ์ ํ๊ธฐ ์ ์, ๊นจ๋ํ 1B ๊ฒฐ๊ณผ๊ฐ ์์ด์ผ ํ์ดํ๋ผ์ธ์ด ์ฌ๋ฐ๋ฅธ์ง ๊ฒ์ฆ ๊ฐ๋ฅ.
7.2 ๋ค์ ์์ ์ ์์ ์ต์ข ํ์ง
| ์งํ | ํ์ฌ (์์ ์ถ๋ก ) | 1B ์ฌํ์ต ์์ | 3B ์ฌํ์ต ์์ |
|---|---|---|---|
| ๋ฐ๋ณต๋ฅ (3-gram) | 17.7% | 5-8% | 2-5% |
| ๋ฐ๋ณต๋ฅ (rep_penalty ์์ด) | ~30% | 10-15% | 5-10% |
| EOS ์ ์ ์ข ๋ฃ์จ | ~60% | 85-90% | 90-95% |
| ko_ifeval (์ถ์ ) | 15-25% | 20-30% | 35-45% |
| ko_winogrande (์ถ์ ) | 50-55% | 53-58% | 60-68% |
| ํ๊ตญ์ด ๋ต๋ณ ์์ฐ์ค๋ฌ์ | ์ค๊ฐ | ์ค์ | ์ |
7.3 ํ์๋ผ์ธ
[์ค๋ โ 3์๊ฐ]
โโโ ๋ฐ์ดํฐ ์ฌ์ค๋น: prepare_sft_data.py ์ฌ์คํ (30๋ถ)
โโโ 1B SFT ์ฌํ์ต: 7500 steps (40๋ถ)
โโโ ํ๊ฐ: ๋ฐ๋ณต๋ฅ + ์์ฑ ํ์ง (30๋ถ-2์๊ฐ)
[๋ด์ผ-๋ชจ๋ โ 30์๊ฐ]
โโโ 3B pretrain (26์๊ฐ, ๋ฐฑ๊ทธ๋ผ์ด๋)
โโโ 3B SFT (2์๊ฐ)
โโโ 3B ์ ์ฒด ํ๊ฐ (2-4์๊ฐ)
7.4 ์ต์ข ๊ถ์ฅ
| ๊ถ์ฅ | ๊ทผ๊ฑฐ |
|---|---|
| โ 1B SFT ์ฆ์ ์ฌํ์ต | 40๋ถ ํฌ์, ๋ฐ๋ณต๋ฅ 17.7% โ 5-8% ์์, ๋ฆฌ์คํฌ ๊ทนํ ๋ฎ์ |
| โ 3B pretrain ๋ณ๋ ฌ ์์ | 1B ์ฌํ์ต ๊ฒฐ๊ณผ๋ก ํ์ดํ๋ผ์ธ ๊ฒ์ฆ ํ ๋์ผ ํ์ดํ๋ผ์ธ ์ ์ฉ |
| โ ํ์ฌ ๊ฐ์ค์น์์ ์ถ๊ฐ ํ์ต | ๊ฐ์ ์๊ฐ์ผ๋ก ๋ ๋ฎ์ ํ์ง. ์ค์ผ ์๋ฅ ์ํ. |
ํ ์ค ์์ฝ: 40๋ถ์ด๋ฉด ๊นจ๋ํ ๋ชจ๋ธ์ ์ป์ ์ ์๋๋ฐ, ์ค์ผ๋ ๋ชจ๋ธ์ 40๋ถ์ ๋ ์ธ ์ด์ ๊ฐ ์๋ค.
๋ถ๋ก: ์ฌํ์ต ์คํ ๋ช ๋ น์ด
# Step 1: ๋ฐ์ดํฐ ์ฌ์ค๋น (๊ฐํ ํํฐ + ์์ ๋ ๊ฐ์ค์น ์ ์ฉ)
cd /PROJECT/0325120031_A/ghong/taketimes/llm-bang
python data/prepare_sft_data.py --output_dir data/sft_v2/ --val_split 0.05
# Step 2: 1B SFT ์ฌํ์ต
torchrun --nproc_per_node=8 train/sft.py \
--base_checkpoint checkpoints/korean_1b_fp8_run1/checkpoint-0034000 \
--sft_data data/sft_v2/train.jsonl \
--val_data data/sft_v2/val.jsonl \
--checkpoint_dir checkpoints/korean_1b_sft_v2 \
--max_steps 7500 \
--batch_size 4 \
--grad_accum 2 \
--lr 2e-5 \
--warmup_steps 225 \
--use_fp8
# Step 3: ํ๊ฐ
python eval/test_generation_params.py \
--checkpoint checkpoints/korean_1b_sft_v2/checkpoint-0007500