Slurm 클러스터 설치 가이드

사전 준비

이 문서는 Ubuntu 22.04 이상에서 Slurm을 설치하는 방법을 설명합니다.

버전 요구사항

Ubuntu 20.04에서는 libpmix-bin, libhdf5-103-1, libhdf5-hl-100 패키지가 설치되지 않는 문제가 있습니다. 22.04 이상을 권장합니다.

네트워크 요구사항

인스턴스 간 방화벽이 있는 경우 다음 포트를 열어야 합니다.

프로토콜 포트 용도
TCP 22 SSH
TCP/UDP 6817 Slurmctld
TCP/UDP 6818 Slurmd
TCP 50001-52000 Srun

데이터베이스 요구사항

Slurm 상태를 외부 저장(Slurmdbd)하려면 MySQL 서버가 필요합니다.

  • 데이터베이스명: slurm_acct_db
  • 권장 MySQL 설정:
innodb_buffer_pool_size=4096M
innodb_log_file_size=64M
innodb_lock_wait_timeout=900
max_allowed_packet=16M

용어 정리

  • [ALL]: 모든 서버에 진행
  • [MASTER]: 마스터 서버에만 진행
  • [COMPUTE]: 연산 서버에만 진행

마스터 서버는 동시에 연산 서버가 될 수 있습니다.

1. Hostname 설정 [ALL]

인스턴스 간 통신에서 Slurm은 도메인명이 아닌 alias를 사용합니다.

vi /etc/hosts

# 하단에 추가
# <IP> <Domain> <Alias>
192.168.0.100 test1.local test1
192.168.0.101 test2.local test2
192.168.0.102 test3.local test3

2. 패키지 설치 및 환경 설정 [ALL]

필수 패키지 설치

sudo apt-get update
sudo apt-get install build-essential fakeroot devscripts equivs \
  libpmix-dev openmpi-bin libpmix-bin \
  libhdf5-103-1 libhdf5-hl-100 libhwloc15 libipmimonitoring6 libjwt0 libmariadb3 librdkafka1 liblua5.3-0

환경 변수 설정

export LD_LIBRARY_PATH=/path/to/pmix/lib:$LD_LIBRARY_PATH
export SLURM_CONF=/etc/slurm/slurm.conf

재부팅 후에도 유지되도록 /etc/environment에 추가합니다.

vi /etc/environment

# 하단에 추가
export LD_LIBRARY_PATH=/path/to/pmix/lib:$LD_LIBRARY_PATH
export SLURM_CONF=/etc/slurm/slurm.conf

디렉토리 생성

mkdir -p /etc/slurm
mkdir -p /var/log/slurm

[COMPUTE] 추가 디렉토리

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

[MASTER] 추가 디렉토리

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

3. Munge 설치 [ALL]

Munge는 Slurm 클러스터 노드 간 접근 제어를 위한 인증 서비스입니다.

사용자 생성 및 패키지 설치

sudo groupadd -g 300 munge
sudo useradd munge -m -d /var/lib/munge -u 300 -g munge -s /usr/sbin/nologin -c "non-privileged user for munged daemon"

sudo apt-get install munge

[MASTER] Munge 키 생성

sudo dd if=/dev/urandom of=/etc/munge/munge.key bs=1c count=4M

# 권한 확인 (결과: -r-------- 1 munge munge)
sudo ls -l /etc/munge/munge.key

sudo chown munge:munge /etc/munge/munge.key
sudo chmod 400 /etc/munge/munge.key

[COMPUTE] Munge 키 복사

Master 노드의 /etc/munge/munge.key를 Compute 노드의 같은 위치로 복사합니다.

sudo chown munge:munge /etc/munge/munge.key
sudo chmod 400 /etc/munge/munge.key

Munge 서비스 시작 [ALL]

sudo systemctl enable munge.service
sudo systemctl start munge.service

[MASTER] Munge 동작 확인

# STATUS: Success 확인
munge -n
munge -n | unmunge
munge -n | ssh -p 22 <COMPUTE_USER>@<COMPUTE_IP> unmunge

4. Slurm 사용자 생성 [ALL]

sudo useradd -u 64030 -g 64030 -d /nonexistent -s /usr/sbin/nologin slurm

5. Slurm 소스코드 빌드 [ALL]

Slurm 릴리스 페이지에서 최신 버전을 다운로드합니다. Slurm은 LTS 정책을 지원하지 않으므로 최신 버전을 사용합니다.

unzip slurm-*.zip
cd slurm-slurm-*
mk-build-deps -i debian/control
debuild -b -uc -us
cd ..

6. Slurm 패키지 설치

패키지 간 의존성이 있으므로 순서대로 설치해야 합니다.

[ALL] 공통 패키지

sudo dpkg -i slurm-smd_<version>_amd64.deb
sudo dpkg -i slurm-smd-libpmi0_<version>_amd64.deb
sudo dpkg -i slurm-smd-libpmi2_<version>_amd64.deb
sudo dpkg -i slurm-smd-client_<version>_amd64.deb

