Computer

리눅스 서버 클러스터 설정하기: 3. 잡 스케쥴러 (slurm) 설정

Novelism 2025. 1. 6. 00:46

리눅스 서버 클러스터 설정하기: 1. 개요

https://novelism.tistory.com/424

리눅스 서버 클러스터 설정하기: 2. 파일 시스템 공유하기

https://novelism.tistory.com/425

리눅스 서버 클러스터 설정하기: 3. 잡 스케쥴러 (slurm) 설정

https://novelism.tistory.com/4256

 

이전에 파일시스템 공유까지 진행하였으니 다음에는 잡 스케쥴러를 이용하여 

서버 클러스터에서 각 서버들을 로그인 노드, 작업 노드로 구분합니다. 

로그인 노드는 외부에서 접속하여 작업을 명령하기 위한 노드이고, 작업 노드들은 계산을 담당하는 서버들입니다. 

경우에 따라서 작업 노드이 일일이 접속해서 작업을 실행하기도 하지만, 번거롭고 다른 사람들과 함께 사용시 충돌할 우려가 있습니다. 

클러스터를 효율적으로 사용하려면 작업 노드에 일일이 접속하지 않고 로그인 노드를 통해서만 작업을 제출하는것이 좋습니다. 그러기 위해선 잡 스케쥴러가 필요합니다.

 

 저는 주로 slurm 을 사용하는데 slurm 설정에 대한 글은 몇년 전에 포스팅 하였으나, 시간이 지나면서 버전이 바뀌어서 제대로 작동하지 않게 되었습니다. 

 최근에 설정할 때는 새로 찾아보면서 세팅을 진행하였고, 거기에 맞게 이 글도 새로 작성합니다.

GPU를 가지고 있는 서버의 경우 GPU 스케쥴링도 고려해야해서 설정이 조금 다른데 그 환경을 고려해서 세팅하였습니다. 

 

 

slurm 설치 전에 먼저 세팅해야 할 것들이 있습니다. 당연히 관리자 권한으로 해야 하는 일들이고, 편의상 sudo는 생략될 수도 있습니다.

 

munge 세팅

이게 뭔지 정확히는 모르겠지만, 서버-노드 간 인증과 관련된 프로그램입니다.

 컴퓨터 1대만 사용할 것이라면 굳이 설치하지 않아도 됩니다.

일단 munge를 설치하기 전에 uid와 gid를 설정해줍니다.

uid와 gid는 991입니다.

groupadd -g 991 munge
useradd -m -c "MUNGE Uid 'N' Gid Emporium" -d /var/lib/munge -u 991 -g munge -s /sbin/nologin munge

서버, 노드에 munge 설치

apt-get update
apt-get install munge

 

서버 세팅

키 생성 및 파일에 저장 및 권한 수정

apt-get install rng-tools -y
rngd -r /dev/urandom
/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

노드 세팅

서버의 인증키를 노드로 전달

scp /etc/munge/munge.key root@서버주소:/etc/munge
systemctl stop munge
systemctl enable munge
systemctl start munge

 

동작 확인

서버에서 실행

munge -n | ssh 노드주소 unmunge

성공할 경우 다음과 같은 메시지가 나옵니다.

STATUS:           Success (0)

 

 

slurm 세팅

slurm uid, gid 설정

munge와 마찬가지로 uid와 gid를 통일합니다. 이 작업은 모든 서버와 노드에서 해줍니다.

groupadd -g 994 slurm
useradd  -m -c "SLURM workload manager" -d /var/lib/slurm -u 994 -g slurm -s /sbin/nologin slurm

 

설치:

slurm에는 3가지 프로그램이 있습니다.

slurmctld는 slurm 서버 툴입니다. 서버 노드에 설치합니다.

apt-get install slurmctld

slurmd는 slurm 계산 노드 툴입니다. 계산 노드에 설치합니다. 만약 서버도 계산 노드로 사용할 것이라면, 서버에도 설치합니다.

apt-get install slurmd

slurm-client는 클라이언트가 서버를 사용하기 위한 툴입니다.

apt-get install slurm-client

sbatch, sinfo, scontrol 등 slurm을 실제로 사용하는데 필요한 명령어들이 포함되어 있습니다.

서버, 계산노드에 설치합니다.

 굳이 서버와 계산 노드가 아니더라도, 특정 컴퓨터에 클라이언트가 설치되어있으면서, slurm.conf가 동일하게 세팅되어있다면 그 컴퓨터에서도 slurm 명령어로 서버와 계산 노드를 제어할 수 있는 것 같습니다.

slurm-wlm 공통 프로그램입니다. 위의 프로그램들을 설치하다 보면 의존성 때문에 알아서 설치될 듯...

 

 

lurm.conf 파일 세팅

https://slurm.schedmd.com/configurator.easy.html

여기서 Cluster Name, Control Machines, Compute Machines 등을 세팅해줍니다.

slurm.conf 파일을 생성하기 위한 것이고, 일부는 직접 고쳐줘야 합니다. 모르는 항목은 그냥 디폴트로 둡니다.

submit을 누르면 slurm.conf 파일을 얻을 수 있습니다. 이를 /etc/slurm-llnl 폴더에 붙여둡니다.

slurm.conf 파일에서

