1. DeepSpeed๋?

DeepSpeed๋ Microsoft์์ ๊ฐ๋ฐํ ๋๊ท๋ชจ ๋ถ์ฐ ํ์ต ์ต์ ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. ๊ธฐ์กด์ PyTorch DDP๋ง์ผ๋ก๋ ํ์ตํ๊ธฐ ์ด๋ ค์ด ์์ญ์ต~์๋ฐฑ์ต ํ๋ผ๋ฏธํฐ ๋ชจ๋ธ์ ํจ์จ์ ์ผ๋ก ํ์ต์ํค๊ธฐ ์ํด ๋ฑ์ฅํ๋ค. GPU ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฝํ๊ณ ํ์ต ์๋๋ฅผ ๋์ด๊ธฐ ์ํ ZeRO ์ต์ ํ, Mixed Precision, Offloading, Pipeline/Tensor ๋ณ๋ ฌํ ๋ฑ ๋ค์ํ ๊ธฐ๋ฒ์ ํตํฉ์ ์ผ๋ก ์ ๊ณตํ๋ ๊ฒ์ด ํน์ง์ด๋ค. PyTorch ๊ธฐ๋ฐ์ผ๋ก ์๋ํ๋ฉฐ ์ฌ์ฉ๋ฒ๊ณผ ํตํฉ์ด ์ฉ์ดํ๋ค.
2. ์ฃผ์ ํน์ง
2.1 ZeRO (Zero Redundancy Optimizer)
DeepSpeed์ ํต์ฌ ๊ธฐ๋ฅ์ด๋ค. ํ๋ผ๋ฏธํฐ, ๊ทธ๋ผ๋์ธํธ, ์ตํฐ๋ง์ด์ ์ํ๋ฅผ GPU๋ผ๋ฆฌ ๋ถ์ฐ(shard)ํด GPU ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ๋ํญ ์ ๊ฐํ๋ค. ์๋ฅผ ๋ค์ด ZeRO-3๋ ํ๋ผ๋ฏธํฐ ์์ฒด๊น์ง shardํ์ฌ GPU ํ๋๊ฐ ๋ชจ๋ธ ์ ์ฒด๋ฅผ ํญ์ ์ฌ๋ฆฌ์ง ์๊ณ ๋ ํ์ต์ด ๊ฐ๋ฅํ๋ค. PyTorch DDP๋ ๋ชจ๋ธ ์ ์ฒด๋ฅผ ๊ฐ GPU์ ๋ณต์ ํ๋ ๋ฐฉ์์ด๋ผ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ๋์ง๋ง, ZeRO๋ ์ด๋ฅผ ์ต์ํํ๋ค.
- ZeRO-1: optimizer states ๋ถ์ฐ
- ZeRO-2: optimizer states + gradients ๋ถ์ฐ
- ZeRO-3: optimizer states + gradients + parameters ๊น์ง ๋ชจ๋ shard
2.2 Mixed Precision Training
FP16, BF16 ๋ฑ์ ํ์ฉํด ์ฐ์ฐ ์๋์ GPU ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ค์ธ๋ค. ์๋ฅผ ๋ค์ด 32GB GPU๋ก 16GB ๋ชจ๋ธ์ ํ์ตํ ๋ FP16์ ์ ์ฉํ๋ฉด ๊ฐ์ GPU์์ 2๋ฐฐ ๊ฐ๊น์ด ๋ฐฐ์น ์ฌ์ด์ฆ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
2.3 Gradient Accumulation & CPU Offloading
batch๋ฅผ ์ฌ๋ฌ step์ผ๋ก ๋๋ ๊ทธ๋๋์ธํธ๋ฅผ ๋์ (accumulate)ํ๊ณ , optimizer ์ํ๋ฅผ CPU์ ์ฌ๋ ค GPU ๋ฉ๋ชจ๋ฆฌ ๋ถ๋ด์ ์ค์ธ๋ค. DDP๋ FSDP๋ณด๋ค CPU offload๊ฐ ์ฝ๊ฒ ์ ์ฉ๋๋ค.
2.4 Pipeline & Tensor Parallelism
๋ชจ๋ธ์ ์ฌ๋ฌ stage๋ ํ ์ ๋จ์๋ก ์ชผ๊ฐ ๋ค์์ GPU์์ ๋ณ๋ ฌ๋ก ํ์ตํ๋ค. Transformer์ฒ๋ผ ๊น์ ๋คํธ์ํฌ๋ฅผ ํ์ดํ๋ผ์ธ ์คํ ์ด์ง๋ก ๋๋ ์ฒ๋ฆฌํ๊ฑฐ๋ ํ ์ ์ฐ์ฐ ์์ฒด๋ฅผ ์ชผ๊ฐ์ด ๋ถ์ฐ ์ฐ์ฐํ๋ ๋ฐฉ์์ผ๋ก, PyTorch์ ๊ธฐ๋ณธ DDP/FSDP๊ฐ ์ง์ํ์ง ์๋ ์์ค์ fine-grained ๋ณ๋ ฌ ํ์ต์ด ๊ฐ๋ฅํ๋ค.
2.5 ๋ถ์ฐํ์ต ํ๋ ์์ํฌ ๋น๊ต
| ๋ฐฉ๋ฒ | ๋ฌด์์ ๋ณ๋ ฌํ? | ํน์ง |
| DDP | ๋ฐ์ดํฐ ๋ณ๋ ฌํ | ๋ชจ๋ GPU๊ฐ ๊ฐ์ ๋ชจ๋ธ ์ ์ฒด๋ฅผ ๋ณต์ , ์๋ก ๋ค๋ฅธ ๋ฐ์ดํฐ batch ํ์ต |
| FSDP | ๋ฐ์ดํฐ + ํ๋ผ๋ฏธํฐ shard | ํ๋ผ๋ฏธํฐ shard๋ก GPU ๋ฉ๋ชจ๋ฆฌ ์ค์, ๊ทธ๋๋ ๋ฐ์ดํฐ ๋ณ๋ ฌ |
| DeepSpeed Pipeline | ๋ชจ๋ธ ์์ฒด๋ฅผ stage๋ณ๋ก ๋ถํ | GPU์ ๋ชจ๋ธ์ ๋๋ ์ ์ฌ๋ ค ๋ฉ๋ชจ๋ฆฌ ๋ถ์ฐ, forward/backward๋ ์์ฐจ ์ํ |
DDP, FSDP๊ฐ ๋ฐ์ดํฐ ๋ณ๋ ฌ์ ์ํ ํ๋ ์์ํฌ๋ผ๋ฉด, DeepSpeed๋ ZeRO(๋ฐ์ดํฐ+ํ๋ผ๋ฏธํฐ ๋ณ๋ ฌ) ๋ฟ ์๋๋ผ ํ์ดํ๋ผ์ธ ๋ณ๋ ฌ๋ ์ง์ํด ์ด๋ํ ๋ชจ๋ธ ํ์ต์ ํจ์ฌ ์ ํฉํ๋ค.
3. DeepSpeed Pipeline Parallelism ์ค์ ๋์ ์์
์์: 3-stage ํ์ดํ๋ผ์ธ
- ๋ชจ๋ธ์ stage 3๊ฐ๋ก ๋๋์๋ค๊ณ ๊ฐ์ (ex. Transformer block์ ๋๋)
- GPU๋ 3๋ (GPU0, GPU1, GPU2)
๋ฏธ๋๋ฐฐ์น1
GPU0: stage1 --> output1
GPU1: stage2 --> output2
GPU2: stage3 --> final_output
๋ฏธ๋๋ฐฐ์น2
GPU0: stage1 --> output1
GPU1: stage2 --> output2
GPU2: stage3 --> final_output
...
์ฆ forward๋
- GPU0์ด stage1์ ๊ณ์ฐ → output์ GPU1๋ก ๋๊น
- GPU1์ด stage2 ๊ณ์ฐ → output์ GPU2๋ก ๋๊น
- GPU2๊ฐ stage3 ๊ณ์ฐ → ์ต์ข output
๋์์ pipeline bubble์ ์ค์ด๊ธฐ ์ํด
time step1: GPU0(๋ฏธ๋๋ฐฐ์น1 stage1)
time step2: GPU0(๋ฏธ๋๋ฐฐ์น2 stage1), GPU1(๋ฏธ๋๋ฐฐ์น1 stage2)
time step3: GPU0(๋ฏธ๋๋ฐฐ์น3 stage1), GPU1(๋ฏธ๋๋ฐฐ์น2 stage2), GPU2(๋ฏธ๋๋ฐฐ์น1 stage3)
...
์ด๋ ๊ฒ ๋ฏธ๋๋ฐฐ์น๋ฅผ ๋๋์ด ์๋ก ๋ค๋ฅธ stage๊ฐ ๋์์ ๋์๊ฐ๋๋ก ํด idle time(bubble)์ ์ต์ํํ๋ค.
Backward ํ๋ฆ
GPU2: backward(stage3)
GPU1: backward(stage2)
GPU0: backward(stage1)
backward๋ forward์ ๋ฐ๋ ๋ฐฉํฅ์ผ๋ก ํ๋ฌ๊ฐ.
โ Pipeline parallelism
๋ชจ๋ธ์ ์ฌ๋ฌ stage๋ก ์ชผ๊ฐ GPU์ ๋ถ์ฐ → ์์ฐจ์ ์ผ๋ก forward/backward ์ํ → bubble ์ต์ํ ์ํด ๋ฏธ๋๋ฐฐ์น ๋๋์ด pipeline ์ฑ์ฐ๊ธฐ
4. ์ฌ์ฉ ๋ฐฉ๋ฒ
4.1 ์ค์น
pip install deepspeed
PyTorch, CUDA, NCCL์ด ์ค์น๋์ด ์์ด์ผ ํ๋ฉฐ, ๋๊ท๋ชจ ๋ถ์ฐ์ ์ํด Slurm ๊ฐ์ ์ค์ผ์ค๋ฌ ํ๊ฒฝ์ด ์ค๋น๋์ด ์์ผ๋ฉด ์ข๋ค.
4.1 ๊ธฐ๋ณธ ํ์ต ์คํฌ๋ฆฝํธ ๊ตฌ์กฐ
DeepSpeed๋ deepspeed ๋ฐ์ฒ๋ฅผ ์ฌ์ฉํด ๋ถ์ฐ ํ์ต์ ์์ํ๋ค.
deepspeed --num_gpus=4 train.py --deepspeed --deepspeed_config ds_config.json
์ฌ๊ธฐ์ ds_config.json์ ํ์ต ๋ฐ ZeRO, FP16 ์ค์ ๋ฑ์ ๋ด์ ์ค์ ํ์ผ์ด๋ค.
4.2 ์์ ds_config.json
{
"train_batch_size": 64,
"gradient_accumulation_steps": 4,
"fp16": {
"enabled": true
},
"zero_optimization": {
"stage": 2,
"offload_optimizer": {
"device": "cpu"
}
}
}
- train_batch_size: ์ ์ฒด ํ์ต์์ ๋ชฉํ๋ก ํ๋ effective batch size. gradient_accumulation_steps์ num_gpus๋ฅผ ๊ณฑํด GPU๋น ์ฒ๋ฆฌ๋์ ๊ฒฐ์ ํ๋ค.
- gradient_accumulation_steps: gradient๋ฅผ ์ฌ๋ฌ step ๋์ ๋์ ํ ํ๊บผ๋ฒ์ optimizer step์ ์ํํด ๋ ํฐ batch size๋ฅผ ํ๋ด๋ธ๋ค.
- fp16.enabled: float32 ๋์ float16(๋ฐ์ ๋ฐ๋) ์ฐ์ฐ์ ์ํํด ์ฐ์ฐ ์๋์ GPU ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ค์ธ๋ค.
- zero_optimization.stage: ZeRO ์ต์ ํ ๋จ๊ณ. stage 2๋ optimizer states์ gradients๋ฅผ shardํ์ฌ ๋ฉ๋ชจ๋ฆฌ footprint๋ฅผ ํฌ๊ฒ ์ค์ธ๋ค.
- offload_optimizer.device: optimizer ์ํ๋ฅผ CPU๋ก ์ฎ๊ฒจ GPU ๋ฉ๋ชจ๋ฆฌ ๋ถ๋ด์ ๋ ์ค์ธ๋ค.
GPU ํด๋ฌ์คํฐ ๊ตฌ์ฑ → Slurm์ผ๋ก ์์ ๊ด๋ฆฌ → PyTorch ๋ชจ๋ธ → DeepSpeed๋ก ๋ํ + ds_config → Slurm์์ srun/sbatch๋ก ์คํ
DeepSpeed๋ ์ด๊ฑฐ๋ ๋ชจ๋ธ์ ํ์ตํ๊ธฐ ์ํด ๋ฑ์ฅํ ํ๋ ์์ํฌ๋ก, ZeRO๋ฅผ ํตํด GPU ๋ฉ๋ชจ๋ฆฌ ๋ถ๋ด์ ๊ทน์ ์ผ๋ก ์ค์ด๊ณ , FP16, Offloading, Parallelism ๋ฑ์ ์กฐํฉํด ๋๊ท๋ชจ ๋ถ์ฐ ํ์ต์ ํจ์จ์ ์ผ๋ก ์ํํ ์ ์๊ฒ ํ๋ค.