Slurm解密:超算平台作业调度的全面指南

133 阅读6分钟

本文用来记录与日后复习如何使用超算平台的 Slurm 作业调度系统

Module 常用命令

超算平台通常安装了多种软件环境和应用软件。为了方便使用,平台通过 module 工具管理计算环境,可以使用 module 命令查看、加载和卸载所需要的环境等

查看可用软件

查看系统可用软件,执行命令:module avail,即可列出用户可使用的所有软件名称。 系统安装的软件主要分为两类:

  1. 安装在共享存储/public/software/路径下的软件,包含数学库、MPI 并行库、工具等;
  2. 安装在节点本地磁盘/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 系统中,用户的所有作业都必须通过特定的作业提交命令提交到计算节点执行。这些作业可以通过不同的命令进行管理和监控。 主要掌握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 查看更多选项。

使用sueue会输出作业信息,但查询不到已退出的作业。运行中的作业输出信息解释如下:

  • 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。

  • 常用选项:
    • -c: 每个任务需要的 CPU 核数。
    • -N: 需要的计算节点数量。节点是物理或虚拟的计算机,用于执行计算任务。例如,-N 2 表示作业需要在两个节点上运行。这个选项通常用于指定作业需要占用多少个独立的计算机资源。
    • -n: 指定任务数,它表示在请求足够的资源来同时运行独立任务的数量。这个数目并不一定与 CPU 核心数直接相等,因为任务的分布取决于作业的具体配置和系统的调度策略。任务分布在请求的节点中。
    • -p: 指定队列/分区。
    • -w: 指定特定计算节点名称或列表。
    • --exclusive: 表示作业要独占计算节点。
    • -t: 运行时间限制。
    • -h: 帮助。

通常任务数(-n)至少会等于或多于节点数(-N)

sbatch-提交批处理作业(*)

sbatch xxx.sh sbatch 的一些常用命令选项,具体可以通过 sbatch --help 查看,这与 srun 基本相同。 sh格式为:

#!/bin/bash
#SBATCH -J write_slurm #作业名称
#SBATCH -p dyedd #指定作业提交的队列
#SBATCH -N 1   #作业申请的节点数
#SBATCH -n 6   #一次运行申请的总任务数
#SBATCH -o %j.out  #输出文件的名称,%j表示作业号
#SBATCH -e %j.err  #错误输出文件名称
python xxx.test  #下面你可以写bash命令

与 srun 区别:

  • srun 用于交互式作业,阻止终端直到完成。
  • sbatch 用于批处理作业,非阻止式。

其它命令

  • salloc: 获取计算资源,用于分配资源并执行任务。
    • salloc -n 4 -N 1 -p dyedd,向dyedd队列申请一个节点4核心的CPU
    • 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: 查看运行的作业/节点信息。

注意:在slurm中,推荐写sh脚本,然后通过sbacth方式提交,这样会更加简单,并且好管理!