Skip to content

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银行账户,对应机时费等。

资源 ​

术语描述
GRESGeneric Resource,通用资源。
TRESTrackable RESources,可追踪资源。
QOSQuality 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。

解压代码文件,并执行多机训练。

bash
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),不会直接影响宿主机服务。安装步骤如下:

bash
# 使用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)可能会有一些端口冲突或延迟。

常用操作命令 ​

bash
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 配置了可运行的配置文件(/etc/slurm/slurm.conf)。
    • 随意修改此文件可能会导致 Slurm 功能无法使用。
    • 如果您对 Slurm 配置非常熟悉,可以自行修改,但请记得重启相关服务。
  • 网络模式冲突:

    • Slurm 容器运行时使用的是 host 模式,即使用了宿主机的端口。
    • 请注意是否存在端口冲突,否则相关服务可能无法启动。
  • 连接配置稳定:

    • Slurm 作业系统提供了三种连接方式:SSH、RDP、JupyterLab。
    • 请不要随意更改相关配置文件,否则可能会导致无法连接。