사전 준비
이 문서는 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 설정이 올바르게 되어 있는지 확인합니다.