本文用来记录与日后复习如何使用超算平台的 Slurm 作业调度系统
可以收藏,因为本文会根据作者的了解,进行实时更新
为什么建议大家看我发的呢?因为我会更新,并且我的内容是会有自己的实践想法和经验,不像其他人只是复制文档。
Module 常用命令
超算平台通常安装了多种软件环境和应用软件。为了方便使用,平台通过 module 工具管理计算环境,可以使用 module 命令查看、加载和卸载所需要的环境等
查看可用软件
查看系统可用软件,执行命令:module avail
,即可列出用户可使用的所有软件名称。
系统安装的软件主要分为两类:
- 安装在共享存储
/public/software/
路径下的软件,包含数学库、MPI 并行库、工具等; - 安装在节点本地磁盘
/opt下
的软件,包含编译器等。
软件列出名称规则:类别/软件名/版本号[/编译器]”。
例如:
------ /public/software/modules --------------
apps/abinit/8.10.3/hpcx-intel2017
apps/octave-mt/5.2.0/gnu
compiler/dtk/23.04
------ /opt/hpc/software/modules --------------
compiler/devtoolset/7.3.1 compiler/intel/2017.5.239
加载/卸载软件环境
这一章节我们同时介绍 module load/add、rm/unload、list 以及一些冲突解决方式。
通过上一命令,我们找到了我们想要进入的软件环境,例如这里我想进入 anaconda3 环境,此时只要通过 module load apps/anaconda3/5.2.0
。(虽然这里我使用进入一词,但实际上 module load
命令是加载相应环境变量,而且可以同时 load 多个环境!)
加载 anaconda 环境后,剩下的命令就和平常操作一样了,E-shell
默认不显示base,直接使用conda env list
检测有没有成功加载。
此外,一般平台也帮我们准备了一些 pytorch、tensorflow 等库了,这些都要在刚刚的 module avail
的输出结果里观察,例如我这就看到了’apps/Pytorch/1.8.0-dtk21.04-cp6’,适配 DCU 的 Pytorch 环境。
同时加载多个环境,可能存在依赖关系报错和冲突关系报错。
刚好,在 module load apps/Pytorch/1.8.0-dtk21.04-cp6
就会发送这两个错误。
apps/Pytorch/1.8.0-dtk21.04-cp6(8):ERROR:151: Module 'apps/Pytorch/1.8.0-dtk21.04-cp6' depends on one of the module(s) 'compiler/dtk/21.04'
apps/Pytorch/1.8.0-dtk21.04-cp6(8):ERROR:102: Tcl command execution failed: prereq compiler/dtk/21.04
首先,我们看到 depends on ,说明这就是依赖,需要先加载 module load compiler/dtk/21.04
后,再加载 module load apps/Pytorch/1.8.0-dtk21.04-cp6
。也可以直接写成 module load compiler/dtk/21.04 apps/Pytorch/1.8.0-dtk21.04-cp6
。
运行之后,又会看到冲突错误:
compiler/dtk/21.04(6):ERROR:150: Module 'compiler/dtk/21.04' conflicts with the currently loaded module(s) 'compiler/dtk/22.10.1'
compiler/dtk/21.04(6):ERROR:102: Tcl command execution failed: conflict compiler/rocm/3.3 compiler/dtk
apps/Pytorch/1.8.0-dtk21.04-cp6(8):ERROR:151: Module 'apps/Pytorch/1.8.0-dtk21.04-cp6' depends on one of the module(s) 'compiler/dtk/21.04'
apps/Pytorch/1.8.0-dtk21.04-cp6(8):ERROR:102: Tcl command execution failed: prereq compiler/dtk/21.04
从这里的输出可以看到 conflicts,这个时候系统已经存在’compiler/dtk/22.10.1’环境了,因此我们首先要先通过 module rm compiler/dtk/22.10.1
卸载当前环境(变量),然后再执行 module load compiler/dtk/21.04 apps/Pytorch/1.8.0-dtk21.04-cp6
终于进入激活对应的环境变量了!
因为我们可能加载了多个环境,或者可能我们还想要加载其它环境但不知道有没有加载成功的时候,我们可用通过 module list
,查看已经加载上的软件环境。
其它指令
module 其它指令 | 说明 |
---|---|
module help | 显示帮助信息 |
module switch/swap [mod1] mod2 | 删除 mod1 并导入 mod2, mod1省略表示当前环境(省略主要用来切换版本,切换其它可能会报错),可以发现这就是先 rm 再 load 的简化版本 |
module purge | 清除所有已经导入的软件环境 |
module show/display mod | 显示 mod 的一些内容:和什么冲突、依赖以及安装位置 |
作业命令
在 Slurm 系统中,用户的所有作业都必须通过特定的作业提交命令提交到计算节点执行。这些作业可以通过不同的命令进行管理和监控。
主要掌握sbtach命令,其它命令我在日常使用中不太经常用到。
作业查询命令
sinfo
: 显示系统资源使用情况。sinfo -n x
: 显示节点 x 的使用情况。sinfo -p a
: 显示队列 a 的情况。
squeue
: 查看作业状态。squeue -j 123456
: 查看作业号为 123456 的作业信息。squeue -u x
: 查看账号 x 的作业信息。squeue -p a
: 查看队列 a 的作业信息。squeue -w j
: 查看节点 j 上的作业信息。- 使用
squeue --help
查看更多选项。
使用squeue
会输出作业信息,但查询不到已退出的作业。运行中的作业输出信息解释如下:
JOBID
: 作业号。(唯一)PARTITION
: 使用的队列名。NAME
: 作业名。USER
: 账号名。ST
: 作业状态,R-Runing(正在运行),PD-PenDing(资源不足,排队中),CG-COMPLETING(作业正在完成中),CA-CANCELLED(作业被人为取消),CD-COMPLETED(作业运行完成),F-FAILED(作业运行失败),NF-NODE_FAIL(节点问题导致作业运行失败),PR(作业被抢占),S(作业被挂起),TO(作业超时被杀)TIME
: 运行时间。NODES
: 使用的节点数。NODELIST(REASON)
: 显示作业使用的节点列表或排队原因。我们可以通过 ssh 进入节点列表。
作业提交命令
srun -提交交互式作业
srun [options] program
srun 包括多个选项,通常需要多个参数结合使用。一些参数如果不填默认为1。
- 常用选项:
-N <x>
: 节点数-n <x>, --ntasks=<x>
: 表示CPU核数--ntasks-per-node=<x>
:每个节点的CPU核数或者任务数--gres=dcu:4
:每个节点的加速卡名称及其数量-p
: 指定队列/分区。--exclusive
: 排他性运行,独占性运行,此节点不允许其他用户或不允许user用户共享运行作业-t
: 运行时间限制。-h
: 帮助。
-n
可以省略:
示例:srun -N 6 --ntasks-per-node=4 -n 24 bash -c 'echo $SLURM_PROCID'
,我们使用6个计算节点,每个节点4个CPU核,一共24核。所以这里的-n24
写不写是无所谓的。(注意我这里使用了其它参数的默认值,本教程本着最简单的原则,所以没有增加,比如可以更改每个进程占多少核,1核多少任务,这样可以查看slurm的官方文档进行进阶)
结果:0 16 6 9 22 3 17 8 18 7 10 2 21 5 23 1 4 19 11 20 14 13 12 15
$SLURM_PROCID
是环境变量,CPU的ID,常用的有:SLURM_JOB_NAME:作业名、SLURM_JOB_ID:作业ID、SLURM_JOB_NUM_NODES:节点总数、SLURM_JOB_NODELIST:节点列表
sbatch-提交批处理作业(*)
- 实际上使用
srun
和sbatch
都能编写脚本,但主要区别在于srun
是交互式的,所以一旦输入,终端要等作业完成才能继续运行,而sbatch
是异步的。所以从这里能看出,sbatch
由于是非阻止式的,因此最好提交一个脚本上去,不然从标准输入中获取脚本内容,可能出错了。 - 提交方式是
sbatch xxx.slurm
,但不一定是slurm
格式,可以没有格式。第一行必须以#!/bin/bash、#!/bin/sh、#!/bin/csh
等开头,指定脚本的解释程序。然后以“#SBATCH”+参数作为Slurm参数处理。 sbatch
里面可以套娃srun
sbatch 的一些常用命令选项,具体可以通过 sbatch --help
查看,这与 srun 基本相同。
脚本内容为:
#!/bin/bash
#作业名称
#SBATCH -J dyedd
#指定作业提交的队列
#SBATCH -p blog
#作业申请的节点总数
#SBATCH -N 1
# 每个节点运行任务数
#SBATCH --ntasks-per-node=1
#SBATCH -o %j.out #输出文件的名称,%j表示作业号
#SBATCH -e %j.err #错误输出文件名称
python xxx.test #下面你可以写bash命令
其它命令
salloc
: 获取计算资源,用于分配资源并执行任务。salloc -n 4 -N 1 -p dyedd
,向dyedd队列申请一个节点4核心的CPU,因为默认一个任务1核,4个任务所以4核salloc -n 4 --gress=dcu:2 -N 1 -p dyedd
,向dyedd队列申请2个DCU卡和1节点4核心的CPU
ssh 节点名
,salloc申请成功之后会返回一个节点名,使用ssh进行登录。scancel 节点名
: 取消已提交的作业。除此之外,还可以-n 作业名
,-p 队列
等等。scontrol show node=node1 / scontrol show job 202311
: 查看运行的作业/节点信息。sacct -u $(whoami) --format JobID | tail
:查看Slurm Job 的 JobID记录
注意:在slurm中,推荐写脚本,然后通过sbacth方式提交,这样会更加简单,并且好管理!
转载于染念的博客