Điểm chính
- Cách dựng một SLURM cluster cơ bản cho AI: 1 controller node, nhiều compute node có GPU, cấu hình dùng chung và xác thực bằng Munge.
- Cách cấu hình
slurm.confcho GPU job (GresTypes=gpu, tài nguyên node, partition GPU) và khởi động các service SLURM.- Ví dụ job script chạy distributed training với PyTorch bằng
torchruntrong container để kiểm tra cluster.
Khi các dự án AI ngày càng phức tạp và mở rộng về quy mô, nhu cầu về môi trường điện toán hiệu năng cao (HPC) ổn định cũng tăng vọt. Kéo theo đó là bài toán quản lý tài nguyên hiệu quả – và đây chính là vấn đề mà SLURM (Simple Linux Utility for Resource Management) được sinh ra để giải quyết.
Vậy SLURM là gì, và workload manager có khả năng mở rộng cao này hoạt động thế nào trên các cluster Linux? Trong bài viết này, chúng tôi sẽ giới thiệu khái niệm SLURM và hướng dẫn từng bước thiết lập một SLURM cluster cho các dự án AI. Cách thiết lập này giúp bạn phân bổ tài nguyên, lập lịch job hiệu quả và tận dụng tối đa hạ tầng tính toán cho AI training và inference.
Cùng bắt đầu nhé!
SLURM là gì?
SLURM (Simple Linux Utility for Resource Management) là một workload manager mã nguồn mở, đóng vai trò “nhạc trưởng” trong “bản giao hưởng” điện toán hiệu năng cao (HPC) của bạn. Hãy hình dung bạn có cả một dàn nhạc gồm những cỗ máy mạnh mẽ, mỗi máy có năng lực xử lý riêng – SLURM chính là người chỉ huy dàn nhạc đó. Không chỉ đơn thuần quản lý workload, SLURM còn đảm bảo:
- Các tác vụ được phân phối chính xác trên toàn bộ compute cluster.
- Tài nguyên như CPU core, bộ nhớ và cả phần cứng chuyên dụng như GPU được phân bổ hợp lý.
- Tài nguyên được tái phân bổ phù hợp để hệ thống luôn có khả năng mở rộng.
Tóm lại, SLURM là “hệ thần kinh trung ương” của môi trường HPC, giúp kỹ sư AI khai thác hiệu quả sức mạnh của compute cluster để giải quyết những bài toán AI khó nhất.
Chuẩn bị trước khi thiết lập SLURM
Trước khi dựng SLURM cluster, bạn cần chuẩn bị:
- Một cụm máy chạy bản phân phối Linux (ví dụ: Ubuntu, CentOS) và có kết nối mạng với nhau.
- Quyền root trên các máy trong cluster.
Môi trường lab trong bài:
- Head node (controller node) chạy Ubuntu 22.04
- hostname:
cls-wrk105, IP:10.237.96.105
- hostname:
- Compute node chạy Ubuntu 22.04
- hostname:
cls-wrk105, IP:10.237.96.105 - hostname:
cls-wrk106, IP:10.237.96.106
- hostname:
Thông tin các node hiển thị như sau:
Cài đặt và cấu hình SLURM trên head node
Để tạo SLURM cluster, trước tiên bạn cần cài đặt và cấu hình SLURM trên head node.
Cài đặt SLURM
Đầu tiên, cập nhật package manager và cài slurmctld trên head node:
root@cls-wrk105:~# sudo apt update
root@cls-wrk105:~# sudo apt install slurmctldKết quả trả về như sau:
Xác thực bằng Munge
Tiếp theo, đảm bảo service munge đang chạy. Kiểm tra bằng lệnh:
root@cls-wrk105:~# systemctl status mungeKết quả trả về như sau:
Cấu hình SLURM
Cấu hình SLURM bằng cách chỉnh sửa file cấu hình chính, thường nằm tại /etc/slurm/slurm.conf.
Dưới đây là ví dụ cấu hình cơ bản:
root@cls-wrk105:~# sudo cat << EOF > /etc/slurm/slurm.conf
ClusterName=lab-cluster
SlurmctldHost=cls-wrk105.lab.local
ProctrackType=proctrack/linuxproc
SlurmctldPidFile=/var/run/slurmctld.pid
SlurmctldPort=6817
SlurmdPidFile=/var/run/slurmd.pid
SlurmdPort=6818
SlurmdSpoolDir=/var/lib/slurm/slurmd
SlurmUser=slurm
StateSaveLocation=/var/lib/slurm/slurmctld
SwitchType=switch/none
TaskPlugin=task/none
#
# TIMERS
InactiveLimit=0
KillWait=30
MinJobAge=300
SlurmctldTimeout=120
SlurmdTimeout=300
Waittime=0
# SCHEDULING
SchedulerType=sched/backfill
SelectType=select/cons_tres
SelectTypeParameters=CR_Core
#
#AccountingStoragePort=
AccountingStorageType=accounting_storage/none
JobCompType=jobcomp/none
JobAcctGatherFrequency=30
JobAcctGatherType=jobacct_gather/none
SlurmctldDebug=info
SlurmctldLogFile=/var/log/slurm/slurmctld.log
SlurmdDebug=info
SlurmdLogFile=/var/log/slurm/slurmd.log
#
# COMPUTE NODES
DefMemPerNode=32000
GresTypes=gpu
NodeName=cls-wrk105.lab.local Gres=gpu:8 CPUs=64 RealMemory=504000 State=UNKNOWN
NodeName=cls-wrk106.lab.local Gres=gpu:7 CPUs=40 RealMemory=252000 State=UNKNOWN
PartitionName=gpu Nodes=ALL Default=YES MaxTime=INFINITE State=UP
EOFNếu có tài nguyên GPU, bạn có thể cấu hình trường gres trong file slurm.conf để khai báo số lượng GPU trên từng node. Ví dụ, với hai node có cấu hình GPU khác nhau, bạn khai báo trường gres như sau:
GresTypes=gpu
NodeName=cls-wrk105.lab.local gres=gpu:8 CPUs=64 RealMemory=504000 State=UNKNOWN
NodeName=cls-wrk106.lab.local gres=gpu:7 CPUs=40 RealMemory=252000 State=UNKNOWNTrong ví dụ này, cls-wrk105.lab.local có 8 GPU, 64 CPU và 504GB bộ nhớ, còn cls-wrk106.lab.local có 7 GPU, 40 CPU và 252GB bộ nhớ. Bạn có thể điều chỉnh các giá trị này theo cấu hình phần cứng thực tế. Xem thêm: https://slurm.schedmd.com/slurm.conf.html
Cấu hình gres cho GPU
Đảm bảo bạn đã cài NVIDIA driver và CUDA toolkit trên từng node để có thể truy cập tài nguyên GPU.
cls-wrk105: 8 GPU. Danh sách GPU hiển thị như sau:
cls-wrk106: 7 GPU
Thiết lập file /etc/slurm/gres.conf để khai báo loại GPU và số lượng GPU trên từng node:
root@cls-wrk105:~# sudo cat << EOF > /etc/slurm/gres.conf
NodeName=cls-wrk105.lab.local Name=gpu File=/dev/nvidia0
NodeName=cls-wrk105.lab.local Name=gpu File=/dev/nvidia1
NodeName=cls-wrk105.lab.local Name=gpu File=/dev/nvidia2
NodeName=cls-wrk105.lab.local Name=gpu File=/dev/nvidia3
NodeName=cls-wrk105.lab.local Name=gpu File=/dev/nvidia4
NodeName=cls-wrk105.lab.local Name=gpu File=/dev/nvidia5
NodeName=cls-wrk105.lab.local Name=gpu File=/dev/nvidia6
NodeName=cls-wrk105.lab.local Name=gpu File=/dev/nvidia7
NodeName=cls-wrk106.lab.local Name=gpu File=/dev/nvidia0
NodeName=cls-wrk106.lab.local Name=gpu File=/dev/nvidia1
NodeName=cls-wrk106.lab.local Name=gpu File=/dev/nvidia2
NodeName=cls-wrk106.lab.local Name=gpu File=/dev/nvidia3
NodeName=cls-wrk106.lab.local Name=gpu File=/dev/nvidia4
NodeName=cls-wrk106.lab.local Name=gpu File=/dev/nvidia5
NodeName=cls-wrk106.lab.local Name=gpu File=/dev/nvidia6
EOFLưu ý: Nếu build SLURM từ source, bạn có thể bật hỗ trợ NVML bằng cách thêm flag --with-nvml vào lệnh configure. Khi đó, SLURM có thể theo dõi mức sử dụng và nhiệt độ GPU, đồng thời áp giới hạn tài nguyên dựa trên mức sử dụng GPU.
Như vậy, bạn không cần khai báo thủ công loại GPU và số lượng GPU của từng node trong gres.conf nữa, chỉ cần thêm dòng sau vào file:
AutoDetect=nvmlXem thêm:
Khởi động service SLURM trên head node:
root@cls-wrk105:~# sudo systemctl start slurmctldKết quả trả về như sau:
Cài đặt SLURM trên compute node
Thực hiện các bước sau để cài SLURM trên compute node:
Cài
slurmdtrên các compute node:root@cls-wrk105:~# sudo apt update root@cls-wrk105:~# sudo apt install slurmd root@cls-wrk106:~# sudo apt update root@cls-wrk106:~# sudo apt install slurmdCopy file cấu hình SLURM và munge key từ head node sang từng compute node:
root@cls-wrk105:~# scp /etc/slurm/*.conf root@cls-wrk106.lab.local:/etc/slurm/ root@cls-wrk105:~# scp /etc/munge/munge.key root@cls-wrk106.lab.local:/etc/munge/munge.keyRestart service munge trên từng compute node:
root@cls-wrk106:~# sudo systemctl restart mungeKhởi động service SLURM trên từng compute node:
root@cls-wrk105:~# sudo systemctl start slurmd root@cls-wrk106:~# sudo systemctl start slurmd
Kiểm tra SLURM cluster
Chuyển các node sang trạng thái
idleđể SLURM có thể lập lịch job lên đó, dùng lệnhscontrol:root@cls-wrk105:~# scontrol update nodename=cls-wrk105.lab.local,cls-wrk106.lab.local state=idleKiểm tra trạng thái các node:
root@cls-wrk105:~# sinfoChạy một job thử để xác nhận SLURM cluster hoạt động đúng:
root@cls-wrk105:~# srun -N2 hostname
Bạn có thể tham khảo một số lệnh SLURM cơ bản tại: https://slurm.schedmd.com/quickstart.html#commands
Chạy GPU job
1. Cài đặt Apptainer
Cài Apptainer để chạy job mẫu trên các compute node. Apptainer là container runtime cho phép chạy ứng dụng đóng gói container trên cluster HPC. Bạn có thể cài Apptainer từ PPA repository như sau:
root@cls-wrk105:~# sudo add-apt-repository -y ppa:apptainer/ppa
root@cls-wrk105:~# sudo apt update
root@cls-wrk105:~# sudo apt install -y apptainer
root@cls-wrk106:~# sudo add-apt-repository -y ppa:apptainer/ppa
root@cls-wrk106:~# sudo apt update
root@cls-wrk106:~# sudo apt install -y apptainer2. Tạo job mẫu
Dưới đây là ví dụ batch script chạy job PyTorch Distributed Data Parallel (DDP) trên SLURM cluster:
root@cls-wrk105:~# cat << 'EOF' > ./sbatch_torchrun_ddp.job
#!/bin/bash
#SBATCH --job-name=multinode-random
#SBATCH --nodes=2
#SBATCH --time=2:00:00
#SBATCH --gres=gpu:2
#SBATCH -o /tmp/multinode-random.%N.%J.%u.out # STDOUT
#SBATCH -e /tmp/multinode-random.%N.%J.%u.err # STDERR
#SBATCH --ntasks=2
nodes=($(scontrol show hostnames $SLURM_JOB_NODELIST ) )
nodes_array=($nodes)
echo $nodes_array
head_node=${nodes_array[0]}
echo $head_node
head_node_ip=$(srun --nodes=1 --ntasks=1 -w "$head_node" hostname --ip-address | cut -d" " -f2)
echo Master Node IP: $head_node_ip
export LOGLEVEL=INFO
srun rm -rf /tmp/slurm-exec-instruction
srun git clone https://github.com/QuangNamVu/slurm-exec-instruction /tmp/slurm-exec-instruction
srun apptainer run \
--nv --bind /tmp/slurm-exec-instruction/torch_dist_train/src/:/mnt \
docker://pytorch/pytorch:2.0.0-cuda11.7-cudnn8-devel \
torchrun --nnodes=2 \
--nproc_per_node=1 \
--rdzv_id=100 \
--rdzv_backend=c10d \
--rdzv_endpoint=$head_node_ip:29400 \
/mnt/rand_ddp.py --batch_size 128 --total_epochs 10000 --save_every 50
EOF3. Submit job bằng lệnh sbatch
root@cls-wrk105:~# sbatch ./sbatch_torchrun_ddp.jobSLURM sẽ lập lịch job lên các compute node và chạy job PyTorch DDP với tài nguyên đã khai báo. Bạn có thể theo dõi job bằng lệnh squeue và kiểm tra các file output của job.
Tiến trình chạy trên cls-wrk105:
Tiến trình chạy trên cls-wrk106:
Template tên file output đã được khai báo trong sbatch_torchrun_ddp.job:
#SBATCH -o /tmp/multinode-random.%N.%J.%u.out # STDOUTDưới đây là output mẫu của job ID 19 chạy trên cls-wrk105 bởi user root:
root@cls-wrk105:~# cat /tmp/multinode-random.cls-wrk105.19.root.outKết quả mẫu như sau:
.....
starting main
delete snapshot file
starting main
delete snapshot file
using backend NCCL
====================
0
====================
using backend NCCL
====================
0
====================
____________________
cuda:0
____________________
____________________
cuda:0
____________________
[GPU0] Epoch 0 | Batchsize: 64 | Steps: 1
[GPU1] Epoch 0 | Batchsize: 64 | Steps: 1
.....Lời kết
Thiết lập SLURM cluster giúp kỹ sư AI nâng cao đáng kể hiệu quả sử dụng và khả năng mở rộng của tài nguyên tính toán. Bài hướng dẫn này đã trang bị cho bạn những kiến thức cần thiết để dựng và tối ưu SLURM cluster, phục vụ tối đa năng suất cho các dự án AI.
Làm theo các bước trên, bạn đã khai mở được tiềm năng to lớn của một SLURM cluster được thiết kế riêng cho AI. Với khả năng lập lịch job và quản lý tài nguyên mạnh mẽ, SLURM là công cụ không thể thiếu khi vận hành các dự án AI phức tạp. Hy vọng bài viết hữu ích cho bạn trong việc dựng SLURM cluster và tối ưu workflow AI. Theo dõi newsletter của GreenNode trên LinkedIn để cập nhật thêm nhiều kiến thức chuyên sâu về ngành AI đang phát triển với tốc độ chóng mặt.











