Slurm介绍

Slurm是一种开源的,用于高性能计算集群管理系统的软件。它能够有效地管理计算资源的分配和任务调度,支持Linux等操作系统,是HPC领域中最受欢迎的调度器之一。Slurm具有高可用性和可扩展性,易于使用,提供了丰富的命令行界面和API,可以为科学研究和工程计算等领域提供高效的支持。

Slurm安装

为了方便演示在此我们采用的是虚拟机进行Slurm的部署操作演示,故每个虚拟机的分配资源都是一样的,在实际使用中控制节点和计算节点应该是有所区别的。

操作系统:Centos 7.9

节点介绍:

  • 控制节点(master:192.168.128.130,分配资源:2个CPU,每个CPU4个核心;内存2048MB)

  • 计算节点1(work1:192.168.128.131,分配资源:2个CPU,每个CPU4个核心;内存2048MB)

  • 计算节点2(work2:192.168.128.132,分配资源:2个CPU,每个CPU4个核心;内存2048MB)

Python版本Python3.8.6

Mysql版本:5.7.26

Slurm版本:20.11.9

网卡配置过程

将所有节点的IP地址设置为静态IP。

修改配置文件/etc/sysconfig/network-scripts/ifcfg-ens33

vim /etc/sysconfig/network-scripts/ifcfg-ens33

修改为以下内容,注意网卡信息不要修改:

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
NM_CONTROLLED=yes
BOOTPROTO=static

IPADDR=192.168.128.130
NETMASK=255.255.255.0
GATEWAY=192.168.128.2
DNS1=192.168.128.2

DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=d7c045a6-f74a-4ef2-9738-17d109179541  # 网卡信息,不要随便改
DEVICE=ens33
ONBOOT=yes

以上为控制节点配置文件,计算节点同理,在此不再赘述。

分别在三个节点中设置主机名

vim /etc/hosts
192.168.128.130 master
192.168.128.131 work1
192.168.128.132 work2

image-hpky.png

给各个节点设置hostname

hostnamectl set-hostname master  # 在控制节点中运行
hostnamectl set-hostname work1  # 在work1计算节点中运行
hostnamectl set-hostname work2  # 在work2计算节点中运行

关闭防火墙

systemctl status firewalld  # 查看防火墙状态
systemctl stop firewalld  # 关闭防火墙
systemctl disable firewalld  # 永久关闭防火墙

关闭Selinux

查看Selinux状态

getenforce

临时关闭,该方法重启服务器后又会恢复为Enforcing

setenforce 0

永久关闭Selinux,进入/etc/selinux/config然后将Selinux的值设置为disabled

vim /etc/selinux/config

配置SSH免密登录

安装ssh服务

yum install openssl openssh-server -y

配置ssh服务

vim /etc/ssh/sshd_config
  • 设置PermitRootLogin=yes

  • 设置PasswordAuthentication=yes

  • 设置PubkeyAuthentication=yes

生成密钥对

ssh-keygen -t rsa  # 连续3次回车

输入该代码后在/root/.ssh文件夹下会生成一系列的公钥和私钥。

将导入公钥id_rsa.pub导出,然后导入到其他计算节点中。

在每个计算节点中运行以下代码,将公钥导入到所有计算节点。

cat id_rsa.pub >> ~/.ssh/authorized_keys

验证ssh是否可以免登录。

ssh work1

免登录成功。

配置时区

配置CST时区

ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

同步NTP服务器

yum install ntp -y
systemctl start ntpd
systemctl enable ntpd

安装EPEL源

yum install http://mirrors.sohu.com/fedora-epel/epel-release-latest-7.noarch.rpm

配置NFS服务

控制节点配置

安装

yum install nfs-utils rpcbind -y

自启动服务

systemctl enable rpcbind
systemctl enable nfs-server
systemctl enable nfs-lock
systemctl enable nfs-idmap

启动服务

systemctl start rpcbind
systemctl start nfs-server
systemctl start nfs-lock
systemctl start nfs-idmap

配置共享目录

vim /etc/exports

添加以下内容

/share 192.168.128.0/24(rw,sync,no_root_squash)

