常用Slurm作业投递及查询命令

本文介绍了Slurm集群的基本概念,包括jobstep、partition、QOS等,并详细讲解了Slurm的基本命令,如salloc、sbatch、scancel等。此外,还探讨了三种提交作业模式:交互模式、批处理模式和分配模式,并提供了节点和作业信息查看的方法。
部署运行你感兴趣的模型镜像

1. 集群常用概念

job step: 作业步,单个作业可以有多个作业步
partition:分区,作业需要在特定分区中运行(理解为定义了队列,每个队列中包含不同节点)
QOS:服务质量,可理解为用户可使用的CPU,内存等资源限制
tasks:任务数,默认一个任务使用一个cpu核,可理解为job所需的cpu核数
socket:cpu插槽,即物理cpu颗数

2. Slurm 基本命令

salloc:为实时处理的作业分配资源

  • 典型场景为分配资源并启动一个shell,然 后用此shell执行srun命令去执行并行任务。

sbatch:提交作业脚本使其运行。

  • 此脚本一般也可含有一个或多个srun命令,启动并行任务。

scancel:取消排队或运行中的作业或作业步。

scontrol:显示或设定Slurm作业、队列、节点等状态。

sinfo:显示队列或节点状态。

squeue:显示队列中的作业及作业步状态。

srun:实时交互式运行并行作业,一般用于短时间测试,或者与sallcoc及sbatch结合。

3. Slurm 提交作业模式

Slurm 提交作业有 3 种模式,分别为交互模式批处理模式分配模式,这三种方式只是用户使用方式的区别,在管理,调度,记账时同等对待。

3.1 交互模式:srun

交互式作业提交,提交命令后,等待作业执行完成之后返回命令行操作界面。

# 常用于测试
srun -p queue2 hostname
# 使用python提交命令
srun -p partitionName -w nodeName python3 /pipeline/test.py
# -p:指定分区
# -w:指定运行节点名称
# -n:指定多少个进程
其他常用命令
# 在 shell 窗口中执行 srun 命令,主要命令格式如下:
srun [options] program

srun 常用选项:srun 包括多个选项,其中最常用的选项主要有以下几个:
-n, –ntasks=number
	指定要运行的任务数。请求为 number 个任务分配资源,默认为每个任务一个处理器核。

-c, –cpus-per-task=ncpus
    告知资源管理系统控制进程,作业的每个任务需要 ncpus 个处理器核。若未指定此选项,则控制进程默认为每个任务分配一个处理器核。

-N, –nodes=minnodes[-maxnodes]
    请求为作业至少分配 minnodes 个结点。调度器可能觉得在多于 minnodes 个结点上运行作业。可以通过 maxnodes 限制最多分配的结点数目(例如“-N 2-4”或“–nodes=2-4”)。最少和最多结点数目可以相同以指定特定的结点数目(例如, “-N 2”或“–nodes=2-2” 将请求两个且仅两个结点)。分区的结点数目限制将覆盖作业的请求。如果作业的结点限制超出了分区中配置的结点数目,作业将被拒绝。 如果没有指定-N,缺省行为是分配足够多的结点以满足-n 和-c 参数的需求。在允许的限制范围内以及不延迟作业开始运行的前提下,作业将被分配尽可能多的结点。

-p, –partition=partition name
    在指定分区中分配资源。请使用 -p [hpxg|hpib|debug] 指定所使用的分区。

# 示例:在CPU-Small分区单节点单核运行chart.e程序
# srun -N 1 -n 1 -p CPU-Small ./chart.e

3.2 批处理模式:sbatch

  • 批处理作业是指用户编写作业脚本,指定资源需求约束,提交后台执行作业
  • 此时作业在入调度状态,在资源满足要求时,分配完计算结点之后,系统将在所分配的第一个计算结点(而不是登录结点)上加载执行用户的作业脚本
  • 批处理作业的脚本为一个文本文件,脚本第一行以 “#!” 字符开头,并制定脚本文件的解释程序,如 sh,bash(因为计算节点为精简环境,只提供 sh 和 bash 的默认支持)
  • 计算开始后,工作目录中会生成以 slurm 开头的.out 文件为输出文件
  • 作业脚本为文本文件,首行以 “#!” 开头,指定解释程序
  • 脚本中可通过 srun 加载计算任务
  • 一个作业可包含多个作业步
  • 脚本在管理节点上提交,实际在计算节点上执行
  • 脚本输出写到输出文件中

