Đ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.conf cho 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 torchrun trong 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
  • Compute node chạy Ubuntu 22.04
    • hostname: cls-wrk105, IP: 10.237.96.105
    • hostname: cls-wrk106, IP: 10.237.96.106

Mô hình lab SLURM cluster gồm head node và các compute node

Thông tin các node hiển thị như sau:

Thông tin các node trong SLURM cluster

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 slurmctld

Kết quả trả về như sau:

Kết quả cài đặt slurmctld trên head node

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 munge

Kết quả trả về như sau:

Trạng thái service munge đang chạy

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
EOF

Nế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=UNKNOWN

Trong 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:

Danh sách 8 GPU trên node cls-wrk105

cls-wrk106: 7 GPU

Danh sách 7 GPU trên node cls-wrk106

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
EOF

Lư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=nvml

Xem thêm:

Khởi động service SLURM trên head node:

root@cls-wrk105:~# sudo systemctl start slurmctld

Kết quả trả về như sau:

Service slurmctld đã khởi động trên head node

Cài đặt SLURM trên compute node

Thực hiện các bước sau để cài SLURM trên compute node:

  1. Cài slurmd trê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 slurmd
  2. Copy 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.key
  3. Restart service munge trên từng compute node:

    root@cls-wrk106:~# sudo systemctl restart munge
  4. Khởi động service SLURM trên từng compute node:

    root@cls-wrk105:~# sudo systemctl start slurmd
    root@cls-wrk106:~# sudo systemctl start slurmd

Service slurmd đang chạy trên compute node

Kiểm tra SLURM cluster

  1. Chuyển các node sang trạng thái idle để SLURM có thể lập lịch job lên đó, dùng lệnh scontrol:

    root@cls-wrk105:~# scontrol update nodename=cls-wrk105.lab.local,cls-wrk106.lab.local state=idle
  2. Kiểm tra trạng thái các node:

    root@cls-wrk105:~# sinfo

    Kết quả lệnh sinfo hiển thị trạng thái các node

  3. Chạy một job thử để xác nhận SLURM cluster hoạt động đúng:

    root@cls-wrk105:~# srun -N2 hostname

    Kết quả lệnh srun chạy trên hai node

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 apptainer

2. 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
EOF

3. Submit job bằng lệnh sbatch

root@cls-wrk105:~# sbatch ./sbatch_torchrun_ddp.job

SLURM 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 training PyTorch DDP chạy trên node cls-wrk105

Tiến trình chạy trên cls-wrk106:

Tiến trình training PyTorch DDP chạy trên node 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 # STDOUT

Dướ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.out

Kế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.