Slurm 스케줄러 설치 및 구성

Slurm 스케줄러 설치 및 구성

작성자 : 서진우 (alang@clunix.com)

https://www.schedmd.com/

1. OS 기본 설정

– 클러스터 호스트 설정

vi /etc/hosts
192.168.201.161 TEST01 # 관리
192.168.201.162 TEST02 # 계산
192.168.201.163 TEST03 # 계산

– NTP 설정

[root@TEST01 ~]# vi /etc/ntp.conf
restrict default nomodify notrap noquery
restrict 127.0.0.1
restrict -6 ::1
restrict 192.168.201.0 mask 255.255.255.0 nomodify notrap

# straum 2 server list
server 127.127.1.0
fudge 127.127.1.0 stratum 10
server kr.pool.ntp.org
server time.bora.net
server time.kornet.net

driftfile /var/lib/ntp/drift
broadcastdelay 0.008
keys /etc/ntp/keys
logfile /var/log/ntp.log

# service ntpd restart
# systemctl disable chronyd
# systemctl enable ntpd
# ntpdate -u kr.pool.ntp.org
# date
# ntpq -p

[root@TEST02 ~]# vi /etc/ntp.conf
driftfile /var/lib/ntp/drift
restrict default kod nomodify notrap nopeer noquery
restrict -6 default kod nomodify notrap nopeer noquery
restrict 127.0.0.1
restrict -6 ::1
server 192.168.201.161
#server kr.pool.ntp.org
#server time.bora.net
#server time.kornet.net
includefile /etc/ntp/crypto/pw
keys /etc/ntp/keys

# service ntpd restart
# systemctl disable chronyd
# systemctl enable ntpd
# ntpdate -u 192.168.201.161
# date
# ntpq -p

– RSH 설정
# systemctl list-units -t socket
# systemctl enable rsh.socket
# systemctl enable rlogin.socket
# vi /etc/securetty
—————————————————————–
..제일 밑에..
rsh
rlogin
—————————————————————–
# vi /etc/hosts.equiv
TEST01
TEST02
TEST03

# vi /root/.rhosts
TEST01
TEST02
TEST03

# chmod 600 /root/.rhosts

// rsh, rlogin 테스트

# rsh TEST01 hostname
TEST01
# rsh TEST02 hostname
TEST02

– SSH 설정

# vi /etc/ssh/ssh_config
.
.
HostbasedAuthentication yes
EnableSSHKeysign yes

# vi /etc/ssh/sshd_config
.
.
HostbasedAuthentication yes
IgnoreRhosts no
UseDNS yes

// 관리 서버 설정

ssh-keyscan -t rsa TEST01,192.168.201.161 > /etc/ssh/ssh_known_hosts2
ssh-keyscan -t rsa TEST02,192.168.201.162 >> /etc/ssh/ssh_known_hosts2
ssh-keyscan -t rsa TEST03,192.168.201.163 >> /etc/ssh/ssh_known_hosts2
.

scp /etc/ssh/ssh_known_hosts2 TEST0[2-3]:/etc/ssh
.

// 모든 서버 수행

chmod 644 /etc/ssh/ssh_config
chmod 600 /etc/ssh/sshd_config
chmod 644 /etc/ssh/ssh_known_hosts2
systemctl restart sshd

ssh TEST01 hostname
ssh TEST02 hostname
ssh TEST03 hostname

– NFS 설정

mkdir /engrid/enslurm -p
vi /etc/exports
/engrid/enslurm *(rw,no_root_squash)

systemctl restart nfs-server
systemctl enable nfs-server

– Yum 설정

vi /etc/yum.repos.d/centos.repo
[base-be]
name=CentOS-7 – Base
repo=os
baseurl=http://ftp.daum.net/centos/7/os/x86_64/
enabled=1
gpgcheck=0
gpgkey=http://ftp.daum.net/centos/7/os/x86_64/RPM-GPG-KEY-CentOS-7

[updates-be]
name=CentOS-7 – Updates
baseurl=http://ftp.daum.net/centos/7/updates/x86_64/
enable=1
gpgcheck=0

[centosplus-be]
name=CentOS-7 – Plus
baseurl=http://ftp.daum.net/centos/7/centosplus/x86_64/
enabled=1
gpgcheck=0

[extras-be]
name=CentOS-7 – Extras
baseurl=http://ftp.daum.net/centos/7/extras/x86_64/
enable=1
gpgcheck=0

[fasttrack-be]
name=CentOS-7 – Fasttrack
baseurl=http://ftp.daum.net/centos/7/fasttrack/x86_64/
enabled=1
gpgcheck=0

yum repolist
yum install -y epel-release

2. Slurm 설치

혹시 기존의 slurm 설치 이력이 있으면 지운다.
yum remove mariadb-server mariadb-devel -y
yum remove slurm munge munge-libs munge-devel -y

slurm and munge users 가 있는지 확인해라
cat /etc/passwd | grep slurm

있다면 user와 해단 user의 폴더를 지우자
userdel -r slurm
userdel -r munge

yum install mariadb-server mariadb-devel -y

Slurm and Munge 설치 전에 모든 노드에 같은 UID and GID 가 필요하다.

useradd -m -d /var/lib/munge -s /sbin/nologin munge
useradd -m -d /var/lib/slurm -s /bin/bash slurm