使其生效

exportfs -a

计算节点配置

安装

yum install nfs-utils -y

检查控制节点共享目录

showmount -e 192.168.128.130

创建共享目录

mkdir /share

配置NFS开机自动挂载

vim /etc/rc.local

添加以下内容

mount -t nfs 192.168.128.130:/share /share

手动临时挂载

mount -t nfs 192.168.128.130:/share /share

验证

这个时候在控制节点的/share目录中创建一个文件夹,看看在计算节点中是否同步。

在计算节点中进行查看。

在计算节点中也存在。

将需要用到的压缩包使用FTP或者SFTP传输到共享目录。

配置NIS服务

控制节点配置

安装

yum install ypserv ypbind yp-tools rpcbind -y

添加NIS域名

vim /etc/rc.local
# 添加可执行权限
chmod +x /etc/rc.local

添加以下内容

nisdomainname nisdomain

然后执行以下代码使其生效。

nisdomainname nisdomain

创建域用户

useradd -s /bin/bash nisuser

设置密码

passwd nisuser

创建用户组

groupadd nisgroup

将用户添加到组中

usermod -G nisgroup nisuser

配置NIS客户端权限

vim /etc/ypserv.conf

添加以下内容:

192.168.128.0/24:*:*:none

初始化NIS数据库以及启动NIS服务

自启动NIS服务

systemctl enable rpcbind
systemctl enable yppasswdd
systemctl enable ypserv

启动NIS服务

systemctl start rpcbind
systemctl start yppasswdd
systemctl start ypserv

初始化NIS数据库

/usr/lib64/yp/ypinit -m

依次输入work1按回车,work2按回车,直到将所有的计算节点添加完毕后按Ctrl + D结束添加,然后输入y完成初始化。

每次修改用户后,更新数据库

make -C /var/yp

初始化数据库后重启服务

systemctl restart rpcbind
systemctl restart yppasswdd
systemctl restart ypserv

检查服务是否启动

rpcinfo -p localhost

计算节点配置

安装客户端

yum install ypbind yp-tools rpcbind -y

添加NIS域

在网络中添加NIS域,使用authconfig-tui配置客户端。

authconfig-tui

用户信息选择使用NIS,认证选择使用shadow密码本地授权即可,然后按F12进入下一页。

接下来在域和服务器中分别输入以下内容:

域:nisdomain

服务器:192.168.128.130

然后按F12保存即可。

添加自启动

systemctl enable rpcbind
systemctl enable ypbind

启动服务

systemctl start rpcbind
systemctl start ypbind

验证

在计算节点中输入以下内容:

yptest

返回以下内容说明安装成功。

安装munge认证服务

控制节点配置

首先要确保控制节点以前没有安装过munge,如果安装过需要使用以下命令将之前的mungemunge用户删除。

yum remove munge munge-libs munge devel -y
userdel -r munge

创建Munge用户,Munge用户要确保Master NodeCompute NodesUIDGID相同,所有节点都需要安装Munge

export MUNGEUSER=1120
groupadd -g $MUNGEUSER munge 
useradd -m -c "MUNGE Uid 'N' Gid Emporium" -d /var/lib/munge -u $MUNGEUSER -g munge -s /sbin/nologin munge

安装epel-release

yum install -y epel-release

控制节点需要安装以下几个包:

yum install munge munge-devel munge-libs rng-tools -y

为系统新增熵池:

rngd -r /dev/urandom

执行以下命令,创建munge.key文件:

create-munge-key

执行完以后,在/etc/munge/下面会生成munge.key,需修改munge.key的权限以及所属用户,把所属用户改成munge

dd if=/dev/urandom bs=1 count=1024 > /etc/munge/munge.key  #在Master Node创建全局使用的密钥
chown munge: /etc/munge/munge.key 
chmod 400 /etc/munge/munge.key
chown -R munge: /var/lib/munge
chown -R munge: /var/run/munge
chown -R munge: /var/log/munge

munge.key分发给其他的计算节点(需要先在计算节点安装munge依赖包):

scp /etc/munge/munge.key root@work1:/etc/munge/
scp /etc/munge/munge.key root@work2:/etc/munge/

