3B Korean LLM ํ์ต ํ์ดํ๋ผ์ธ โ ์ ์ฒด ๊ณํ
์์ฑ์ผ: 2026-02-27
์๋ฒ: 8ร B200 192GB, NVSwitch, CUDA 13.1, PyTorch 2.10, TransformerEngine FP8
ํ๋ก์ ํธ: /PROJECT/0325120031_A/ghong/taketimes/llm-bang/
1. ๋ชจ๋ธ ์ํคํ
์ฒ (3B)
| ํญ๋ชฉ |
1B (ํ์ฌ) |
3B (์ ๊ท) |
๊ทผ๊ฑฐ |
| d_model |
2048 |
3072 |
LLaMA-3 3B ์ฐธ๊ณ |
| n_layers |
24 |
28 |
|
| n_heads |
16 |
24 |
|
| n_kv_heads |
4 (GQA 4:1) |
8 (GQA 3:1) |
๋ ํฐ ๋ชจ๋ธ์์ KV ์ข ๋ ์ฌ์ |
| d_ffn |
5472 |
8192 |
~2.67ร d_model, 128๋ฐฐ์ (FP8) |
| max_seq_len |
4096 |
4096 |
๋์ผ |
| vocab_size |
64000 |
64000 |
๋์ผ ํ ํฌ๋์ด์ |
| ์ด ํ๋ผ๋ฏธํฐ |
~1.0B |
~3.0B |
|
2. ์ฌ์ ํ์ต ํ์ดํผํ๋ผ๋ฏธํฐ
| ํญ๋ชฉ |
1B ๊ฐ |
3B ๊ฐ |
๊ทผ๊ฑฐ |
| Learning Rate |
2e-4 |
1.5e-4 |
ฮผP scaling ~1/โ(3), LLaMA-3 3B ์ฐธ๊ณ |
| LR Schedule |
cosine decay |
cosine decay |
๋์ผ |
| Warmup Steps |
2000 |
2000 |
57k์ 3.5% (์ ์ ) |
| Weight Decay |
0.1 |
0.1 |
ํ์ค |
| Gradient Clip |
1.0 |
1.0 |
ํ์ค |
| Batch Size (local) |
8 |
8 |
per GPU |
| Grad Accum |
4 |
4 |
|
| Eff Batch |
1M tok/step |
1M tok/step |
8ร8ร4ร4096 |
| Max Steps |
34,000 |
57,000 (60B tok) |
Chinchilla: 3B โ 60B min |
| ์ด ํ ํฐ |
35.6B |
60B (์ต์) / 95k steps=100B (๊ถ์ฅ) |
|
| Save Interval |
500 |
2000 |
27GB/์ฒดํฌํฌ์ธํธ โ ๋ ์์ฃผ |
| Eval Interval |
200 |
500 |
|
| FP8 |
MXFP8 |
MXFP8 |
B200 ๋ค์ดํฐ๋ธ |
3. ์์ ์์ธก
์ฒดํฌํฌ์ธํธ
- model.pt: 3B ร 1B(FP8) โ 3GB
- optimizer.pt: 3B ร 8B(FP32 states) โ 24GB
- ์ฒดํฌํฌ์ธํธ๋น ~27GB
- 2000 step ๊ฐ๊ฒฉ โ ์ต๋ ~28๊ฐ = 756GB
- /PROJECT ์ฌ์ 19TB โ ์ถฉ๋ถ
VRAM
- ๋ชจ๋ธ: ~6GB (FP8)
- Optimizer states: ~24GB
- Activations: ~40-60GB (batch 8, seq 4096)
- ์ด: ~80-90GB/GPU โ B200 192GB๋ก ์ถฉ๋ถ (47% ์ฌ์ฉ)
ํ์ต ์๊ฐ ์์
- 1B: 34k steps โ ~12h (๊ด์ฐฐ๊ฐ ๊ธฐ๋ฐ)
- 3B: step๋น ~3๋ฐฐ โ step ~1.05s ์์
- 57k steps ร 1.05s โ ~17h (60B tokens)
- 95k steps ร 1.05s โ ~28h (100B tokens)
- ์์ ๋ง์ง ํฌํจ: 24~36h
4. NCCL ์ต์ ํ (B200 NVSwitch)
export NCCL_IB_DISABLE=1
export NCCL_ALGO=Ring,Tree
export NCCL_PROTO=Simple
export NCCL_MIN_NCHANNELS=16
export NCCL_MAX_NCHANNELS=16
export NCCL_BUFFSIZE=134217728
export NCCL_P2P_LEVEL=NVL
5. SFT ๊ณํ (์ฌ์ ํ์ต ์๋ฃ ํ)
๋ฐ์ดํฐ
- 1B SFT ๋ฐ์ดํฐ (161k ์ํ) โ ๊ธฐ์กด ๊ฒ์ฆ ์๋ฃ
- ์ถ๊ฐ ๊ณ ํ์ง ๋ฐ์ดํฐ ๊ณ ๋ ค:
- Ko-Alpaca ํ์ฅ
- ShareGPT-ko ์ถ๊ฐ
- ๋ชฉํ: 200k+ ์ํ
ํ์ดํผํ๋ผ๋ฏธํฐ
| ํญ๋ชฉ |
1B SFT |
3B SFT |
๊ทผ๊ฑฐ |
| LR |
2e-5 |
1e-5 |
๋ ํฐ ๋ชจ๋ธ โ ๋ ๋ฎ์ LR |
| Batch (local) |
4 |
4 |
|
| Grad Accum |
2 |
2 |
|
| Eff Batch |
64 |
64 |
|
| Max Steps |
9000 |
12000 |
3B๋ ์๋ ด์ ์ข ๋ ํ์ |
| Warmup |
300 |
500 |
|
| Max Seq Len |
4096 |
4096 |
|
1B SFT ๊ตํ ๋ฐ์
- โ
Labels shift ๋ฒ๊ทธ โ sft_dataset.py ์ด๋ฏธ ์์ ๋จ
- โ
ํ๋ก์ธ์ค ์ค๋ณต ๋ฐฉ์ง โ launch ์คํฌ๋ฆฝํธ์ pgrep ์ฒดํฌ ์ถ๊ฐ
- โ
Loss 0 ๊ฐ์ง โ ๋ชจ๋ํฐ๋ง์ ํฌํจ
์์ SFT ์๊ฐ
- 12000 steps ร
0.8s/step โ **3h**
6. ORPO ๊ณํ (SFT ์๋ฃ ํ)
๋ฐ์ดํฐ
์ค์
| ํญ๋ชฉ |
๊ฐ |
๊ทผ๊ฑฐ |
| LR |
5e-6 |
ORPO ํ์ค, SFT๋ณด๋ค ๋ฎ๊ฒ |
| ฮฒ (ORPO lambda) |
0.1 |
๋
ผ๋ฌธ ๊ธฐ๋ณธ๊ฐ |
| Batch (local) |
2 |
chosen+rejected ์ โ ๋ฉ๋ชจ๋ฆฌ 2๋ฐฐ |
| Grad Accum |
4 |
eff_batch = 64 |
| Max Steps |
~3000-5000 |
๋ฐ์ดํฐ ํฌ๊ธฐ์ ๋ฐ๋ผ |
| Max Seq Len |
4096 |
|
์์ ORPO ์๊ฐ
- 5000 steps ร
1.5s/step (์ ๋น๊ต) โ **2h**
7. ์ ์ฒด ํ์๋ผ์ธ
Phase 1: ์ฌ์ ํ์ต (60B tokens)
โโ ์ค๋น: configs, scripts ํ์ธ ~30๋ถ
โโ ํ์ต: 57k steps ~24-36h
โโ ํ๊ฐ: eval suite ~1h
Phase 2: SFT
โโ ๋ฐ์ดํฐ ์ค๋น: 161k+ ๊ฒ์ฆ ~30๋ถ
โโ ํ์ต: 12k steps ~3h
โโ ํ๊ฐ ~30๋ถ
Phase 3: ORPO
โโ ๋ฐ์ดํฐ ๋ค์ด๋ก๋+์ฒ๋ฆฌ ~30๋ถ
โโ ํ์ต: 3-5k steps ~2h
โโ ์ต์ข
ํ๊ฐ ~1h
์ด ์์: ์ฝ 3-4์ผ (์ฌ์ ํ์ต ํฌํจ)
์ฌ์ ํ์ต๋ง: 24-36h
SFT+ORPO: ~6h
8. ์์ธ ๋์ ํ๋ ์ด๋ถ (3B ํนํ)
8-1. ์๋ฒ ์ฌ์์์ด ํ์ํ ๊ฒฝ์ฐ
Ctrl+C๋ก graceful stop (SIGINT โ ํ์ฌ step ์๋ฃ ํ ์ฒดํฌํฌ์ธํธ ์ ์ฅ)
- ์ ๋๋ฉด
kill -15 <PID> โ 10์ด ๋๊ธฐ โ kill -9
- ์ฌ์์ ํ:
bash scripts/launch_3b_pretrain.sh (์๋ resume ๊ฐ์ง)
8-2. ์ฒดํฌํฌ์ธํธ ์์
python -c "
import torch
ckpt = torch.load('checkpoints/korean_3b_fp8_run1/checkpoint-XXXXX/model.pt', weights_only=True)
print(f'Keys: {len(ckpt)}')
print(f'Total params: {sum(v.numel() for v in ckpt.values()):,}')
"
bash scripts/launch_3b_pretrain.sh --resume checkpoints/korean_3b_fp8_run1/checkpoint-YYYYY
8-3. NCCL Hang ๊ฐ์ง
monitor_3b.sh ๋ก๊ทธ 10๋ถ ๋ฉ์ถค โ CRITICAL ์๋ฆผ
--auto-restart ์ต์
์ผ๋ก ์๋ kill + ์ฌ์์ ๊ฐ์ด๋
- ์๋:
kill -9 $(pgrep -f pretrain.py) โ ์ฌ์คํ
8-4. ๋์คํฌ ๊ณต๊ฐ ๋ถ์กฑ
8-5. Loss ๋ฐ์ฐ (NaN / spike)
- ์ฆ์ ์ค๋จ
- ์ต๊ทผ ์ ์ ์ฒดํฌํฌ์ธํธ์์ resume
- LR 50% ๊ฐ์ํ์ฌ ์ฌ์์:
--lr 7.5e-5
- ๋ฐ๋ณต ์ warmup ๋๋ฆฌ๊ธฐ:
--warmup_steps 4000
9. ๋ชจ๋ํฐ๋ง ์คํฌ๋ฆฝํธ
์ค์๊ฐ ๊ฐ์
bash scripts/monitor_3b.sh
bash scripts/monitor_3b.sh --check-once
bash scripts/monitor_3b.sh --auto-cleanup
bash scripts/monitor_3b.sh --auto-restart
TensorBoard
tensorboard --logdir checkpoints/korean_3b_fp8_run1/tensorboard --port 6007
10. ์คํ ์ปค๋งจ๋ ์์ฝ
bash scripts/launch_3b_pretrain.sh
bash scripts/monitor_3b.sh --auto-cleanup
BASE_CHECKPOINT=checkpoints/korean_3b_fp8_run1/checkpoint-XXXXX \
RUN_NAME=korean_3b_sft \
bash scripts/launch_sft.sh --lr 1e-5 --max_steps 12000 --warmup_steps 500
์ํ: โ
ํ์ดํ๋ผ์ธ ์ค๊ณ ์๋ฃ, ์คํฌ๋ฆฝํธ ์์ฑ ์๋ฃ
๋ค์ ์ก์
: bash scripts/launch_3b_pretrain.sh ์คํ