Skip to content

slurm 任务调度系统使用指南

1. 简介

slurm 调度系统是超算计算资源的大管家,负责超算计算资源的统一管理与分配,我们只需遵循既定规范提交计算任务,slurm 便会根据系统的资源和调度策略来分配和执行这些任务。

2. 三种任务提交方式

slurm 系统有三种任务提交方式,分别是:交互式、批处理式和抢占式。

任务提交方式 使用方式简述 优点 缺点 适用场景
交互式 在命令行窗口执行:srun -J test -p intel_expr -n 1 python hello.py,即可提交计算任务 快捷简单,可实时从屏幕看到程序的输出 终端与集群断开连接,计算任务将会中断;计算资源不够时会提交失败 任务测试
批处理式 先编写脚本run.sh,然后执行sbatch run.sh提交计算任务 计算稳定,与终端连接状态无关;计算资源不够时会排队 需要写几行脚本,略繁琐 正式计算,使用最多的方式
抢占式 在命令窗口执行:sallloc -J test -p intel_expr-n 1,提交成功后用户可以ssh进入计算节点运行相关程序 持续占用节点,不用重复排队,可实时从屏幕看到程序的输出 终端与集群断开连接,计算任务将会中断;计算资源不够时会提交失败 任务测试,不想重复提交任务

3. 交互式示例

示例一,一般形式的任务提交

srun -J test -p intel_expr -n 1 python hello.py

命令中参数含义:

  • -J test,设置所提交任务的任务名为 test
  • -p intel_expr,设置把任务提交到 intel_expr 队列运行
  • -n 1,启动一个任务或者进程运行计算任务,默认一个任务分配一个核心,因此也可理解成使用1个核心来运行计算任务
  • python hello.py,Python 程序运行命令

示例二,大内存任务的提交

srun -J test -p intel_expr -n 1 --mem-per-cpu=80G python hello.py
  • --mem-per-cpu=80G,申请 80G 内存来运行任务

计算节点每个核心默认可用 8G 内存,计算任务如需要更大的内存空间,则需通过--mem-per-cpu 选项申请内存,否则会因超内存而报错退出。

超内存报错信息:

slurmstepd-c02b03n01: error: Detected 1 oom-kill event(s) in step 169428.0 cgroup. Some
 of your processes may have been killed by the cgroup out-of-memory handler

示例三,多线程任务的提交

srun -J test -p intel_expr -n 1 -c 36 python hello.py
  • -c 36,设置单个任务或者进程可使用核心数

启动一个任务或者进程来运行计算任务,但这个任务或者进程可以使用 36 个计算核心,如果计算任务开启的线程数恰好是 36,就可以使得每个线程占用1个核心

示例四,多进程任务提交

srun -J test -p intel_expr -n 100 python hello.py
  • -n 100,启动100个进程运行计算任务

示例五,多进程+多线程任务提交

srun -p intel_expr  -n 2 -N 2 --ntasks-per-node 1 -c 36  python hello.py
  • -n 2 ,启动 2 个进程
  • -N 2,使用两个计算节点
  • --ntasks-per-node 1,每个计算节点只运行 1 个进程
  • -c 36,每个进程可以使用 36 个计算核心来运行多个线程

4. 批处理式示例

首先编写任务脚本run.sh,内容为:

#!/bin/bash
#SBATCH -J test                     # 任务名为 test
#SBATCH -o job.out                  #将程序的输出结果保存到当前文件夹的 job.out
#SBATCH -p intel_expr                     # 任务提交的分区
#SBATCH -n 1                        # 启动一个任务(进程)

python hello.py                     #计算任务运行命令 
  • 第一行是固定的,表示使用/bin/bash 来执行脚本
  • 之后有 #SBATCH 开头的若干行表示 slurm 任务的设置区域,用于指定运行任务的详细设置

然后在命令行窗口执行 sbatch run.sh 命令提交任务,命令执行后会立即返回命令行窗口,任务交由计算节点控制,与终端状态无关。

示例一,一般形式的任务提交脚本

#!/bin/bash
#SBATCH -J test                     # 任务名为 test
#SBATCH -o job.out                  #将程序的输出结果保存到当前文件夹的 job.out
#SBATCH -p intel_expr                     # 任务提交的分区
#SBATCH -n 1                        # 启动一个任务(进程)

python hello.py                     #计算任务运行命令 

示例二,申请额外内存的任务提交脚本

