slurm 설치 과정
https://equable-tank-4b0.notion.site/Slurm-db5c8fb0682c4da7838e8e84f4b601fb
* 장비 목록
slurm-master2 : 192.168.20.83
slurm-worker1 : 192.168.20.82
slurm-worker2 : 192.168.20.84
==========
1. ntp 설치 -> VM 간 시간 일치 조정
# master, worker nodes 모두 NTP 설치
sudo apt-get install NTP
==========
2. munge, slurm 유저 생성 -> munge와 slurm 을 위해 각각 계정 필요
# 모든 node에서 UID, GID 일치
sudo adduser -u 1111 munge --disabled-password --gecos ""
sudo adduser -u 1121 slurm --disabled-password --gecos ""
=> UID와 GID가 일치해야하는게 포인트인듯.
==========
3. NFS 설치 -> storage 공유를 위해서
# master node
sudo apt install nfs-kernel-server -y
sudo mkdir /storage
sudo chown uclick:uclick /storage
sudo vi /etc/exports
/storage *(rw,sync,no_root_squash,fsid=1,no_subtree_check) # 마지막에 추가 입력
sudo systemctl start nfs-kernel-server.service
상태 확인 ufw status
Status: inactive
# worker node
sudo apt install nfs-common -y
sudo mkdir /storage
sudo chown uclick:uclick /storage
sudo mount slurm-master2:/storage /storage
/storage 들어가서 mount 잘 되었는지 확인.
==========
4. munge 설정
* master node 설정
# munge 설치
sudo apt-get install libmunge-dev libmunge2 munge -y
sudo systemctl enable munge
sudo systemctl start munge
# munge key를 NFS에 복사 후 권한 부여
sudo cp /etc/munge/munge.key /storage/
sudo chown munge /storage/munge.key
sudo chmod 400 /storage/munge.key
* worker node 설정
# munge 설치, NFS에서 key 복사 후 munge 시작
sudo apt-get install libmunge-dev libmunge2 munge
sudo cp /storage/munge.key /etc/munge/munge.key
sudo systemctl enable munge
sudo systemctl start munge
* munge test
munge -n | unmunge | grep STATUS
# munge를 통해서 다른 노드로 접속 가능한지 확인
munge -n | ssh slurm-worker1 unmunge
munge -n | ssh slurm-worker2 unmunge
munge -n | ssh v100-01 unmunge
remunge
===> 중간에 permission error들이 많이 나타나는데 모두
chown -R munge:munge ~ 로 permission 처리 해준다.
==========
5. slurmDB 설정 (master node)
# NFS에서 repo 복사
cd /storage
git clone https://github.com/mknoxnv/ubuntu-slurm.git
# 설치 전 준비
sudo apt-get install git gcc make ruby ruby-dev libpam0g-dev libmariadb-client-lgpl-dev libmysqlclient-dev mariadb-server build-essential libssl-dev -y
sudo gem install fpm
sudo systemctl enable mysql
sudo systemctl start mysql
sudo mysql -u root
# mysql 내에서 password는 /storage/ubuntu-slurm/slurmdbd.conf에서의 StoragePass 값과 동일해야함.
create database slurm_acct_db;
create user 'slurm'@'localhost';
set password for 'slurm'@'localhost' = password('slurmdbpass');
grant usage on *.* to 'slurm'@'localhost';
grant all privileges on slurm_acct_db.* to 'slurm'@'localhost';
flush privileges;
exit
mysql -u slurm -p 로 접속 잘 되는지 확인
cp /storage/ubuntu-slurm/slurmdbd.conf /storage
==========
6. slurm 설치
* Master node 설정
# slurm-23.11.6 deb 파일 빌드
cd /storage
wget https://download.schedmd.com/slurm/slurm-23.11.6.tar.bz2 # slurm 최신 버전
tar -xvf slurm-23.11.6.tar.bz2
cd slurm-23.11.6/
./configure --prefix=/tmp/slurm-build --sysconfdir=/etc/slurm --enable-pam --with-pam_dir=/lib/x86_64-linux-gnu/security/ --without-shared-libslurm
make
make contrib
make install
sudo fpm -s dir -t deb -v 23.11.6 -n slurm-23.11.6 --prefix=/usr -C /storage/slurm-23.11.6 .
sudo dpkg -i slurm-23.11.6_23.11.6_amd64.deb
sudo mkdir -p /etc/slurm /etc/slurm/prolog.d /etc/slurm/epilog.d /var/spool/slurm/ctld /var/spool/slurm/d /var/log/slurm
sudo chown slurm /var/spool/slurm/ctld /var/spool/slurm/d /var/log/slurm
# slurm control, db 서비스 복사
sudo cp /storage/ubuntu-slurm/slurmdbd.service /etc/systemd/system/
sudo cp /storage/ubuntu-slurm/slurmctld.service /etc/systemd/system/
# 서비스 시작 전 slurmdbd.conf 복사
sudo cp /storage/slurmdbd.conf /etc/slurm/
# slurm 서비스 시작
sudo systemctl daemon-reload
sudo systemctl enable slurmdbd
sudo systemctl start slurmdbd
==> 성공
sudo systemctl enable slurmctld
sudo systemctl start slurmctld
==> 실패
* Worker node 설정
cd /storage
sudo dpkg -i slurm-23.11.6_1.0_amd64.deb
sudo cp /storage/ubuntu-slurm/slurmd.service /etc/systemd/system/
sudo systemctl enable slurmd
sudo systemctl start slurmd
==========
7. slurm 설정
# slurm.conf 파일 복사
cp /storage/ubuntu-slurm/slurm.conf /storage/slurm.conf
# slurm 설치 과정에서 다음과 같은 파라미터는 사용이 더이상 안되기에 주석 처리
FastSchedule=1
#모든 노드에서 slurm 설치 시 다음 명령어 사용 가능
#노드의 spec 출력 후 slurm.conf에 복사
sudo slurmd -C
=> slurm.conf 파일 마지막 부분에 spec 관련 정보
# slurm.conf 작성 예시 >
# COMPUTE NODES
GresTypes=gpu
DefMemPerNode=64000
#NodeName=linux1 Gres=gpu:8 CPUs=80 Sockets=2 CoresPerSocket=20 ThreadsPerCore=2 RealMemory=515896 #State=UNKNOWN
NodeName=slurm-master2 CPUs=8 Boards=1 SocketsPerBoard=8 CoresPerSocket=1 ThreadsPerCore=1 RealMemory=3943
NodeName=slurm-worker1 CPUs=8 Boards=1 SocketsPerBoard=8 CoresPerSocket=1 ThreadsPerCore=1 RealMemory=3943
NodeName=slurm-worker2 CPUs=8 Boards=1 SocketsPerBoard=8 CoresPerSocket=1 ThreadsPerCore=1 RealMemory=3943
#PartitionName=debug Nodes=ALL Default=YES MaxTime=INFINITE State=UP
PartitionName=cpu Nodes=slurm-worker1,slurm-worker2 Default=YES MaxTime=INFINITE State=UP
PartitionName=all Nodes=ALL Default=YES MaxTime=INFINITE State=UP
----------------------------------------------------------------------------
GresTypes=gpu
- Generic Resource(Gres)의 유형을 GPU로 인식하는 것. 이를 통해 작업 제출 시 사용자들이 GPU 리소스를 요청할 수 있게 되며, SLURM은 해당 요청에 맞춰 리소스를 할당하고 작업을 스케줄링 가능.
- CPU는 명시하지 않아도 기본적으로 slurm에서 관리되는 자원이다.
- GPU 사용을 위해서라면 /etc/slurm/gres.conf 파일이 필요하다.
=> gres.conf 예시
NodeName=slurm-worker1 Name=gpu File=/dev/nvidia0 CPUs=0-7
NodeName : GPU 서버가 있는 hostname
Name : GPU 사용할거니 gpu
File : GPU가 설치되어 있는 장비의 Nvidia 드라이버 경로. (ls /dev/nvidia* 로 확인)
CPUs = 8개 CPU core 장비 기준 0번 ~ 7번 core 설정 값. 이는 GPU 작업이 해당 노드의 모든 CPU 코어를 이용할 수 있도록 허용
- 그 외 다양한 옵션들을 사용할 수가 있다. (ex> GPU, FPGA, Micron's Automata Processor, 소프트웨어 라이선스)
DefMemPerNode=64000
- 클러스터의 각 노드에 대한 기본적으로 설정되는 메모리 할당량 (MB 단위) : slurm 스케줄러가 작업을 노드에 할당할 때 기본적으로 고려하는 메모리 할당량을 의미
- 사용자가 작업 제출 시 더 많은 메모리를 요청한다면, 그 요청에 따라 더 많은 메모리를 갖춘 노드에서 작업이 실행됨
- 만약에 작업이 할당된 후에 예상보다 더 많은 메모리를 사용하여 실제 메모리 사용이 할당 메모리를 초과한다면, 해당 노드에서 OOM(메모리 부족) 상황이 발생할 수 있다. 이때 Slurm에서나 OS 자체에서 해당 작업 종료시킬 수 있다.
- OOME가 발생하지 않게 하기 위해서는 작업 제출 시 정확한 메모리 요구사항을 명시하게 되는 이유기도 하다.
NodeName=slurm-master2 CPUs=8 Boards=1 SocketsPerBoard=8 CoresPerSocket=1 ThreadsPerCore=1 RealMemory=3943
NodeName=slurm-worker1 CPUs=8 Boards=1 SocketsPerBoard=8 CoresPerSocket=1 ThreadsPerCore=1 RealMemory=3943
NodeName=slurm-worker2 CPUs=8 Boards=1 SocketsPerBoard=8 CoresPerSocket=1 ThreadsPerCore=1 RealMemory=3943
- sudo slurmd -C 통해서 각 node의 스펙을 복사하여 slurm 클러스터에 편입
PartitionName=cpu Nodes=slurm-worker1,slurm-worker2 Default=YES MaxTime=INFINITE State=UP
PartitionName=all Nodes=ALL Default=YES MaxTime=INFINITE State=UP
- cpu 파티션에는 slurm-worker1과 slurm-worker2가 포함되어 있으며, 기본 설정으로 활성화되어 있다.
- all 파티션에는 모든 노드(slurm-master2, slurm-worker1, slurm-worker2)가 포함되어 있으며, 이 역시 기본 설정으로 활성화되어 있다.
=> 만약 slurm-worker1 만을 GPU 파티션에 설정하고 나머지는 CPU 파티션에 설정하고 싶다면 아래와 같이 설정이 가능하다.
PartitionName=gpu Nodes=slurm-worker1 Default=NO MaxTime=INFINITE State=UP
PartitionName=cpu Nodes=slurm-master2,slurm-worker2 Default=YES MaxTime=INFINITE State=UP
PartitionName=all Nodes=slurm-master2,slurm-worker2 Default=YES MaxTime=INFINITE State=UP
# 만약 slurm-master1을 GPU,CPU 작업에 모두 참여시키고 싶으면 마지막 all 파티션에 slurm-master1을 추가로 설정할 수 있다.
PartitionName=all Nodes=slurm-master2,slurm-master1,slurm-worker2 Default=YES MaxTime=INFINITE State=UP
=> all 파티션에 모두 포함되어 있지만 slurm-worker1에만 GPU가 설치되어 있으니, GPU 작업은 자동으로 worker1로만 할당되게 된다.
----------------------------------------------------------------------------
# gres.conf 파일 복사
cp /storage/ubuntu-slurm/gres.conf /storage
# 모든노드에서 .conf 파일 /etc/slurm/으로 복사
# 모든 노드의 slurm.conf 파일의 내용은 동일해야 함. 동일하지 않아도 실행 됨.
sudo cp /storage/ubuntu-slurm/cgroup* /etc/slurm/
sudo cp /storage/slurm.conf /etc/slurm/
sudo cp /storage/gres.conf /etc/slurm/
# worker node에서 다음 디렉토리 생성되어 있는지 확인.
sudo mkdir -p /var/spool/slurm/d
sudo chown slurm /var/spool/slurm/d
# 재시작
# master node
sudo systemctl restart slurmctld
sudo systemctl restart slurmdbd
# worker node
sudo systemctl restart slurmd
# sinfo로 노드 상태 확인
sinfo
=======
## 최종 결과 확인
uclick@slurm-master2:/etc/slurm$ sinfo
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST
cpu up infinite 2 idle slurm-worker[1-2]
all* up infinite 1 unk* slurm-master2
all* up infinite 2 idle slurm-worker[1-2]
위와 같이 내용이 나타나면 slurm 연동 성공
'Nvidia > AI' 카테고리의 다른 글
slurm ~ enroot/pyxis (0) | 2024.05.20 |
---|---|
slurm Admin (0) | 2024.05.20 |
Nvidia Nemo를 이용하여 gemma-7b 모델 사용하기 (0) | 2024.04.25 |
CNN (0) | 2023.09.05 |
영화 리뷰 인공지능 만들기 (0) | 2023.09.05 |