티스토리 뷰
https://slurm.schedmd.com/quickstart.html
Slurm Workload Manager - Quick Start User Guide
Quick Start User Guide Overview Slurm is an open source, fault-tolerant, and highly scalable cluster management and job scheduling system for large and small Linux clusters. Slurm requires no kernel modifications for its operation and is relatively self-co
slurm.schedmd.com
개요
Slurm은 리눅스 기반 클러스터에서 활용되는 리소스 매니저이다. 서버 여러 대에 퍼져있는 GPU 등의 리소스를 효율적으로 쓸 수 있게 도와준다. 지도교수님이 박사 때 써보시고 감명을 받아 우리 랩 세팅을 하면서 구축했다. 우리 교수님 말고 신임 교수님이 두 분 더 계시는데, 노는 GPU를 최소화하기 위해 세 랩이 힘을 합쳐 클러스터를 구성했다. 랩마다 GPU 수요가 몰리는 기간이 다르니 서로 상부상조 하자는 취지이다. 초기에는 여러 애로사항이 있긴 했지만 구성이 되고 나니 매우 강력하다.
여담인데 세 랩이 클러스터를 구성하면서 교류가 매우 활발하다. 주당 1회 연합 논문읽기 스터디를 진행 중이며, 여러 프로젝트들을 교수님 두 분이서 지도해주시는 등 자원관리 외적으로도 장점이 많다.
2023/03/24 추가
우리 랩 클러스터 세팅에 슬럼이 성공적인 효과를 보면서 학과 클러스터를 구축하는 회의에서 교수님이 슬럼을 홍보했고 다른 교수님들께 장점이 효과적으로 어필되어 이전의 유료 클라우드 서비스를 중단하고 학과 클러스터도 슬럼으로 관리하게 됐다. 학과 클러스터는 8PFlops 급(3090급 220장)이고, 주변 사람들의 만족도는 굉장히 높다. (물론 관리자는 갈려나가야 한다.)
필요성
리소스 매니저/스케줄러는 다음과 같은 목표를 가질 경우 필요하다.
CPU/GPU등의 컴퓨팅 자원을
특정 시간 동안, 다른 유저의 방해를 받지 않고, 독점적으로 쓰게 하고 싶다.
유저가 자원을 요청하면 자원을 빌려주거나, 가용한 자원이 없으면 대기시킨다. 유저는 노드들을 돌며 일일이 nvidia-smi, htop을 찍어보면서 어느 GPU가 비었나 확인하지 않아도 되고, job을 돌려놓고 누가 내 GPU를 사용해 OOM이 뜨지 않을까 노심초사하지 않아도 된다. 또, 다른 사람이 자원을 쓰고 있을 때 수시로 nvidia-smi를 찍어보며 기다리지 않아도 된다.
기능
다음은 내가 써보고 감동한 기능 몇 개이다.
- 리소스 모니터링
간단한 명령어를 통해 현재 GPU를 누가 쓰고 있는지, job이 몇 개 대기 중인지, 노드 상태가 어떤지 등을 알 수 있다. 노드들을 돌면서 nvidia-smi 안 찍어봐도 된다. - 리소스 스케줄링
유저가 요구한 만큼의 자원이 있으면 바로 빌려주고, 없으면 대기시킨다. 자원이 비면 바로 할당시켜준다. 수시로 nvidia-smi 찍어보거나 job 돌리는 사람한테 언제 끝나냐고 물어보지 않아도 된다.
그리고 슬럼은 다른 리소스 매니저보다 더 유연한 스케줄링 정책을 갖고 있다. 대표적으로 backfilling이라는 건데 job들이 리소스를 기다리면서 줄 서있을 때 뒷사람이 할 일이 적다면 먼저 보내주는(할당시켜주는) 기능이다. - Fine-grained resource manging
다른 리소스 매니저에는 없는 굉장히 세부적인 리소스 제한 방식을 제공한다. 이를 통해 권한자 및 관리자는 더 세부적인 리소스 정책을 펼칠 수 있다. 예를 들어 우리 학교의 경우 대학원생의 경우 GPU 몇 개, CPU 몇 개, 메모리 몇 기가, 돌릴 수 있는 job 몇 개, 한번에 제출할 수 있는 job 몇 개, 잡 당 최대 시간 며칠... 그리고 학부연구생의 경우 ... 등 세부적으로 나눠서 관리할 수 있다. Accounting 기능으로 리소스를 수업 당, 팀 당으로도 제한 가능하다.
여담: 저렇게 아름답게 제한하기 위해서 필요한 명령어는 단 2~3줄 정도이다. 실제로 필요한 건 철저한 문서화를 통한 강력한 근거와 신뢰를 줄 수 있는 정책이다. "너가 알아서 대충 몇 개 줘"와 같이 정책에 큰 구멍이 있거나 정책에 관한 문서화가 잘 되어있지 않으면 유저 간 분쟁이 생긴다. 분쟁 해결에 제일 골머리를 앓았다. 슬럼은 정책의 자유도를 높여줄 뿐 분쟁을 해결해주진 않는다. - Job array
Job 하나를 여러 개 복사해서 제출할 수 있다. 완전히 똑같은 건 아니고 각 세션마다 JOB_ARRAY_TASK_ID라는 환경변수 값이 달라진다. 이를 이용해 hyper-parameter search를 할 수 있다. 아님 그냥 seed 만 달리해서 돌릴 수도 있다. - Priority
대기 중인 job이 많을 때 리소스가 비면 먼저 투입되는 순서를 정할 수 있다. 예: 논문 마감이 얼마 남지 않은 사람한테는 높은 priority를 주는 식으로 사용할 수 있다.
FairShare이라는 기능으로 유저의 최근 리소스 사용량을 기반으로 유저의 job 우선순위를 계산하게 할 수도 있다. GPU를 적게 사용한 사람이 job을 제출하면 줄 맨앞으로 보내주는 식이다. (하지만 우리는 GPU를 많이 사용하는 사람들은 계속 GPU를 많이 써야 하기 때문에 도입하진 않았다.) - Preemption
사용하도록 설정하면 높은 priority의 job이 제출되었을 때 강제로 running 중인 priority가 낮은 job을 중단시키고 투입시킬 수 있다. Gang scheduling이라고 한다. 진짜 그 갱 맞다. 중단된 job은 중단된 상태로 냅두거나 requeue라고 해서 자동으로 대기줄 맨 앞으로 보낼 수 있다. - Partition
여러 옵션이 pre-set 되어있는 옵션 집합 정도로 생각하면 될 것 같다. Job을 제출할 때 반드시 하나 이상 명시해야 한다. 파티션마다 노드와 (유저)그룹 또는 슬럼의 기능인 account 등등을 명시해서 노드들을 분리하여 노드 그룹 별 사용자 그룹을 배치할 수 있다. 예: 컴공과 학생은 컴퓨터공학과 소속 노드만 사용 가능하게 하는 식으로 사용할 수 있다. - Requeue
Running 중인 job을 job 주인이 requeue 및 hold 시킬 수 있다. 누군가 급하게 잠깐 쓴다고 할 때 쓰면 좋다. ["B: 나 급한데 잠깐만 쓸게" -> "A: (job을 중단하며) 너 다 쓰면 알려줘" -> "B: 응 고마워" -> "A: 다 썼어?" -> "B: 아니 아직" -> "A: 언제 다 써?" -> ...] 안 해도 된다. - Job 예약 기능
제출된 job을 언제부터 돌릴지 예약할 수 있다. 예: "지금 job A를 돌려버리면 GPU 자리가 없으니까 좀이따 잘 때 시작하게 해놔야지~"
Docs가 상당히 잘 되어있다. (이쁘진 않다.) 그리고 기능도 훨씬 많다. 내가 지금까지 사용한 기능이 체감 상 전체 기능의 5% 정도 되는 것 같다. (2023/03/24 이제는 한 80% 정도 되는 것 같다)
앞으로 쓸 글들
설치부터 굉장히 빡세다. 엔비디아에서 앤서블(Ansible) 기반으로 슬럼과 각종 관리, 모니터링 툴들을 묶어놓은 Deepops라는 레포를 이용해 슬럼을 빠르게 설치하는 법을 알아볼 것이다. 나와 다른 관리자 학생 한 명이 같이 머리를 맞대고 1년 동안 고군분투하며 알아낸 내용들이다. 지금은 내부적으로 설치 steps를 세부적으로 적어놓은 docs를 구축해놨는데 새 관리자 학생이 들어왔을 때 2시간 만에 설치하고 배포할 수 있었던 것을 보면 정리는 나름 잘 해놓은 것 같다.
그리고 각종 리소스 제한 strategy들을 알아볼 것이다.
'[infra] > Slurm' 카테고리의 다른 글
Slurm | Slurm의 유저 인터페이스 (1) | 2023.03.24 |
---|