前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【科研利器】slurm作业调度系统(二)

【科研利器】slurm作业调度系统(二)

作者头像
自学气象人
发布2022-10-09 09:41:41
3.7K0
发布2022-10-09 09:41:41
举报
文章被收录于专栏:自学气象人自学气象人

大家好哇!前面我们对slurm作业调度系统进行了一个简单的介绍【科研利器】slurm作业调度系统(一),今天我们继续对如何用slurm提交批处理任务以及使用 sinfo、squeue、scontrol命令查询作业信息进行具体的介绍。

1

查看可用资源

咱们在提交任务之前,务必先检查一下超算上可用的节点信息,比如计算资源是否充足、节点是否正在运行作业等。

在其默认的输出中,partition 表示分区名、avail 表示分区状态(up 可用,down 不可用),timelimit 表示分区可供最大运行时长,nodes 表示节点数,state 表示节点运行状态,nodelist 表示分区包含的节点列表。

其中我们需要关注的主要是 state 和 partition ,若 state 中显示 idle 表示节点处于空闲状态,可接收新的作业;显示 allocated 表示节点已经分配了一个或者多个作业且所有核心用满,在作业释放前不能再被分配作业;显示 mix 状态为使用部分核心,仍可以被分配作业;显示 drain 状态表示对应节点已经下线;显示 drng 表示已下线但仍有作业在运行。我们一般会选择将作业提交到 state=idle 所对应的分区(partition),这样可以减少排队时间。

代码语言:javascript
复制
(base) [xiazh@login ~]$ sinfo
PARTITION     AVAIL  TIMELIMIT  NODES  STATE NODELIST
CPU-Large*       up 20-00:00:0     3    mix   cnode[220,231,236]
CPU-Large*       up 20-00:00:0     5   alloc  cnode[164-169]
CPU-Small        up 15-00:00:0     2    mix   cnode[220,231]

以下是 sinfo 命令的常用参数,借助这些参数可以帮我们更准确地掌握想知道的信息。如只想查看上面 CPU-Large 分区的信息,可以用 sinfo -p CPU-Large。

代码语言:javascript
复制
--help    # 显示sinfo命令的使用帮助信息;
-d        # 查看集群中没有响应的节点;
-i <seconds>    # 每隔相应的秒数,对输出的分区节点信息进行刷新
-n <name_list>    # 显示指定节点的信息,如果指定多个节点的话用逗号隔开;
-N    # 按每个节点一行的格式来显示信息;
-p  # <partition> 显示指定分区的信息,如果指定多个分区的话用逗号隔开;
-r    # 只显示响应的节点;
-R    # 显示节点不正常工作的原因;

2

编写slurm脚本

在slurm作业调度系统下,主要支持两种作业形式:提交交互式任务和提交批处理任务。在这里我们先介绍如何编写批处理任务的脚本,交互式任务后面再介绍。slurm 脚本可以在本地编写后上传,也可以直接在超算上编辑。一个 slurm脚本可设置很多内容,比如作业要提交到的分区、运行的最大时长等。以下给出一个常用的模板:

代码语言:javascript
复制
#!/bin/bash
#SBATCH -J test                   # 作业名为 test
#SBATCH -o test.out               # 屏幕上的输出文件重定向到 test.out
#SBATCH -e test.error           # 指定作业标准错误输出文件的名称为test.error
#SBATCH -p gpu                    # 作业提交的分区为 gpu
#SBATCH --qos=debug               # 作业使用的 QoS 为 debug
#SBATCH -N 1                      # 作业申请 1 个节点
#SBATCH -n 1                         #作业申请1个进程
#SBATCH --ntasks-per-node=1       # 单节点启动的进程数为 1
#SBATCH --cpus-per-task=4         # 单任务使用的 CPU 核心数为 4
#SBATCH -t 1:00:00                # 任务运行的最长时间为 1 小时
#SBATCH --gres=gpu:1              # 单个节点使用 1 块 GPU 卡
#SBATCh -w cnode220               # 指定运行作业的节点是 cnode220,若不填写系统自动分配节点
#SBATCh -x cnode221             # 指定不使用cnode221节点运行作业 
#SBATCh –-exclusive             #指定作业独占计算节点

