本文是我用来记录与复习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是释放所申请的资源。

linux 超算 高性能

版权属于:染念
作品采用:本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
更新于: 2024年09月12日 21:34
1


183 文章数
695 评论量
4 分类数
186 页面数
已在风雨中度过 7年284天1小时59分
目录
来自 《超算平台Slurm 作业调度软件使用手册》
© 2024 染念的笔记
浙ICP备19020194号-1
暗黑模式
暗黑模式
评论
返回顶部
© 2024 染念的笔记
浙ICP备19020194号-1
暗黑模式
暗黑模式
评论
返回顶部