slurm 作业调度系统

一、Slurm 是什么?

Slurm 是一个开源的、高度可扩展的 工作负载管理器 (也称为作业调度系统或集群管理器),专门为高性能计算集群设计

您可以把它想象成大型计算集群的“操作系统”或“交通警察”。当成千上万个计算节点和数百个用户共享一个集群时,Slurm 负责:

  1. 分配资源:管理哪些用户的任务在哪些计算节点上运行,以及使用多少CPU、内存、GPU等资源
  2. 排队管理:处理用户提交的“作业”,根据优先级、资源可用性和策略等因素,安排它们的执行顺序
  3. 任务启动:在分配好的节点上启动并监控用户的并行计算任务
  4. 隔离与仲裁:确保不同用户的任务互不干扰,并公平地分配集群资源

Slurm 是目前全球高性能计算领域最流行和事实上的标准调度系统之一,被许多世界顶级的超算中心(如美国的劳伦斯利弗莫尔国家实验室、 橡树岭国家实验室等)和大学集群广泛使用

二、核心概念

为了理解 Slurm,需要掌握以下几个核心概念:

  1. 作业:用户要执行的一个计算任务。它通常由一个脚本文件(Bash脚本)定义,其中包含了要运行的命令以及所需的资源请求(如需要多少CPU、内存、运行时间等)
  2. 节点:集群中的一台物理或虚拟服务器
    • 管理节点/登录节点:用户登录的节点,用于编辑文件、编译代码、提交作业。严禁在此直接运行大型计算程序
    • 计算节点:真正执行计算任务的节点
  3. 分区:一组计算节点的集合。可以理解为不同的“队列”。分区通常根据节点特性(如节点性能、内存大小、是否包含GPU)或用户组来划分。用户提交作业时需要指定到某个分区
    • 例如:cpu-partition(通用CPU队列), gpu-partition(GPU队列), bigmem-partition(大内存队列)
  4. 作业步:一个作业内部可以包含多个连续的或并行的任务步骤。例如,一个作业可能包含“编译”、“运行”、“后处理”三个作业步
  5. 任务:一个作业或作业步中并行运行的进程实例数。通常一个任务对应一个CPU核心

三、基本工作流程

用户使用 Slurm 的典型流程如下:

  1. 编写作业脚本:创建一个包含 #SBATCH 指令的 Shell 脚本(通常是 Bash)。这些指令用于向 Slurm 申请资源
  2. 提交作业:使用 sbatch 命令将作业脚本提交给 Slurm
  3. 排队等待:Slurm 将作业放入相应分区的队列中,根据调度策略等待资源可用
  4. 分配资源并运行:一旦资源满足要求,Slurm 会在分配的计算节点上加载环境并执行作业脚本
  5. 监控与管理:在作业运行期间,用户可以使用 squeuescontrol 等命令查看作业状态、修改作业属性
  6. 输出结果:作业完成后,标准输出和标准错误会被重定向到指定的文件中。用户也会收到邮件通知(如果配置了)

四、常用命令(用户角度)

命令 功能描述 常用示例
sbatch 提交作业 sbatch my_job.sh
squeue 查看作业队列状态 squeue (查看所有作业) squeue -u $USER (查看自己的作业) squeue -p gpu (查看gpu分区的作业)
scancel 取消作业 scancel 12345 (取消作业ID为12345的作业) scancel -u $USER (取消自己的所有作业)
sinfo 查看分区和节点状态 sinfo (查看所有分区节点状态) sinfo -p gpu (查看gpu分区状态)
scontrol 查看和管理作业/节点详细信息 scontrol show job 12345 (显示作业12345的详细信息)
salloc 交互式分配资源 salloc -n 4 --pty /bin/bash (分配4个CPU核心,并启动一个交互式Shell)
srun 在已分配的资源上运行并行任务,或直接提交交互式作业 在作业脚本中:srun my_mpi_program 在登录节点:srun -p gpu -n 1 --gres=gpu:1 --pty /bin/bash (申请一块GPU进行交互式调试)

五、作业脚本示例

一个最简单的 Slurm 作业脚本示例(my_job.sh):

#!/bin/bash
#SBATCH -J my_test_job         # 作业名称
#SBATCH -p cpu-partition       # 提交到哪个分区
#SBATCH -N 2                   # 申请2个计算节点
#SBATCH --ntasks-per-node=4    # 每个节点上运行4个任务(进程)
#SBATCH -t 01:30:00            # 最大运行时间:时:分:秒
#SBATCH -o %j.out              # 标准输出重定向到文件(%j 代表作业ID)
#SBATCH -e %j.err              # 标准错误重定向到文件

# 加载必要的环境模块(如果需要)
module purge
module load intel-compiler/2020 openmpi/4.0

# 进入作业执行目录
cd ~/my_project

# 执行并行计算程序(例如MPI程序)
# 使用 srun 来启动并行任务
srun ./my_mpi_program arg1 arg2

# 如果不是MPI程序,而是多线程OpenMP程序,可以这样:
# export OMP_NUM_THREADS=8
# ./my_omp_program

然后使用 sbatch my_job.sh 提交它

六、优势与特点

  1. 开源免费:无需支付昂贵的许可费用
  2. 高可扩展性:能够高效管理从几个节点到数万个节点的超大规模集群
  3. 容错性好:能够处理节点故障,并重新排队运行失败的作业
  4. 功能丰富:支持复杂的拓扑结构、资源限制(CPU、内存、GPU、许可证等)、作业阵列、抢占式调度、记账等高级功能
  5. 活跃的社区:拥有庞大的用户群体和活跃的开发社区,问题容易得到解决

七、总结

Slurm 是现代高性能计算集群不可或缺的“大脑”。它通过高效的资源管理和作业调度,使得大量用户能够公平、有序、高效地共享庞大的计算资源。 对于用户而言,学习 Slurm 的基本用法是使用任何 HPC 集群的第一步