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. 交互式示例
示例一,一般形式的任务提交
命令中参数含义:
- -J test,设置所提交任务的任务名为
test
- -p intel_expr,设置把任务提交到
intel_expr
队列运行 - -n 1,启动一个任务或者进程运行计算任务,默认一个任务分配一个核心,因此也可理解成使用1个核心来运行计算任务
- python hello.py,Python 程序运行命令
示例二,大内存任务的提交
- --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
示例三,多线程任务的提交
- -c 36,设置单个任务或者进程可使用核心数
启动一个任务或者进程来运行计算任务,但这个任务或者进程可以使用 36 个计算核心,如果计算任务开启的线程数恰好是 36,就可以使得每个线程占用1个核心
示例四,多进程任务提交
- -n 100,启动100个进程运行计算任务
示例五,多进程+多线程任务提交
- -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切换到计算节点操作
- Step3:执行exit退出,释放抢占资源
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 用户名
可以查到。
6.4 scontrol查看计算任务详细信息
执行 scontrol show job 任务编号
可以查到计算任务的工作目录、输出文件等详细信息
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 |
显示帮助信息 |