对于大型集群环境,通常需要有作业管理系统来调度分配系统资源,本文介绍一款开源免费的容错和高度可扩展的集群管理和作业调度系统:SLURM。在我国首次获得世界TOP500计算机排名第一的天河一号计算机上使用的集群管理和作业调度系统,就是基于SLURM二次开发的,可见其强大。

它的官网是:传送门

准备可执行程序和输入文件

我们想提交一个计算任务,首先要准备好可执行程序和输入文件。

  • 可执行程序需要系统管理员进行编译安装,并配置好环境。
  • 输入文件需要每一位用户针对自己的计算问题进行配置,并上传到自己的账户目录下。

然后我们要看看自己登录的账户可用的资源情况,这样子才能有针对性的提交到合适的计算分区,申请相应的系统资源进行作业的计算。

这里我们假设:可执行程序的名字叫做 program.exe,输入文件的名字叫做 inputfile

查看可用计算节点信息

查看可用计算节点信息的命令是:

sinfo

天河系统的相应命令是:

yhi

显示如下(举例):

PARTITION AVAIL  TIMELIMIT  NODES  STATE  NODELIST
debug        up      30:00     10  drain  cn[1-2]
debug        up      30:00     10  alloc  cn[3-4]
debug        up      30:00     10   idle  cn[5-6]

说明:

关键词 含义
PARTITION 分区名,大型集群为了方便管理,会将节点划分为不同的分区设置不同权限
AVAIL 可用状态:up 可用;down 不可用
TIMELIMIT 该分区的作业最大运行时长限制, 30:00 表示30分钟,如果是2-00:00:00表示2天,如果是infinite表示不限时间
NODES 节点的数量
STATE 节点的状态:drain: 排空状态,表示该类结点不再分配到其他;idle: 空闲状态;alloc: 被分配状态

通过查看系统可用资源情况,我们就知道了要将计算任务提交到那里了,比如例子中的debug计算分区。

提交作业进行计算

接下来应该就是使用slurm作业管理系统进行作业提交了,常用的提交方式有2种,分别介绍如下:

方式1:使用srun直接执行可执行程序

在命令行终端直接执行srun命令进行作业提交计算:

srun -N 2 -n 24 -p debug program.exe < inputfile

天河系统的相应命令是:

yhrun -N 2 -n 24 -p debug program.exe < inputfile

参数说明如下:

关键词 含义
srun srun是slurm作业管理系统并行执行mpi程序的命令,类似mpirun
-N 任务所需的总节点数
-n 任务所需的总核数
-p 任务申请的计算分区名称,刚刚用sinfo查询过,记得吗?
program.exe 可执行程序名称
inputfile 输入文件的名称,”<“简单讲,就是把inputfile文件给program.exe

备注: 1. 有的程序不需要特别指定输入文件的名称,会自动寻找,那么就不需要写 < inputfile 了。 2. 关于结果输出: 1. 如果程序有内置的输出文件名,那么就会写到默认的输出文件中; 2. 如果没有的话,使用 srun 提交的任务的输出会显示在当前屏幕中; 3. 如果想将输出结果定向到别的文件,可以使用例如 > outputfile 的写法,将输出结果写到 outputfile 文件中。 3. 不过要注意的是,在有登录节点和计算节点的大型集群中,使用 srun 命令提交任务,会由于用户的当前终端关闭而导致任务断掉,因此建议用户使用下面的方式提交组偶也。

方式2:使用sbatch提交批处理脚本进行任务计算

这种方式是最为推荐的方式,先编写一个脚本(别担心,很简单),然后用提交命令提交这个脚本即可。

编写脚本

使用文本编辑器(例如vim等),创建一个用于提交作业的脚本文件,例如名为sub.sh的文件。

vim sub.sh

然后写入脚本内容

#!/bin/bash
srun -N 2 -n 24 -p debug program.exe < inputfile

天河系统的相应命令是:

yhrun -N 2 -n 24 -p debug program.exe < inputfile

第一行表示这个文件是一个bash的脚本文件。 第二行表示我要用srun命令,申请2个节点,一共24个cpu核,在debug分区,使用program.exe程序计算inputfile输入文件所设定的具体计算任务。

这个和方式1种的命令,完全相同。

提交脚本

我们用命令将刚刚写的脚本提交一下,放到后台,这样子就不担心因为当前终端关闭而导致任务断掉的问题了,命令为:

sbatch -N 2 -n 24 -p debug sub.sh  

天河系统的相应命令是:

yhbatch -N 2 -n 24 -p debug sub.sh

参数说明如下:

关键词 含义
sbatch sbatch是slurm作业管理系统提交批处理脚本的命令
-N 任务所需的总节点数
-n 任务所需的总核数
-p 任务申请的计算分区名称
sub.sh 脚本的名字,我们起的名字是sub.sh

使用这种方式提交的任务,会自动生成一个名为slurm-jobid.out的文件,其中”jobid”是slurm分配给这个任务的具体编号数字。里面会有除了程序特殊指定,或用户重定向以外的所有作业的标准输出和错误信息。当计算任务出现错误的时候,我们也是第一时间查看该文件,寻找原因。

查看作业状态

如果我们想查看一下当前用户的作业状态,可以使用如下命令:

squeue

天河系统的相应命令是:

yhqueue
或
yhq

显示如下(举例):

JOBID   PARTITION  NAME     USER       ST  TIME      NODES NODELIST(REASON)
100001  debug      sub.sh   zhenggang  R   00:05:00  1     cn6

参数说明如下:

关键词 含义
JOBID job的id号,每个成功提交的任务都会有唯一的id
PARTITION 计算分区名
NAME 任务名,默认以提交脚本的名称当作任务名
USER 用户名,提交该任务的用户名
ST 任务状态:PD排队;R运行;S挂起;CG正在退出
TIME 任务运行时间,例子中为5分钟
NODES 任务作占节点数,例子中为1个
NODELIST(REASON) 任务所占节点列表,如果是排队状态的任务,则会给出排队原因

备注:常见排队原因:

  • AssociationResourceLimit:关联的资源限制已满 — 账户有使用节点数限制,已经用满了。
  • Resources:当前可用资源不能满足作业需求 — 系统的可用节点资源不足
  • Dependency:作业的依赖关系未满足 — 作业之间有依赖关系,依赖的作业没完成
  • PartitionDown:作业所在的分区处于 down 状态 — 分区down,所以节点不可用。

取消作业

如果提交作业后,发现有些输入文件参数设置错了,或者其他原因想停止这个作业,可以先使用squeue(或yhq)找到该作业的id号,如100001,然后使用如下命令杀掉任务:

scancel 100001

天河系统的相应命令是:

yhcancel 100001

进阶

关于slurm作业管理系统,还有非常丰富的内容,本文仅给出了最最常用的几个命令。如果想深入了解,可以关于以后的文章。

比如: * 如何给任务起名字,让每个任务不一样 * 如何限制任务的运行时间 * 如何申请特定节点,排除特定的节点 * 如何查看作业运行的详细信息,比如提交目录、运行耗时 * 如何设置作业之间的依赖关系,让某个作业在另一个之后才运行

不过这些通常用户用到的不多,如果想知道的话,留言哦。