一些常见的资源需求参数(在脚本文件中使用 #SBATCH -XX XXX的方式写入脚本):

--mem:指定每个节点上使用的物理内存
--reservation:资源预留
--begin:指定作业开始时间
-D,--chdir:指定脚本/命令的工作目录
-c, --cpu-per-task=NCPUs        #指定每个进程使用核数,不指定默认为1
-e, --error=error_filename      #指定错误文件输出
-J, --job-name=JOBNAME          #指定作业名称
--mail-type=END/FAIL/ALL        #邮件提醒,可选:END,FAIL,ALL
--mail-user=mail_address        #通知邮箱地址
-n, --ntask=NTASKs #指定总进程数;不使用cpus-per-task,可理解为进程数即为核数 
--ntask-per-node=N #指定每个节点进程数/核数,使用-n参数后变为每个节点最多运行的进程数
-N, --nodes=N                   #指定节点数量
-o, --output=out_filename       #指定输出文件输出
-p, --partion=debug             #指定分区
-t, --time=dd-hh:mm:ss          #作业最大运行时间
-w, --nodelist=node[1,2]        #指定优先使用节点,不可与避免节点冲突
-x, --exclude=node[3,5-6]       #指定避免使用节点,不可与优先节点冲突
--mem-per-cpu=MB                #指定计算cpu最大占用内存大小
示例文件1
#!/bin/bash
#SBATCH -J array
#SBATCH -p compute
#SBATCH -N 1

input=(foo bar baz)
echo "This is job #${SLURM_ARRAY_JOB_ID}, with parameter ${input[$SLURM_ARRAY_TASK_ID]}"
echo "There are ${SLURM_ARRAY_TASK_COUNT} task(s) in the array."
echo "  Max index is ${SLURM_ARRAY_TASK_MAX}"
echo "  Min index is ${SLURM_ARRAY_TASK_MIN}"
sleep 5


# -------------------------------------#
# 作业 ID 是 81,而作业数组 ID 中的每个元素的命名方式为 JOBID_TASKID,非常 容易分辨。
# 以下是其中某个作业的输出:
# 	slurm-81.out
示例文件2
#!/bin/bash 
#提交单个作业
#SBATCH --job-name=JOBNAME      %指定作业名称
#SBATCH --partition=debug       %指定分区
#SBATCH --nodes=2               %指定节点数量
#SBATCH --cpus-per-task=1       %指定每个进程使用核数,不指定默认为1
#SBATCH -n 32       %指定总进程数;不使用cpus-per-task,可理解为进程数即为核数
#SBATCH --ntasks-per-node=16    %指定每个节点进程数/核数,使用-n参数(优先级更高),变为每个节点最多运行的任务数
#SBATCH --nodelist=node[3,4]    %指定优先使用节点
#SBATCH --exclude=node[1,5-6]   %指定避免使用节点
#SBATCH --time=dd-hh:mm:ss      %作业最大运行时长,参考格式填写
#SBATCH --output=file_name      %指定输出文件输出
#SBATCH --error=file_name       %指定错误文件输出
#SBATCH --mail-type=ALL         %邮件提醒,可选:END,FAIL,ALL
#SBATCH --mail-user=address     %通知邮箱地址

source /public/home/user/.bashrc   #导入环境变量文件

mpirun -n 32 ./iPic3D ./inputfiles/test.inp #运行命令

执行

# 命令行执行;文件名任意(有无后缀均可以,但内容格式必须规定)
sbatch filename

3.3 分配模式:salloc

结点资源抢占命令。该命令支持用户在提交作业前,抢占所需计算资源(此时开始计算所用机时)。

  • 执行分为四步:

      1.提交资源分配请求,作业排队等待资源分配,作业开始运行,开始计费;
      
      2.执行用户指定的命令;
      
      3.命令执行结束;
      
      4.退出作业释放资源,作业停止运行,停止计费。
    

4. 作业或节点信息查看

4.1 节点信息查看

sinfo									# 查看所有分区状态
sinfo -a 							# 查看所有分区状态
sinfo -N								# 查看节点状态
sinfo -n node-name			# 查看指定节点状态
sinfo --help						# 查看帮助信息

# 节点状态信息
alloc:节点在使用
idle:节点可用
mix:节点部分被占用
down:节点下线
drain:节点故障

4.2 作业信息查询

squeue				# 查看运行中作业列表
squeue -l 		# 查看列表细节信息
squeue -j job-id 	# 查看指定运行中的作业信息
squeue -u username  # 查看user所有运行中的作业
# 作业状态
R:正在运行
PD:正在排队
CG:即将完成
CD:已完成

4.3 scontrol

4.3.1 信息查看

scontrol show job JOBID         #查看作业的详细信息
scontrol show node              #查看所有节点详细信息
scontrol show node node-name    #查看指定节点详细信息
scontrol show node | grep CPU   #查看各节点cpu状态
scontrol show node node-name | grep CPU #查看指定节点cpu状态

4.3.2 更新作业

在任务开始前却发现作业的属性写错了(例如提交错了分区,修改名字),取消了重新排队似乎很不划算。如果作业恰好 没在运行,我们是可以通过 scontrol 命令来更新作业的属性

scontrol update jobid=JOBID ... #...为下面参数
reqnodelist=<nodes>
reqcores=<count>
name=<name>
nodelist=<nodes>
excnodelist=<nodes>
numcpus=<min_count-max_count>
numnodes=<min_count-max_count>
numtasks=<count>
starttime=yyyy-mm-dd
partition=<name>
timelimit=d-h:m:s
mincpusnode=<count>
minmemorycpu=<megabytes>
minmemorynode=<megabytes>

5. 其他常用命令

squeue:检查队列状况
scancel:结合作业ID,终止作业
swatch+节点名称+top:查看cpu使用情况
swatch+节点名称+free:查看内存使用情况
scontrol update NodeName=m1 State=idle:修改节点状态

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

### 使用 `seff` 命令优化 Slurm 作业的资源配置 在 Slurm 平台中,`seff` 命令为用户提供了历史作业的详细资源使用情况,包括 CPU 利用时间、内存使用量以及作业运行效率等信息。这些数据对于优化后续作业的资源配置具有重要意义。通过分析已完成作业的资源消耗情况,可以合理调整资源请求参数,从而避免资源浪费或作业因资源不足而失败的情况。 #### 获取历史作业的资源使用情况 使用 `seff` 命令后跟作业 ID 可以查看该作业的资源使用统计信息。例如,查看作业 ID 为 `10010` 的作业: ```bash $ seff 10010 Job ID: 10010 Cluster: cluster_test User/Group: slurmtest/slurmtest State: COMPLETED (exit code 0) Nodes: 2 Cores per node: 16 CPU Utilized: 1-15:14:19 CPU Efficiency: 99.53% of 1-15:25:20 core-walltime Job Wall-clock time: 01:13:55 Memory Utilized: 1.05 GB (estimated maximum) Memory Efficiency: 3.37% of 31.25 GB (1000.00 MB/core) ``` 从上述输出中可以提取以下关键信息: - **CPU Utilized**:作业实际使用的 CPU 时间。 - **CPU Efficiency**:作业 CPU 利用率,表示实际使用的 CPU 时间与请求的 CPU 时间的比率。 - **Memory Utilized**:作业实际使用的最大内存。 - **Memory Efficiency**:作业内存利用率,表示实际使用的内存与请求的内存的比率。 通过这些信息,可以判断作业是否充分利用了请求的资源,或者是否存在资源请求过量或不足的情况[^1]。 #### 根据 `seff` 数据优化资源配置 1. **优化 CPU 请求**:如果作业的 CPU 利用率接近 100%,说明作业充分利用了请求的 CPU 时间,可以考虑保持当前配置或适当增加 CPU 时间以提高性能。如果 CPU 利用率较低,则应减少请求的 CPU 时间,以避免资源浪费。 2. **优化内存请求**:如果作业的内存利用率较低(例如低于 50%),则说明请求的内存过多,可以减少内存请求以释放更多资源给其他作业。如果内存利用率接近 100%,则可能需要增加内存请求以避免作业因内存不足而失败。 3. **调整节点和核心数**:根据作业的并行需求,调整请求的节点数和每个节点的核心数。如果作业在多个节点上运行效率不高,可以尝试减少节点数量以提高通信效率。 4. **结合 `sacct` 命令**:除了 `seff`,还可以使用 `sacct` 命令获取更详细的作业统计信息。例如,以下命令可以显示作业的资源使用情况: ```bash sacct -j 10010 --format=JobID,JobName,Partition,Account,AllocCPUs,Elapsed,TotalCPU,MaxRSS ``` 通过结合 `seff` 和 `sacct` 命令,可以更全面地了解作业的资源使用情况,并据此优化资源配置。 #### 示例:根据 `seff` 输出调整作业脚本 假设通过 `seff` 查看作业的内存使用情况如下: ```bash Memory Utilized: 1.05 GB (estimated maximum) Memory Efficiency: 3.7% of 31.25 GB (1000.00 MB/core) ``` 从输出中可以看出,作业实际使用的内存仅为 1.05 GB,而请求的内存为 31.25 GB,内存利用率仅为 3.7%。这表明内存请求过高,可以将内存请求减少到 2 GB 左右,以提高资源利用率。 优化后的作业脚本如下: ```bash #SBATCH --nodes=2 #SBATCH --ntasks-per-node=16 #SBATCH --mem=2GB #SBATCH --time=02:00:00 ``` 通过这种方式,可以有效减少资源浪费,提高集群的整体利用率。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值