[MASTER] 마스터 패키지

sudo dpkg -i slurm-smd-slurmctld_<version>_amd64.deb
sudo dpkg -i slurm-smd-slurmdbd_<version>_amd64.deb

[COMPUTE] 연산 노드 패키지

# 마스터가 연산 노드도 겸할 경우 마스터에도 설치
sudo dpkg -i slurm-smd-slurmd_<version>_amd64.deb

7. Slurm 환경 설정

[ALL] slurm.conf

vi /etc/slurm/slurm.conf
ClusterName=<클러스터명>
SlurmctldHost=<마스터_alias>
# 고가용성: SlurmctldHost=<백업_마스터_alias>

ProctrackType=proctrack/cgroup
PrologFlags=Contain

ReturnToService=1
SlurmctldPidFile=/run/slurmctld.pid
SlurmctldPort=6817
SlurmdPidFile=/run/slurmd.pid
SlurmdPort=6818
SlurmdSpoolDir=/var/spool/slurmd
SlurmUser=slurm
SrunPortRange=50001-52000

StateSaveLocation=/var/spool/slurmctld
TaskPlugin=task/affinity,task/cgroup

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

SchedulerType=sched/backfill
SelectType=select/cons_tres

AccountingStorageType=accounting_storage/slurmdbd

JobAcctGatherFrequency=30
JobAcctGatherType=jobacct_gather/cgroup
SlurmctldDebug=info
SlurmctldLogFile=/var/log/slurm/slurmctld.log
SlurmdDebug=info
SlurmdLogFile=/var/log/slurm/slurmd.log

# GPU 설정
GresTypes=gpu
NodeName=test1 RealMemory=515821 Sockets=2 CoresPerSocket=16 ThreadsPerCore=2 State=UNKNOWN Gres=gpu:rtx3090:8
NodeName=test2 RealMemory=515671 Sockets=2 CoresPerSocket=16 ThreadsPerCore=2 State=UNKNOWN Gres=gpu:rtx3090:8
NodeName=test3 RealMemory=515675 Sockets=2 CoresPerSocket=16 ThreadsPerCore=2 State=UNKNOWN Gres=gpu:a6000:8

PartitionName=all-partition Nodes=ALL Default=YES MaxTime=INFINITE State=UP

[ALL] gres.conf (GPU 사용 시)

vi /etc/slurm/gres.conf
Nodename=test1 Name=gpu Type=rtx3090 File=/dev/nvidia[0-7]
Nodename=test2 Name=gpu Type=rtx3090 File=/dev/nvidia[0-7]
Nodename=test3 Name=gpu Type=a6000 File=/dev/nvidia[0-7]

[MASTER] slurmdbd.conf

vi /etc/slurm/slurmdbd.conf
AuthType=auth/munge
DbdHost=test1
DebugLevel=info

StorageHost=<MySQL_IP>
StorageLoc=slurm_acct_db
StorageUser=<User>
StoragePass=<Password>

StorageType=accounting_storage/mysql

LogFile=/var/log/slurm/slurmdbd.log
PidFile=/run/slurmdbd.pid
SlurmUser=slurm

[ALL] cgroup.conf

vi /etc/slurm/cgroup.conf
ConstrainCores=yes
ConstrainDevices=yes
ConstrainRAMSpace=yes
ConstrainSwapSpace=yes

8. 권한 설정

[ALL] 설정 파일 권한

sudo chown slurm: -Rv /etc/slurm/

[MASTER] slurmdbd.conf 권한

sudo chmod 700 /etc/slurm/slurmdbd.conf

9. GRUB 수정 [ALL]

Cgroup swap memory 관련 이슈를 해결합니다. 업데이트 후 재부팅이 필요합니다.

vi /etc/default/grub

# GRUB_CMDLINE_LINUX 수정
GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"

sudo update-grub

10. Slurm 서비스 시작

[MASTER] slurmctld, slurmdbd 실행

sudo systemctl enable slurmctld slurmdbd
sudo systemctl start slurmctld slurmdbd
sudo systemctl status slurmctld slurmdbd

[COMPUTE] slurmd 실행

sudo systemctl enable slurmd
sudo systemctl start slurmd
sudo systemctl status slurmd

11. 동작 확인

sinfo

sinfo
# PARTITION      AVAIL  TIMELIMIT  NODES  STATE NODELIST
# all-partition*    up   infinite      3   idle test1,test2,test3

srun

# test3 이외의 노드에서 실행
srun -w test3 hostname
# test3

마무리

Slurm 클러스터 설치가 완료되면 sinfo로 노드 상태를 확인하고 srun으로 작업 실행을 테스트합니다. GPU 노드를 사용하는 경우 gres.conf 설정이 올바르게 되어 있는지 확인합니다.