本文用来记录与日后复习如何使用超算平台的 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 以及一些冲突解决方式。
通过上一命令,我们找到了我们想要进入的软件环境,此时只要通过 module load apps/anaconda3/5.2.0
,例如这里我想进入 anaconda3 环境。(虽然这里我使用进入一词,但实际上 module load
命令是加载相应环境变量,而且同时 load 多个环境!)
如果进行 anaconda 环境,剩下的命令就和平常操作一样了。
此外,一般平台也帮我们准备了一些 pytorch、tensorflow 等库了,这些都要在刚刚的 module avail
的输出结果里观察,例如我这就看到了'apps/Pytorch/1.8.0-dtk21.04-cp6',适配 DCU 的 Pytorch 环境。
接上面的可以 load 多个环境,这主要为了解决可能的存在依赖关系报错和冲突关系报错。
刚好,在 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 系统,用户所有需要运行的作业均必须通过作业提交命令(sbatch 或 srun)提交到计算节点执行运算,提交后可利用相关命令查询作业状态等。
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)对于运行作业(R 状态)显示作业使用的节点列表;对于排队作业(PD 状态),显示排队的原因。(可以通过 ssh 进入节点列表)
srun -提交交互式作业
srun [options] program
srun -p a -w j[1100-1101] -N 2 -n 128 -t 20 A.exe
Srun 包括多个选项,通常需要多个参数结合使用。其中最常用的选项主要有以下几个:
• -n,指定要运行的任务数。默认为 1, srun -n 20
表示要运行 20 个 task。
• -c,指定作业每个 task 需要的 CPU 核数。默认为 1。srun -c 4
表示运行一个任务,使用 4 个 CPU 核。
• -N,指定作业需要的计算节点数量。srun -N 2
表示作业将在两个计算节点上运行。
• -p,指定作业运行的队列/分区。srun -p hfactest
表示指定作业在 hfactest 队列中运行。
• -w,指定作业运行的特定计算节点名称或列表。srun -w node[1-16]
指定作业在 node1 到 node16 这 16 个节点上运行。
• --exclusive,指定作业独占计算节点。作业运行过程中不允许其他作业使用节点,即使节点核心未用满。
-t,指定作业运行时间限制。
• -h, --help,若需使用 srun 更多选项,可通过“srun -h
” 或“srun --help
” 查看。sbatch-提交批处理作业
sbatch xxx.sbatch
sbatch 文件是批处理作业脚本,格式为:#!/bin/bash #SBATCH -J TestSerial #作业名称 #SBATCH -p hfactest #指定作业提交的队列 #SBATCH -N 1 #作业申请的节点数 #SBATCH -n 1 #作业申请的总task任务数 #SBATCH -o %j.out #输出文件的名称,%j表示作业号 #SBATCH -e %j.err #错误输出文件名称 echo "SLURM_JOB_PARTITION=$SLURM_JOB_PARTITION" #环境变量-作业被分配到的队列名 echo "SLURM_JOB_NODELIST=$SLURM_JOB_NODELIST" #环境变量-作业被分配到的节点列表 srun ./calc_serial # 也可以直接运行软件: ./calc_serial
作业控制指令以" #SBATCH "开头,其他注释以"#"开头。
sbatch 的一些常用命令选项,具体可以通过sbatch --help
查看,这与 srun 基本相同。
更多介绍见sugon文档
与 srun 区别:
srun
交互和阻止(在终端中获得结果,并且在完成之前无法编写其他命令)sbatch
批处理和非阻止(结果写入文件,并且可以提交其他命令)salloc-提交节点资源获取作业
该命令支持用户在提交作业前,先获取所需计算资源。
典型场景为分配资源并启动一个 shell,然后用此 shell(ssh 到计算节点)执行 srun 命令去执行并行任务。
salloc -n 4 -p hfactest
scancel-取消已提交的作业
scancel 123456 #取消作业号为 123456 的作业
scancel -n testjob #取消作业名为 testjob 的作业
scancel -p amd_256 #取消提交到 amd_256 队列的作业
scancel -t PENDING #取消正在排队的作业
scancel -w j100 #取消运行在 j100 节点上的作业
scontrol-查看正在运行的作业/节点信息
Scontrol 命令可以查看正在运行的作业详情,比如提交目录、提交脚本、使用核数情况等,对已退出的作业无效。
scontrol show node[=node1] #查看节点信息,如果不指定node1,默认会显示所有节点信息
scontrol show job 123456 #查看作业信息