# 设置运行环境
module add anaconda/3-5.0.0.1     # 添加 anaconda/3-5.0.0.1 模块

# 输入要执行的命令,例如 python test.py 等
python test.py                    # 执行命令

其中,第一行是固定的,表示使用 /bin/bash 来执行脚本。实际在每个节点上分配的 CPU 数量由 --ntasks-per-node 和 --cpus-per-task 参数共同决定,等于两者乘积之和。任务最长时间的设置格式是 DD-HH:MM:SS,例如一天又15小时写作 1-15:00:00。 以上的所有 #SBATCH 属性均可以不设置,当缺少某属性时,系统将使用默认值。在这里说一句题外话,请大家在使用时估计自己任务的开销,适量申请计算资源,避免造成资源的浪费,毕竟这都是花钱买来的!

3

提交任务

将slurm脚本编写完毕并上传超算后(或直接在超算编辑),进入 slurm脚本的目录,使用如下命令完成脚本(test.slurm)的提交。

代码语言:javascript
复制
sbatch test.slurm

4‍‍

查看任务状态

作业提交完毕后,可使用 squeue 命令查看任务状态。

代码语言:javascript
复制
(base)[xiazh@login]$ squeue
  JOBID   PARTITION     NAME     USER    ST     TIME    NODES  NODELIST(REASON)
    55       cpu        test    xiazh    PD      0:00      1   (PartitionTimeLimit)
    54       cpu        test    xiazh     R      0:15      1       cnode220

其中JOBID表示任务ID 编号,PARTITION表示作业所在队列(分区),NAME表示任务名称,USER为用户,ST为作业状态,TIME 为已运行时间,NODES 表示占用节点数,NODELIST(REASON)为任务运行的节点列表或者原因说明。另外,状态列中R-Runing(正在运行),PD-PenDing(资源不足,排队中),CG-COMPLETING(作业正在完成中),CA-CANCELLED(作业被人为取消),CD-COMPLETED(作业运行完成),F-FAILED作业运行失败,NF-NODE_FAIL节点问题导致作业运行失败,PR作业被抢占,S作业被挂起,TO作业超时被杀。除此之外,使用 squeue 配合不同参数可以过滤显示的内容,以便能看到你感兴趣的结果。某些参数可以相互组合。

代码语言:javascript
复制
squeue -l: 以长列表显示更多信息。
squeue -u username: 仅显示属于用户 username 的任务。
squeue -t state: 仅显示处于 state 状态的任务。
squeue -n job_name:仅显示名称为job_name的作业
squeue -p partition :仅显示partition分区的任务。
squeue -jobs job_id :仅显示作业id为job_id的作业

顺便介绍一下如何删除任务以及查询任务的详细信息,其显示的内容可以参考squeue。

(1)删除任务(注意:用户只能删除自己的作业,不能删除别人的作业):

代码语言:javascript
复制
scancel jobid: 删除 jobid 的作业。
scancel -u username: 删除 username 的全部作业。
scancel -s state: 删除处于 state 状态的作业。
scancel -p partition :仅显示partition分区的任务。

(2)查看任务详细信息:

代码语言:javascript
复制
scontrol show partition partition_name :详细显示partition_name分区的信息
scontrol show node node_name :详细显示node_name节点信息
scontrol show job job_id :详细显示job_id作业的信息

当你已经学会了以上全部内容的时候,恭喜你!你已经基本掌握了slurm作业调度系统了。

参考资料:

[1]http://hpc.pku.edu.cn/_book/guide/slurm/sinfo.html

[2]中科大超算用户手册

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-11-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 自学气象人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档