yum install munge munge-libs munge-devel -y
Munge 설치 후엔 서버의 secret key를 만들어야 한다.
관리노드가 될 노드하나를 선정하자.

우선 키를 만들기 위해서 rng-tools를 설치하자.
yum install rng-tools -y
rngd -r /dev/urandom

이제 secret key를 서버에서만 만들면 된다.
/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

secret key 만들고 나서 키를 모든 compute nodes에 보내야 한다.

scp /etc/munge/munge.key root@TEST02:/etc/munge
scp /etc/munge/munge.key root@TEST03:/etc/munge

이젠 모든 노드에 SSH 해서 permissions을 수정하고 Munge service도 시작.
chown -R munge. /etc/munge/ /var/log/munge/
chmod 0700 /etc/munge/ /var/log/munge/

systemctl enable munge
systemctl start munge

Munge를 테스트하기 위해, Munge를 통해서 다른 노드에 접속해보자

munge -n
munge -n | unmunge
munge -n | ssh TEST02 unmunge
munge -n | ssh TEST03 unmunge
remunge

[root@TEST01 ~]# munge -n
MUNGE:AwQDAACmEK3L1DQdMWmFpsQtRCtB9PicCH0mHQ+SbscZrhUQ6MIdTO6vkADy396khwZCsznQQtpwSMnaOWZ4roSpFdbm3FZnsYfy7CU7znvHowYFrgeDt84=:
[root@TEST01 ~]# munge -n | unmunge
STATUS: Success (0)
ENCODE_HOST: TEST01 (192.168.201.161)
ENCODE_TIME: 2018-11-07 16:04:39 +0900 (1541574279)
DECODE_TIME: 2018-11-07 16:04:39 +0900 (1541574279)
TTL: 300
CIPHER: aes128 (4)
MAC: sha1 (3)
ZIP: none (0)
UID: root (0)
GID: root (0)
LENGTH: 0

[root@TEST01 ~]# munge -n | ssh TEST02 unmunge
STATUS: Success (0)
ENCODE_HOST: TEST01 (192.168.201.161)
ENCODE_TIME: 2018-11-07 16:04:39 +0900 (1541574279)
DECODE_TIME: 2018-11-07 16:04:39 +0900 (1541574279)
TTL: 300
CIPHER: aes128 (4)
MAC: sha1 (3)
ZIP: none (0)
UID: root (0)
GID: root (0)
LENGTH: 0

[root@TEST01 ~]# munge -n | ssh TEST03 unmunge
STATUS: Success (0)
ENCODE_HOST: TEST01 (192.168.201.161)
ENCODE_TIME: 2018-11-07 16:04:39 +0900 (1541574279)
DECODE_TIME: 2018-11-07 16:04:39 +0900 (1541574279)
TTL: 300
CIPHER: aes128 (4)
MAC: sha1 (3)
ZIP: none (0)
UID: root (0)
GID: root (0)
LENGTH: 0

[root@TEST01 ~]# remunge
2018-11-07 16:04:39 Spawning 1 thread for encoding
2018-11-07 16:04:39 Processing credentials for 1 second
2018-11-07 16:04:40 Processed 17707 credentials in 1.000s (17703 creds/sec)

에러가 없다면 Ok..

최신 Slurm 다운로드 및 RPM Build

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

wget https://download.schedmd.com/slurm/slurm-18.08.3.tar.bz2

yum install rpm-build
rpmbuild -ta slurm-18.08.3.tar.bz2

cd /root/rpmbuild/RPMS/x86_64
mkdir /root/slurm-rpms
[root@TEST01 x86_64]# ls
slurm-18.08.3-1.el7.x86_64.rpm slurm-pam_slurm-18.08.3-1.el7.x86_64.rpm
slurm-contribs-18.08.3-1.el7.x86_64.rpm slurm-perlapi-18.08.3-1.el7.x86_64.rpm
slurm-devel-18.08.3-1.el7.x86_64.rpm slurm-slurmctld-18.08.3-1.el7.x86_64.rpm
slurm-example-configs-18.08.3-1.el7.x86_64.rpm slurm-slurmd-18.08.3-1.el7.x86_64.rpm
slurm-libpmi-18.08.3-1.el7.x86_64.rpm slurm-slurmdbd-18.08.3-1.el7.x86_64.rpm
slurm-openlava-18.08.3-1.el7.x86_64.rpm slurm-torque-18.08.3-1.el7.x86_64.rpm

[root@TEST01 x86_64]# cp slurm-*.rpm /root/slurm-rpms/
[root@TEST01 x86_64]# cd
[root@TEST01 ~]# scp -r slurm-rpms/ root@TEST02:/root
[root@TEST01 ~]# scp -r slurm-rpms/ root@TEST03:/root

# cd /root/slurm-rpms/

