Ubuntu 22.04 + Slurm 24.05 集群部署实战
摘要: 本文档记录了在 Ubuntu 22.04.4 LTS 上从零构建双节点 GPU 集群的完整过程。重点解决了 Slurm 24.05 的源码编译、MariaDB 配置、NVIDIA 驱动与 Cgroup 的适配问题,并提供了完整的 PyTorch 分布式作业测试脚本。
1. 硬件与网络规划
1.1 节点信息
| 主机名 | 管理 IP | IB/内网 IP | 角色 | 硬件配置 |
|---|---|---|---|---|
| serverx42 | 192.168.8.149 | 10.0.0.242 | Master/Compute | 2x RTX 4090 |
| serverx43 | 192.168.8.150 | 10.0.0.243 | Compute | 2x RTX 4090 |
1.2 网络配置 (Netplan)
Ubuntu 使用 Netplan 管理网络。编辑 /etc/netplan/00-installer-config.yaml:
yaml
network:
ethernets:
eno1:
addresses:
- 10.0.0.242/24
routes:
- to: default
via: 10.0.0.1
nameservers:
addresses: [10.0.0.1, 114.114.114.114]
version: 2应用配置:netplan apply
2. 基础环境初始化
2.1 源与时间同步
bash
# 替换清华源
sed -i 's@//.*archive.ubuntu.com@//mirrors.tuna.tsinghua.edu.cn@g' /etc/apt/sources.list
apt update
# 时间同步
apt install -y chrony
systemctl enable --now chrony2.2 MUNGE 认证 (Key 同步)
Ubuntu 22.04 源中的 MUNGE 版本通常较新,直接安装即可。
bash
# 所有节点安装依赖
apt-get install -y munge libmunge-dev libmunge2 build-essential ...
# Master 生成 Key
create-munge-key
# 同步 Key 到所有节点
scp /etc/munge/munge.key root@serverx43:/etc/munge/
# 修正权限 (必须严格执行)
chown munge:munge /etc/munge/munge.key
chmod 400 /etc/munge/munge.key
systemctl restart munge2.3 依赖库安装
编译 Slurm 所需的依赖包:
bash
apt-get install -y mariadb-server libmariadb-dev-compat libmariadb-dev \
python3 python3-pip libhwloc-dev libipmimonitoring-dev \
libpam0g-dev libcurl4-openssl-dev3. Slurm 24.05 源码编译与安装
3.1 编译 Slurm
bash
wget https://download.schedmd.com/slurm/slurm-24.05.1.tar.bz2
tar -xf slurm-24.05.1.tar.bz2
cd slurm-24.05.1/
# 配置编译选项
./configure --enable-debug --prefix=/usr/local \
--sysconfdir=/usr/local/etc --with-mysql_config=/usr/bin/mysql_config
make -j$(nproc) && make install3.2 配置 MariaDB
bash
systemctl start mariadb
mysql -u root -p
> CREATE DATABASE slurm_acct_db;
> CREATE USER 'slurm'@'localhost' IDENTIFIED BY 'Password123';
> GRANT ALL ON slurm_acct_db.* TO 'slurm'@'localhost';3.3 配置文件详解
1. slurm.conf (主配置)
bash
ClusterName=HPCcluster
SlurmctldHost=serverx42
MpiDefault=none
ProctrackType=proctrack/cgroup
ReturnToService=1
SlurmUser=slurm
StateSaveLocation=/var/spool/slurmctld
# 调度策略
SchedulerType=sched/backfill
SelectType=select/cons_tres
SelectTypeParameters=CR_Core_Memory
# 记账数据库
AccountingStorageType=accounting_storage/slurmdbd
JobCompType=jobcomp/none
# 节点定义 (开启 GPU 支持)
GresTypes=gpu
NodeName=serverx[42-43] CPUs=32 RealMemory=64000 Gres=gpu:geforce:2 State=UNKNOWN
PartitionName=SERVER Nodes=serverx[42-43] Default=YES MaxTime=INFINITE State=UP2. gres.conf (GPU 资源映射)
bash
NodeName=serverx[42-43] Name=gpu Type=geforce File=/dev/nvidia0 Cores=0-15
NodeName=serverx[42-43] Name=gpu Type=geforce File=/dev/nvidia1 Cores=16-313. cgroup.conf (Cgroup v2 适配)
bash
CgroupMountpoint=/sys/fs/cgroup
ConstrainCores=yes
ConstrainDevices=yes
ConstrainRAMSpace=yes3.4 启动服务
复制 systemd 单元文件并启动:
bash
cp etc/slurm*service /lib/systemd/system/
systemctl enable --now slurmdbd slurmctld slurmd4. NVIDIA 驱动与 CUDA
4.1 禁用 Nouveau
bash
echo "blacklist nouveau" > /etc/modprobe.d/blacklist-nouveau.conf
echo "options nouveau modeset=0" >> /etc/modprobe.d/blacklist-nouveau.conf
update-initramfs -u
reboot4.2 安装驱动 (550.100)
bash
./NVIDIA-Linux-x86_64-550.100.run --disable-nouveau --no-opengl-files
nvidia-smi # 验证5. 用户管理与作业测试
5.1 创建统一用户 (UID 同步)
在所有节点执行,确保 UID 一致:
bash
groupadd -g 2004 test004
useradd -u 2004 -g 2004 -m -s /bin/bash test0045.2 Slurm 账号关联
bash
sacctmgr add cluster HPCcluster
sacctmgr add account normal Description="Default"
sacctmgr create user test004 account=normal5.3 PyTorch 多机作业提交
提交脚本 submit.sh:
bash
#!/bin/bash
#SBATCH --job-name=torch_test
#SBATCH --partition=SERVER
#SBATCH --nodes=2
#SBATCH --ntasks-per-node=1
#SBATCH --gpus=geforce:4
#SBATCH --output=%j.out
srun --nodelist=serverx42,serverx43 python -c "import torch; print(torch.cuda.device_count(), torch.cuda.get_device_name(0))"提交: sbatch submit.sh
6. 监控系统 (Prometheus + Grafana)
- Node Exporter: 在每台节点运行
./node_exporter。 - Prometheus: 配置
prometheus.yml抓取10.0.0.242:9100和10.0.0.243:9100。 - Grafana: 导入
Node Exporter Full仪表盘,即可看到集群 CPU、内存、网络及 GPU 状态。
7. 附录:常用运维命令
- 重启集群:
systemctl restart slurmctld slurmdbd(Master),systemctl restart slurmd(Compute). - 节点状态恢复:
scontrol update NodeName=serverx43 State=RESUME. - 查看作业:
squeue,scontrol show job <jobid>.
