Slurm
炎扉集群内部集成了 Slurm,以容器方式运行。用户可在集群中新增多个独立运行的 Slurm 作业系统。为简化配置,用户只需选择主节点和计算节点即可提交作业。
特点
平台 Slurm 作业系统以整台机器为调度单位,最少调度一台机器作为主节点。主节点同时可以进行科学计算。
- 主节点配置:运行数据库服务 (
slurmdbd和mysql)、slurmctld(控制服务) 和slurmd服务。 - 计算节点配置:仅运行
slurmd服务。
炎扉集群的slurm作业系统以整台机器为调度,即最少调度一台机器(作为主节点),同时主节点也可以进行科学计算。主节点运行了数据库服务(slurmdbd以及mysql)、slurmctld服务和slurmd服务。计算节点上仅运行slurmd服务。
- 设备兼容性高:同一 Slurm 作业系统内部支持管理异构配置的机器(包括显卡、内存、CPU 等),得益于 Slurm 原生支持。
- 操作简单:自动完成节点间的相关配置,无需准备原始 Slurm 配置文件。
- 作业可视化:提供 Web 端作业可视化报表,支持 Web 端取消作业。
- 系统级隔离:支持启动多个独立的 Slurm 作业系统,不同系统间相互隔离,互不影响。
Slurm 简介
说明
Slurm (Simple Linux Utility for Resource Management) 是开源的、具有容错性和高度可扩展的 Linux 集群超级计算系统资源管理和作业调度系统。它用于管理资源和作业,避免相互干扰,提高运行效率。
作业提交命令:
- 交互式并行
srun。 - 批处理式
sbatch。 - 分配式
salloc。
架构
Slurm 采用 slurmctld (守护进程) 作为中心管理器用于监测资源和作业,可配置备份冗余管理器。
slurmd:需在各计算节点启动的守护进程,用于执行作业并返回状态。slurmdbd(Slurm DataBase Daemon):数据库守护进程(非必需,建议采用),用于记录跨集群的记账信息。slurmrestd(Slurm REST API Daemon):通过 REST API 与 Slurm 交互(非必需)。- 用户工具:包括
srun、scancel、sinfo、squeue、sacct。sview提供图形化显示。 - 管理工具:
scontrol(监控/修改配置) 和sacctmgr(管理数据库认证)。
术语
节点
| 术语 | 描述 |
|---|---|
| Head Node | 头节点/主节点,运行 slurmctld 管理服务。 |
| Compute Node | 计算节点,运行作业计算任务,需运行 slurmd 服务。 |
| Login Node | 用户登录节点。 |
| SlurmDBD Node | 数据库节点,存储调度策略、记账信息的节点。 |
| 客户节点 | 包含计算节点和用户登录节点。 |
用户
| 术语 | 描述 |
|---|---|
| account | 账户,可含多个用户。 |
| user | 用户,可共享一个账户。 |
| bank account | 银行账户,对应机时费等。 |
资源
| 术语 | 描述 |
|---|---|
| GRES | Generic Resource,通用资源。 |
| TRES | Trackable RESources,可追踪资源。 |
| QOS | Quality of Service,服务质量,影响作业优先级。 |
| association | 关联,用于实现用户访问控制。 |
| Partition | 队列/分区,用于对节点、作业规模、时长等进行分组管理和资源分配。 |
插件
Slurm 插件支持多种基础结构和配置:
- 记账存储 (
Accounting Storage):存储作业历史数据。 - 账户收集能源 (
Account Gather Energy):收集作业或节点的能源消耗。 - 通用资源 (
Generic Resources):用于控制通用资源(如 GPU)的接口。 - 作业提交 (
Job Submit):允许站点覆盖作业提交时提出的需求。 - 调度器 (
Scheduler):决定 Slurm 何时及如何调度作业。 - 优先级 (
Priority):赋予作业优先级。 - 进程追踪 (
Process tracking):用于确认各作业关联的进程。
配置模式
Slurm 客户节点配置有两种模式:
- 传统模式:客户节点采用 /etc/slurm/ 目录下的
slurm.conf等本地配置文件。 - 无配置 (configless) 模式:Slurm 20.02 版起支持,客户节点无需本地配置文件。节点从
slurmctld守护进程获取配置,由控制节点统一管理。
无配置模式指定方式: slurmd 服务启动时从指定的 slurmctld 节点获取配置,可通过 --conf-server 参数或 DNS SRV 记录指定。
- 使用
--conf-server参数 (默认端口 6817 可省略):- 仅一个管理节点:
slurmd --conf-server slurmctl-primary:6817。 - 主备管理节点:
slurmd --conf-server slurmctl-primary:6817,slurmctl-secondary。
- 仅一个管理节点:
- 使用 DNS SRV 记录:
_slurmctld._tcp 3600 IN SRV 10 0 6817 slurmctl-backup。_slurmctld._tcp 3600 IN SRV 0 0 6817 slurmctl-primary。
创建步骤
创建slurm作业系统很简单,在平台的作业管理的Slurm中单击新增,然后选择主节点(必须)和计算节点(根据需求添加,可不添加),选择合适的镜像。下面是一个简单示例,可以参照。
示例
我们提供了可运行代码,这里 下载 下载完成后上传至用户目录。