yum –nogpgcheck localinstall slurm-18.08.3-1.el7.x86_64.rpm \
slurm-contribs-18.08.3-1.el7.x86_64.rpm \
slurm-devel-18.08.3-1.el7.x86_64.rpm \
slurm-example-configs-18.08.3-1.el7.x86_64.rpm \
slurm-libpmi-18.08.3-1.el7.x86_64.rpm \
slurm-openlava-18.08.3-1.el7.x86_64.rpm \
slurm-pam_slurm-18.08.3-1.el7.x86_64.rpm \
slurm-perlapi-18.08.3-1.el7.x86_64.rpm \
slurm-slurmctld-18.08.3-1.el7.x86_64.rpm \
slurm-slurmd-18.08.3-1.el7.x86_64.rpm \
slurm-slurmdbd-18.08.3-1.el7.x86_64.rpm \
slurm-torque-18.08.3-1.el7.x86_64.rpm

모든 머신에 Slurm 을 설치했다면 재대로 Slurm이 잘 작동되는지 확인해보자

http://slurm.schedmd.com/configurator.easy.html 에 접속하여 Slurm configuration file을 만들어라

아래 뺴곤 default로 냅둔다.

# slurm.conf file generated by configurator easy.html.
# Put this file on all nodes of your cluster.
# See the slurm.conf man page for more information.
#
SlurmctldHost=TEST01
#
#MailProg=/bin/mail
MpiDefault=none
#MpiParams=ports=#-#
ProctrackType=proctrack/linuxproc
ReturnToService=1
SlurmctldPidFile=/var/run/slurmctld.pid
#SlurmctldPort=6817
SlurmdPidFile=/var/run/slurmd.pid
#SlurmdPort=6818
SlurmdSpoolDir=/var/spool/slurmd
SlurmUser=slurm
#SlurmdUser=root
StateSaveLocation=/var/spool
SwitchType=switch/none
TaskPlugin=task/none
#
#
# TIMERS
#KillWait=30
#MinJobAge=300
#SlurmctldTimeout=120
#SlurmdTimeout=300
#
#
# SCHEDULING
FastSchedule=1
SchedulerType=sched/backfill
SelectType=select/linear
#SelectTypeParameters=
#
#
# LOGGING AND ACCOUNTING
AccountingStorageType=accounting_storage/none
ClusterName=gridcenter
#JobAcctGatherFrequency=30
JobAcctGatherType=jobacct_gather/linux
#SlurmctldDebug=3
#SlurmctldLogFile=
#SlurmdDebug=3
#SlurmdLogFile=
#
#
# COMPUTE NODES
NodeName=TEST0[1-3] CPUs=4 Sockets=2 CoresPerSocket=2 ThreadsPerCore=1 State=UNKNOWN
PartitionName=debug Nodes=TEST0[1-3] Default=YES MaxTime=INFINITE State=UP

Submit을 누르고나면 전체 Slurm configuration file을 받을 볼 수 있다.

vi /etc/slurm/slurm.conf
+++
# slurm.conf file generated by configurator easy.html.
# Put this file on all nodes of your cluster.
# See the slurm.conf man page for more information.
#
SlurmctldHost=TEST01
#
#MailProg=/bin/mail
MpiDefault=none
#MpiParams=ports=#-#
ProctrackType=proctrack/cgroup
ReturnToService=1
SlurmctldPidFile=/var/run/slurmctld.pid
#SlurmctldPort=6817
SlurmdPidFile=/var/run/slurmd.pid
#SlurmdPort=6818
SlurmdSpoolDir=/var/spool/slurmd
SlurmUser=slurm
#SlurmdUser=root
StateSaveLocation=/var/spool/slurmd
SwitchType=switch/none
TaskPlugin=task/affinity
#
#
# TIMERS
#KillWait=30
#MinJobAge=300
#SlurmctldTimeout=120
#SlurmdTimeout=300
#
#
# SCHEDULING
FastSchedule=1
SchedulerType=sched/backfill
SelectType=select/cons_res
SelectTypeParameters=CR_Core
#
#
# LOGGING AND ACCOUNTING
AccountingStorageType=accounting_storage/none
ClusterName=cluster
#JobAcctGatherFrequency=30
JobAcctGatherType=jobacct_gather/none
SlurmctldDebug=3
SlurmctldLogFile=/var/log/slurm/slurmctld.log
SlurmdDebug=3
SlurmdLogFile=/var/log/slurm/slurmd.log
#
#
# COMPUTE NODES
#NodeName=TEST0[1-3] CPUs=4 RealMemory=6GB Sockets=2 CoresPerSocket=2 ThreadsPerCore=1 State=UNKNOWN
NodeName=TEST01 NodeAddr=192.168.201.161 CPUs=4 State=UNKNOWN
NodeName=TEST02 NodeAddr=192.168.201.162 CPUs=4 State=UNKNOWN
NodeName=TEST03 NodeAddr=192.168.201.163 CPUs=4 State=UNKNOWN
PartitionName=hpc.q Nodes=TEST0[1-3] Default=YES MaxTime=INFINITE State=UP
+++

여기선 IP address가 순서대로 되어있지 않아있다, 그래서 저 줄은 지우고 직접 아래와 같이 바꿨다

NodeName=TEST01 NodeAddr=192.168.201.161 CPUs=4 Sockets=2 CoresPerSocket=2 ThreadsPerCore=1 State=UNKNOWN
NodeName=TEST02 NodeAddr=192.168.201.162 CPUs=4 Sockets=2 CoresPerSocket=2 ThreadsPerCore=1 State=UNKNOWN
NodeName=TEST03 NodeAddr=192.168.201.163 CPUs=4 Sockets=2 CoresPerSocket=2 ThreadsPerCore=1 State=UNKNOWN

