본문 바로가기
클라우드

slurm 이란?

by CleanCoder 2024. 5. 22.

SLURM은 고성능 컴퓨팅 환경에서 다양한 기능을 활용하면 자원을 효율적으로 관리하고, 사용자 간의 분쟁을 줄이며, 전체 시스템의 성능을 극대화할 수 있다. 


SLURM의 장점

HPC 환경에 최적화

SLURM은 고성능 컴퓨팅 환경에서 대규모 병렬 작업을 효율적으로 관리할 수 있습니다. 백필링, 세부적인 리소스 제한, 공정한 자원 분배 등 HPC 작업에 특화된 다양한 기능을 제공합니다.

세부적인 리소스 관리

SLURM은 매우 세부적인 리소스 제한 및 관리 기능을 제공한다. 사용자는 GPU, CPU, 메모리 등의 자원을 세밀하게 제어할 수 있으며, 사용자 역할에 따른 리소스 제한을 설정할 수 있다.

유연한 스케줄링 정책

SLURM은 다양한 스케줄링 정책을 지원한다. 백필링을 통한 효율적인 자원 활용, 작업 우선순위 설정, 작업 선점 등의 기능을 통해 자원을 최적화할 수 있다.


슬럼(SLURM)을 활용한 효율적인 리소스 관리와 스케줄링

고성능 컴퓨팅(HPC) 환경에서 리소스 관리와 스케줄링은 매우 중요한 요소이다. 수많은 사용자가 제한된 자원을 효율적으로 사용하려면, 리소스 모니터링, 스케줄링, 우선순위 관리 등 다양한 기능이 필요하다. 여기서 소개할 SLURM(Simplified Linux Utility for Resource Management)은 이러한 요구를 충족시키는 강력한 리소스 관리 도구이다.

리소스 모니터링

SLURM을 사용하면 간단한 명령어로 현재 GPU 사용 현황, 대기 중인 작업(job) 수, 노드 상태 등을 실시간으로 확인할 수 있다. 노드별로 일일이 nvidia-smi 명령어를 입력하지 않아도 되며, 전체 시스템의 리소스 상태를 한눈에 파악할 수 있다. 사용자 간의 자원 분쟁을 줄이는 데 큰 도움이 된다.

 

# 현재 클러스터 상태 확인
sinfo

# 특정 노드의 상태 및 사용 현황 확인
scontrol show node <노드명>

 

리소스 스케줄링

SLURM은 사용자가 요구하는 만큼의 자원이 있으면 즉시 할당하고, 없으면 대기시키는 효율적인 스케줄링 시스템을 갖추고 있다. 자원이 비는 즉시 작업을 할당하기 때문에, 사용자는 수시로 nvidia-smi를 확인하거나 다른 사용자에게 작업 완료 시간을 물어보지 않아도 된다. 특히, SLURM의 백필링(Backfilling) 기능은 대기 중인 작업이 많을 때, 자원을 적게 사용하는 작업을 우선 할당하여 전체 시스템의 효율성을 극대화한다.

# 작업 제출
sbatch <스크립트 파일>

# 현재 대기 중인 작업 확인
squeue

 

세부적인 리소스 관리(Fine-grained Resource Management)

SLURM은 다른 리소스 관리 도구와 달리 매우 세부적인 리소스 제한 방식을 제공한다. 관리자는 사용자의 역할에 따라 GPU, CPU, 메모리, 제출 가능한 작업 수, 최대 작업 시간 등을 세부적으로 설정할 수 있다. 예를 들어, 대학원생과 학부연구생의 리소스 사용 한도를 다르게 설정하여 효율적인 자원 분배를 할 수 있다. 이러한 기능은 학과나 팀 단위로도 리소스를 제한할 수 있어, 공정한 자원 사용을 보장한다.

# 리소스 제한 설정 예시 (Slurm configuration 파일)
# /etc/slurm/slurm.conf
AccountingStorageEnforce = limits
GrpCPUMins = 10000
GrpCPUs = 100
GrpJobs = 10

 

Job Array

SLURM의 Job Array 기능을 통해 하나의 작업을 여러 개로 복사하여 제출할 수 있다. 각 작업에는 고유한 JOB_ARRAY_TASK_ID 환경 변수가 할당되며, 이를 활용해 하이퍼파라미터 검색 또는 다른 변수를 사용한 반복 작업을 수행할 수 있다. 예를 들어, 다양한 시드 값을 사용하여 작업을 실행하거나, 여러 파라미터 조합을 테스트할 수 있다.

# Job Array 제출 예시
sbatch --array=1-10 <스크립트 파일>

# 각 작업에서 환경변수 사용 예시 (스크립트 내)
echo "My SLURM_ARRAY_TASK_ID: $SLURM_ARRAY_TASK_ID"

 

우선순위 관리(Prioritization)

SLURM은 대기 중인 작업이 많을 때, 우선순위를 설정하여 리소스를 배분할 수 있다. 논문 마감이 임박한 사용자에게 높은 우선순위를 부여하는 식으로 활용할 수 있다. 또한, FairShare 기능을 통해 최근 리소스 사용량을 기반으로 작업의 우선순위를 자동으로 조정할 수 있다. 이는 자원을 적게 사용한 사용자가 작업을 제출할 때 우선순위를 높여주는 방식으로 작동한다.

