Slurm 설치 방법

 

(계속 업데이트 중…)

Slurm 이란 무엇인가?

Slrum은 여러 연산 서버가 돌아가는 환경에서 이를 조율하는 조율자의 역할을 한다. 비유를 하자면, 현악 합주에서 각 연주자가 연산 서버 노드가 될 것이고, 이를 조율하는 지휘자가 slurm 서버가 될 것이다. Slurm을 설치하기로 결심한 이유는, 연구실 서버의 사양이 각기 다르고, 각자 다른 환경에서 실험을 진행하고 있다. 이러한 상황에서 한 서버에서 다른 서버로 넘어가면 환경설정을 다시 해야하고, 서버 수가 많아지면서 각각의 관리가 어렵게 되었다. 다른 이유로는, 하나의 실험 job이 끝나면 다음 실험으로 넘어가는 것이 이상적이다. 즉 서버가 노는 (idle) 상황이 없어야 하는데, 다음 실험을 실행하기 위해서는 또 출근해야 하고, 어느정도 자원이 소모되는지도 관찰하여야 한다. 이러한 이유로 연구실에 slurm 서버를 두기로 결심하게 되었다.

Slurm 설치 가이드

공식 문서

공식 문서를 보면 Quick start라고 주장하지만 이대로 실행하기에는 여러 어려움이 있다. 가장 단순한 방법으로는 apt-get slurm-wlm slurm-wlm-doc을 통하여 apt에 모든 것을 맡길 수 있지만, 이 경우 최신 버전을 받을 수 없는 문제가 있었다. 이것이 문제가 되는 이유는, 각기 다른 slurm 버전의 경우 slurm 서버와 연산 노드간의 통신 프로토콜이 맞지 않아 며칠간 애를 먹었다. 그래서 모든 서버에 모두 동일한 버전의 slurm을 설치하는 것이 좋겠다.

Slurm 설치에 앞서 많~은 준비사항이 있는데 step-by-step으로 따라해보자. 나의 경우 직접 컴파일하고 설치하는 과정을 반복하여 최신 버전으로 설치하였다. (“apt를 써서 편하게 하자…”)

Munge

Munge는 서버 사이에서 인증을 하는 프로토콜이다. Slurm에서는 각 연산 서버간의 통신인증을 위해 munge를 활용하고 있으므로 이를 사전에 설치하여야 한다.

Openssl

OpenSSL Download

Munge를 설치하기에 앞서 munge에 필요한 openssl을 설치하자. 현재 서버에 설치된 버전을 확인해보자.

$ openssl version
OpenSSL 1.1.1l  24 Aug 2021

위의 경우 버전을 출력하는 명령이며, 보통은 1이 설치되어 있을 것이다. 이후 설치 요구사항을 맞추기 위하여 openssl을 설치하자.

가끔 아나콘다에 openssl이 설치되어 있으면 그 친구 먼저 잡히는 경우가 있다. deactivate로 해제시켜서 올바른 openssl이 잡히도록 하자.

(base) $ munge-0.5.15 which openssl
/home/<niceuser>/anaconda3/bin/openssl

다만, anaconda 등의 python이 동작하는 환경에서는 openssl이 anaconda 환경에 설치가 되어 있을 수 있다. anaconda를 해제하고, 아니면 다른 계정에서 작업하는 것을 권한다. (이걸로 일주일간 애먹어서…) 또한 이미 openssl이 설치된 경우라면 이를 삭제하는 작업도 필요하다.

$ sudo ls -al /usr/bin/openssl # 있으면 삭제 후 설치
$ sudo apt remove openssl

소스를 공식 홈페이지에서 직접 다운로드 할 수 있다. Tip을 적자면 서버가 외부 망에 직접 연결 되어 있다면, 우클릭으로 주소를 복사하고 wget <붙여넣은 주소>로 바로 다운로드 하자.

설치는 단순하다. 일반적인 컴파일과 동일하다.

$ tar -xvf <다운 받은 파일명>
$ cd openssl-<버전>
$ ./Configure --prefix=/usr
$ make -j # j 옵션 없어도 되지만 시간을 단축시키자, 서버정도면 코어가 많아서 괜찮을 것이다.
$ sudo make install

이후 심볼릭링크로 바로가기를 만들고, openssl 라이브러리를 연동시키는 작업이 필요하다.

$ sudo ln -s /usr/local/bin/openssl /usr/bin/openssl
$ sudo ldconfig /usr/local/lib64
$ openssl version

참고자료

Munge 설치

이제 정말로 munge를 설치하여보자. 우선 munge를 실행할 user를 아래와 같이 생성하자.

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