cd /etc/slurm
scp slurm.conf root@TEST02:$PWD
scp slurm.conf root@TEST03:$PWD

이제 서버노드를 설정하자, wonwooddo. 모든 노드들이 올바른 configuration 과 file을 가지고 있어야 한다.

mkdir /var/log/slurm
chown slurm: /var/log/slurm
touch /var/log/slurm/slurmctld.log
chown slurm: /var/log/slurm/slurmctld.log
touch /var/log/slurm/slurm_jobacct.log /var/log/slurm/slurm_jobcomp.log
chown slurm: /var/log/slurm/slurm_jobacct.log /var/log/slurm/slurm_jobcomp.log

이제 컴퓨팅 노드들을 설정하자 wwhpc[1-6]. 모든 컴퓨팅 노드들이 똑같은 설정을 가지고 있어야 한다.

mkdir /var/spool/slurmd
chown slurm: /var/spool/slurmd
chmod 755 /var/spool/slurmd
touch /var/log/slurm/slurmd.log
chown slurm: /var/log/slurm/slurmd.log

slurmd 잘 설정되어있는지 아래 명령어로 확인하자

slurmd -C

You should get something like this:

ClusterName=(null) NodeName=buhpc3 CPUs=4 Boards=1 SocketsPerBoard=2 CoresPerSocket=2 ThreadsPerCore=1 RealMemory=7822 TmpDisk=45753
UpTime=13-14:27:52

노드간에 방화벽이 막혀있는 경우 ..

systemctl stop firewalld
systemctl disable firewalld
iptables -F
iptables -X

만일 방화벽을 열어야 할경우 Slurm이 사용하는 default port를 열어준다.

firewall-cmd –permanent –zone=public –add-port=6817/udp
firewall-cmd –permanent –zone=public –add-port=6817/tcp
firewall-cmd –permanent –zone=public –add-port=6818/tcp
firewall-cmd –permanent –zone=public –add-port=6818/tcp
firewall-cmd –permanent –zone=public –add-port=7321/tcp
firewall-cmd –permanent –zone=public –add-port=7321/tcp
firewall-cmd –reload

모든 계산 서버에서 ..
systemctl enable slurmd.service
systemctl restart slurmd.service
systemctl status slurmd.service

