本文是我用来记录与复习 Slurm 的笔记,经过我的多次编辑和自身成长,本文绝对是全网最零基础,保证学会的文章~ 本文会不定时更新,这主要取决我的记忆会不会发生错乱或是我突然遇到了 bug 然后提出解决方案,所以一定要收藏! 为什么建议大家看我发的呢?因为我会更新,并且我的内容是会有自己的实践想法和经验,不像其他人只是复制文档。
Slurm 简介 #
Slurm(Simple Linux Utility for Resource Management)是一个软件,经常被用于超算平台的作业调度,作业就是我们的运行任务。 使用 Slurm 我们需要知道:
- 我们首先进入的是登录节点,登录节点不要运行大规模作业
- 如果我们要运行作业。我们要申请资源到计算节点,等待资源申请成功之后才能把任务提交到计算节点上运行。
Module 常用命令 #
超算平台通常安装了多种软件环境和应用软件。我们可以通过使用module X命令查看、加载和卸载所需要的环境等。
我觉得 module 真的太棒了,因为
- 它的出现简化了多用户的使用,比如在多用户使用的集群或者个人电脑上,如果没有 Slurm,有些小白用户是真的不会去找这台机器上安装了什么软件,比如重复在自己的 home 目录安装 pycharm,而 Slurm 的出现,能够告诉这些人使用之前,首先查看当前有什么软件了
- 它也简化了软件的配置,例如我们安装 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 -helphelp
- 输出信息解释
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表示作业 IDSLURM_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是释放所申请的资源。
