SLURM作业系统

Slurm系统简介

在公共集群中使用SLURM作业调度系统进行任务的调度和管理。SLURM (Simple Linux Utility for Resource Management)是一种可用于大型计算节点集群的高度可伸缩和容错的集群管理器和作业调度系统,被世界范围内的超级计算机和计算集群广泛采用。

Slurm常用命令

sinfo

查看节点与分区状态

squeue

查看队列状态

scancel

取消作业

sacct

查看历史作业信息

salloc

分配资源

sbatch

提交批处理作业

scontrol

系统控制

srun

执行作业

日常使用超算资源只需掌握简单的几条命令即可,具体详细的配置请参考SLURM官方文档

查询状态

sinfo:查看节点与分区状态

$ sinfo
PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
cpu*         up   infinite      1  down* n144
cpu*         up   infinite    168  alloc n[3-143,145-171]

关键词

含义

PARTITION

分区名,对节点的逻辑分组。不同的分区会设置不同权限、资源限制等。

AVAIL

可用状态:up 可用;down 不可用

TIMELIMIT

该分区的作业最大运行时长限制, 30:00 表示30分钟,如果是2-00:00:00表示2天,如果是infinite表示不限时间

NODES

节点数量

STATE

状态:drain: 排空状态,表示该类节点不再分配到其他;idle: 空闲状态;alloc: 被分配状态; mix:部分被占用,但是仍有可用资源; down停机

NODELIST

节点列表

image0

squeue:查看队列状态

$ squeue
JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
8628       cpu vasp_cpu  yangx17 PD       0:00      2 (QOSMaxNodePerUserLimit)
8629       cpu vasp_cpu  yangx17 PD       0:00      2 (QOSMaxNodePerUserLimit)
8630       cpu vasp_cpu  yangx17 PD       0:00      2 (QOSMaxNodePerUserLimit)
8636       cpu vasp_cpu  mab2019 PD       0:00      4 (Resources)
8637       cpu     vasp lizhenhu PD       0:00      1 (Priority)
5042       cpu HICE_WAC    xum17  R 16-22:28:14      4 n[114-117]
5044       cpu LICE_WAC    xum17  R 16-22:21:58      4 n[29,41-43]
5519       cpu        c zhaosy16  R 14-22:00:21      5 n[93-95,165-166]
5783       cpu        c liangt20  R 13-20:54:50      5 n[30-32,156-157]

关键词

含义

JOBID

作业的id号,每个成功提交的任务都会有唯一的id

PARTITION

队列名

NAME

作业名称,默认为提交脚本的名称

USER

用户名,提交该作业的用户名

ST

作业状态:PD排队;R运行;S挂起;CG正在退出

TIME

作业运行时间

NODES

作业占节点数

NODELIST(REASON)

作业所占节点列表,如果是排队状态的任务,则会给出排队原因

image1

scancel:取消作业

image2

Slurm作业提交

Slurm作业通常分为交互式和批量式两种。交互式作业通常用于代码编译、脚本调试、交互式计算等工作。长期后台计算的任务通常以作业脚本的方式进行批量提交。

交互作业

集群的登录节点设置有资源限制,请勿在登录节点进行大量计算。

集群的计算节点默认不允许用户直接登录,对需要交互式处理的程序,在登录到集群后,使用salloc命令分配节点,然后再ssh到分配的节点上进行处理:

image3

计算完成后,使用exit命令推出节点,注意需要exit两次,第一次exit是从计算节点退出到登录节点,第二次exit是释放所申请的资源。

image4

批量作业

可以通过将程序执行命令放入作业提交脚本,并通过sbatch命令作业提交的方式在集群中进行计算。

一个简单的脚本示例如下:

 1### 表示这是一个bash脚本
 2#!/bin/bash
 3
 4###作业提交到smalljob队列
 5#SBATCH --partition=smalljob
 6
 7### 设置该作业的作业名
 8#SBATCH --job-name=JOBNAME
 9
10### 指定该作业需要2个节点数
11#SBATCH --nodes=2
12
13### 每个节点所运行的进程数为40
14#SBATCH --ntasks-per-node=40
15
16### 作业最大的运行时间,超过时间后作业资源会被SLURM回收
17#SBATCH --time=2:00:00
18
19### 程序的执行命令
20mpirun hostname

注解

上述中###为注释行。

第2行表示这是一个bash脚本,下面以#SBATCH开头的命令表示这些是需要slurm系统处理的参数。

注意

部分集群划分了数个队列,不同队列的配置、限制等不同。因此在提交作业前,请注意查阅集群信息中的队列信息,根据自己作业特点,选择合适的分区,加上#SBATCH --partition=<name>参数提交。

如下图所示,通过sbatch+作业脚本名提交作业,系统会返回作业编号,通过squeue命令可以看到作业运行状态,等作业执行完成后,默认会把程序的输出放到slurm-作业编号.out的文件中,可通过该文件查看程序的输出。