(만약 에러가 뜬다면:

cgroup.conf

[root@amber600 slurm]# cat cgroup.conf| grep -v ‘#’
CgroupMountpoint=”/sys/fs/cgroup”
CgroupAutomount=yes
CgroupReleaseAgentDir=”/etc/slurm/cgroup”
AllowedDevicesFile=”/etc/slurm/cgroup_allowed_devices_file.conf”
ConstrainCores=no
TaskAffinity=no
ConstrainRAMSpace=yes
ConstrainSwapSpace=no
ConstrainDevices=no
AllowedRamSpace=100
AllowedSwapSpace=0
MaxRAMPercent=100
MaxSwapPercent=100
MinRAMSpace=30

[root@amber600 slurm]# cat cgroup_allowed_devices_file.conf | grep -v ‘#’
/dev/null
/dev/urandom
/dev/zero
/dev/sda*
/dev/cpu/*/*
/dev/pts/*

관리서버에서

systemctl enable slurmctld.service
systemctl restart slurmctld.service
systemctl status slurmctld.service

slurmd와 slurmctld 를 확인해보면 잘되었는지 안되었는지 확인할수 있다.
만약 문제가 되면 로그파일을 보자!

Compute node bugs: tail /var/log/slurm/slurmd.log
Server node bugs: tail /var/log/slurm/slurmctld.log

3. Slurm 기본 사용

컴퓨팅 노드 확인

scontrol show nodes

srun 은 대화형 작업 제출 명령이고, -N 은 노드 수를 의미한다.
3대의 노드에 hostname 명령을 interactive 방식으로 제출

srun -N3 /bin/hostname
TEST01
TEST03
TEST02

큐의 작업확인하려면:

scontrol show jobs

JobId=16 JobName=hostname
UserId=root(0) GroupId=root(0)
Priority=4294901746 Nice=0 Account=(null) QOS=(null)
JobState=COMPLETED Reason=None Dependency=(null)
Requeue=1 Restarts=0 BatchFlag=0 Reboot=0 ExitCode=0:0
RunTime=00:00:00 TimeLimit=UNLIMITED TimeMin=N/A
SubmitTime=2016-04-10T16:26:04 EligibleTime=2016-04-10T16:26:04
StartTime=2016-04-10T16:26:04 EndTime=2016-04-10T16:26:04
PreemptTime=None SuspendTime=None SecsPreSuspend=0
Partition=debug AllocNode:Sid=buhpc3:1834
ReqNodeList=(null) ExcNodeList=(null)
NodeList=buhpc[1-5]
BatchHost=buhpc1
NumNodes=5 NumCPUs=20 CPUs/Task=1 ReqB:S:C:T=0:0:*:*
TRES=cpu=20,node=5
Socks/Node=* NtasksPerN:B:S:C=0:0:*:* CoreSpec=*
MinCPUsNode=1 MinMemoryNode=0 MinTmpDiskNode=0
Features=(null) Gres=(null) Reservation=(null)
Shared=0 Contiguous=0 Licenses=(null) Network=(null)
Command=/bin/hostname
WorkDir=/root
Power= SICP=0

script로 작업을 제출하려면 script를 작성하고 아래와같이 한다

sbatch -N2 script-file

http://www.sdsc.edu/~hocks/FG/PBS.slurm.html

1. 기본명령어 요약

명령어

내용

$ sbatch [옵션..] 스크립트

작업 제출

$ scancel 작업ID

작업 삭제

$ squeue

작업 상태 확인

# squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
129 hpc.q test root R 0:02 1 TEST01

* JOBID : 제출한 작업의 식별 번호
* PARTITION : 현재 작업이 제출된 파티션의 이름
(slurm에서의 partition은 SGE에서의 queue와 같은 개념)
* NAME : 작업의 이름
* USER : 작업을 제출한 리눅스 계정의 이름
* ST : 현재 작업의 상태 (R: running, PD: pending)
* NODELIST : 현재 이 작업을 수행할 수 있도록 할당된 컴퓨터 노드들

$ smap

작업 상태 및 노드 상태 확인

$ sinfo [옵션..]

노드 정보 확인

$ srun [옵션…] 실행파일

작업 제출 (interactive 작업용)

2. sinfo

slurm 노드 및 파티션 정보를 조회합니다. 사용방법 및 예제는 아래와 같습니다.

$ sinfo

PARTITION AVAIL TIMELIMIT NODES STATE NODELIST

single_k40_node up 1-00:00:00 2 alloc tesla[01-02]

single_k40_node up 1-00:00:00 15 idle tesla[03-17]

dual_v100_node up 1-00:00:00 11 idle tesla[18-28]

single_v100_node up 1-00:00:00 1 alloc tesla30

single_v100_node up 1-00:00:00 1 idle tesla29

skl_node up 1-00:00:00 9 idle skl[01-09]

bigmem_node up 1-00:00:00 2 idle bigmem,bigmem2]

3. sbatch

작업 제출을 위한 명령어입니다. 사용방법 및 예제는 아래와 같습니다.

$ sbatch ./job_script.sh

[작업스크립트 예제]

#!/bin/sh

#SBATCH -J test # 작업 이름

#SBATCH -p dual_v100_node # partition 이름

#SBATCH -N 2 # 총 필요한 컴퓨팅 노드 수

#SBATCH -n 2 # 총 필요한 프로세스 수 (–ntasks=2)

#SBATCH -o test.o%j # stdout 파일 명

#SBATCH -e test.e%j # stderr 파일 명

#SBATCH -t 00:30:00 # 최대 작업 시간 (Wall Time Clock Limit) (–time)

#SBATCH –gres=gpu # GPU를 사용하기 위한 옵션

#SBATCH –mem=1gb

srun lmp_mpi -sf gpu -in in.lj

[작업스크립트 작성 안내]

slurm에게 전달해야 할 정보는 작업스크립트 내에 #SBATCH 지시자를 붙여 전달합니다.

(1) 작업 이름

작업 이름을 명시하지 않으면 slurm이 임의로 부여합니다..

작업 이름을 test 로 지정할 경우 “–job-name=test” 또는 “-J test” 와 같이 사용합니다.

(2) 작업 파티션 이름

작업 수행할 파티션을 지정하는 것이며, 사용가능한 파티션 이름은 sinfo 명령어로 확인이 가능합니다.

파티션을 dual_v100_node으로 사용할 경우, “–partition=dual_v100_node” 또는 “-p dual_v100_node” 와 같이 사용합니다.

(3) 필요한 자원의 양

작업 수행에 필요한 총 프로세스 수는 “-n” 옵션으로, 작업 수행에 필요한 컴퓨팅 노드 개수는 “-N”으로 정의합니다.

(4) output

Standard output을 저장할 파일명을 정의합니다.

파일명을 test.out으로 사용할 경우, “–output=test.out” 또는 “-o test.out” 과 같이 사용합니다.

(5) error

Standard error 를 저장할 파일명을 정의합니다.

파일명을 test.err으로 사용할 경우, “–error=test.err” 또는 “-e test.err” 와 같이 사용합니다.

(6) Wall Time Clock Limit

예상되는 작업 소요 시간을 의미하며, 실제 예상되는 작업 소요 시간보다 약간 더 길게 설정해 주는 것이 안전합니다.

만약 해당 작업이 설정해 둔 시간내에 종료 되지 않을 경우, Wall Time Clock Limit 시간을 초과하는 시점에서 slurm이 해당 작업을 강제로 종료시킵니다. 이 키워드는 작업 제출 스크립트 파일에 반드시 지정되어야 하며, 초단위 또는 시:분:초 형식으로 지정할 수 있습니다.

Wall Time Clock Limit을 1시간을 지정할 경우, “–time=01:00:00: 또는 “-t 01:00:00″ 과 같이 사용합니다.

4. squeue

제출된 작업 목록 및 정보 조회 명령어입니다. 사용방법 및 예제는 아래와 같습니다.

$ squeue

JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)

760 tesla_nod test sunlsy PD 0:00 10 (Resources)

761 tesla_nod test sunlsy PD 0:00 10 (Priority)

762 tesla_nod test sunlsy PD 0:00 10 (Priority)

763 tesla_nod test sunlsy PD 0:00 10 (Priority)

764 tesla_nod test sunlsy PD 0:00 10 (Priority)

765 tesla_nod test sunlsy PD 0:00 10 (Priority)

759 tesla_nod test sunlsy R 1:09 10 tesla[01-10]

[제출된 작업 상세 조회]

scontrol 명령어를 이용하면 제출된 작업의 상세내역을 조회할 수 있습니다. 사용방법 및 예제는 아래와 같습니다.

$ scontrol show job [작업 ID]

– 예제 –

$ scontrol show job 3217

JobId=3217 JobName=ssw_test

UserId=moasys1(100001107) GroupId=in0011(1000011) MCS_label=N/A

Priority=4294901630 Nice=0 Account=kat_user QOS=normal

JobState=RUNNING Reason=None Dependency=(null)

Requeue=1 Restarts=0 BatchFlag=1 Reboot=0 ExitCode=0:0

RunTime=00:00:05 TimeLimit=01:00:00 TimeMin=N/A

SubmitTime=2018-04-30T17:54:07 EligibleTime=2018-04-30T17:54:07

StartTime=2018-04-30T17:54:07 EndTime=2018-04-30T18:54:08 Deadline=N/A

PreemptTime=None SuspendTime=None SecsPreSuspend=0

Partition=single_k40_node AllocNode:Sid=login-tesla02:9203

ReqNodeList=(null) ExcNodeList=(null)

NodeList=tesla[03-04]

BatchHost=tesla03

NumNodes=2 NumCPUs=40 NumTasks=4 CPUs/Task=1 ReqB:S:C:T=0:0:*:*

TRES=cpu=40,node=2,gres/gpu=2

Socks/Node=* NtasksPerN:B:S:C=0:0:*:* CoreSpec=*

MinCPUsNode=1 MinMemoryNode=0 MinTmpDiskNode=0

Features=(null) DelayBoot=00:00:00

Gres=gpu Reservation=(null)

OverSubscribe=NO Contiguous=0 Licenses=(null) Network=(null)

Command=./kat-2.sh

WorkDir=/scratch2/moasys1/ssw/moasys1/kat_test

StdErr=/scratch2/moasys1/ssw/moasys1/kat_test/ssw.e3217

StdIn=/dev/null

StdOut=/scratch2/moasys1/ssw/moasys1/kat_test/ssw.o3217

Power=

5. scancel

제출된 작업 수행을 취소합니다. 사용방법은 아래와 같습니다.

$ scancel [작업 ID]

5. smap

sinfo와 squeue에서 보여주는 정보를 그래픽화면으로 보여줍니다.

6. srun

작업 제출 (인터액티브 수행)을 위한 명령어입니다. sbatch에서 설명했던 예제를 인터액티브 모드로 작업 제출하면 다음과 같습니다.

$ srun -n 2 -N 2 -p dual_v100_node –gres=gpu lmp_mpi -sf gpu -in in.lj

7. sbcast

로컬디스크에 있는 작업 파일을 작업이 할당된 로컬 디스크로 자동 복사하는 명령

> cat my.job
#!/bin/bash
sbcast my.prog /tmp/my.prog
srun /tmp/my.prog

> sbatch –nodes=8 my.job
srun: jobid 12345 submitted

[slurm 계산 노드 정보 ]

– parririon 정보 확인

$ sinfo
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST
hpc.q* up infinite 3 idle TEST[01-03]

– 상세 자원 정보 출력

$ sinfo -N -l
NODELIST NODES PARTITION STATE CPUS S:C:T MEMORY TMP_DISK WEIGHT AVAIL_FE REASON
TEST01 1 hpc.q* idle 4 4:1:1 1 0 1 (null) none
TEST02 1 hpc.q* idle 4 4:1:1 1 0 1 (null) none
TEST03 1 hpc.q* idle 4 4:1:1 1 0 1 (null) none

– sinfo 사용 참고 : https://slurm.schedmd.com/sinfo.html

[작업 제출]

sbatch 명령을 이용하여 slurm 스케줄러로 작업 제출

$ sbatch run.sh

[작업 조회]

squeue 명령을 이용하여 작업 조회

$ squeue

* R : RUNNING 상태

* PD : PENDING 상태

* S : SUSPENDED 상태

* ST : STOP 상태

* CD : COMPLETED 상태

* CA : CANCELLED 상태

* F : FAILED 상태

* NF : NODE_FAIL 상태

– 참고 : https://slurm.schedmd.com/squeue.html

[작업 정보 조회]

sacct -j {작업ID} –format {포멧지정}

sacct -j 1902 –format JobID,jobname,NTasks,nodelist,MaxRSS,MaxVMSize,AveRSS,AveVMSize

[수행 중인 작업 정보 조회]

sstat -j {작업ID} –format {포멧지정}

sstat -j 1902 –format JobID,jobname,nodelist,MaxVMSize,MaxRSS,MaxDiskRead,MaxDiskWrite

$ scontrol show job 186
UserId=root(0) GroupId=root(0) MCS_label=N/A
Priority=4294901714 Nice=0 Account=root QOS=normal
JobState=COMPLETED Reason=None Dependency=(null)
Requeue=1 Restarts=0 BatchFlag=1 Reboot=0 ExitCode=0:0
RunTime=00:00:20 TimeLimit=00:30:00 TimeMin=N/A
SubmitTime=2018-11-08T14:37:47 EligibleTime=2018-11-08T14:37:47
AccrueTime=Unknown
StartTime=2018-11-08T14:39:20 EndTime=2018-11-08T14:39:40 Deadline=N/A
PreemptTime=None SuspendTime=None SecsPreSuspend=0
LastSchedEval=2018-11-08T14:39:20
Partition=hpc.q AllocNode:Sid=TEST03:1592
ReqNodeList=(null) ExcNodeList=(null)
NodeList=TEST03
BatchHost=TEST03
NumNodes=1 NumCPUs=2 NumTasks=2 CPUs/Task=1 ReqB:S:C:T=0:0:*:*
TRES=cpu=2,node=1,billing=2
Socks/Node=* NtasksPerN:B:S:C=0:0:*:* CoreSpec=*
MinCPUsNode=1 MinMemoryNode=0 MinTmpDiskNode=0
Features=(null) DelayBoot=00:00:00
OverSubscribe=OK Contiguous=0 Licenses=explicit:1 Network=(null)
Command=/home/job1.sh
WorkDir=/home
StdErr=/home/test.e186
StdIn=/dev/null
StdOut=/home/test.o186
Power=

# qstat -f 186
Job Id: 186
Job_Name = test
Job_Owner = root@TEST03
job_state = R
queue = hpc.q
qtime = Thu Nov 8 14:37:47 2018
mtime = Thu Nov 8 14:39:20 2018
ctime = Thu Nov 8 15:09:20 2018
Account_Name = root
exec_host = TEST03/2
Priority = 4294901714
euser = root(0)
egroup = root(0)
Resource_List.walltime = 00:30:00
Resource_List.nodect = 1
Resource_List.ncpus = 2

$ sview : SGE 의 qmon

//// GPU 및 Resource Complex

vi /etc/slurm/gres.conf
+++
# Configure support for our four GPUs, plus bandwidth
Name=gpu Type=tesla File=/dev/nvidia0 CPUs=0,1
Name=gpu Type=tesla File=/dev/nvidia1 CPUs=0,1
Name=gpu Type=kepler File=/dev/nvidia2 CPUs=2,3
Name=gpu Type=kepler File=/dev/nvidia3 CPUs=2,3
Name=bandwidth Type=lustre Count=4G
+++

vi /etc/slurm/slurm.conf

GresTypes=gpu,bandwidth
NodeName=tux[0-7] Gres=gpu:tesla:2,gpu:kepler:2,bandwidth:lustre:no_consume:4G

#!/bin/bash
#
# gres_test.bash
# Submit as follows:
# sbatch –gres=gpu:4 -n4 -N1-1 gres_test.bash
#
srun –gres=gpu:2 -n2 –exclusive show_device.sh &
srun –gres=gpu:1 -n1 –exclusive show_device.sh &
srun –gres=gpu:1 -n1 –exclusive show_device.sh &
wait

JobStep=1234.0 CUDA_VISIBLE_DEVICES=0,1
JobStep=1234.1 CUDA_VISIBLE_DEVICES=2
JobStep=1234.2 CUDA_VISIBLE_DEVICES=3

//// license 설정

= local

slurm 스케줄러 내에 라이선스나 기타 complex 항목을 생성하여 자원을 관리할 수
있다.
방법은 간단하다.

slurm.conf
+++
Licenses=fluent:30,ansys:100
+++

scontrol show lic
LicenseName=ansys
Total=100 Used=0 Free=100 Remote=no
LicenseName=fluent
Total=30 Used=0 Free=30 Remote=no

sbatch -L ansys:2 script.sh
Submitted batch job 5212

$ scontrol show lic
LicenseName=ansys
Total=100 Used=2 Free=98 Remote=no
LicenseName=fluent
Total=30 Used=0 Free=30 Remote=no

= remote

일단 slurm 의 경우 flexlm 및 기타 네트워크 라이선스 서버와 연동하는 방법은
아직 없다. (곧 나오겠지만..)
일단 DBMS 를 통해 중앙의 서버에서 자원 항목을 관리할 수 있다.
추후 flexlm 서버의 실제 상태를 파악해서 해당 DB 에 업데이트하는 방식으로
SGE qlicserver 와 같은 기능을 만들수도 있을듯…

일단 DB를 이용한 자원 관리 방법은 sacctmgr 명령을 이용해서 가능하다.

사전 준비
slurm-slurmdbd 설치
mariadb-server 설치

사전 준비

mysql> SHOW VARIABLES LIKE ‘innodb_buffer_pool_size’;
+————————-+———–+
| Variable_name | Value |
+————————-+———–+
| innodb_buffer_pool_size | 134217728 |
+————————-+———–+

실제 서비스에서는 innodb 관련 사이즈를 키워준다.

$cat my.cnf

[mysqld]
innodb_buffer_pool_size=1024M
innodb_log_file_size=64M
innodb_lock_wait_timeout=900

mysql>
create user ‘slurm’@’localhost’ identified by ‘password’;
grant all on slurm_acct_db.* TO ‘slurm’@’localhost’;
create database slurm_acct_db;

# vi /etc/slurm/slurm.conf
+++
AccountingStorageType=accounting_storage/slurmdbd
+++

# vi /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=localhost
DbdHost=localhost
#DbdPort=7031
SlurmUser=slurm
#MessageTimeout=300
DebugLevel=4
#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=localhost
#StoragePort=3306
StoragePass=password
StorageUser=slurm
StorageLoc=slurm_acct_db

관리서버
systemctl restart slurmdbd
systemctl restart slurmctld.service

모든서버
systemctl restart slurmd

# mysql -u slurm -ppassword slurm_acct_db
MariaDB [slurm_acct_db]> show tables;

# sacctmgr add cluster gridcenter
# sacctmgr list cluster
Cluster ControlHost ControlPort
———- ————— ————
gridcenter 127.0.0.1 6817

# sacctmgr add resource name=explicit count=1024 \
server=GCT3MGR01 servertype=flexlm type=license \
percentallowed=100 cluster=gridcenter

# sacctmgr show resource
Name Server Type Count % Allocated ServerType
———- ———- ——– —— ———– ———-
explicit gct3mgr01 License 101 100 flexlm

# sacctmgr show resource withclusters
Name Server Type Count % Allocated ServerType Cluster % Allowed
———- ———- ——– —— ———– ———- ———- ———-
explicit gct3mgr01 License 101 100 flexlm gridcenter 100

# scontrol show lic
LicenseName=explicit@gct3mgr01
Total=1024 Used=0 Free=1024 Remote=yes

# srun -L explicit@gct3mgr01:91 sleep 300
# scontrol show lic
LicenseName=explicit@gct3mgr01
Total=1024 Used=91 Free=933 Remote=yes

# sacctmgr modify resource name=explicit server=gct3mgr01 set count=100
# scontrol show lic
LicenseName=explicit@gct3mgr01
Total=100 Used=0 Free=100 Remote=yes

/// RQS, QOS 설정

SET:
sacctmgr modify user bob set GrpTRES=cpu=1500,mem=200,gres/gpu=50
UNSET:
sacctmgr modify user bob set GrpTRES=cpu=-1,mem=-1,gres/gpu=-1

/// MPI 연동

# srun –mpi=list
srun: MPI types are…
srun: openmpi
srun: none
srun: pmi2

vi p_job.sh
#!/bin/sh
#SBATCH -J test
#SBATCH -p hpc.q
#SBATCH -N 2
#SBATCH -n 4
#SBATCH -o test.o%j
#SBATCH –time 00:30:00

SLURM_NODEFILE=`generate_pbs_nodefile`
srun hostname
echo $SLURM_NTASKS
echo $SLURM_TASKS_PER_NODE
echo $SLURM_NODEFILE
cat $SLURM_NODEFILE

sbatch p_job.sh

cat test.0.111
TEST01
TEST02
TEST01
TEST01
4
3,1
/tmp/ZimFnCUOYo
TEST01
TEST01
TEST01
TEST02

#!/bin/sh
#SBATCH -J test
#SBATCH -p hpc.q
#SBATCH -N 2
#SBATCH –ntasks-per-node=2
#SBATCH -o test.o%j
#SBATCH –time 00:30:00

SLURM_NODEFILE=`generate_pbs_nodefile`
srun hostname
echo $SLURM_NTASKS
echo $SLURM_TASKS_PER_NODE
echo $SLURM_NODEFILE
cat $SLURM_NODEFILE

TEST01
TEST02
TEST01
TEST02
4
2(x2)
/tmp/6ZBvpSirZY
TEST01
TEST01
TEST02
TEST02

srun hostname -s | sort | uniq > hosts.$SLURM_JOB_ID
cat hosts.$SLURM_JOB_ID
fluent 3d -t$SLURM_NTASKS -slurm -cnf=hosts.$SLURM_JOB_ID

/// abaqus

#!/bin/bash

#SBATCH -J MyJobName
#SBATCH -A myaccount
#SBATCH –nodes=4
#SBATCH –time=72:00:00
#SBATCH -p ProdQ
#
#SBATCH –ntasks-per-node=40
#SBATCH –cpus-per-task=1
#SBATCH -o %x-%j.log

env_file=abaqus_v6.env

cat << EOF > ${env_file}
#verbose = 3
#ask_delete = OFF
scratch=”$PWD”
mp_mpirun_options=”-TCP”
EOF

node_list=$(scontrol show hostname ${SLURM_NODELIST} | sort -u)

mp_host_list=”[”
for host in ${node_list}; do
mp_host_list=”${mp_host_list}[‘$host’, ${SLURM_CPUS_ON_NODE}],”
done

mp_host_list=$(echo ${mp_host_list} | sed -e “s/,$/]/”)
echo “mp_host_list=${mp_host_list}” >> ${env_file}

### Set input file and job (file prefix) name here
job_name=${SLURM_JOB_NAME}

### ABAQUS parallel execution
input_file=input.inp
abaqus job=${job_name} input=${input_file} cpus=${SLURM_NTASKS} int

서진우

슈퍼컴퓨팅 전문 기업 클루닉스/ 상무(기술이사)/ 정보시스템감리사/ 시스존 블로그 운영자

You may also like...

페이스북/트위트/구글 계정으로 댓글 가능합니다.