slurm은 리눅스 클러스터 환경에서 많이 사용되는 스케줄러입니다. 비슷한 것으로 pbs, torque 등이 있습니다.
slurm이 gpu 스케줄 관리 기능을 지원하면서 사용자가 늘었습니다.
클러스터에서 잡 관리할 때도 사용할 수 있지만, PC 1대에서도 사용하면 장점이 있습니다.
리눅스에선 기본적으로 유저의 터미널이 끊기면 그 터미널 아래에서 돌아가던 잡은 백그라운드일지라도 중단됩니다.
그래서 nohup이나 screen이나 tmux 같은 여러 툴들을 사용합니다. 스케쥴러를 사용할 수도 있습니다.
다른 툴들에 비해 스케쥴러의 장점이라 한다면, 여러 잡을 순차적으로 돌리고 싶을 때, 한 번에 여러 개의 잡을 제출 해도 동시에 실행되지 않고 순차적으로(queue) 잡이 실행 가능합니다.
그렇긴 해도 클러스터에서 사용할 때 유용성이 더 커집니다. 물론 세팅을 잘해둬야 한다는 문제가 있지만요.
세팅 잘된 클러스터는 정말 사용하기 편하고, 묶지 않고 사용하는 것보다도 훨씬 효율적입니다.
예를 들어 서로 데이터나, 작업환경이 공유되지 않으면 매번 다른 서버에서 일할 때마다 세팅을 해주고 데이터를 옮겨야겠죠.
물론 이런 것들을 세팅하려면 nfs나 luster 같은 저장장치 공유도 필요합니다.
대학원에 처음 입학했을 때는 컴퓨터 견적부터 구매, 조립, 운영체제 설치, 클러스터 세팅, 소프트웨어 세팅 전부 다 했었는데...
요즘엔 그런 것을 하나하나 할 여유가 없네요. 지금은 인터넷이 잘 발달해서 더 쉬워지긴 했지만, 그래도 깊이 파고들 여력이 안됩니다. 스토리지는 이미 잘 공유되어있다고 가정하고 slurm 설정에 대해서만 이야기하려고 합니다.
다른 블로그들을 참고하여 세팅을 했었고, 제가 사용하는 시스템에 맞게 수정했습니다.
slurm 설치 후 정상 작동을 하지 않는 경우에 상당수 원인은 권한 (파일 소유권, 사용권) 문제였습니다. 만약 안되시면 관련 파일들을 찾아보고 권한을 확인해보시는 것을 추천드립니다.
slurm 설치 전에 먼저 세팅해야 할 것들이 있습니다. 당연히 관리자 권한으로 해야 하는 일들이고, 편의상 sudo는 생략될 수도 있습니다.
- 서버와 노드에 스토리지를 공유하고, 서버와 노드에 일관되게 계정을 만듭니다. 같은 uid, gid를 사용해야 합니다.
-
useradd -u "uid" "user"
- -u 옵션을 사용하면 원하는 uid를 부여할 수 있습니다.
- 아니면 이미 존재하는 계정이라면 직접 passwd 파일에서 uid를 고쳐줄 수도 있습니다.
- 리눅스에는 많은 설정 파일들이 존재하고, useradd 같은 명령어는 그 설정 파일에 원하는 정보를 기록하는 기능을 할 뿐입니다. 그러니까 굳이 명령어 없이도 설정 파일들을 직접 고쳐서 세팅할 수도 있습니다.
-
- 서버와 각 노드에 host name을 설정합니다.
- 호스트 네임은 /etc/hostname 파일에서 고쳐줄 수 있습니다.
- /etc/hosts 파일 설정
-
127.0.0.1 localhost 127.0.1.1 server.novelism.co.kr server 192.169.0.11 node1.novelism.co.kr node1 192.169.0.12 node2.novelism.co.kr node2
- 이런 식으로 ip 주소, 도메인(임의로), alias를 기록해줍니다.
- alias를 사용하면 ssh 연결 시에 ip 주소를 전부 입력할 필요 없이 대신 alias를 입력해서 사용할 수 있습니다.
-
- 네트워크를 재시작해줍니다.
-
systemctl restart networking
-
- 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는 클라이언트가 서버를 사용하기 위한 툴입니다.
- sbatch, sinfo, scontrol 등 slurm을 실제로 사용하는데 필요한 명령어들이 포함되어 있습니다.
- 서버, 계산노드에 설치합니다.
- 굳이 서버와 계산 노드가 아니더라도, 특정 컴퓨터에 클라이언트가 설치되어있으면서, slurm.conf가 동일하게 세팅되어있다면 그 컴퓨터에서도 slurm 명령어로 서버와 계산 노드를 제어할 수 있는 것 같습니다.
-
apt-get install slurm-client
- slurm-wlm 공통 프로그램입니다. 위의 프로그램들을 설치하다 보면 의존성 때문에 알아서 설치될 듯...
- slurm.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로 고쳐줍니다.
- 예시: 제가 사용하는 설정 파일을 약간 고친 것입니다.
-
# 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=server ControlMachine=server #ControlAddr=192.168.0.1 # #MailProg=/bin/mail MpiDefault=none #MpiParams=ports=#-# ProctrackType=proctrack/pgid ReturnToService=1 #SlurmctldPidFile=/var/run/slurmctld.pid SlurmctldPidFile=/var/run/slurm-llnl/slurmctld.pid #SlurmctldPort=6817 #SlurmdPidFile=/var/run/slurmd.pid SlurmdPidFile=/var/run/slurm-llnl/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-llnl/slurmctld.log #SlurmdDebug=info SlurmdLogFile=/var/log/slurm-llnl/slurmd.log DebugFlags=NO_CONF_HASH # # # COMPUTE NODES NodeName=node01 NodeAddr=192.168.0.11 Procs=256 Sockets=2 CoresPerSocket=64 ThreadsPerCore=2 State=idle NodeName=node02 NodeAddr=192.168.0.11 Procs=256 Sockets=2 CoresPerSocket=64 ThreadsPerCore=2 State=idle PartitionName=debug Nodes=node01 Default=Yes MaxTime=INFINITE State=UP PartitionName=nodes Nodes=node01, node02 Default=No MaxTime=INFINITE State=UP
- 로그 파일 위치를 디폴트 설정에서 조금 바꿔주었습니다.
- /var/log/slurm-llnl/slurmctld.log ,/var/log/slurm-llnl/slurmd.log
- /var/log/slurm-llnl 폴더를 만들고 권한 변경도 해야 합니다.
- 이렇게만 해도 되는 경우가 있는데, 저는 잘 안돼서 파일을 2개 더 추가했습니다.
- /etc/slurm-llnl/cgroup.conf
-
CgroupMountpoint="/sys/fs/cgroup" CgroupAutomount=yes CgroupReleaseAgentDir="/etc/slurm-llnl/cgroup" AllowedDevicesFile="/etc/slurm-llnl/cgroup_allowed_devices_file.conf" ConstrainCores=yes TaskAffinity=no ConstrainRAMSpace=yes ConstrainSwapSpace=no ConstrainDevices=no AllowedRamSpace=100 AllowedSwapSpace=0 MaxRAMPercent=100 MaxSwapPercent=100 MinRAMSpace=30
- /etc/slurm-llnl/cgroup_allowed_devices_file.conf
-
/dev/null /dev/urandom /dev/zero /dev/sda* /dev/cpu/*/* /dev/pts/*
- slurm.conf를 보시면 몇 개의 파일과 폴더가 필요함을 알 수 있습니다. 이 파일의 소유주는 slurm 이어야 합니다. 그래서 먼저 폴더와 파일을 만들고, 권한을 이전해야 합니다.
-
- 서버 설정:
-
mkdir /var/spool/slurmctld /var/log/slurm-llnl touch /var/log/slurm-llnl/slurmctld.log chown slurm: /var/spool/slurmctld /var/log/slurm-llnl /var/log/slurm-llnl/slurmctld.log chmod 755 /var/spool/slurmctld /var/log/slurm-llnl /var/log/slurm-llnl/slurmctld.log
-
- 서버 서비스 시작
sudo systemctl stop slurmctld.service sudo systemctl enable slurmctld.service sudo systemctl start slurmctld.service sudo systemctl status slurmctld.service
- 노드 설정
-
mkdir /var/spool/slurmd /var/run/slurm-llnl /var/log/slurm-llnl touch /var/log/slurm-llnl/slurmd.log chown -R slurm: /var/spool/slurmd /var/run/slurm-llnl /var/log/slurm-llnl
-
- 노드 서비스 시작
-
systemctl stop slurmd.service systemctl enable slurmd.service systemctl start slurmd.service systemctl status slurmd.service
-
- 참고사항
- 아마도 여기까지 세팅을 해도 환경에 따라서 에러가 날 수도 있는데, 그럴 경우 관련 파일과 폴더의 권한을 확인해보시기 바랍니다.
- 상당수의 에러는 로그 파일에 정보가 남아있으니 로그 파일을 확인해보는 편이 좋습니다.
- /var/log/slurm-llnl/slurmctld.log
- /var/log/slurm-llnl/slurmd.log
- 노드에 문제가 있을 경우 제외하거나 다시 추가하는 명령어
-
sudo scontrol update NodeName="node_name" State=down Reason=hung_proc sudo scontrol update NodeName="node_name" State=resume
-
- slurm uid, gid 설정
- slurm 사용법
- slurm 명령어
- sinfo: 노드 정보 보기
- 옵션: sinfo -N -O "partition,prioritytier,nodeaiot,nodeaddr,cpusstate,cpusload,gres,gresused:30,reson" -S "P,N"'
- alias sinfo2='sinfo -N -O "partition,prioritytier,nodeaiot,nodeaddr,cpusstate,cpusload,gres,gresused:30,reson" -S "P,N"'
- squeue: queue 정보 확인
- sbatch : script로 잡 제출
- srun: 실행파일을 직접 queue에 제출
- scontrol : 노드, queue 제어
- sinfo: 노드 정보 보기
- slurm batch script 예시
-
#!/bin/bash #SBATCH --job-name=debug # Job name #SBATCH --partition=debug # Job name #SBATCH --nodes=1 #SBATCH --ntasks-per-node=256 #SBATCH --time=72: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 sleep 10 date
-
- interactive job submit
- 미리 정해진 스크립트만 돌리는 방식으로는 불편할 때가 있으므로 interactive 모드를 지원함
-
srun --partition=debug --nodes=1 --ntasks-per-node=256 --pty bash -i
- 명령어를 실행하면 필요한 자원이 할당되고 queue에 접속됨
- 종료: exit
- 주의사항
- 서버와 노드에 동일한 디렉터리가 있어야 잡 제출
- 서버의 /home/user/aa/test.sh라는 잡을 던졌는데, node에 /home/user/aa 가 없으면 안 됨
- 이름만 같은 것이 아니라, 실제로 서로 공유되어 내용이 같아야 함
- slurm 명령어
'Computer' 카테고리의 다른 글
bashrc 설정, 생성되는 파일 권한 설정 (5) | 2022.04.18 |
---|---|
VHTS와 병렬 컴퓨팅: 3. job list 파일 공유를 이용한 병렬처리 (0) | 2022.03.28 |
VHTS와 병렬 컴퓨팅: 2. python multiprocessing 을 이용한 분자 처리 (0) | 2022.02.27 |
VHTS와 병렬 컴퓨팅: 1. 기초 개념, file split (0) | 2022.02.27 |
vi 에디터 vimrc 설정 예시 (0) | 2021.10.22 |