当前位置: 首页 > 工具软件 > SLURM > 使用案例 >

Slurm安装和常用操作

呼延弘方
2023-12-01

源码安装

下载最新的slurm源码包
munge安装

#安装rpm-build软件,以提供rpmbuild命令
yum install rpm-build -y
# 安装时提示缺一堆软件包,一一安装就好,centos下都可以解决,在ubuntu下却找不到相同的包,导致无法使用rpm安装,如果安装完。不管成功失败在本地会生成一个rpmbuild目录
# 1.创建用户名并设置密码
groupadd -g 1109 slurm
useradd -m -c "Slurm manager" -d /var/lib/slurm -u 1109 -g slurm -s /bin/bash slurm
# vim /etc/passwd 检查一下
slurm:x:1109:1109:SLURM workload manager:/var/lib/slurm:/bin/bash

# 2.安装依赖
yum install gcc gcc-c++ readline-devel perl-ExtUtils-MakeMaker pam-devel rpm-build mysql-devel perl-Switch.noarch -y

# 3.打包rpm,如果报错实在解决不了,就到一个能编译的机器编译好后把rpmbuild拿过来install
sudo rpmbuild -ta slurm*.tar.bz2

#4.安装,sudo rpm --install <the rpm files>
sudo rpm --install rpmbuild/RPMS/x86_64/slurm-*.rpm

apt安装

不要用apt install slurm 那是另一个工具
ubuntu下可以安装,具体安装没试

配置

slurm配置文件

#/etc/slurm/slurm.conf
ClusterName=Test
ControlMachine=host_name # 网络名
ControlAddr=local_ip #可以是内网地址
#
SlurmUser=slurm
SlurmctldPort=6817
SlurmdPort=6818
AuthType=auth/munge
StateSaveLocation=/opt/slurm/ctld
SlurmdSpoolDir=/var/spool/slurm/d
SwitchType=switch/none
MpiDefault=none
SlurmctldPidFile=/var/run/slurmctld.pid
SlurmdPidFile=/var/run/slurmd.pid
ProctrackType=proctrack/pgid
ReturnToService=0

SlurmctldTimeout=300
SlurmdTimeout=300
InactiveLimit=0
MinJobAge=300
KillWait=30
Waittime=0

SchedulerType=sched/backfill
#SchedulerAuth=
SelectType=select/cons_tres
SelectTypeParameters=CR_Core

SlurmctldDebug=info
SlurmctldLogFile=/var/log/slurmctld.log
SlurmdDebug=info
SlurmdLogFile=/var/log/slurmd.log
JobCompType=jobcomp/none
# 本机节点
NodeName=host_name Sockets=1 CoresPerSocket=4 ThreadsPerCore=1 RealMemory=128   State=IDLE
PartitionName=debug Nodes=host_name Default=YES MaxTime=INFINITE State=UP

启动

sudo systemctl start slurmctld
sudo systemctl start slurmd
sudo systemctl start munge

常用命令

sbatch

sbatch用于提交作业到作业调度系统中。先编写作业脚本,然后使用sbatch命令提交。提交后脚本将在分配的计算节点中运行。

#!/bin/bash
#SBATCH -o job.%j.out   # 脚本执行的输出将被保存在job.%j.out文件下,%j表示作业号
#SBATCH -p CC   # 作业提交的指定分区为CC
#SBATCH --qos=low       # 指定作业的QOS为low
#SBATCH -J myFirstJob   # 作业在调度系统中的作业名为myFirstJob
#SBATCH --nodes=1       # 申请节点数为1,如果作业不能跨节点(MPI)运行, 申请的节点数应不超过1
#SBATCH --ntasks-per-node=1   # 每个节点上运行一个任务,默认一情况下也可理解为每个节点使用一个核心,如果程序不支持多线程(如openmp),这个数不应该超过1

hostname

将上面代码保存为job.sh

sbatch job.sh

GPU例子,该作业脚本提交后,将申请1个节点,6个核心,1块GPU卡,脚本将在分配到的计算节点上执行nvidia-smi

#!/bin/bash
#SBATCH -o job.%j.out
#SBATCH --partition=GPU
#SBATCH --qos=low
#SBATCH -J JobName
#SBATCH --nodes=1                 # 申请一个节点
#SBATCH --ntasks-per-node=6
#SBATCH --gres=gpu:1              # 每个节点上申请一块GPU卡

nvidia-smi

DCU例子

#!/bin/bash 
#SBATCH -J JobName
#SBATCH -p DCU
#SBATCH -n 8
#SBATCH -N 1
#SBATCH --gres=gpu:0
#SBATCH --gres=dcu:1
#SBATCH --time 240:00:00 
#SBATCH --comment=BASE 
###SBATCH -o std.out.%j
###SBATCH -e std.err.%j
#SBATCH -o /public/home/a/b/c/std.out.%j
#SBATCH -e /public/home/a/b/c/std.err.%j

cmdxxx

MPI
以下作业脚本将申请两个节点,每个节点申请32个核心,随后并行执行vasp作业