# 작업 우선순위 설정 예시
sbatch --priority=1000 <스크립트 파일>

# FairShare 설정 예시 (Slurm configuration 파일)
# /etc/slurm/slurm.conf
PriorityWeightFairshare=100000

 

작업 선점(Preemption)

SLURM은 높은 우선순위의 작업이 제출되었을 때, 낮은 우선순위의 작업을 중단시키고 자원을 재할당할 수 있는 Gang Scheduling 기능을 제공한다. 중단된 작업은 재대기 상태로 전환되거나, 자동으로 대기줄 맨 앞으로 이동할 수 있다. 이러한 기능은 긴급한 작업을 빠르게 처리하는 데 매우 유용하다.

# Preemption 설정 예시 (Slurm configuration 파일)
# /etc/slurm/slurm.conf
PreemptType=preempt/partition_prio
PreemptMode=CANCEL

 

파티션(Partition)

SLURM의 파티션 기능은 미리 설정된 노드 집합으로, 작업 제출 시 반드시 하나 이상의 파티션을 지정해야 한다. 파티션은 기본적으로 노드 집합이며, 사용 가능한 사용자 그룹을 설정하여 특정 노드 집합에 대한 접근을 제한할 수 있다. 예를 들어, 컴퓨터공학과 학생들은 컴퓨터공학과 소속 노드만 사용 가능하게 설정할 수 있다.

# 파티션 설정 예시 (Slurm configuration 파일)
# /etc/slurm/slurm.conf
PartitionName=comp_sci Nodes=c[01-10] Default=YES MaxTime=INFINITE State=UP

 

Requeue 및 Hold

사용자는 실행 중인 작업을 requeue 또는 hold 시킬 수 있다. 이는 누군가 급하게 자원을 사용해야 할 때 매우 유용하다. 예를 들어, 긴급 작업이 발생한 경우 다른 사용자가 자신의 작업을 일시 중단하고, 나중에 재개할 수 있다. 이렇게 하면 자원 사용에 대한 유연성이 높아진다.

# 작업 재대기
scontrol requeue <job_id>

# 작업 일시 중단
scontrol hold <job_id>

# 작업 재개
scontrol release <job_id>

 

작업 예약 기능

SLURM을 사용하면 작업을 예약하여 특정 시간에 실행되도록 설정할 수 있다. 예를 들어, 현재 GPU 자리가 없을 때, 작업을 밤에 시작하도록 예약할 수 있다. 이는 자원을 효율적으로 사용하고, 사용자 편의를 높이는 데 큰 도움이 된다.

# 작업 예약 제출 예시
sbatch --begin=now+2hours <스크립트 파일>



SLURM의 한계와 Kubernetes와의 비교

SLURM(Simplified Linux Utility for Resource Management)은 고성능 컴퓨팅(HPC) 환경에서 뛰어난 리소스 관리 및 스케줄링 도구로 알려져 있지만, 모든 사용 사례에 완벽하지는 않다. 특히, Orchestration 및 배포와 같은 특정 시나리오에서는 제약이 있을 수 있다. 또한, Kubernetes와의 비교를 통해 SLURM의 장점과 단점을 명확히 이해하는 것이 중요하다.

Orchestration 및 배포

SLURM은 주로 HPC 작업을 위해 설계되었기 때문에, 마이크로서비스 아키텍처에서 서비스의 배포 및 오케스트레이션 기능이 부족하다. Kubernetes와 같은 플랫폼이 제공하는 마이크로서비스의 자동화된 체계적 관리는 SLURM에서 구현하기 어렵다.
# SLURM은 마이크로서비스의 자동 스케일링, 서비스 디스커버리, 롤링 업데이트 등을 기본적으로 지원하지 않는다.

VSCode-Jupyter, GUI Debugger 사용의 불편함

SLURM 환경에서 Jupyter Notebook이나 VSCode와 같은 도구를 사용하는 것은 가능하지만, 다소 불편할 수 있다. GPU를 사용하는 작업의 경우 srun으로 GPU를 할당받은 후, 해당 노드에서 다시 VSCode나 Jupyter를 실행해야 한다. 이는 사용자에게 추가적인 작업을 요구하며, 특히 개발 및 디버깅 과정에서 번거로울 수 있다.

# GPU를 할당받은 후 Jupyter Notebook을 실행하는 예시
srun --gres=gpu:1 --pty bash
module load anaconda
jupyter-notebook --no-browser --ip=0.0.0.0 --port=8888



SLURM과 Kubernetes의 결합

HPC 환경에서 SLURM과 Kubernetes를 결합하여 사용하는 경우도 있다. SLURM은 주로 대규모 병렬 작업의 리소스 관리에, Kubernetes는 서비스 배포 및 마이크로서비스 관리에 사용하여 두 시스템의 장점을 극대화할 수 있다.

# 예시: SLURM 작업을 Kubernetes 파드로 실행
kubectl create -f slurm-job.yaml

SLURM과 Kubernetes는 각각의 강점을 살려 특정 환경에서 더 적합한 솔루션을 제공할 수 있다. 사용자 요구에 따라 두 시스템을 조합하여 사용하면, 더욱 효과적인 리소스 관리 및 서비스 배포가 가능하기도 하다.

댓글