启动munge服务并加入开机自启:

systemctl start munge
systemctl enable munge

计算节点配置

同样,计算节点也要保证没有安装过munge,如果安装过则需要将以前的mungemunge用户删除。

yum remove munge munge-libs munge devel -y
userdel -r munge

删除完之后需要新建munge用户,server端和client端的munge用户UID必须保持一致,因此必须在创建时指定UID,执行如下命令即可。

export MUNGEUSER=1120
groupadd -g $MUNGEUSER munge 
useradd -m -c "MUNGE Uid 'N' Gid Emporium" -d /var/lib/munge -u $MUNGEUSER -g munge -s /sbin/nologin munge

安装epel-release

yum install -y epel-release

计算节点同样需要安装以下几个包。

yum install munge munge-devel munge-libs rng-tools

为系统新增熵池:

rngd -r /dev/urandom

在配置控制节点时已经将munge.key发送到了计算节点,此时在计算节点同样需要修改munge.key文件的所属用户,并修改相关目录权限,修改成munge即可。

chmod 700 /etc/munge
chown -R munge: /etc/munge
chown -R munge: /var/lib/munge
chown -R munge: /var/run/munge
chown -R munge: /var/log/munge

修改完之后即可启动rngdmunge服务,然后加入开机自启。

systemctl start rngd
systemctl start munge
systemctl enable rngd
systemctl enable munge

验证

在控制节点中输入以下代码:

munge -n|unmunge

返回图示内容,说明控制节点中munge服务安装成功。

接着输入再输入以下代码:

munge -n|ssh work1 unmunge

返回图示内容说明work1计算节点中munge服务安装成功。

同理验证其他计算节点。

安装Python3

此步骤需要在所有节点中均完成安装,以控制节点为例。

安装插件

yum -y groupinstall "Development tools"

预装的依赖

yum -y install zlib zlib-devel
yum -y install bzip2 bzip2-devel
yum -y install ncurses ncurses-devel
yum -y install readline readline-devel
yum -y install openssl openssl-devel
yum -y install openssl-static
yum -y install xz lzma xz-devel
yum -y install sqlite sqlite-devel
yum -y install gdbm gdbm-devel
yum -y install tk tk-devel
yum -y install libffi libffi-devel

解压安装包

cd /share
tar -xvf Python-3.8.6.tar.xz

将解压后的Python目录复制到家目录。

cp -R /share/Python-3.8.6 ~/

安装Python3

cd ~/Python-3.8.6/
./configure --prefix=/usr/soft/python3

等待安装成功后进行编译

make -j 20 && make install

创建软链接

ln -s /usr/soft/python3/bin/python3.8 /usr/bin/python3
ln -s /usr/soft/python3/bin/pip3 /usr/bin/pip3

升级pip

pip3 install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple

验证是否安装成功。

python3 -V

安装Mysql

此过程只需在控制节点中进行安装。

首先删除系统自带的Mariadb

查看系统中是否有maria
rpm -qa|grep maria
yum list installed|grep maria
# 逐条删除展示的结果
yum remove {展示的包名} -y

安装相关依赖

yum install libaio perl-ExtUtils-MakeMaker numactl net-tools -y

解压目录

tar -xvf mysql-5.7.26-1.el7.x86_64.rpm-bundle.tar

开始安装

rpm -ivh mysql-community-common-5.7.26-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.26-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.26-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.26-1.el7.x86_64.rpm
rpm -ivh mysql-community-devel-5.7.26-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-compat-5.7.26-1.el7.x86_64.rpm

启动mysql

systemctl start mysqld.service

查询mysql初始密码

grep "password" /var/log/mysqld.log

使用初始密码进入数据库

mysql -u root -p

降低密码的验证等级

set global validate_password_policy=LOW;

将密码长度设置为6位

set global validate_password_length=6;

修改root密码为123456

ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';

创建Slurm相关数据库

create database slurm_acct_db;
create database slurm_jobcomp_db;

然后创建一个slurm用户拥有所有数据库的所有权限,并且不限制登录。

