现阶段在学习深度学习超参数优化过程中涉及到SLURM相关知识。这几天探索了一番,简单记录一下目前简单认识。
SLURM,Simple Linux Utility for Resource Management的缩写,是一个开源、容错、高度可扩展的集群管理和作业调度系统。
几个关键概念:
**node节点 **理解成一台独立的服务器(有若干内核,一定大小的内存);
**task任务 **理解为一个可执行脚本(.sh或者.py等),最一般情况下执行一个脚本仅需要一个内核;
**Job作业 **理解为一次slurm提交,可包含一个或多个任务
基本使用流程为(1)用户进入登陆节点—(2)编写任务以及所需配置资源—(3)提交任务,分配节点,开始计算
基础查询命令#
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 #赋予执行权限
|
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
|
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
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!
|
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