Skip to content

安装 SLURM

参考资料:

  • https://slurm.schedmd.com/quickstart_admin.html

SLURM 简介

SLURM(Simple Linux Utility for Resource Management)是一个开源的、高可扩展的集群管理和作业调度系统,广泛应用于高性能计算(HPC)环境。

SLURM 集群由多种类型的节点组成,每种节点承担不同的功能:

节点类型 功能描述 关键服务/组件
控制节点
(Controller Node)
集群的核心调度器,管理作业队列、资源分配和节点监控。可部署备用控制节点以提升服务可用性。 slurmctld
计算节点
(Compute Node)
根据需求配置了充足的 CPU/内存/GPU 资源,执行用户提交的计算任务。 slurmd
登录节点
(Login Node)
用户提交和管理作业的入口。 SLURM 客户端工具
数据库节点
(DBD Node)
(可选)存储作业记账(accounting)和资源使用记录。 slurmdbd
REST API 节点 (可选)提供 RESTful API 接口,支持外部系统集成。 slurmrestd

集群环境需要满足以下基础条件:

  1. 统一的 Linux 用户 UID 和组 GID
  2. 时间同步服务(如 NTP 网络时间协议)
  3. 共享的存储空间(如 NFS 网络文件系统)

典型的SLURM集群由以下服务器组成:

  1. 主节点(master):负责用户登录、作业提交和集群管理
  2. 计算节点(node1, node2,...):专门用于执行计算任务