#!/bin/bash
#SBATCH -J test                     # 任务名为 test
#SBATCH -o job.out                  #将程序的输出结果保存到当前文件夹的 job.out
#SBATCH -p intel_expr                     # 任务提交的分区
#SBATCH -n 1                        # 启动一个任务(进程)
#SBATCH --mem-per-cpu=80G           #申请 80G 内存来运行任务

python hello.py                     #计算任务运行命令 

计算节点每个核心默认可用 8G 内存,计算任务如需要更大的内存空间,则需通过--mem-per-cpu 选项申请内存,否则会因超内存而报错退出。

超内存报错信息:

示例三,多线程任务提交脚本

#!/bin/bash
#SBATCH -J test             # 任务名为 test
#SBATCH -o job.out          #将屏幕的输出结果保存到当前文件夹的 job.out
#SBATCH -p intel_expr             # 任务提交的分区
#SBATCH -n 1                 # 启动一个任务(进程)
#SBATCH -c 36                # 该任务(进程)使用36个核心

python hello.py              #计算任务运行命令

示例四,多进程任务提交脚本

#!/bin/bash
#SBATCH -J test             # 任务名为 test
#SBATCH -o job.out          #将屏幕的输出结果保存到当前文件夹的 job.out
#SBATCH -p intel_expr       # 任务提交的分区
#SBATCH -n 100              # 启动100个任务(进程)

mpirun  -n  100 python hello.py  #计算任务运行命令                                    

示例五,多进程+多线程任务提交脚本

#!/bin/bash
#SBATCH -J test                 # 任务名为 test
#SBATCH -o job.out              #将屏幕的输出结果保存到当前文件夹的 job.out
#SBATCH -p intel_expr           # 任务提交的分区
#SBATCH -N 2                    # 申请2个节点
#SBATCH --ntasks-per-node=1     # 每个节点运行1个进程
#SBATCH -c 36                   # 每个进程使用36个核心

mpirun  -n  2 ./hybrid-pro-thr    #计算任务运行命令

5. 抢占式示例

使用步骤:

  • Step1:资源申请
[zhangw@login02 data]$ salloc -p intel_expr -n 1
salloc: Granted job allocation 57991
salloc: Nodes node023 are ready for job
  • Step2:ssh切换到计算节点操作
[zhangw@login02 data]$ ssh node023
[zhangw@node023 ~]$ hostname
node023
  • Step3:执行exit退出,释放抢占资源
[zhangw@node023 ~]$ exit
logout
Connection to node023 closed.

6. 其他常用命令

6.1 sinfo查看计算资源

提交任务之前可以使用sinfo命令查看集群的分区以及资源情况

[user@login01 tmp]$ sinfo 
PARTITION    AVAIL  TIMELIMIT  NODES  STATE NODELIST
intel*        up     infinite   700  idle qhcn[002-800]
intel_expr    up       1:00      2   mix qhcn[819-820]
amd_expr      up       1:00      1   idle qhdn092

sinfo查询到的信息中state 一栏,若为 idle表示该节点处于闲置状态,若为 alloc表示该节点已经没有多余的 资源了,若为 mix表示该节点有人在占用,但是仍然有剩余资源

6.2 squeue查看计算任务

执行squeue -u 用户名查看计算任务运行状态

[user@login01 tmp]$ squeue -u user
             JOBID PARTITION     NAME     USER ST     TIME   NODES NODELIST(REASON)
              3656   intel       run.sh   user  R     0:23   1     qhcn001
  • JOBID,任务编号
  • ST,任务状态,任务状态包括R(正在运行),PD(正在排队),CG(即将完成),CD(已完成)
  • TIME,运行时间
  • NODES,占用节点(也称服务器,下同)个数
  • NODELIST,占用服务器的编号

6.3 scancel取消计算任务

执行 scancel 任务编号 停止计算任务,“任务编号” 通过 squeue -u 用户名 可以查到。

scancel  3656

6.4 scontrol查看计算任务详细信息

执行 scontrol show job 任务编号 可以查到计算任务的工作目录、输出文件等详细信息

scontrol show job 3656

7. slurm常用选项

Slurm 含义
-n [count] 总进程数
--ntasks-per-node=[count] 每个节点上的进程数
-p [partition] 任务队列
--job-name=[name] 任务名
--output=[file_name] 标准输出文件
--error=[file_name] 标准错误文件
--time=[dd-hh:mm:ss] 任务最大运行时长
--exclusive 独占节点
--mem-per-cpu=<size> 每个CPU核可使用的内存大小
--nodelist=[nodes] 指定运行节点
--exclude=[nodes] 排除节点
--help 显示帮助信息