GPU ํด๋ฌ์คํฐ: SuperPOD์ Slurm์ ๊ฐ๋ ๊ณผ ํ์ฉ๋ฒ
๐ GPU ํด๋ฌ์คํฐ๋ ๋ฌด์์ธ๊ฐ?
GPU ํด๋ฌ์คํฐ๋ ์ฌ๋ฌ ๋์ GPU ์๋ฒ๋ฅผ ๊ณ ์ ๋คํธ์ํฌ๋ก ์ฐ๊ฒฐํ์ฌ ํ๋์ ์์คํ ์ฒ๋ผ ์ฌ์ฉํ๋ ์ปดํจํ ํ๊ฒฝ์ด๋ค. ์ต๊ทผ AI ๋ชจ๋ธ๋ค์ ๊ท๋ชจ๊ฐ ์ ์ ์ปค์ง๊ณ ๋ณต์กํด์ง๊ณ ์์ด, ๋จ์ผ GPU๋ง์ผ๋ก๋ ํจ์จ์ ์ธ ํ์ต์ด ์ด๋ ค์์ก๋ค. ์ด๋ GPU ํด๋ฌ์คํฐ๋ ์ฌ๋ฌ GPU์ ์์์ ๋์์ ํ์ฉํ์ฌ ๋น ๋ฅด๊ณ ํจ๊ณผ์ ์ผ๋ก AI ๋ชจ๋ธ์ ํ์ตํ ์ ์๋๋ก ํ๋ค.
์๋ฅผ ๋ค์ด, OpenAI์ GPT-4๋ Meta์ LLaMA์ ๊ฐ์ ์ด๊ฑฐ๋ ๋ชจ๋ธ๋ค์ ์๋ฐฑ์์ ์์ฒ ๊ฐ์ GPU๋ฅผ ๋์์ ํ์ฉํ์ฌ ํ์ต๋๋ค. ์ด๋ฌํ ์ด๊ฑฐ๋ ๋ชจ๋ธ ํ์ต ํ๊ฒฝ์ด ๋ฐ๋ก GPU ํด๋ฌ์คํฐ ํ๊ฒฝ์ด๋ค.
๐ NVIDIA SuperPOD๋?
NVIDIA SuperPOD๋ NVIDIA๊ฐ ์ ๊ณตํ๋ ์ด๊ณ ์ฑ๋ฅ GPU ํด๋ฌ์คํฐ ์์คํ ์ด๋ค. ์ผ๋ฐ์ ์ธ GPU ์๋ฒ ์ฌ๋ฌ ๋๋ฅผ ๋จ์ํ ๋ฌถ์ ๊ฒ์ด ์๋๋ผ, ๊ณ ์ ํต์ ์ ์ํ NVLink์ InfiniBand์ ๊ฐ์ ํน์ ๋คํธ์ํฌ ๊ธฐ์ ์ ํ์ฉํ์ฌ GPU ๊ฐ์ ๋น ๋ฅธ ๋ฐ์ดํฐ ํต์ ์ ๊ฐ๋ฅํ๊ฒ ํ๋ค.
ํนํ SuperPOD๋ ๋๊ท๋ชจ AI ํ์ต์ ์ต์ ํ๋ ํ๊ฒฝ์ผ๋ก, NVIDIA A100 ๋๋ ์ต์ ์ H100 GPU ์๋ฐฑ ๋๋ฅผ ๋์์ ์ฐ๊ฒฐํ์ฌ ์ฌ์ฉํ๋ค. ๊ฐ GPU ๊ฐ ๋ฐ์ดํฐ ๊ตํ ์๋๊ฐ ๋งค์ฐ ๋นจ๋ผ ๋ชจ๋ธ ํ์ต์ ํจ์จ์ฑ์ ๊ทน๋ํํ๋ฉฐ, ๋๊ท๋ชจ ๋ชจ๋ธ์ ํจ๊ณผ์ ์ผ๋ก ํ์ตํ ์ ์๊ฒ ์ง์ํ๋ค. NVIDIA SuperPOD๋ ์ด๋ฏธ OpenAI์ GPT ๋ชจ๋ธ๊ณผ ๊ฐ์ ์ด๊ฑฐ๋ AI ๋ชจ๋ธ์ ํ์ต์ ํ์ฉ๋๊ณ ์์ผ๋ฉฐ, AI ๋ชจ๋ธ ๊ฐ๋ฐ ๋ฐ ์ฐ๊ตฌ๋ฅผ ์ํ ํต์ฌ ์ธํ๋ผ๋ก ์๋ฆฌ์ก์๋ค.
- NVLink: NVIDIA๊ฐ ๊ฐ๋ฐํ ๊ณ ์ GPU ๊ฐ ๋ฐ์ดํฐ ํต์ ๊ธฐ์ ๋ก, GPU ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ํตํฉํ์ฌ ๋ณ๋ชฉ ํ์์ ํฌ๊ฒ ์ค์ฌ์ค๋ค.
- InfiniBand: ๋ฐ์ดํฐ ์ผํฐ ๋ด ๊ณ ์ฑ๋ฅ ์ปดํจํ (HPC) ๋ฐ ํด๋ฌ์คํฐ ์์คํ ์์ ๋๋ฆฌ ์ฌ์ฉํ๋ ์ด๊ณ ์ ๋คํธ์ํฌ ๊ธฐ์ ๋ก, ๋ฎ์ ์ง์ฐ ์๊ฐ๊ณผ ๋์ ๋์ญํญ์ ์ ๊ณตํ๋ค.
๐ Slurm์ด๋?
Slurm(Simple Linux Utility for Resource Management)์ ๋ฆฌ๋ ์ค ๊ธฐ๋ฐ์ ์คํ์์ค ์์ ๊ด๋ฆฌ ๋ฐ ์์ ์ค์ผ์ค๋ง ์์คํ ์ด๋ค. ํด๋ฌ์คํฐ ํ๊ฒฝ์์๋ ๋ค์ํ ์ฐ๊ตฌ์๋ ์์ง๋์ด๊ฐ ๋์์ ๋ชจ๋ธ ํ์ต์ ์์ฒญํ๊ฒ ๋๋๋ฐ, ์ด๋ GPU์ CPU ๋ฑ์ ์์์ ํจ์จ์ ์ผ๋ก ๋ถ๋ฐฐํ์ฌ ์์ ์ ๊ด๋ฆฌํ๋ ์ญํ ์ ํ๋ค.
์ฝ๊ฒ ๋งํด, Slurm์ GPU ํด๋ฌ์คํฐ์์ '๊ตํต ๊ฒฝ์ฐฐ'๊ณผ ๊ฐ์ ์ญํ ์ ํ๋ค. ์ฌ์ฉ์๊ฐ ์ ์ถํ ์์ (Job)์ ๋ฐ์์ ์ธ์ ์ด๋ค ๋ ธ๋์์ ์คํํ ์ง ๊ฒฐ์ ํ๊ณ , ์์์ ์ ์ ํ ๋ฐฐ๋ถํด ์์๋๋ก ์ฒ๋ฆฌํ๋ค.
Slurm์ ์ฌ์ฉํ๋ ค๋ฉด?
Slurm์ ์ฌ์ฉํด ์์ (์๋ ์ฐธ๊ณ )์ ์ ์ถํ๋ ค๋ฉด, ๋ฐ๋์ ๋ฏธ๋ฆฌ GPU ํด๋ฌ์คํฐ๊ฐ ๊ตฌ์ถ๋ ์ํ์ฌ์ผ ํ๋ค. ์ฆ ๋ฌผ๋ฆฌ์ ์ผ๋ก GPU ์๋ฒ(๋ ธ๋)๋ค์ด ๋คํธ์ํฌ๋ก ์ฐ๊ฒฐ๋์ด ์๊ณ , Slurm์ด ์ด๋ฅผ ๊ด๋ฆฌํ๋๋ก ์ค์ ๋ ํ๊ฒฝ์ด ํ์ํ๋ค.
AWS EC2๋ฅผ ๋จ์ํ ์ฌ๋ฌ ๊ฐ ๋์ฐ๊ณ SSH๋ก ์ ์ํ๋ ๊ฒ๊ณผ๋ ๋ค๋ฅด๋ค. Slurm์ ์ฌ์ฉํ๋ ค๋ฉด
- ์ฌ๋ฌ GPU ์๋ฒ(๋
ธ๋)๊ฐ ๋ฌผ๋ฆฌ์ ·๋
ผ๋ฆฌ์ ์ผ๋ก ํด๋ฌ์คํฐ๋ฅผ ์ด๋ค์ผ ํ๋ค.
- ๋ณดํต ๊ฐ์ ๋ฐ์ดํฐ์ผํฐ ๋ ๋ด์์ InfiniBand ๊ฐ์ ๊ณ ์ ๋คํธ์ํฌ๋ก ์ฐ๊ฒฐ
- ๋ชจ๋ ๋ ธ๋์ Slurm ๋ฐ๋ชฌ(slurmd)์ด ์ค์น๋์ด Slurm ์ปจํธ๋กค๋ฌ(slurmctld)์ ํต์ ํ๋๋ก ๊ตฌ์ฑ๋์ด ์์ด์ผ ํ๋ค.
- ๋์ผํ ํ์ผ์์คํ (์: NFS)์ด ๋ง์ดํธ๋์ด ์์ด ์์ ์คํฌ๋ฆฝํธ์ ๋ฐ์ดํฐ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๊ณต์ ๊ฐ๋ฅํด์ผ ํ๋ค.
๋ฐ๋ผ์ Slurm์ ์ฌ์ฉํด sbatch๋ฅผ ์คํํ๋ ค๋ฉด ์ด๋ฐ ํด๋ฌ์คํฐ๊ฐ ์ด๋ฏธ ์ค๋น๋์ด ์์ด์ผ ํ๋ค. ์ฌ์ฉ์๋ Slurm์ด ์ ๊ตฌ์ถ๋ ํด๋ฌ์คํฐ ํ๊ฒฝ์ SSH๋ก ์ ์ํด sbatch๋ฅผ ํตํด ์์ ๋ง ์ฌ๋ฆฌ๋ฉด ๋๋ค.
์ด์ ๋๋น๋๋ ์๋ก, ๋จ์ํ AWS EC2 ์ฌ๋ฌ ๋๋ฅผ ๋์์ python train.py๋ฅผ ๋ฐ๋ก ์คํํ๋ฉด ๋ ธ๋๋ผ๋ฆฌ ์๋์ผ๋ก ํ์ ํ์ง ์๋๋ค. ์ด๋๋ ์๋์ผ๋ก IP๋ฅผ ์ง์ ํด torch.distributed.launch ๊ฐ์ ์คํฌ๋ฆฝํธ๋ฅผ ๋๋ ค์ผ ํ๋ค. ๋ฐ๋ฉด Slurm์ ์ด๋ฐ ๋ถ์ฐ ํ์ต ํ๊ฒฝ(IP, ํฌํธ, ํ๋ก์ธ์ค ์)์ ์๋์ผ๋ก ์ธํ ํด ์ฃผ๊ธฐ ๋๋ฌธ์ ํจ์ฌ ํธ๋ฆฌํ๋ค. ์ฆ Slurm์ ๋จ์ํ ์ค์ผ์ค๋ฌ๊ฐ ์๋๋ผ, ์ด๋ฏธ ๊ตฌ์ถ๋ GPU ํด๋ฌ์คํฐ ์์์ ์์์ ํ ๋นํ๊ณ ๋ถ์ฐ ํ์ต์ ํ๋ก์ธ์ค๋ฅผ ์๋์ผ๋ก ๊ด๋ฆฌํด ์ฃผ๋ ํต์ฌ ๋๊ตฌ์ด๋ค.
Slurm์ผ๋ก ๋๊ท๋ชจ ๋ชจ๋ธ์ ํ์ตํ๊ธฐ ์ํด ํ์ํ ๋จ๊ณ
1๏ธโฃ Job ์คํฌ๋ฆฝํธ ์์ฑํ๊ธฐ
์ฌ์ฉ์๋ ๋จผ์ Slurm์ ์ ์ถํ ์์ ์ bash ์คํฌ๋ฆฝํธ๋ก ์์ฑํ๋ค. ์ด ์คํฌ๋ฆฝํธ์๋ ๋ช ๊ฐ์ GPU๋ฅผ ์ฌ์ฉํ ์ง, ๋ช ๊ฐ์ ๋ ธ๋๋ฅผ ์ฌ์ฉํ ์ง, ์ต๋ ์ผ๋ง ๋์ ์คํํ ์ง ๋ฑ์ ์ค์ ํ๋ค.
#!/bin/bash
#SBATCH --job-name=large_model_train # ์์
์ด๋ฆ
#SBATCH --nodes=2 # ์ฌ์ฉํ ๋
ธ๋(์๋ฒ) ๊ฐ์
#SBATCH --gres=gpu:4 # ๋
ธ๋๋น GPU ๊ฐ์ (์ด 8 GPU)
#SBATCH --ntasks-per-node=4 # ๋
ธ๋๋น ์คํํ ํ๋ก์ธ์ค ์
#SBATCH --time=24:00:00 # ์ต๋ ์คํ ์๊ฐ (24์๊ฐ)
#SBATCH --partition=gpu # ์ฌ์ฉํ ํํฐ์
module load cuda/12.1
module load python/3.11
srun python train_large_model.py
์ ์์๋ "์ด 8๊ฐ์ GPU๋ฅผ ๋ ์๋ฒ์ ๊ฑธ์ณ ์ฌ์ฉํด ํ๋ฃจ ๋์ ๋ชจ๋ธ์ ํ์ต์์ผ๋ผ"๋ ์๋ฏธ๋ค.
2๏ธโฃ ์์ ์ ์ถํ๊ธฐ
sbatch train_job.sh
์์ฑํ ์คํฌ๋ฆฝํธ๋ฅผ Slurm์ ์ ์ถํ๋ค.
Slurm์ ์ด ์์ฒญ์ ๋ฐ๊ณ ์ ์ ํ ์์ ๊ณผ ๋ ธ๋๋ฅผ ๊ฒฐ์ ํ์ฌ ์คํํ๋ค.
3๏ธโฃ ์์ ์ํ ๋ชจ๋ํฐ๋งํ๊ธฐ
squeue -u username # ๋ณธ์ธ ์์
์กฐํ
์ ์ถํ ์์ ์ด ํ์ฌ ์ด๋ค ์ํ์ธ์ง ํ์ธํ ์ ์๋ค.
๋๋ ํน์ ์์ ID์ ์์ธ ๋ด์ญ์ ๋ณด๊ณ ์ถ๋ค๋ฉด
scontrol show job JOB_ID
4๏ธโฃ ์์ ์ทจ์ํ๊ธฐ
scancel JOB_ID
์๋ชป ์ ์ถํ๊ฑฐ๋ ์ค๋จํ๊ณ ์ถ์ ๋๋ ๋ค์๊ณผ ๊ฐ์ด ์ทจ์ํ๋ค.
5๏ธโฃ ๊ฒฐ๊ณผ ํ์ธํ๊ธฐ
Slurm์ ๋ณดํต slurm-JOBID.out ํ์ผ์ ์๋ ์์ฑํด ํ์ค ์ถ๋ ฅ ๋ก๊ทธ๋ฅผ ๋จ๊ธด๋ค. ์ฌ๊ธฐ์ ํ์ต ์ค ์ถ๋ ฅ๋ ๋ก๊ทธ๋ ์ค๋ฅ๋ฅผ ํ์ธํ ์ ์๋ค.
Slurm์ ์ ์ฌ์ฉํ๊ธฐ ์ํด ์์์ผ ํ ๊ฒ
- module load๋ฅผ ํตํ CUDA, Python ํ๊ฒฝ ์ค์ ๋ฐฉ๋ฒ
- srun์ ์ด์ฉํ ๋ถ์ฐ ํ์ต ์คํ ๋ฐฉ์
- ntasks, nodes, gres๋ฅผ ์กฐํฉํด GPU/๋ ธ๋ ๋ณ๋ ฌ ๊ตฌ์กฐ๋ฅผ ์ค๊ณํ๋ ๋ฐฉ๋ฒ
- --dependency ์ต์ ๋ฑ์ ํ์ฉํด ์ ํ ์์ ์ด ๋๋ ๋ค ํ์ ์์ ์ ์๋์ผ๋ก ์คํํ๊ธฐ
- NCCL, torch.distributed.launch์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ Slurm์ ์ฐ๋ ๋ฐฉ์
์ด์ฒ๋ผ Slurm์ ๋จ์ํ ์์ ์ ์ถ๋ง ํ๋ ์์คํ ์ด ์๋๋ผ, ๋๊ท๋ชจ ๋ชจ๋ธ ํ์ต์์ ์์์ ์ต์ ์ผ๋ก ํ์ฉํ๊ธฐ ์ํด ๊ผญ ์์งํด์ผ ํ ํต์ฌ ๋๊ตฌ์ด๋ค.
๋ถ์ฐํ์ต ํ๋ ์์ํฌ ๊ฐ๋จ ์ ๋ฆฌ
๋๊ท๋ชจ GPU ํด๋ฌ์คํฐ์์ Slurm์ ํตํด ์์์ ํ ๋น๋ฐ์ ๋ค, ์ค์ ๋ก ๋ชจ๋ธ์ ๋ถ์ฐ ํ์ต์ํค๋ ๋ฐ๋ FSDP, Deepspeed, Pipeline Parallelism ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค.
- FSDP๋ PyTorch์์ ์ ๊ณตํ๋ Fully Sharded Data Parallel ๋ฐฉ์์ผ๋ก, ๋ชจ๋ธ ํ๋ผ๋ฏธํฐ๋ฅผ GPU๋ค์ ๋๋์ด ์ฌ๋ ค ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ต์ํํ๋ค.
- Deepspeed๋ ๋ง์ดํฌ๋ก์ํํธ๊ฐ ๋ง๋ ํ๋ ์์ํฌ๋ก ZeRO, Offload, Pipeline ๋ฑ ๋ค์ํ ๊ธฐ์ ์ ํตํด ์ด๋๊ท๋ชจ ๋ชจ๋ธ๋ ํจ์จ์ ์ผ๋ก ํ์ตํ ์ ์๊ฒ ํ๋ค.
- Pipeline Parallelism์ ๋ชจ๋ธ์ layer๋ฅผ ์ฌ๋ฌ GPU์ ํ์ดํ๋ผ์ธ ํํ๋ก ๋ถํ ํด ์์ฐจ์ ์ผ๋ก ํ์ตํ๋ ๋ฐฉ์์ด๋ค.
์ด๋ค ํ๋ ์์ํฌ๋ฅผ ๋์์ ์ฌ์ฉํ๋ ๊ฒ์ ์๋๋ฉฐ, ๋ชจ๋ธ๊ณผ ํ๊ฒฝ์ ๋ง๊ฒ ์ ์ ํ ํ๋๋ฅผ ์ ํํด ์ ์ฉํ๋ค. ์ฆ Slurm์ด GPU ํด๋ฌ์คํฐ์์ ์์์ ํ ๋นํด ์ฃผ๋ '๊ตํต ์ ๋ฆฌ'๋ฅผ ํ๋ค๋ฉด, FSDP, Deepspeed, Pipeline Parallelism์ ๊ทธ ์์ ์์์ ์ค์ ๋ก ๋ชจ๋ธ์ ๋ถ์ฐ ํ์ต์ํค๋ '์คํ ์์ง'์ด๋ค.