#!/bin/bash
#SBATCH -o job.%j.out
#SBATCH --partition=C032M0128G
#SBATCH --qos=low
#SBATCH -J myFirstMPIJob
#SBATCH --nodes=2
#SBATCH --ntasks-per-node=32

# 导入MPI运行环境
module load intel/2017.1

# 导入MPI应用程序
module load vasp/5.4.4-intel-2017.1

# 生成 machinefile
srun hostname -s | sort -n >slurm.hosts

# 执行MPI并行计算程序
mpirun -n 64 -machinefile slurm.hosts vasp_std > log

常用参数

--help    # 显示帮助信息;
-A <account>    # 指定计费账户;
-D, --chdir=<directory>      # 指定工作目录;
--get-user-env    # 获取当前的环境变量;
--gres=<list>    # 使用gpu这类资源,如申请两块gpu则--gres=gpu:2
-J, --job-name=<jobname>    # 指定该作业的作业名;
--mail-type=<type>    # 指定状态发生时,发送邮件通知,有效种类为(NONE, BEGIN, END, FAIL, REQUEUE, ALL);
--mail-user=<user>    # 发送给指定邮箱;
-n, --ntasks=<number>    # sbatch并不会执行任务,当需要申请相应的资源来运行脚本,默认情况下一个任务一个核心,--cpus-per-task参数可以修改该默认值;
-c, --cpus-per-task=<ncpus>      # 每个任务所需要的核心数,默认为1;
--ntasks-per-node=<ntasks>    # 每个节点的任务数,--ntasks参数的优先级高于该参数,如果使用--ntasks这个参数,那么将会变为每个节点最多运行的任务数;
-o, --output=<filename pattern>    # 输出文件,作业脚本中的输出将会输出到该文件;
-p, --partition=<partition_names>    # 将作业提交到对应分区;
-q, --qos=<qos>    # 指定QOS;
-t, --time=<time>    # 允许作业运行的最大时间,目前未名一号和生科一号为5天,教学一号为两天;
-w, --nodelist=<node name list>  # 指定申请的节点;
-x, --exclude=<node name list>   # 排除指定的节点;

scancel

用于取消已经提交的作业

# 取消作业ID为123的作业
scancel 123
# 取消当前上机上号上所有的作业,注意whoami前后不是单引号
scancel -u `whoami`
# 取消当前用户下所有状态为PENDING的作业
scancel -t PENDING -u `whoami`

常用参数

--help                # 显示scancel命令的使用帮助信息;
-A <account>        # 取消指定账户的作业,如果没有指定job_id,将取消所有;
-n <job_name>        # 取消指定作业名的作业;
-p <partition_name> # 取消指定分区的作业;
-q <qos>            # 取消指定qos的作业;
-t <job_state_name> # 取消指定作态的作业,"PENDING", "RUNNING" 或 "SUSPENDED";
-u <user_name>        # 取消指定用户下的作业;

squeue

查看作业队列信息

# 查看自己提交的作业
squeue -u `whoami`
# 按照一定格式显示自己的作业信息
squeue -o "%.18i %.9P %.12j %.12u %.12T %.12M %.16l %.6D %R" -u $USER
# 上面命令长,可以建个alias
echo "alias sq='squeue -o \"%.18i %.9P %.12j %.12u %.12T %.12M %.16l %.6D %R\" -u $USER'" >> ~/.bashrc

常用参数

--help    # 显示squeue命令的使用帮助信息;
-A <account_list>    # 显示指定账户下所有用户的作业,如果是多个账户的话用逗号隔开;
-i <seconds>     # 每隔相应的秒数,对输出的作业信息进行刷新
-j <job_id_list> # 显示指定作业号的作业信息,如果是多个作业号的话用逗号隔开;
-n <name_list>     # 显示指定节点上的作业信息,如果指定多个节点的话用逗号隔开;
-t <state_list>     # 显示指定状态的作业信息,如果指定多个状态的话用逗号隔开;
-u <user_list>     # 显示指定用户的作业信息,如果是多个用户的话用逗号隔开;
-w <hostlist>     # 显示指定节点上运行的作业,如果是多个节点的话用逗号隔开;

指定格式

-o <output_format>    显示指定的输出信息,指定的方式为%[[.]size]type,size表示输出项的显示长度,type为需要显示的信息。可以指定显示的常见信息如下;
%a 账户信息
%C 核心数
%D 节点数
%i 作业ID
%j 作业名
%l 作业时限
%P 分区
%q 优先级
%R 状态PD作业显示原因,状态R的作业显示节点
%T 状态
%u 用户
%M 已运行时间
# 例:squeue -o “%.18i %.9P %.12j %.12u %.12T %.12M %.16l %.6D %R”

sinfo

# 查看集群分区状态
sinfo
# 查看指定分区的状态
sinfo -p queue1,queue2

常用参数

--help    # 显示sinfo命令的使用帮助信息;
-d        # 查看集群中没有响应的节点;
-i <seconds>    # 每隔相应的秒数,对输出的分区节点信息进行刷新
-n <name_list>    # 显示指定节点的信息,如果指定多个节点的话用逗号隔开;
-N    # 按每个节点一行的格式来显示信息;
-p  # <partition> 显示指定分区的信息,如果指定多个分区的话用逗号隔开;
-r    # 只显示响应的节点;
-R    # 显示节点不正常工作的原因;