点击新增slurm作业,并选择主节点,计算节点。注意,主节点和计算节点镜像不一样,主节点带有master,计算节点带有compute字样。



等待节点启动完成后,进入Console,输入sinfo,查看节点是否全部idle。

解压代码文件,并执行多机训练。
cd /mnt/volume/{你的用户目录} # 这里是 cd /mnt/volume/caida
unzip slurm_demo.zip
cd slurm_demo
# 安装相关依赖
sbatch -N2 --partition=rtx4070ti --wrap "pip install -r requirements.txt"
#训练:指定2台节点,每台两张卡
srun --partition=rtx4070ti -N2 -n4 --gres=gpu:2 --ntasks-per-node=2 --job-name=slrum_test python3 -u train.py注意,这里的节点数量,分区名称,每个节点的进程数量,gpu数量,请根据实际环境的数量决定,这里只是演示了一个2节点,分区名为rtx4070ti,每个节点两张卡的训练。

更多信息
炎扉集群slurm作业系统,对slurm进行了封装,提供了web端的可视化作业报表。用户可以查看作业的状态,并且取消作业;
slurm作业系统默认连接方式有三种,ssh,rdp,jupyterlab。它们提供的是主节点ip,计算节点的ip可以进入主节点进行查询,密码和主节点相同;
为了避免多机任务中每个节点的数据都要进行复制,请使用集群的分布式存储。slurm作业系统内部的每个节点都默认挂载了用户目录
/mnt/volume/{用户名}和公共目录/mnt/volume/public。slurm容器使用的是
host模式,无需进行端口映射,直接使用ip+端口的就可以访问自定义的服务;如果修改导致的slurm无法使用,可以在页面重新创建slurm作业。slurm相关的配置文件在文件夹
/etc/slurm/下;若存在显卡,默认为节点设置的分区(
PARTITION)为显卡名,同种型号的显卡会合并。如果是CPU节点,分区名就是CPU型号,同型号的cpu会合并。如果分区设置不满足实际使用中的需求,请修改slurm的配置文件;为了使得容器可以像宿主机一样,进行资源分配/进程管理,运行的容器设置了privileged权限,安装了systemd,以及挂载了宿主机的cgroup。使用时请不要进行危险操作。
Docker in Docker
炎扉集群运行的slurm容器,配置了privileged权限以及systemd,可以在容器内部安装docker(不推荐),容器里的 Docker 是独立 DinD(Docker-in-Docker),不会直接影响宿主机服务。安装步骤如下:
# 使用root 用户执行
apt-get update
apt-get install -y ca-certificates curl gnupg lsb-release
mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | \
tee /etc/apt/sources.list.d/docker.list > /dev/null
apt-get update
apt-get install -y docker-ce docker-ce-cli containerd.io
systemctl start docker除非必要,否则不推荐在容器中安装Docker,可能存在的问题如下:
文件系统操作稍微复杂时,性能会比直接在宿主机慢;
某些情况下可能出现 “device or resource busy” 错误;
容器挂载了--cgroupns=host,如果在 DinD 容器里启动大量容器,宿主机资源也会被消耗;
DinD 容器里的 Docker 网络(bridge、overlay)可能会有一些端口冲突或延迟。
常用操作命令
systemctl restart slurmctld # 重启slurmctld
systemctl restart slurmd # 重启slurmd
sinfo # 查看所有节点状态信息
scontrol show node ${NodeName} # 查看某个节点的具体信息
scontrol update NodeName=${NodeName} State=RESUME # 尝试修复某个节点
scontrol reconfig # 刷新配置文件,使其生效
squeue # 查看运行中的作业
scancel ${job_id} # 取消作业
sacct # 查看全部作业
sbatch run.sh # 提交作业注意事项
高权限 (
privileged) 安全风险:- 炎扉平台的 Slurm 配置在容器中,并被赋予了高权限 (
privileged),使其能够像部署在主机上一样进行 CPU 核心分配和系统资源管理。 - 然而,
privileged权限打破了容器的安全隔离。容器中的进程可以直接操作宿主机设备、加载内核模块,甚至修改宿主机文件系统(如/etc、/var/lib/docker等)。 - 除非您明确知道操作后果,否则请勿进行类似的危险操作。
- 炎扉平台的 Slurm 配置在容器中,并被赋予了高权限 (
配置文件风险:
- 平台默认为 Slurm 配置了可运行的配置文件(
/etc/slurm/slurm.conf)。 - 随意修改此文件可能会导致 Slurm 功能无法使用。
- 如果您对 Slurm 配置非常熟悉,可以自行修改,但请记得重启相关服务。
- 平台默认为 Slurm 配置了可运行的配置文件(
网络模式冲突:
- Slurm 容器运行时使用的是
host模式,即使用了宿主机的端口。 - 请注意是否存在端口冲突,否则相关服务可能无法启动。
- Slurm 容器运行时使用的是
连接配置稳定:
- Slurm 作业系统提供了三种连接方式:SSH、RDP、JupyterLab。
- 请不要随意更改相关配置文件,否则可能会导致无法连接。

