本文地址
👍如果大家觉得本文有用的话,希望能点个赞鼓励一下,十分感谢各位的支持
文章目录
- 1 前言
- 1.1 slurm系统的简介
- 1.2 slurm系统的资源申请过程的简要说明
- 2 Slurm系统的基础命令
- 2.1 shell脚本文件与批处理文件的提交
- 3 个人编辑的功能小脚本
1 前言
本文针对一般的新手小白的需要进行原理介绍,所以会介绍的比较抽象一些。
本文主要参考了以下文章。转载本文需要附上本文链接。
【Slurm系统入门】
[1] SLURM 资源管理系统(自可乐,简书)
[2] slurm系统的使用格式示范
[3] PBS或SLURM提交任务的命令对比
【超算使用手册】
[4] 中国科大超算中心用户使用手册(虚拟gnome桌面) (衍生命令讲的比较详细)
[5] 北京大学超算中心使用手册 (排版比较好)
[6] 超算slurm进阶 (讲了很多额外功能)
1.1 slurm系统的简介
SLURM (Simple Linux Utility for Resource Management)是一种可用于大型计算节点集群的高度可伸缩和容错的集群管理器和作业调度系统,被世界范围内的超级计算机和计算集群广泛采用。SLURM 维护着一个待处理工作的队列并管理此工作的整体资源利用。它以一种共享或非共享的方式管理可用的计算节点(取决于资源的需求),以供用户执行工作。SLURM 会为任务队列合理地分配资源,并监视作业至其完成。
如今,SLURM 已经成为了很多最强大的超级计算机上使用的领先资源管理器,如天河二号上便使用了 SLURM 资源管理系统。其实天河二号也通用slurm的系统指令,只不过把slurm指令开头的“s"换成了银河的拼音缩写"yh", slurm指令的英文单词简化成首字母, 例如,squeue
和yhq
都是查看作业情况的命令。sinfo
和yhi
都是查看分区的情况。具体见超算HPC3N系统用户手册。
(转载自 可乐(简书): SLURM 资源管理系统)
1.2 slurm系统的资源申请过程的简要说明
使用Slurm系统提交作业和本地计算机使用的区别在于,执行sh脚本以及调用核数都需要参与排队。不论是本地计算机安装的slurm队列系统,还是超算上安装的队列系统,对于普通用户的意义在于在有限资源的情况下,以先到先得的原则将资源分配给多个人进行计算。此外,如果一个任务算完,不需要人为的等到任务算完再执行计算任务,系统可以自动检测之前的任务算完,自动执行计算任务,这样就能充分利用好计算资源一直进行计算。过程示意图如下所示:
另外,指令的输入个人建议使用mobaxterm
(必应搜索官网下载), 文件的传输建议使用winscp
(其实也可以输入简单指令,但是不太好用)。 一些常用的unix指令见HPC3N系统用户手册的附录。mobaxterm鼠标中键可以直接输出路径,可以查看cpu使用率等等,功能很方便,可以多尝试尝试。
对于执行作业的方式,有三种作业运行模式,分别为批处理模式(sbatch), 交互模式(srun), 分配模式(salloc)。具体见引文1。
2 Slurm系统的基础命令
常用的指令如下
(其中(4)系统控制指令scontrol
配合 show jobs jobid
, release jobid
, release jobid
等可实现多种功能)
(jobid为你在整个超算系统的任务队列序号,超算按照jobid从小到大的顺序提供计算资源, 未挂起的任务将会按照jobid的顺序获得计算资源)
常用命令 | slurm系统 | 天河二号系统 |
---|---|---|
(1)提交批处理文件 | sbatch | yhbatch |
(2)执行作业(类似mpirun) | srun | yhrun |
(3)查看队列状态 | squeue | yhq |
(4)系统控制 | scontrol | yhcotnrol |
(5)取消作业 | scancel | yhcancel |
(6) 查看节点与分区状态 | sinfo | yhi |
注: 查看用户使用权限命令: yhacctmgr list association
2.1 shell脚本文件与批处理文件的提交
用sbatch提交作业首先要申请资源,申请多少资源(节点数,输入输出等等)需要进行说明,有两种说明方法(以提交的shell脚本为task.sh为例,提交前建议给该文件777权限):
个人目前使用情况(未在shell脚本中说明, 使用1个节点32个核,gjf计算文件/vasp计算文件夹内执行):
(gaussian 16 : sbatch -c32 -pTH_LONG3N g16.sh)
(VASP : sbatch -N 1 -n 32 -p TH_LONG3N vasp.sh)
(1) 不在脚本中声明,在在终端中进行声明,如:
①shell脚本的内容如下:
#!/bin/bash
#<1.source 环境变量>
# 天河二号和非sbatch提交的脚本会自动source ~/.bashrc,因此此步可以忽略
# 本地计算机使用sbatch命令提交shell脚本,由于是在由于是在nonloginshell环境里运行,而非interactive loginshell,并不会自动source ~/.bashrc 的环境变量,因此有两种解决方案
解决方案1: 此处加上source ~/.bashrc
解决方案2: 此处按顺序export 和source所有所需的变量。
# <2.执行运行软件>
# 高斯执行方式1(gjf文件同目录下直接执行): g16 < test.gjf > test.out
# 高斯执行方式2(同目录下,srun): srun -c 32 -p TH_LONG3N g16 < test.gjf > test.out
# VASP执行方式1(文件夹内, srun,老超算): srun -p TH_NEW1 -N 1 -n 12 vasp软件路径
# VASP执行方式2(文件夹内, srun,新超算): srun -p LONG_3N -N 1 -n 32 vasp软件路径
②终端提交命令如下:
cd task.sh的文件路径 #mobaxterm可以中键锁定路径,不用手动输入了
sbatch -p TH_LONG3N -N 1 -n 1 -c 32 task.sh #也可以winscp打开文件所在位置,shift+ctrl+T, 然后输入命令。这样可以不需要cd命令。
(2) 在shell脚本文件开头进行声明,在终端直接提交:
注释行并非没用, 第一行#!是说明用什么语言,比如bash语言,删了就不能正常运行。
#SBATCH其实是能正常读取的。具体说明见北大超算sbatch 常用参数。2
#!/bin/bash
#SBATCH -p TH_LONG3N #可以用sinfo查看分区,老超算为TH_NEW1,新超算为TH_LONG3N,超算中debug3N分区不用参与大循环,但是运行时间上线为半小时。
#SBATCH -N 1 #使用1个节点
#SBATCH -n 1 #1个进程
#SBATCH -c 32 #每个任务所需要的核心数为32个核(clusters)。老超算则为12个核
#<1.source 环境变量>
# 天河二号和非sbatch提交的脚本会自动source ~/.bashrc,因此此步可以忽略
# 本地计算机使用sbatch命令提交shell脚本,由于是在由于是在nonloginshell环境里运行,而非interactive loginshell,并不会自动source ~/.bashrc 的环境变量,因此有两种解决方案
解决方案1: 此处加上 source ~/.bashrc
解决方案2: 此处按顺序 export 和 source 所有所需的变量。
# <2.执行运行软件>
# 高斯执行方式1(gjf文件同目录下直接执行): g16 < test.gjf > test.out
# 高斯执行方式2(同目录下,srun): srun -c 32 -p TH_LONG3N g16 < test.gjf > test.out
# VASP执行方式1(文件夹内, srun,老超算): srun -p TH_NEW1 -N 1 -n 12 vasp软件路径
# VASP执行方式2(文件夹内, srun,新超算): srun -p LONG_3N -N 1 -n 32 vasp软件路径
②终端提交命令如下:
cd task.sh的文件路径 #mobaxterm可以中键锁定路径,不用手动输入了
sbatch task.sh #因为已经在sh文件中声明了,所以此处就不需要-N -n了
3 个人编辑的功能小脚本
复制其中一行到超算里,并回车即可进行统计。(Momol,2021/09/07,命令适用于天河超算)
squeue | awk '$5 ~ /R/ {print $7}' | awk '{sum+=$1}END{print sum}' #R 运行节点总数 (mhk2021)
squeue | awk '$5 ~ /PD/ {print $7}' | awk '{sum+=$1}END{print sum}' #PD 排队节点总数 (mhk2021)
squeue | awk '{print $7}' | awk '{sum+=$1}END{print sum}' #R+PD 节点总数 (mhk2021)
命令原理解释:“|”为管道符号,输出信息到后者
(1)显示运行节点总数
squeue | awk ‘$5 ~ /R/ {print $7}’ | awk ‘{sum+=$1}END{print sum}’
#查找yhq输出信息包含"R"的行,并输出第7列,然后求和输出
(2)显示排队节点总数
squeue| awk ‘$5 ~ /PD/ {print $7}’ | awk ‘{sum+=$1}END{print sum}’
查找yhq输出信息包含"PD"的行,并输出第7列,然后求和输出
(3)运行+排队节点总数
squeue | awk ‘{print $7}’ | awk ‘{sum+=$1}END{print sum}’ #运行+排队节点总数(mhk2021)
查找yhq信息,输出第7列,然后求和输出
awk语法参考网址: Linux awk 命令
SLURM 资源管理系统(自可乐,简书) ↩︎
北京大学超算中心使用手册 (排版比较好) ↩︎