Skip to content

Ubuntu 22.04 + Slurm 24.05 集群部署实战

摘要: 本文档记录了在 Ubuntu 22.04.4 LTS 上从零构建双节点 GPU 集群的完整过程。重点解决了 Slurm 24.05 的源码编译、MariaDB 配置、NVIDIA 驱动与 Cgroup 的适配问题,并提供了完整的 PyTorch 分布式作业测试脚本。

1. 硬件与网络规划

1.1 节点信息

主机名管理 IPIB/内网 IP角色硬件配置
serverx42192.168.8.14910.0.0.242Master/Compute2x RTX 4090
serverx43192.168.8.15010.0.0.243Compute2x 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 chrony

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

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

3. 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 install

3.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=UP

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

3. cgroup.conf (Cgroup v2 适配)

bash
CgroupMountpoint=/sys/fs/cgroup
ConstrainCores=yes
ConstrainDevices=yes
ConstrainRAMSpace=yes

3.4 启动服务

复制 systemd 单元文件并启动:

bash
cp etc/slurm*service /lib/systemd/system/
systemctl enable --now slurmdbd slurmctld slurmd

4. 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
reboot

4.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 test004

5.2 Slurm 账号关联

bash
sacctmgr add cluster HPCcluster
sacctmgr add account normal Description="Default"
sacctmgr create user test004 account=normal

5.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)

  1. Node Exporter: 在每台节点运行 ./node_exporter
  2. Prometheus: 配置 prometheus.yml 抓取 10.0.0.242:910010.0.0.243:9100
  3. 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>.

AI-HPC Organization