现阶段在学习深度学习超参数优化过程中涉及到SLURM相关知识。这几天探索了一番,简单记录一下目前简单认识。

SLURM,Simple Linux Utility for Resource Management的缩写,是一个开源、容错、高度可扩展的集群管理和作业调度系统。

几个关键概念:

**node节点 **理解成一台独立的服务器(有若干内核,一定大小的内存);

**task任务 **理解为一个可执行脚本(.sh或者.py等),最一般情况下执行一个脚本仅需要一个内核;

**Job作业 **理解为一次slurm提交,可包含一个或多个任务

基本使用流程为(1)用户进入登陆节点—(2)编写任务以及所需配置资源—(3)提交任务,分配节点,开始计算

PDC Center for High Performance Computing

基础查询命令

1
2
3
4
5
6
sinfo   #查看所有计算节点状态,第一列为分区名,后面会多次用到

squeue  #查看正在运行的作业,包括比较重要的JobID信息
sacct   #查看登陆节点以来所有的作业

scancel #根据JobID,取消正在运行的作业

两种运行方式

1、sbatch/srun提交脚本方式

(1)脚本与参数

需要考虑两部分(1)正确无误的可执行任务脚本文件;(2)指定运行脚本所需的节点资源

  • 脚本文件如下简单的示例
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
vi hello.py
#---如下为脚本内容

#!/usr/bin/env python
import time
print("t1:  ",time.asctime(time.localtime())) 
print("hello world")
time.sleep(5)
print("t2:  ",time.asctime(time.localtime())) 
print("hello world again!")

chmod +x hello.py  #赋予执行权限
  • 通过一些参数,设置运行环境(根据sinfo了解可用节点,以及相应的性能)。

    其中sbatch/srun的参数基本相同

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
-p, --partition=partition name # 在指定分区中分配资源
-N, --nodes   #节点数;如果作业不能跨节点(MPI)运行, 申请的节点数应不超过1
-n, --ntasks  #请求执行任务数/分配的核心数, 默认情况下一个任务一个核心(可通过-c参数修改)
# -n, --ntasks-per-node  #每个节点执行的任务数/分配的核心数,如果申请一个节点与上一个参数意义等价
-c, --cpus-per-task    #每个任务所需的核心数,默认为1

-J myFirstJob  #设置作业名
-o job.%j.out  #脚本执行的输出另保存
-e job.%j.err  #脚本执行的报错另保存
--time=4-00:00 #限制运行时间
(2)srun执行

如下srun调用分区中一个c-4-1节点(已知该节点共有4个核心),并启用1个核心执行hello.py脚本任务

srun运行作业的主要特点之一是阻塞式的,直到运行结束后才会释放命令行。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
srun -N 1 -n 1 -p c-4-1 ./hello.py
# 结果输出如下
# t1:   Sat Sep 10 14:13:31 2022
# hello world
# t2:   Sat Sep 10 14:13:36 2022
# hello world again!

## 如果调用2个核心,则输出结果如下,可以体会与上述启用一个节点的差异
srun -N 1 -n 2 -p c-4-1 ./hello.py
# t1:   Sat Sep 10 14:15:28 2022
# hello world
# t2:   Sat Sep 10 14:15:33 2022
# hello world again!
# t1:   Sat Sep 10 14:15:28 2022
# hello world
# t2:   Sat Sep 10 14:15:33 2022
# hello world again!
(3)sbatch执行

与srun相比,sbatch更适合后台批量提交作业。

sbatch执行的是一个shell作业脚本文件(注意与上面任务脚本是不同的),如下示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
vi hello.slurm
#---如下为脚本内容

#!/bin/bash
#SBATCH -J hello
#SBATCH -p c-4-1
#SBATCH -o %j.out
#SBATCH -e %j.err
#SBATCH -n 1

source activate mypython3    #加载所需的conda环境

python -c 'print("hello, world!")'
#也可以结合srun使用
srun -n 1 ./hello.py
  • 如上,sbatch的参数可以写在作业脚本内,相对更加便捷。

  • 如下执行脚本,然后会返回一个jobID;输出结果会相应保存在out与err文件中。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
sbatch hello.slurm
# Submitted batch job 34


cat 34.out
# hello, world!
# t1:   Sat Sep 10 14:36:37 2022
# hello world
# t2:   Sat Sep 10 14:36:42 2022
# hello world again!
(4)sbatch单节点多任务

如上sbatch执行作业脚本的逻辑就是简单的自上而下思路。

在申请一个多核的节点,结合shell命令技巧同时运行多个任务即并行。

  • (1)多任务,并没有并行的示例
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
vi multi_hello.slurm
#---如下为脚本内容

#!/bin/bash
#SBATCH -J hello
#SBATCH -p c-4-1
#SBATCH -o %j.out
#SBATCH -e %j.err
#SBATCH -n 2
source activate mypython3    #加载所需的conda环境

#任务1
srun -n 1 ./hello.py
#任务2
srun -n 1 ./hello.py

如上为整个作业申请2个核心,使用1个核心执行单个任务

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
sbatch multi_hello.slurm
# Submitted batch job 35

cat 35.out
# t1:   Sat Sep 10 14:52:07 2022
# hello world
# t2:   Sat Sep 10 14:52:12 2022
# hello world again!
# t1:   Sat Sep 10 14:52:12 2022   ##可以看到是在第一个任务结束后再执行的
# hello world
# t2:   Sat Sep 10 14:52:17 2022
# hello world again!
  • (2)多任务,且并行的示例
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
vi multi_hello.slurm
#---如下为脚本内容

#!/bin/bash
#SBATCH -J hello
#SBATCH -p c-4-1
#SBATCH -o %j.out
#SBATCH -e %j.err
#SBATCH -n 2
source activate mypython3    #加载所需的conda环境

#任务1
srun -n 1 ./hello.py &
#任务2
srun -n 1 ./hello.py &

wait

如上有两点特殊处理

& 加在每个任务的末尾,表示放在后台运行,否则任务脚本就会卡在这一行。

wait 放在作业脚本的末尾, 让脚本等待以上后台任务运行结束后再停止,否则作业脚本运行到末尾就结束了。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
sbatch multi_hello.slurm
# Submitted batch job 36

cat 36.out
# t1:   Sat Sep 10 14:58:37 2022
# hello world
# t2:   Sat Sep 10 14:58:42 2022
# hello world again!
# t1:   Sat Sep 10 14:58:37 2022   ##可以看到是在第一个任务同时开始的
# hello world
# t2:   Sat Sep 10 14:58:42 2022
# hello world again!

2、salloc交互式运行计算

salloc可以直接调用指定配置的节点(-p等参数同上),然后通过ssh方式进入节点。之后的操作基本等同在一台相应的服务器上操作。

可以先在salloc模式下调试脚本,之后再通过sbatch批量放到后台运行。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 查看节点
sinfo

# 申请节点
salloc -p c-4-1

# 查看状态
squeue
# JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
#    38     c-4-1     bash  cloudam  R       0:11      1 c-4-1-worker0001

# 进入节点
ssh c-4-1-worker0001

主要参考链接

http://hpc.whu.edu.cn/info/1028/1019.htm

https://docs.hpc.sjtu.edu.cn/app/compilers_and_languages/python.html