指定格式

-o #<output_format>    显示指定的输出信息,指定的方式为%[[.]size]type,“.”表示右对齐,不加的话表示左对齐;size表示输出项的显示长度;type为需要显示的信息。可以指定显示的常见信息如下:
%a 是否可用状态
%A 以"allocated/idle"的格式来显示节点数,不要和"%t" or "%T"一起使用
%c 节点的核心数
%C “allocated/idle/other/total”格式显示核心总数
%D 节点总数
%E 节点不可用的原因
%m 每个节点的内存大小(单位为M)
%N 节点名
%O CPU负载
%P 分区名,作业默认分区带“*”
%r 只有root可以提交作业(yes/no)
%R 分区名
%t 节点状态(紧凑形式)
%T 节点的状态(扩展形式)
例:sinfo -o "%.15P %.5a %.10l %.6D %.6t %N"

salloc

先占用资源,然后再运行或者调式作业

# 申请单节点,跳转到节点上运行程序
salloc -p C032M0128G -N1 -n6 -q low -t 2:00:00
# salloc 申请成功后会返回申请到的节点和作业ID等信息,假设申请到的是a4u03n07节点,作业ID为1078858
ssh a4u03n07      # 直接登录到刚刚申请到的节点a4u03n07调式作业
scancel 1078858   # 计算资源使用完后取消作业
squeue -j 1078858 # 查看作业是否还在运行,确保作业已经退出

# 申请GPU节点,并跳转到GPU节点上运行程序
salloc -p GPU -N1 -n6 --gres=gpu:1 -q low -t 24:00:00
# 假设申请成功后返回的作业号为1078858,申请到的节点是gpu05
ssh gpu05 # 登录到gpu05上调式作业
scancel 1078858  # 计算结束后结束任务
squeue -j 1078858 # 确保作业已经退出

# 申请多节点,运行MPI程序
salloc -p C032M0128G -N2 --ntasks-per-node=12 -q low -t 2:00:00
# salloc 申请成功后会返回申请到的节点和作业ID等信息,假设申请到的是a8u03n[05-06]节点,作业ID为1078858
# 这里申请两个节点,每个节点12个进程,每个进程一个核心

# 根据需求导入MPI环境
module load intel/2018.0

# 根据以下命令生成MPI需要的machine file
srun hostname -s | sort -n > slurm.hosts

# 跳转到申请到的头节点(第一个节点),如a8u03n05
ssh a8u03n05

# 导入计算环境并执行程序
module load intel/2018.0
mpirun -np 24 -machinefile slurm.hosts hostname

# 当运行调试完程序后切记使用scancel释放资源,并执行squeue -j xxx可查看作业时候还在运行,避免占用资源却未运行作业造成意料之外的收费
scancel 1078858

常用参数

--help                # 显示帮助信息;
-A <account>          # 指定计费账户;
-D, --chdir=<directory>        # 指定工作目录;
--get-user-env          # 获取当前的环境变量;
--gres=<list>          # 使用gpu这类资源,如申请两块gpu则--gres=gpu:2
-J, --job-name=<jobname>  # 指定该作业的作业名;
--mail-type=<type>      # 指定状态发生时,发送邮件通知,有效种类为(NONE, BEGIN, END, FAIL, REQUEUE, ALL);
--mail-user=<user>      # 发送给指定邮箱;
-n, --ntasks=<number>      # sbatch并不会执行任务,当需要申请相应的资源来运行脚本,默认情况下一个任务一个核心,--cpus-per-task参数可以修改该默认值;
-c, --cpus-per-task=<ncpus>      # 每个任务所需要的核心数,默认为1;
--ntasks-per-node=<ntasks>      # 每个节点的任务数,--ntasks参数的优先级高于该参数,如果使用--ntasks这个参数,那么将会变为每个节点最多运行的任务数;
-o, --output=<filename pattern>    # 输出文件,作业脚本中的输出将会输出到该文件;
-p, --partition=<partition_names>    # 将作业提交到对应分区;
-q, --qos=<qos>        # 指定QOS;
-t, --time=<time>    # 设置限定时间;
-w, --nodelist=<node name list>  # 指定申请的节点;
-x, --exclude=<node name list>   # 排除指定的节点;

scontrol

# 查看机器信息
scontrol show slurm reports
# 查询仍在运行的作业详细信息
scontrol show job 7454119

sacct 详细

# 查询已经结束作业的相关信息
sacct -j 7454119
# 指定输出格式
format=jobid,jobname,partition,nodelist,alloccpus,state,end
sacct --format=$format -j 7454119

其他

# 调试
sudo slurmctld -vvvvDDDD

参考

https://slurm.schedmd.com
https://www.dazhuanlan.com/2019/10/18/5da8cbd357c21/
https://blog.csdn.net/kongxx/article/details/48173829/
https://www.cnblogs.com/liu-shaobo/p/13285839.html
http://hpc.pku.edu.cn/_book/

 类似资料: