本文是我用来记录与复习 Slurm 的笔记,经过我的多次编辑和自身成长,本文绝对是全网最零基础,保证学会的文章~ 本文会不定时更新,这主要取决我的记忆会不会发生错乱或是我突然遇到了 bug 然后提出解决方案,所以一定要收藏! 为什么建议大家看我发的呢?因为我会更新,并且我的内容是会有自己的实践想法和经验,不像其他人只是复制文档。

Slurm 简介 #

Slurm(Simple Linux Utility for Resource Management)是一个软件,经常被用于超算平台的作业调度,作业就是我们的运行任务。 使用 Slurm 我们需要知道:

  1. 我们首先进入的是登录节点,登录节点不要运行大规模作业
  2. 如果我们要运行作业。我们要申请资源到计算节点,等待资源申请成功之后才能把任务提交到计算节点上运行。

Module 常用命令 #

超算平台通常安装了多种软件环境和应用软件。我们可以通过使用module X命令查看、加载和卸载所需要的环境等。 我觉得 module 真的太棒了,因为

  1. 它的出现简化了多用户的使用,比如在多用户使用的集群或者个人电脑上,如果没有 Slurm,有些小白用户是真的不会去找这台机器上安装了什么软件,比如重复在自己的 home 目录安装 pycharm,而 Slurm 的出现,能够告诉这些人使用之前,首先查看当前有什么软件了
  2. 它也简化了软件的配置,例如我们安装 cmake 的时候,经常要写入环境变量,而如果通过 Slurm 作业调度系统,我们也不用特地的把环境变量写入配置文件,通过自带的机制可以方便我们删除和载入环境变量。

具体操作如下:

  • module avail查看能使用的预装软件
  • module load mod1 [mod2...]来加载环境变量和使用软件。可以同时 load 多个环境 例如,我们 avail 之后看到显示结果有compiler/dtk/24.04,那么我们直接module load compiler/dtk/24.04即可使用 DTK24.04。
  • module rm mod,卸载某个变量
  • module list查看当前已加载的环境变量,这在如果我们忘记我们加载了什么环境变量时候非常有用。
  • module help显示帮助信息
  • module purge清除所有已经导入的环境变量,重开!
  • module switch/swap [mod1] mod2用来删除 mod1 并导入 mod2, 省略 mod1,系统会自动切换当前环境中的一个变量,这经常用来切换某个相同软件的版本。
  • module show/display mod显示 mod 的一些内容:和什么冲突、依赖以及安装位置

处理依赖和冲突 #

同时加载多个环境,可能存在依赖关系报错和冲突关系报错。 刚好,在 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

Slurm 命令 #

主要掌握 sbtach 命令,其它命令我在日常使用中不太经常用到。

作业查询命令 #

  • sinfo: 查看集群状态。
    • 节点状态包括 drain(节点故障),alloc(节点在用),idle(节点可用),down(节点下线),mix(节点部分占用,但仍有剩余资源)
    • sinfo的常用命令选项:
      • sinfo 查看总体资源信息
      • sinfo -N 查看节点级信息
      • sinfo -p partition_name 显示指定队列的信息
      • sinfo -n node_name 查看指定节点状态
      • sinfo -V 显示版本信息
      • sinfo --help 查看帮助说明
  • squeue: 查看作业信息,但查询不到已退出的作业。
    • 输出信息解释
      • `JOBID`: 作业号(唯一)
        
      • PARTITION: 使用的队列名。
      • NAME: 作业名。
      • USER: 账号名。
      • ST: 作业状态,包括 R(正在运行),PD(正在排队),CG(即将完成),CD(已完成), 如果 squeue 没有任务信息,说明任务已退出并且退出的时间已经超出清理时间。
      • TIME: 运行时间。
      • NODES: 使用的节点数。
      • NODELIST(REASON): 显示作业使用的节点列表或排队原因。我们可以通过 ssh 进入节点列表
    • 查用命令选项:
      • squeue查看自己账户的作业,后面带-l显示更加细节
      • squeue -j job_id根据指定的作业号查询作业信息
      • squeue -l查看细节信息
      • squeue -p partition_name按队列查询作业
      • squeue -help help
  • sacct显示过去 24 小时 的帐号作业信息
  • scancel [JOB_ID]取消作业
  • scontrol hold JOB_ID使排队中尚未运行的作业暂停被分配运行,被挂起的作业将不被执行
  • scontrol release JOB_ID取消挂起