각 연산 노드별로 동일한 uid, gid를 가져야 한다. 모든 서버에서 동일하게 세팅한다.

ubuntu와 같은 경우 아래와 같은 명령어로 설치할 수 있다.

apt-get install munge libmunge-dev

혹은 직접 파일을 다운받아 컴파일을 할 수도 있다.

wget https://github.com/dun/munge/releases/download/munge-0.5.15/munge-0.5.15.tar.xz --no-ch
eck-certificate
tar xJf munge-0.5.15.tar.xz
cd munge-0.5.15/
./configure \
	--prefix=/usr \
	--sysconfdir=/etc \
	--localstatedir=/var \
	--runstatedir=/run
make -j32
sudo make install

설치가 완료 되었다면, 인증할 key를 가져오자. 인증할 munge.key는 모든 서버가 공유하여야 한다. 이의 생성은 서버에서

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

로 생성할 수 있다.

생성이 완료되었다면 /etc/munge/munge.key에 생성이 되었을 것이다. key 파일을 모든 서버에 동일하게 복사한 이후, key 파일의 권한을 수정하자.

sudo ls -al /etc/munge/munge.key
sudo chown munge:munge /etc/munge/munge.key
sudo chmod 400 /etc/munge/munge.key

이제 munge 데몬을 실행시키자.

sudo systemctl enable munge
sudo systemctl start munge

munge가 성공적으로 설치 되었는지 아래와 같은 명령을 차례로 실행시켜 확인해 보자. munged -n을 실행하면 key파일이 나오고 munged -n | unmunge를 하면 “STATUS: Success (0)”를 통해 성공함을 확인할 수 있다.

munged -n
munged -n | unmunge
munged -n | ssh <node> unmunge

참고자료

Slurm의 설치

먼저 slurm을 실행할 user를 생성하자.

export SLURMUSER=990
sudo groupadd -g $SLURMUSER slurm
sudo useradd -m -c "SLURM Uid 'N' Gid Emporium" -d /var/lib/slurm -u $SLURMUSER -g slurm -s /sbin/nologin slurm

그리고 다운을 받아 설치하자.

wget https://download.schedmd.com/slurm/slurm-22.05.3.tar.bz2 --no-check-certificate
tar xvf slurm-22.05.3.tar.bz2
cd slurm-22.05.3
./configure --prefix=/usr/local --sysconfdir=/etc/slurm-llnl
make -j32
sudo make install

끝… 이 아니다. slurm에서는 필요한 파일과 디렉토리를 자동으로 생성하지 않기에 직접 생성해 주어야 한다. Spool을 생성하고

mkdir /var/spool/slurmd
chown slurm: /var/spool/slurmd
chmod 755 /var/spool/slurmd

Log 파일도 생성하자.

touch /var/log/slurmd.log
chown slurm: /var/log/slurmd.log

configuration file의 경우 모든 서버 노드가 공유하여야 한다. 이를 생성하였으면 설정된 configuration path에 저장하자. 위의 설치에서 sysconfdir 옵션의 위치가 이에 해당한다. (예, /etc/slurm-llnl)

관리 서버에서는 slurmctld 데몬을 실행하고, 연산 서버에서는 slurmd를 실행하자.

이의 확인이 되었음은

scontrol show nodes
sinfo -a

로 가능하다.

Common error

resolve DNS에 실패하는 경우는 1) slurm.conf 파일의 위치가 잘못 되었거나. (apt-get으로 설치하게 되면 다른 위치에 존재한다. systemctl status slurmd를 통해 위치를 확인할 수 있다.) 2) 혹은 hostname을 찾지 못하는 경우이다.

slurmd: error: resolve_ctls_from_dns_srv: res_nsearch error: Unknown host
slurmd: error: fetch_config: DNS SRV lookup failed
slurmd: error: _establish_configuration: failed to load configs
slurmd: error: slurmd initialization failed

1)의 경우 심볼릭 링크를 통해 맞는 configuration파일을 연결해주자.

sudo ln -s /etc/slurm-llnl/slurm.conf /usr/local/etc/slurm.conf

2)의 경우 /etc/hosts에서 해당 hostname을 추가하자.

만약 에러가 난다면 디버깅 모드로 slurmd -Dcvvv를 통해 로그를 뱉게 하여보자.

연산 노드 사양의 확인

Slurm을 설정할려면 각 연산 노드의 사양을 기입하여야 하는데, slurm이 연산노드에 설치된 상태로

slurmd -C

를 통해 바로 확인할 수 있다. 첫번째 줄을 복사 붙여넣기를 하자.

참고 사이트

Configless slurm