frankenstallm / source /eval /decision /restart_scenario.md
pathcosmos's picture
Upload folder using huggingface_hub (#29)
5b1ff4d
|
raw
history blame
15.1 kB

"์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ์‹œ์ž‘" ์‹œ๋‚˜๋ฆฌ์˜ค ์™„์ „ ๋ถ„์„

์ž‘์„ฑ์ผ: 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%๋Š” ๊ฐ€์ค‘์น˜ ์ˆ˜์ค€ ๋ฌธ์ œ. ์›์ธ:

  1. ํ•™์Šต ๋ฐ์ดํ„ฐ ์ž์ฒด์˜ ๋ฐ˜๋ณต ํŒจํ„ด (57๊ฑด ์ง์ ‘ ๋ฐ˜๋ณต + ์ˆ˜๋ฐฑ ๊ฑด ๊ฐ„์ ‘)
  2. 2 epoch์˜ underfitting์œผ๋กœ EOS ์ƒ์„ฑ ์‹ ๋ขฐ๋„ ๋ถ€์กฑ
  3. 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 ํ˜„ ํ”„๋กœ์ ํŠธ์— ๋ฐ”๋กœ ์ ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒƒ

  1. โœ… ์ด๋ฏธ ์ ์šฉ๋จ: Dynamic padding, EOS ๋ณด์žฅ, completion-only loss, NEFTune
  2. ๐ŸŸก ๋ฏธ์ ์šฉ์ด๋‚˜ ์ค‘์š”๋„ ๋‚ฎ์Œ: Sample packing (๊ตฌํ˜„ ๋ณต์žก, ํ˜„์žฌ ํšจ์œจ ์ถฉ๋ถ„)
  3. ๐ŸŸก ๋ฏธ์ ์šฉ์ด๋‚˜ ๊ณ ๋ ค ๊ฐ€์น˜: 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๊ฐ€ ๋ฐ˜๋ณต ํ‡ดํ™”๋ฅผ ๊ตฌ์กฐ์ ์œผ๋กœ ๋œ ๊ฒช๋Š”๊ฐ€?

์˜ˆ, ์Šค์ผ€์ผ ํšจ๊ณผ๊ฐ€ ์žˆ๋‹ค. ๊ทผ๊ฑฐ:

  1. Representation capacity: 3B๋Š” 1B ๋Œ€๋น„ ~2.5๋ฐฐ ํŒŒ๋ผ๋ฏธํ„ฐ โ†’ EOS ์˜ˆ์ธก, ๋ฐ˜๋ณต ํšŒํ”ผ ๋“ฑ ๋ณต์žกํ•œ ํŒจํ„ด์„ ๋” ์ •ํ™•ํ•˜๊ฒŒ ํ•™์Šต
  2. Attention head ์ˆ˜ ์ฆ๊ฐ€: ๋” ๋งŽ์€ head๊ฐ€ "์ด์ „์— ๋งํ•œ ๊ฒƒ" ์ถ”์ ์— ์ „์šฉ ๊ฐ€๋Šฅ
  3. ๊ฒฝํ—˜์  ์ฆ๊ฑฐ: Open Ko-LLM ๋ฆฌ๋”๋ณด๋“œ์—์„œ 3B ๋ชจ๋ธ๋“ค์€ 1B ๋Œ€๋น„ ์ผ๊ด€๋˜๊ฒŒ ๋ฐ˜๋ณต๋ฅ  ๋‚ฎ์Œ
  4. ๊ฐ™์€ 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 "๋‹ค์‹œ ์‹œ์ž‘"์ด ํ•„์š”ํ•œ ๊ทผ๋ณธ์  ์ด์œ 

ํ•„์š”ํ•˜๋‹ค. ์ด์œ :

  1. ๋น„์šฉ์ด ๊ฑฐ์˜ ์—†๋‹ค โ€” 1B SFT ์žฌํ•™์Šต์€ 40๋ถ„. ๊ธฐ์กด ๋ชจ๋ธ์—์„œ ์ถ”๊ฐ€ ํ•™์Šตํ•˜๋Š” ์‹œ๊ฐ„๊ณผ ๋™์ผ.
  2. ์˜ค์—ผ๋œ ๊ฐ€์ค‘์น˜ ์œ„์— ์Œ“๋Š” ๊ฒƒ์€ ๋น„ํšจ์œจ์  โ€” OpenOrca 5๋ฐฐ ์—…์ƒ˜ํ”Œ๋ง + Q/A ๋งˆ์ปค ์˜ค์—ผ์˜ ํ”์ ์ด ๋‚จ์•„์žˆ๋Š” ์ƒํƒœ์—์„œ ์ถ”๊ฐ€ ํ•™์Šตํ•˜๋ฉด, ์ƒˆ gradient๊ฐ€ ์˜ค๋ž˜๋œ ์˜ค์—ผ์„ ์™„์ „ํžˆ ๋ฎ์ง€ ๋ชปํ•จ.
  3. ๋ชจ๋“  ์ˆ˜์ • ์‚ฌํ•ญ์ด ์ด๋ฏธ ์ฝ”๋“œ์— ๋ฐ˜์˜๋จ โ€” sft_dataset.py (dynamic padding, EOS ๋ณด์žฅ), prepare_sft_data.py (๊ฐ•ํ™” ํ•„ํ„ฐ, ๊ฐ€์ค‘์น˜ ์ˆ˜์ •) ๋ชจ๋‘ ์ˆ˜์ • ์™„๋ฃŒ. ์‹คํ–‰๋งŒ ํ•˜๋ฉด ๋จ.
  4. ๊นจ๋—ํ•œ ๊ธฐ์ค€์„ ์ด ํ•„์š” โ€” 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