作业提交命令 #

srun #

交互式提交作业,断网、关闭终端窗口或者手贱暂停会导致作业中断。 srun常用命令选项如下,通常需要多个选项联合使用。一些选项如果不填默认为 1。

  • 常用参数:
    • -J:作业名
    • -N 1: 节点数
    • -n 1: 指定要运行的进程数(任务数),默认每个进程(任务)一个处理器核
    • --ntasks-per-node=1:指定每个节点运行进程数
    • -cpu_per_task=1:指定任务需要的处理器数目
    • -c 1:每个任务需要多少个处理器核
    • --gres=dcu:4:每个节点的加速卡名称及其数量
    • --exclusive: 作业独占节点,作业运行过程中不允许其他作业使用节点,即使节点核心未用满。
    • -t 40: 运行时间限制
    • -o xx:输出文件的名 可以附带 %j表示作业 ID 来命名
    • -e xxx:输出错误文件的名称,上同
    • -h: 帮助

示例:srun -p test -N 6 --ntasks-per-node=4 -n 24 bash -c 'echo $SLURM_PROCID',我们使用 6 个计算节点,每个节点进程数量是 4,一共 24 个进程,24 个任务,24 个 CPU 核。 上面的输出结果是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是 Slrum 环境变量,用来表示 CPU 的 ID,常用的还有:

  • SLURM_JOB_NAME表示作业名
  • SLURM_JOB_ID表示作业 ID
  • SLURM_JOB_NUM_NODES表示节点总数
  • SLURM_JOB_NODELIST表示节点列表

sbatch #

通过 sbatch 提交一个批处理作业是 Slurm 的最常见用法。 srun 是交互式的,如果关闭终端或者不小心停止,作业只能停止,而 sbatch 是异步的,非阻止式的,关闭终端也能执行。当 sbatch 在脚本正确传递给作业调度系统后立即退出,同时获取到一个作业号。

其提交方式是sbatch xxx.slurm(不一定是slurm格式,可以没有格式)

  • 第一行必须以#!/bin/bash、#!/bin/sh、#!/bin/csh等开头,指定脚本的解释程序。
  • 然后以“#SBATCH”+参数作为 Slurm 参数处理。参数和srun基本一致。
  • sbatch 里面可以套娃 srun

使用示例

#!/bin/bash
#SBATCH -J dyedd
#SBATCH -p blog
#SBATCH -N 1
#SBATCH --ntasks-per-node=1
#SBATCH -o %j.out
#SBATCH -e %j.err
python test.py

salloc #

该命令支持用户在提交作业前,先获取所需计算资源,然后可以 ssh 进入计算节点运行相关计算程序,当命令结束后释放分配的资源。常用作调试。 常用命令选项同上面基本一致。

使用示例

salloc -p 队列名 -N 1 --gres=dcu:1

直到等待出现:salloc: Nodes b09r3n18 are ready for job,后面可能附带冲突关系不用理会,我认为是因为我们执行 salloc 的时候是处于登录节点,而登录节点有自己的加载的环境变量(可以通过module list查看),而开辟的新节点即计算节点也有自己的环境变量,此时如果两个地方如编译器版本不同,就会显示冲突,而我们实际上要进入这个计算节点的,管它登录节点什么事情。 是吧,然后我们通过ssh b09r3n18登录节点,原来的环境变量已经被切换了。

计算完成后,使用exit命令推出节点,注意需要exit两次, 第一次exit是从计算节点退出到登录节点,第二次exit是释放所申请的资源。