本文介绍如何在高性能计算GPU实例上搭建Slurm计算集群。
Slurm(Simple Linux Utility for Resource Management)是一个开源、容错和高度可扩展的集群管理和作业调度系统,适用于大型和小型Linux集群。Slurm的运行不需要内核修改,并且相对独立。作为集群工作负载管理器,Slurm具有以下三个关键功能:
在一段时间内为用户分配对资源(计算节点)的独占或非独占访问,以便资源可以执行工作。
为在分配的节点集上启动、执行和监控工作(通常是并行工作)提供框架。
通过管理待处理工作队列来仲裁资源争用。
架构图来源于:Slurm官方网站。
控制进程slurmctld :资源管理系统的中枢服务,负责资源状态维护、资源分配、作业调度、作业管理控制等。
节点监控进程slurmd:运行在每个计算节点上,负责收集节点上的资源状态并向控制进程报告,slurmd接收来自控制进程与用户命令的请求,进行作业步任务加载、作业取消等操作。
slurmdbd:命令工具与控制进程访问数据库的中间层。它提供访问数据与关联信息的统一接口,并起到用户认证与安全隔离的作用。
Client commands用户命令包含 :
sbatch:提交单节点和多节点 slurm任务。
srun:运行作业。
scancel:终止排队中或运行中的作业。
sinfo:查看系统状态。
squeue:查看作业状态。
sacct:查看运行中或结束了的作业及作业簿信息等命令。
scontrol:作为管理工具,可以监控、修改集群的配置和状态信息等。
sacctmgr:用于管理数据库,可认证集群、有效用户、有效记账账户等。
准备3台高性能GPU云服务器实例分别作为管理节点和计算节点,均需进行如下操作,假设各节点配置信息如下:
操作系统:CentOS 7.8
实例规格:4vCPU,16G内存,300G数据盘
数据库规格:MySQL,2vCPU,4G内存,100G数据盘
计算节点1:C1,192.168.0.32
计算节点2:C2,192.168.0.159
管理节点:M1,192.168.0.65
请分别在3个节点执行以下命令,设置主机名:
hostnamectl set-hostname m1 hostnamectl set-hostname c1 hostnamectl set-hostname c2
删除已安装的slurm。如果您之前未安装slurm,请跳过本步骤。
删除数据库。
yum remove mariadb-server mariadb-devel -y
移除Slurm和Munge。
yum remove slurm munge munge-libs munge-devel -y
删除用户和相应的文件夹。
userdel -r slurm suerdel -r munge
关闭防火墙。
systemctl stop firewalld systemctl disable firewalld systemctl stop iptables systemctl disable iptables
修改资源限制。
执行以下命令打开文件。
vim /etc/security/limits.conf
在End of file下方添加如下内容,如下图所示。
- nofile 655360 - nproc 655350
配置时区,同步集群时钟。
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
安装配置NTP服务器。
安装NTP服务器。
yum install ntp -y systemctl enable ntpd.service ntpdate pool.ntp.org systemctl start ntpd
同步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
在控制节点M1安装配置NFS。
安装NFS。
yum -y install nfs-utils rpcbind
创建 exports 文件。
执行以下命令创建并打开文件。
vim /etc/exports
添加如下内容。
/software/ *(rw,async,insecure,no_root_squash)
启动NFS。
systemctl start nfs systemctl start rpcbind systemctl enable nfs systemctl enable rpcbind
查看NFS状态。
systemctl status nfs
回显如下,表示安装成功。
编辑本地静态解析。
执行以下命令打开本地hosts文件。
vi /etc/hosts
将下列内容写入到文件中,IP地址与主机名请根据实际情况替换。
192.168.0.253 m1 192.168.0.65 c1 192.168.0.191 c2
免密认证。
生成密钥。
ssh-keygen
根据提示连续按enter键后,回显如下:
复制密钥到C1、C2计算节点。
ssh-copy-id -i .ssh/id_rsa.pub c1 ssh-copy-id -i .ssh/id_rsa.pub c2
过程中请输入计算节点登录密码。
重新登录计算节点,确认无需输入密码,表示免密认证成功。
ssh root@c1 ssh root@c2
Slurm和Munge要求集群中每个节点的UID和GID一致,请登录各节点,完成munge的安装。
创建全局用户。
export MUNGEUSER=991 groupadd -g $MUNGEUSER munge useradd -m -c "MUNGE Uid 'N' Gid Emporium" -d /var/lib/munge -u $MUNGEUSER -g munge -s /sbin/nologin munge
安装Munge。
安装装epel库。
yum install epel-release
安装munge。
yum install munge munge-libs munge-devel -y
安装rng工具。
yum install rng-tools -y rngd -r /dev/urandom rngd -r /dev/urandomscp /etc/munge/munge.key root@c1:/etc/munge rngd -r /dev/urandomscp /etc/munge/munge.key root@c2:/etc/munge
在控制节点M1上新建密钥并设置权限。
/usr/sbin/create-munge-key -r dd if=/dev/urandom bs=1 count=1024 > /etc/munge/munge.key chown munge: /etc/munge/munge.key chmod 400 /etc/munge/munge.key
将生成的密钥发送到计算节点C1和C2。
scp /etc/munge/munge.key root@c1:/etc/munge scp /etc/munge/munge.key root@c2:/etc/munge
输入yes后,输入计算节点密码可以看到密钥发送成功,如下图所示。
在管理节点M1和计算节点C1、C2中修改权限。
chown -R munge: /etc/munge/ /var/log/munge/ chmod 0700 /etc/munge/ /var/log/munge/ systemctl enable munge systemctl restart munge
检查munge状态。
systemctl restart munge systemctl status munge
在管理节点M1上执行以下命令,验证munge是否安装成功以及管理节点与各计算节点的连通性。
munge -n munge -n | unmunge munge -n | ssh c1 unmunge munge -n | ssh c2 unmunge
回显如下,表示安装成功。
请登录各节点,完成slurm的安装。
创建slurm用户。
groupadd -g 1109 slurm useradd -m -c "Slurm manager" -d /var/lib/slurm -u 1109 -g slurm -s /bin/bash slurm
安装依赖项。
yum install openssl openssl-devel pam-devel numactl numactl-devel hwloc hwloc-devel lua lua-devel readline-devel rrdtool-devel ncurses-devel man2html libibmad libibumad -y yum install gcc gcc-c++ readline-devel perl-ExtUtils-MakeMaker pam-devel rpm-build mysql-devel -y
下载安装slurm。
安装slurm。
wget https://download.schedmd.com/slurm/slurm-20.02.7.tar.bz2
安装rpmbuild编译Slurm,并制作rpm包。
yum install rpm-build rpmbuild -ta slurm-20.02.7.tar.bz2
进入rpm包目录下,安装Slurm。
cd /root/rpmbuild/RPMS/x86_64 yum localinstall slurm-*
登录管理节点M1,创建相关文件。
mkdir /var/spool/slurmctld chown slurm: /var/spool/slurmctld chmod 755 /var/spool/slurmctld touch /var/log/slurmctld.log chown slurm: /var/log/slurmctld.log touch /var/log/slurm_jobacct.log /var/log/slurm_jobcomp.log chown slurm: /var/log/slurm_jobacct.log /var/log/slurm_jobcomp.log mkdir /var/spool/slurm chown slurm:slurm /var/spool/slurm chmod 755 /var/spool/slurm mkdir -p /var/spool/slurm/cluster_state chown slurm:slurm /var/spool/slurm/cluster_state
编辑管理节点配置文件。
输入以下内容。vi /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=test ControlMachine=m1 ControlAddr=192.168.0.65 #管理节点IP #BackupController= #BackupAddr= # SlurmUser=slurm #SlurmdUser=root SlurmctldPort=6817 SlurmdPort=6818 AuthType=auth/munge #JobCredentialPrivateKey= #JobCredentialPublicCertificate= StateSaveLocation=/var/spool/slurmctld 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/slurmctld.log SlurmdDebug=info SlurmdLogFile=/var/log/slurmd.log JobCompType=jobcomp/none #JobCompLoc= # # ACCOUNTING JobAcctGatherType=jobacct_gather/linux #JobAcctGatherFrequency=30 # AccountingStorageType=accounting_storage/slurmdbd #AccountingStorageHost= #AccountingStorageLoc= #AccountingStoragePass= #AccountingStorageUser= # # COMPUTE NODES NodeName=c[1-2] Procs=1 State=UNKNOWN PartitionName=debug Nodes=ALL Default=YES MaxTime=INFINITE State=UP
将编辑完成的配置文件发送至计算节点C1和C2。
scp /etc/slurm/slurm.conf root@c1:/etc/slurm/ scp /etc/slurm/slurm.conf root@c2:/etc/slurm/
登录火山引擎控制台配置RDS服务。
创建实例,选择5.7版本,注意RDS实例需与HPC实例属于同个地域、可用区和私有网络。
将管理节点M1的IP加入RDS实例的白名单。如下图所示,选择“数据安全”页签,单击“修改”按钮,添加M1 IP后,单击“确定”按钮。
创建名称为slurm_acct_db的数据库,用于Slurmctld通过Slurmdbd读取数据库。如下图所示,选择“数据库管理”页签,单击“创建数据库”按钮,输入数据库名称、选择字符集后,单击“确定”按钮。
配置slurmdbd.conf文件。
创建systemd文件。
cp /usr/lib/systemd/system/slurmctld.service /usr/lib/systemd/system/slurmd.service /usr/lib/systemd/system/slurmdbd.service /etc/systemd/system/ cat /etc/systemd/system/slurmctld.service
配置slurmdbd.conf文件。
cp /etc/slurm/slurmdbd.conf.example /etc/slurm/slurmdbd.conf chown slurm: /etc/slurm/slurmdbd.conf chmod 600 /etc/slurm/slurmdbd.conf mkdir /var/log/slurm/ touch /var/log/slurm/slurmdbd.log chown slurm: /var/log/slurm/slurmdbd.log vi /etc/slurm/slurmdbd.conf
在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=localhost DbdHost=localhost 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=mysql3dd7de4bfd19.rds.ivolces.com #数据库实例内网地址 StoragePort=3306 #内网端口 StoragePass=AihymTs4X*7z*QGp #数据库实例密码 StorageUser=zxd-slurm #账号名称 StorageLoc=slurm_acct_db #数据库名称
启动SlurmDBD服务。
systemctl enable slurmdbd systemctl start slurmdbd systemctl status slurmdbd
开启slurmctl服务。
systemctl enable slurmctld.service systemctl start slurmctld.service systemctl status slurmctld.service
在计算节点C1、C2分别创建/etc/slurm/文件夹。
mkdir /var/spool/slurmd chown slurm: /var/spool/slurmd chmod 755 /var/spool/slurmd touch /var/log/slurmd.log chown slurm: /var/log/slurmd.log
在计算节点C1、C2分别启动slurm服务。
mkdir /var/spool/slurm mkdir /var/spool/slurm/d systemctl start slurmd.service systemctl status slurmd.service systemctl enable slurmd.service
显示所有Compute Nodes。
scontrol show nodes
如果Compute Nodes的State=DOWN
,执行如下命令,将状态变成IDLE
:
scontrol update nodename=cas01 state=resume
编辑测试脚本。
vim "day 1".sh
将下列内容粘贴到文件中并保存退出
#!/bin/bash sleep 30 echo "always day 1 $(hostname)"
在计算节点C1和C2执行如下命令。
cat slurm-X.out
在管理节点M1执行测试脚本。
sbatch "day 1".sh squeue
管理节点和测试节点回显分别如下,表示集群部署成功。
回显如下,表示集群部署成功。
您可以登录Slurm官方网站查看基础操作命令。