集群环境需要满足以下基础条件:

  • 统一的Linux账户管理系统(如NIS协议:ypbindyp-tools
  • 时间同步服务(如NTP网络时间协议)
  • 共享存储空间(如NFS网络文件系统)

SLURM 系统包含三个主要程序:

  1. slurmdbd:运行于主节点,负责集群数据同步,通常依赖MySQL数据库
  2. slurmctld:运行于主节点,作为集群控制守护进程
  3. slurmd:运行于各计算节点,负责执行任务并向主节点反馈状态

除了这三个主要组件,我们还需要一个用户权限信息管理的软件 munge

接下来我们将基于 Ubuntu 24.04 LTS 来说明 SLURM 23.11.4 的配置过程。需要注意的是,不同版本的 SLURM 消息格式可能不一样(特别是跨大版本后),从而导致 slurmctld 和 slurmd 无法通信。如果在未来,新加入的计算节点使用了 Ubuntu 26.04 LTS 甚至更高版本的系统,导致 apt 默认安装到的 slurmd 版本更高,从而与主节点的 slurmctld 无法通信。如果发生这种情况,需要降级 slurmd 版本(如果官方源已不支持 24.11,就需要源码安装),或者升级其他所有节点的 SLURM

主节点的配置

apt update; apt install slurmctld slurm-client;

计算节点的配置

安装 munge

我们在新的计算节点上 apt 安装 munge

apt update; apt install munge

安装完成后,我们需要拷贝主节点的 munge.key 到新的计算节点上。需要注意的是,如果主节点和计算节点的 root 间可以 ssh 直连,很容易造成攻击者的横向攻击。所以,最好不要在节点间建 root 间的 ssh 直连方式。我们直接通过自己的机器 ssh 传输 munge.key

scp <master-node>:/etc/munge/munge.key <new-node>:/etc/munge/

传输完成后,在计算节点上查看 munge.key 的所有者,确保该文件属于 munge 用户(如果不是,请修改)

# ls -l /etc/munge/munge.key
-rw------- 1 munge munge 1024 Oct 25 23:32 /etc/munge/munge.key

可在自己机器上运行如下命令,确保 munge 配置成功:

ssh <master-node> munge -n -t 10 | ssh <new-node> unmunge

若上述命令的输出中包含 STATUS: Success (0),则说明配置成功

slurmd 安装

在新计算节点上运行如下命令:

apt install slurmd slurm-client

然后查看本机配置:

slurmd -C      # 查看 CPU、Memory 配置
nvidia-smi -L  # 查看 GPU 型号(如果有 GPU)

例如:

# slurmd -C
NodeName=ada-4090 CPUs=32 Boards=1 SocketsPerBoard=1 CoresPerSocket=16 ThreadsPerCore=2 RealMemory=773273
UpTime=2-04:05:01
# nvidia-smi -L
GPU 0: NVIDIA GeForce RTX 4090 (UUID: GPU-c3b2d0dd-ada3-973f-924f-57cfde894c8f)
GPU 1: NVIDIA GeForce RTX 4090 (UUID: GPU-b59b7220-ca11-153c-c20f-9fa6359775c3)
GPU 2: NVIDIA GeForce RTX 4090 (UUID: GPU-e069ce26-0c5e-9258-d539-ce5dd9b7145a)
GPU 3: NVIDIA GeForce RTX 4090 (UUID: GPU-0e1d0f0a-28dc-3e66-a795-a77b8a10d6e0)

插件安装

enroot 安装与配置

enroot 是一个轻量级的容器运行时,需要使用打包压缩为 SquashFS 格式的 .sqsh 镜像运行容器。如果主服务器上还有 enroot 的安装包,可以直接拷贝到计算节点上使用。如果找不到了,可以重新下载。

下载 enroot 安装包:

打开 enroot 的 github 仓库:https://github.com/NVIDIA/enroot,点击右侧 Releases 下的 3.5.0(在我写这篇文档时是当前最新的版本),找到 enroot_3.5.0-1_amd64.debenroot+caps_3.5.0-1_amd64.deb 下载(如果服务器访问 Github 缓慢,就在网页端下载以后再上传服务器)。

wget https://github.com/NVIDIA/enroot/releases/download/v3.5.0/enroot+caps_3.5.0-1_amd64.deb
wget https://github.com/NVIDIA/enroot/releases/download/v3.5.0/enroot_3.5.0-1_amd64.deb

然后在计算节点上安装 enroot

sudo apt install ./enroot_3.5.0-1_amd64.deb ./enroot+caps_3.5.0-1_amd64.deb

为了避免 enroot 默认路径盘较小,以及为了增加隔离性,修改 enroot 的运行时和缓存与数据文件的路径。在 /etc/enroot/enroot.conf.d/ 下添加配置文件(文件名随意):

# cat /etc/enroot/enroot.conf.d/ada.conf
ENROOT_RUNTIME_PATH /mnt/node-name/data/enroot/$(id -u)
ENROOT_CACHE_PATH /mnt/node-name/data/enroot/enroot-cache/group-$(id -g)
ENROOT_DATA_PATH /mnt/node-name/data/enroot/enroot-data/user-$(id -u)

请确保 /mnt/node-name/data/enroot 是在该计算节点的一块足够大的固态上。配置完后,请立即创建该路径,并将权限设为 777,否则,该路径将由第一个尝试使用 enroot 的用户自动创建,从而导致其他人没有修改权限。

mkdir /mnt/node-name/data/enroot
chmod 777 /mnt/node-name/data/enroot

pyxis 插件安装

如果主服务器上还有 pyxis 的安装包,可以直接拷贝到计算节点上使用。如果找不到了,需要重新编译安装。有了这个 slurm 插件,slurm 便能通过 enroot 来使用容器。

编译 pyxis 安装包:

首先先从 github 下载源码:

wget https://github.com/NVIDIA/pyxis/archive/refs/tags/v0.20.0.tar.gz -O pyxis-v0.20.0.tar.gz

然后按如下命令编译安装:

tar zxf pyxis-v0.20.0.tar.gz  # 解压
cd pyxis-0.20.0/
make orig
make deb

然后上层目录就会出现一个名为 nvslurm-plugin-pyxis_0.20.0-1_amd64.deb 的安装包。保留这个安装包,其余文件(如压缩包、源代码、中间文件)都可以删除。

在计算节点上运行如下命令安装并配置 pyxis

sudo apt install ./nvslurm-plugin-pyxis_0.20.0-1_amd64.deb
sudo ln -s /usr/share/pyxis/pyxis.conf /etc/slurm/plugstack.conf.d/pyxis.conf

主节点配置文件修改

由于我们在主节点上采用了无配置(Configless)模式,因此只用在主节点放置配置文件。我们登录主节点,编辑 /etc/slurm/slurm.conf/etc/slurm/gres.conf 文件。

/etc/slurm/slurm.conf 中,添加新节点的配置:

NodeName=ada-4090 CPUs=32 Boards=1 SocketsPerBoard=1 CoresPerSocket=16 ThreadsPerCore=2 RealMemory=773273 Gres=gpu:4090:4 State=UNKNOWN
PartitionName=4090 Nodes=ada-4090 Default=YES MaxTime=INFINITE State=UP

请注意,如果有 GPU 资源,才会添加 Gres 信息, Gres= 后冒号分割的三个参数分别代表:资源名称、资源类型、资源数量。其中资源类型可以自己写任意字符串,如“rtx4090” 也是可以的(该类型是方便用户申请特定GPU型号使用的)。如果有多种不同的 GPU 设备,使用逗号分割,如 Gres=gpu:3090:1,gpu:3080ti:2 表明有 1 块 3090 和 2 块 3080 Ti。

添加 Gres 信息后,还需要修改 /etc/slurm/gres.conf,添加新节点的 GPU 具体通过哪个设备文件访问:

NodeName=ada-4090  Name=gpu Type=4090 File=/dev/nvidia[0-3]

slurmd 配置

我们运行 systemctl cat slurmd.service,在输出中可以看到这么一行:

EnvironmentFile=-/etc/default/slurmd

因此,我们可以把 slurmd 需要的配置写到 /etc/default/slurmd 文件中。由于我们在主节点上采用了无配置(Configless)模式,因此只用在管理节点放置配置文件,而在计算节点上只需要配置 slurmctld 服务运行在哪就可以了。

为了配置方便和可读性,打开 /etc/hosts 写入主节点 IP 地址,形如:(如已配置请跳过)

211.86.133.18  master-node-name

然后,编辑 -/etc/default/slurmd,写入:

SLURMD_OPTIONS="--conf-server master-node-name:6817 -D -s"

重启服务

在计算节点上运行如下命令重启 slurmd 服务

sudo systemctl restart slurmd

在主节点上运行如下命令加载新节点配置:

sudo systemctl reload slurmctld

通过 systemctl status slurmd 查看计算节点上服务是否有报错。在主节点上运行 sinfo 检查新节点是否正确添加。