create user 'slurm'@'%' IDENTIFIED BY '123456';
grant ALL PRIVILEGES on *.* TO 'slurm'@'%';

root用户的访问权限也修改一下

create user 'root'@'%' IDENTIFIED BY '123456';
grant ALL PRIVILEGES on *.* TO 'root'@'%';

安装Slurm服务

所有节点通用配置

创建Slurm用户

export SLURMUSER=1130
groupadd -g $SLURMUSER slurm
useradd -m -c "Slurm manager" -d /var/lib/slurm -u $SLURMUSER -g slurm -s /bin/bash slurm

安装Slurm依赖

yum install gcc gcc-c++ readline-devel perl-ExtUtils-MakeMaker pam-devel rpm-build mysql-devel -y

进入到/share目录,然后安装rpmbuild开始编译Slurm,制作rpm包。

cd /share && yum install rpm-build
rpmbuild -ta --nodeps slurm-20.11.9.tar.bz2

安装生成好的所有rpm

cd /root/rpmbuild/RPMS/x86_64/ && yum localinstall slurm-* && cd

到此,Slurm配置项已经做完,接下来开始修改配置文件并启动控制节点和计算节点的Slurm服务。

控制节点配置

配置slurm.conf文件

复制配置文件,并修改

cp /etc/slurm/cgroup.conf.example /etc/slurm/cgroup.conf
cp /etc/slurm/slurm.conf.example /etc/slurm/slurm.conf
vim /etc/slurm/slurm.conf

修改以下部分内容

完整配置文件如下:

#
# Example slurm.conf file. Please run configurator.html
# (in doc/html) to build a configuration file customized
# for your environment.
#
#
# slurm.conf file generated by configurator.html.
#
# See the slurm.conf man page for more information.
#
ClusterName=linux
ControlMachine=master
#ControlAddr=
#BackupController=
#BackupAddr=
#
SlurmUser=slurm
#SlurmdUser=root
SlurmctldPort=6817
SlurmdPort=6818
AuthType=auth/munge
#JobCredentialPrivateKey=
#JobCredentialPublicCertificate=
StateSaveLocation=/var/spool/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
#PluginDir=
#FirstJobId=
ReturnToService=0
#MaxJobCount=
#PlugStackConfig=
#PropagatePrioProcess=
#PropagateResourceLimits=
#PropagateResourceLimitsExcept=
#Prolog=
#Epilog=
#SrunProlog=
#SrunEpilog=
#TaskProlog=
#TaskEpilog=
#TaskPlugin=
#TrackWCKey=no
#TreeWidth=50
#TmpFS=
#UsePAM=
#
# TIMERS
SlurmctldTimeout=300
SlurmdTimeout=300
InactiveLimit=0
MinJobAge=300
KillWait=30
Waittime=0
#
# SCHEDULING
SchedulerType=sched/backfill
#SchedulerAuth=
SelectType=select/cons_tres
SelectTypeParameters=CR_Core
#PriorityType=priority/multifactor
#PriorityDecayHalfLife=14-0
#PriorityUsageResetPeriod=14-0
#PriorityWeightFairshare=100000
#PriorityWeightAge=1000
#PriorityWeightPartition=10000
#PriorityWeightJobSize=1000
#PriorityMaxAge=1-0
#
# LOGGING
SlurmctldDebug=info
SlurmctldLogFile=/var/log/slurm/slurmctld.log
SlurmdDebug=info
SlurmdLogFile=/var/log/slurm/slurmd.log
JobCompType=jobcomp/none
#JobCompLoc=
#
# ACCOUNTING
#JobAcctGatherType=jobacct_gather/linux
#JobAcctGatherFrequency=30
#
#AccountingStorageType=accounting_storage/slurmdbd
#AccountingStorageHost=
#AccountingStorageLoc=
#AccountingStoragePass=
#AccountingStorageUser=
#
# COMPUTE NODES
NodeName=master CPUs=2 Sockets=1 CoresPerSocket=2 RealMemory=2048 State=UNKNOWN
NodeName=work1,work2 CPUs=2 Sockets=1 CoresPerSocket=2 RealMemory=2048 State=UNKNOWN
PartitionName=control Nodes=master Default=YES MaxTime=INFINITE State=UP
PartitionName=compute Nodes=work[1-2] Default=YES MaxTime=INFINITE State=UP