image6

GPU集群作业提交

如果是GPU集群,需要在作业脚本中增加--gres=gpu:<number of card>参数。例如#SBATCH --gres=gpu:2,意味着指定2张GPU卡数。

以下为GPU作业的一个示例:

 1### 表示这是一个bash脚本
 2#!/bin/bash
 3
 4### 该作业的作业名
 5#SBATCH --job-name=gpu-example
 6
 7### 该作业提交到gpu2队列
 8#SBATCH --partition=gpu2
 9
10### 该作业需要1个节点
11#SBATCH --nodes=1
12
13### 该作业需要16个CPU
14#SBATCH --ntasks=16
15
16### 申请1块GPU卡
17#SBATCH --gres=gpu:1
18
19### 程序的执行命令
20python test.py

常见提交作业参数参考

参数

说明

--partition=<name>

设定作业提交的队列

--job­name=<name>

设定作业名称

--nodes=<n>

设定作业需要的节点数。如果没有指定,默认分配足够的节点来满足--ntasks=<n>--cpus-per-task=<ncpus>参数的要求。

--ntasks-per-node=<ntasks>

设定每个节点上的任务数。要和``–nodes=<n>``同时配合使用。

--ntasks=<n>

设定最多启动的任务数。

--cpus-per-task=<ncpus>

设定每个任务所需要的CPU核数。如果没有指定,默认为每个任务分配一个CPU核。一般运行OpenMP等多线程程序时需要,普通MPI程序不需要。

使用集群中的singularity启动jupyter服务

基础操作

提交作业

在“集群”中,选择“提交作业”,根据下图设置:

set job

将下列内容复制到“编辑运行脚本”中,SBATCH的参数, 按自己需要酌情修改,然后“提交作业”。

#!/bin/bash

### 指定该作业需要多少个节点
#SBATCH --nodes=1
#SBATCH --ntasks=1
#SBATCH --partition=smalljob

singularity run --uts --pid /opt/app/singularity/images/jupyter/jupyter.sif

提交作业可以看到作业的基本信息:

job info

查看作业输出信息,记录红色框中的IP(示例为192.168.0.3:8888)和绿色框中的地址(示例为http://127.0.0.1:8888/?token=487a14f4f23b9dc28ff11d8b37f0d344fd345d62826ae862

job output

配置SSH转发

不同操作系统的SSH转发配置有所不同,请根据自己操作系统选择。

Windows系统

Windows系统建议使用PuTTY

在“PuTTY configuration”配置界面内选择“Session”,在HostNamePort按如下图填写。

putty session

然后选择”Tunnels”,按下图设置,

putty tunnels

点击下方的“Open”按钮后,弹出窗口中要求输入用户名和密码,输入平台的用户名和密码即可。

Linux系统 & Mac系统

打开本地电脑上的~/.ssh/config

vi ~/.ssh/config

添加如下配置。注意在最后的LocalForwad 配置项中将第二个地址修改为刚才红色框的地址。

Host jupyter
        HostName 202.201.1.198
        Port 20338
        User ***YourUserName***
        Compression yes
        IdentityFile "***Your Identity File ***"
        LocalForward 127.0.0.1:8888 192.168.0.3:8888

User是系统用户名,IdentityFile是本机的私钥,具体可以参考集群登录

连接Jupyter并且将Singularity中Jupyter的8888通过 ssh local tunnel 到本地, 注意后面的43569是创建ssh tunnel的ssh进程的进程号, 后续需要断开连接可以kill -9 43569

$ ssh -N jupyter &
[1] 43569

打开Jupyter

打开浏览器, 设置浏览器的代理类型为socks5, 代理地址为127.0.0.1:8888。输入上文记录下的绿色框中的地址就能使用Jupyter了。

browser

进阶版

如果需要定制 conda 环境, 比如 python 版本,可以通过以下方式。

进入集群,输入如下命令进入singularity:

$ salloc -p smalljob -n 1
$ ssh n1
$ singularity instance start --pid --uts /opt/app/singularity/images/jupyter/jupyter.sif jupyter
$ singularity shell instance://jupyter

在singluarity内获取设备的ip地址:

> ip addr|grep "192.168.0"|awk '{print $2}'|awk -F"/" '{print $1}'
> netstat -ntal|grep 8888

启动Jupyter:

> jupyter notebook --notebook-dir=${HOME}/notebooks --ip="192.168.0.3" --port=8888 --no-browser

后续执行如下命令后,就能通过conda安装新环境

$ ssh n1
$ singularity shell instance://jupyter

目前默认是Python 3.8, 输入如下命令可以激活:

> source /opt/app/conda/bin/activate

安装其他环境可以参考此处conda指南

另外也可以通过Jupyter网页上的终端用conda安装新环境

web terminal

注意

如果需要定制自己的环境, 安装系统未带的python包, 务必在自己的env创建, 不要在默认的base env执行安装, 默认的env所在的文件系统是只读的