SlurmctldHost라고 서있는 항목이 있는데, 아마도 예전 변 수명이었는지 에러가 납니다. SlurmctldHost을 ControlMachine로 고쳐줍니다.

예시: 제가 사용하는 설정 파일을 약간 고친 것입니다

/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.
#
ClusterName=nob
SlurmctldHost=server00

#
#MailProg=/bin/mail
MpiDefault=none
#MpiParams=ports=#-#
ProctrackType=proctrack/pgid
ReturnToService=1
#SlurmctldPidFile=/var/run/slurmctld.pid
SlurmctldPidFile=/var/run/slurmctld.pid
#SlurmctldPort=6817
#SlurmdPidFile=/var/run/slurmd.pid
SlurmdPidFile=/var/run/slurmd.pid
#SlurmdPort=6818
SlurmdSpoolDir=/var/spool/slurmd
SlurmUser=slurm
#SlurmdUser=root
StateSaveLocation=/var/spool/slurmctld
SwitchType=switch/none
TaskPlugin=task/affinity
#
#
# TIMERS
#KillWait=30
#MinJobAge=300
#SlurmctldTimeout=120
#SlurmdTimeout=300
#
#
# SCHEDULING
FastSchedule=1
SchedulerType=sched/backfill
SelectType=select/cons_tres
SelectTypeParameters=CR_Core
#
#
# LOGGING AND ACCOUNTING
AccountingStorageType=accounting_storage/none
ClusterName=
#JobAcctGatherFrequency=30
JobAcctGatherType=jobacct_gather/none
#SlurmctldDebug=info
SlurmctldLogFile=/var/log/slurm/slurmctld.log
#SlurmdDebug=info
SlurmdLogFile=/var/log/slurm/slurmd.log
DebugFlags=NO_CONF_HASH
#
#
# COMPUTE NODES
GresTypes=gpu

NodeName=node00 Procs=40 Sockets=2 CoresPerSocket=10 ThreadsPerCore=2 Gres=gpu:rtx4090:2 State=idle
NodeName=node01 Procs=40 Sockets=2 CoresPerSocket=10 ThreadsPerCore=2 Gres=gpu:rtx4090:2 State=idle

PartitionName=debug Nodes=ALL Default=YES MaxTime=INFINITE State=UP
PartitionName=test0 Nodes=node00 Default=YES MaxTime=INFINITE State=UP
PartitionName=gpu Nodes=ALL Default=YES MaxTime=INFINITE State=UP
PartitionName=node Nodes=node01 Default=YES MaxTime=INFINITE State=UP

 

로그 파일이나 spool 파일 경로를 조심해서 작성해야 합니다. 

권한이 없어서 제대로 작동하지 않는 경우가 있습니다. 뭔가 안될 때는 아래 파일이 정상적으로 작성되었는지, 작성되었다면 무슨 내용이 적혀있는지 확인해야 합니다. 그리고 설정에 따라서 파일 경로가 다르기도 합니다. 

/var/log/slurm/slurmctld.log

/var/log/slurm/slurmd.log

 

예전에 설정한 것이 남아있긴 한데 이 파일이 꼭 필요한지 모르겠네요. 

/etc/slurm/gres.conf

Nodename=node00 Name=gpu Type=rtx4090 File=/dev/nvidia[0-1]
Nodename=node01 Name=gpu Type=rtx4090 File=/dev/nvidia[0-1]

 

 

설정 파일을 작성했으면 일단 서버부터 실행해보겠습니다.

sudo systemctl stop slurmctld.service
sudo systemctl enable slurmctld.service
sudo systemctl start slurmctld.service
sudo systemctl status slurmctld.service

 

노드도 시작합니다.

systemctl stop slurmd.service
systemctl enable slurmd.service
systemctl start slurmd.service
systemctl status slurmd.service

 

에러가 있는지 로그를 살펴봅시다. 

/var/log/slurm/slurmctld.log

/var/log/slurm/slurmd.log

 

 

주로 쓰는 명령어는 명령 대기, 실행중인 queue를 보는 squeue와 노드 및 파티션의 상태를 보는 sinfo가 있습니다. 

 

특정 노드에 문제가 생겼거나 유지보수 중에 slurm에서 잡이 안들어가도록 down 처리 하거나 재개할 때 사용하는 명령어 입니다. 

sudo scontrol update NodeName="node_name" State=down Reason=hung_proc
sudo scontrol update NodeName="node_name" State=resume

 

요즘 주로 사용하는 slurm batch script입니다. 

#!/bin/bash
#SBATCH --job-name=gpu # Job name
#SBATCH --partition=gpu # Job name
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=1
#SBATCH --gres=gpu:1
#SBATCH --time=240:00:00 # Time limit hrs:min:sec
#SBATCH --output=debug_%j.log # Standard output and error log

## --mail-user=
## --mail-type=All

pwd; hostname; date

NPROCS=$SLURM_NPROCS
echo NPROCS=$NPROCS
echo CUDA_DEVICES=$CUDA_VISIBLE_DEVICES

sleep 10

date

 

 다음 명령어 로 제출합니다. 

sbatch -J job_name slurm_run.sh

 

 

interactive mode 로 들어갈 수도 있습니다.

srun --partition=debug --nodes=1 --ntasks-per-node=1 --pty bash -i

명령어를 실행하면 필요한 자원이 할당되고 queue에 접속됨

종료: exit