复制控制节点配置文件到计算节点

scp /etc/slurm/*.conf  root@work1:/etc/slurm/
scp /etc/slurm/*.conf  root@work2:/etc/slurm/

设置控制、计算节点文件权限(所有节点都运行)

#slurmdbd.conf文件为slurmdbd服务的配置文件,所有者必须为slurm用户
touch /etc/slurm/slurmdbd.conf
chown slurm:slurm /etc/slurm/slurmdbd.conf
 
#slurm.conf文件为slurmd、slurmctld的配置文件,所有者必须为root用户
touch /etc/slurm/slurm.conf
chown root:root /etc/slurm/slurm.conf
 
#建立slurmctld服务存储其状态等的目录,由slurm.conf中StateSaveLocation参数定义:
mkdir /var/spool/slurmctld
chown slurm:slurm /var/spool/slurmctld
mkdir /var/spool/slurm
chown slurm: /var/spool/slurm
 
#建立日志文件存储目录,并修改目录权限
mkdir /var/log/slurm
cd /var/log/slurm/
touch slurmd.log
touch slurmctld.log
touch slurmdbd.log
chown slurm:slurm /var/log/slurm

配置slurmdbd.conf文件

cp /etc/slurm/slurmdbd.conf.example /etc/slurm/slurmdbd.conf
vim /etc/slurm/slurmdbd.conf

修改以下内容:

完整配置文件内容如下:

#
# Example slurmdbd.conf file.
#
# See the slurmdbd.conf man page for more information.
#
# Archive info
#ArchiveJobs=yes
#ArchiveDir="/tmp"
#ArchiveSteps=yes
#ArchiveScript=
#JobPurge=12
#StepPurge=1
#
# Authentication info
AuthType=auth/munge
AuthInfo=/var/run/munge/munge.socket.2
#
# slurmDBD info
DbdAddr=192.168.128.130
DbdHost=master
DbdPort=6819
SlurmUser=slurm
#MessageTimeout=300
DebugLevel=verbose
#DefaultQOS=normal,standby
LogFile=/var/log/slurm/slurmdbd.log
PidFile=/var/run/slurmdbd.pid
#PluginDir=/usr/lib/slurm
#PrivateData=accounts,users,usage,jobs
#TrackWCKey=yes
#
# Database info
StorageType=accounting_storage/mysql
StorageHost=master
StoragePort=3306
StoragePass=123456
StorageUser=root
StorageLoc=slurm_acct_db

启动slurmd服务并加入开机自启。(所有节点都运行)

systemctl enable slurmd
systemctl start slurmd

查看slurmd服务状态。

systemctl status slurmd

启动slurmctld服务并加入开机自启。(仅控制节点运行)

systemctl enable slurmctld
systemctl start slurmctld

查看slurmctld服务状态。

systemctl status slurmctld

启动集群

控制节点:

slurmctld -c  && slurmd -c

计算节点:

slurmd -c

检查Slurm集群

查看集群

sinfo

展示分区

scontrol show partition

展示所有已配置节点

修改节点状态

在前面输出的节点信息中可以看到计算节点work[1-2]这两个节点的状态STATEdraindrainSlurm调度系统中控制节点的一种状态,表示该节点暂时处于离线状态,不接受新的任务。)

这个时候往其中去提交任务会导致阻塞,没有可用节点能够运行任务。

采用以下方法将其修改为idea可用状态。

scontrol update NodeName=slave[1-2] State=DOWN Reason=hung_completing
systemctl restart slurm*
scontrol update NodeName=slave[1-2] State=RESUME

提交作业

srun -N2 hostname

查看作业

scontrol show jobs  # 展示所有作业

显示队列中的作业

squeue -a

由于任务已经运行完毕,这里队列中不存在任务。

并且节点都处于可用状态。

GPU集群配置

上述的配置过程,由于节点是虚拟机,也不存在GPU资源需要配置,但是Slurm集群创建出来一定会需要去配置GPU资源的。要想集群能够调用节点的GPU资源还需要补充和修改相关配置文件。

下面给出我在搭建集群的时候的一个例子。

该集群一共有14个节点。其中gpu1-gpu9GPU节点,master1master2cpu1cpu2CPU节点。

一共包含4个配置文件。

  1. cgroup.conf:用于配置SlurmLinux控制组(cgroups)之间的集成。CgroupsLinux内核提供的一种机制,用于限制、控制和监视进程组的资源使用。Slurm使用cgroups来实现对作业和任务的资源管理和限制。

  2. slurmdbd.conf:用于配置Slurm数据库守护进程(slurmdbd)的配置文件。该守护进程负责与数据库交互,将集群中的作业、任务和其他相关数据存储到数据库中,以便进行监视、报告和分析。

  3. slurmd.conf:用于配置Slurm计算节点守护进程(slurmd)的配置文件。该守护进程在计算节点上运行,负责接收来自控制节点的指令并执行作业和任务。

  4. gres.conf:是用于描述和管理通用资源的概念,例如加速器(如GPU、FPGA)、特殊硬件设备或其他用户定义的资源。

以上所有的配置文件都在目录/etc/slurm/下,我自己使用的配置文件如下:

cgroup.conf

###
#
# Slurm cgroup support configuration file
#
# See man slurm.conf and man cgroup.conf for further
# information on cgroup configuration parameters
#--
CgroupAutomount=yes

ConstrainCores=no
ConstrainRAMSpace=no

slurmdbd.conf

#
# Example slurmdbd.conf file.
#
# See the slurmdbd.conf man page for more information.
#
# Archive info
#ArchiveJobs=yes
#ArchiveDir="/tmp"
#ArchiveSteps=yes
#ArchiveScript=
#JobPurge=12
#StepPurge=1
#
# Authentication info
AuthType=auth/munge
AuthInfo=/var/run/munge/munge.socket.2
#
# slurmDBD info
#DbdAddr=192.169.99.110
DbdHost=master1
DbdPort=6819
SlurmUser=slurm
# MessageTimeout=60
DebugLevel=verbose
#DefaultQOS=normal,standby
LogFile=/var/log/slurm/slurmdbd.log
PidFile=/var/run/slurmdbd.pid
#PluginDir=/usr/lib/slurm
#PrivateData=accounts,users,usage,jobs
#TrackWCKey=yes
#
# Database info
StorageType=accounting_storage/mysql
StorageHost=master1
StoragePort=3306
StoragePass=123456
StorageUser=root
StorageLoc=slurm_acct_db

slurm.conf

#
# Example slurm.conf file. Please run configurator.html
# (in doc/html) to build a configuration file customized
# for your environment.
#
#
# slurm.conf file generated by configurator.html.
#
# See the slurm.conf man page for more information.
#
ClusterName=linux
ControlMachine=master1
ControlAddr=192.168.99.110
BackupController=master2
BackupAddr=192.168.99.114
#
SlurmUser=slurm
#SlurmdUser=root
SlurmctldPort=6817
SlurmdPort=6818
AuthType=auth/munge
#JobCredentialPrivateKey=
#JobCredentialPublicCertificate=
StateSaveLocation=/var/spool/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
#PluginDir=
#FirstJobId=
ReturnToService=0
MaxJobCount=3000000
#PlugStackConfig=
#PropagatePrioProcess=
#PropagateResourceLimits=
#PropagateResourceLimitsExcept=
#Prolog=
#Epilog=
#SrunProlog=
#SrunEpilog=
#TaskProlog=
#TaskEpilog=
TaskPlugin=task/affinity,task/cgroup
TaskPluginParam=Sched
#TrackWCKey=no
#TreeWidth=50
#TmpFS=
#UsePAM=
#
# TIMERS
SlurmctldTimeout=300
SlurmdTimeout=300
InactiveLimit=0
MinJobAge=300
KillWait=30
Waittime=0
#
# SCHEDULING
SchedulerType=sched/backfill
#SchedulerAuth=
SelectType=select/cons_tres
SelectTypeParameters=CR_Core_Memory
#PriorityType=priority/multifactor
#PriorityDecayHalfLife=14-0
#PriorityUsageResetPeriod=14-0
#PriorityWeightFairshare=100000
#PriorityWeightAge=1000
#PriorityWeightPartition=10000
#PriorityWeightJobSize=1000
#PriorityMaxAge=1-0
#
# LOGGING
SlurmctldDebug=info
SlurmctldLogFile=/var/log/slurm/slurmctld.log
SlurmdDebug=info
SlurmdLogFile=/var/log/slurm/slurmd.log
#JobCompLoc=
#
# ACCOUNTING
JobCompHost=master1
JobCompPass=123456
JobCompPort=3306
JobCompType=jobcomp/mysql
#JobCompType=jobcomp/filetxt
JobCompUser=root
JobCompLoc=/var/log/slurm/slurm_jobcomp.log

#JobAcctGatherFrequency=30
JobAcctGatherType=jobacct_gather/linux
#
AccountingStorageType=accounting_storage/slurmdbd
#AccountingStorageEnforce=1
AccountingStorageHost=master1
AccountingStoragePort=6819
#AccountingStorageUser=root
#AccountingStoragePass=123456
#AccountingStorageType=accounting_storage/filetxt
#AccountingStorageLoc=/opt/slurm/acct
#AccountingStoreJobComment=YES
#
# COMPUTE NODES
GresTypes=gpu
NodeName=master1 CPUs=80 Boards=1 SocketsPerBoard=2 CoresPerSocket=20 ThreadsPerCore=2 RealMemory=321882 State=UNKNOWN
NodeName=cpu[1-2],master2 CPUs=80 Boards=1 SocketsPerBoard=2 CoresPerSocket=20 ThreadsPerCore=2 RealMemory=280000 State=UNKNOWN
NodeName=gpu1 CPUs=64 Boards=1 SocketsPerBoard=2 CoresPerSocket=16 ThreadsPerCore=2 RealMemory=257377 State=UNKNOWN Gres=gpu:2
NodeName=gpu[2-5] CPUs=104 Boards=1 SocketsPerBoard=2 CoresPerSocket=26 ThreadsPerCore=2 RealMemory=250000 State=UNKNOWN Gres=gpu:2
NodeName=gpu[6-9] CPUs=40 Boards=1 SocketsPerBoard=2 CoresPerSocket=20 ThreadsPerCore=1 RealMemory=250000 State=UNKNOWN Gres=gpu:2

PartitionName=COMPUTE Nodes=master[1-2],cpu[1-2],gpu[1-9] Default=YES MaxTime=INFINITE State=UP

gres.conf

NodeName=gpu1 Name=gpu Type=gpu File=/dev/nvidia0
NodeName=gpu1 Name=gpu Type=gpu File=/dev/nvidia1
NodeName=gpu2 Name=gpu Type=gpu File=/dev/nvidia0
NodeName=gpu2 Name=gpu Type=gpu File=/dev/nvidia1
NodeName=gpu3 Name=gpu Type=gpu File=/dev/nvidia0
NodeName=gpu3 Name=gpu Type=gpu File=/dev/nvidia1
NodeName=gpu4 Name=gpu Type=gpu File=/dev/nvidia0
NodeName=gpu4 Name=gpu Type=gpu File=/dev/nvidia1
NodeName=gpu5 Name=gpu Type=gpu File=/dev/nvidia0
NodeName=gpu5 Name=gpu Type=gpu File=/dev/nvidia1
NodeName=gpu6 Name=gpu Type=gpu File=/dev/nvidia0
NodeName=gpu6 Name=gpu Type=gpu File=/dev/nvidia1
NodeName=gpu7 Name=gpu Type=gpu File=/dev/nvidia0
NodeName=gpu7 Name=gpu Type=gpu File=/dev/nvidia1
NodeName=gpu8 Name=gpu Type=gpu File=/dev/nvidia0
NodeName=gpu8 Name=gpu Type=gpu File=/dev/nvidia1
NodeName=gpu9 Name=gpu Type=gpu File=/dev/nvidia0
NodeName=gpu9 Name=gpu Type=gpu File=/dev/nvidia1