HPC 환경, Slurm 스케줄러 완벽 정복!
HPC 환경에서 Slurm 스케줄러(Slurm Scheduler)의 내부 구조와 동작 원리를 상세히 설명하며, Job 제출부터 종료까지의 라이프사이클(Job Lifecycle)을 다룸
Slurm 클러스터의 핵심 데몬(Daemon)인 slurmctld, slurmd, slurmdbd의 역할과 상호 작용을 설명하고, 자원 관리 정책(Resource Management Policies)을 소개함
실전 예제로 대화형 작업, 배치 작업, Job 배열(Array Job)을 제시하고, QOS, Fairshare, Preemption과 같은 자원 관리 정책을 활용하는 방법을 안내함
Job이 PENDING 상태에서 벗어나지 못하는 경우, squeue 명령어를 활용한 문제 해결 방법과 sacct 명령어를 통한 Job 히스토리 확인 등 실무 팁을 제공함
Slurm 아키텍처: 핵심 데몬과 Job 라이프사이클
Slurm 클러스터는 slurmctld, slurmd, slurmdbd 세 가지 핵심 데몬(Daemon)으로 구성되며, 각 데몬은 HPC 환경에서 중요한 역할을 수행한다.
slurmctld: 클러스터 전체의 자원 상태를 파악하고, Job 스케줄링을 담당하는 중앙 컨트롤러(Central Controller)
slurmd: 각 Worker 노드에서 실행되며, slurmctld의 지시에 따라 Job을 실행하고 관리하는 노드 관리자(Node Manager)
slurmdbd: Job 이력, 자원 사용량, 사용자별 통계 등을 데이터베이스에 기록하는 데이터베이스 데몬(Database Daemon)
사용자가 sbatch 명령어를 통해 Job을 제출하면, slurmctld는 Fairshare, QOS, 파티션 제한 등을 고려하여 가장 적합한 노드를 선택하고, slurmd는 slurmstepd 프로세스를 생성하여 Job을 실행한다.
Worker 노드에서의 Job 실행 과정: slurmstepd와 cgroup
slurmd는 사용자의 코드를 직접 실행하는 대신, slurmstepd 프로세스(Process)를 생성하여 Job 실행을 위임함으로써 시스템 안정성을 확보한다.
slurmstepd 생성: slurmd는 사용자의 코드를 실행하기 전에 slurmstepd라는 별도의 프로세스를 생성하여, 실행 환경을 격리(Isolation)
cgroup을 통한 자원 격리: cgroup 플러그인이 설정된 경우, cgroup을 사용하여 Job의 자원 사용 범위를 제한하고 추적
사용자 권한 실행: slurmstepd는 root 권한으로 시작하여 cgroup 설정 등의 특권 작업을 수행한 뒤, Job을 제출한 사용자의 UID/GID로 자식 프로세스를 생성
이러한 구조를 통해, 사용자의 코드가 예기치 않은 문제를 일으키더라도 slurmd에는 영향이 없도록 설계되었다.
Job 취소 시 프로세스 정리: SIGTERM, SIGKILL, 그리고 cgroup
scancel 명령어를 통해 Job을 취소하거나, Preemption으로 Job이 밀려났을 때, Slurm은 안정적인 프로세스 정리(Process Cleanup)를 수행한다.
SIGTERM 전송: slurmstepd는 cgroup에 속한 Job의 프로세스에 SIGTERM 신호를 보내어, 정리 작업(Cleanup Task)을 요청
Grace Period: KillWait 파라미터에 설정된 유예 시간 동안 프로세스가 정리될 수 있도록 대기
SIGKILL 강제 종료: 유예 시간 이후에도 프로세스가 종료되지 않으면, SIGKILL 신호를 보내어 강제 종료
cgroup 기반 정리: cgroup에 속한 모든 PID를 추적하여, 좀비 프로세스(Zombie Process) 발생을 방지
이러한 메커니즘을 통해, 이전 Job의 좀비 프로세스가 GPU를 점유하는 문제를 방지하고, 다음 Job의 원활한 실행을 보장한다.
실전 예제: 대화형 작업, 배치 작업, Job 배열
Slurm을 활용한 다양한 Job 제출 방식을 통해, HPC 환경에서의 작업 효율성을 극대화할 수 있다.
대화형 작업(Interactive Job): srun 또는 salloc 명령어를 사용하여 GPU 서버에 직접 접속하여 코드를 디버깅
배치 작업(Batch Job): sbatch 명령어를 사용하여 스크립트를 제출하고, 자원이 확보되는 대로 자동으로 실행
Job 배열(Array Job): --array 옵션을 사용하여, 여러 하이퍼파라미터 조합(Hyperparameter Combination)을 한 번에 실행
Job 배열을 활용하면, 하이퍼파라미터 탐색과 같은 반복적인 작업을 효율적으로 수행할 수 있으며, --dependency 옵션을 통해 Job 간의 의존성을 설정하여 파이프라인을 자동화할 수 있다.
자원 관리 정책: QOS, Fairshare, Preemption
Slurm은 QOS, Fairshare, Preemption과 같은 다양한 자원 관리 정책을 통해, HPC 환경에서 자원을 효율적으로 분배하고, 공정한 사용을 보장한다.
QOS(Quality of Service): Job의 중요도에 따라 서로 다른 자원 제한과 우선순위를 적용하여, 긴급한 Job(Emergency Job)의 실행을 보장
Fairshare 스케줄링: 각 그룹(팀/부서)에 할당된 자원 사용 비율에 따라 Job의 우선순위를 결정하여, 자원 사용의 공정성(Fairness)을 확보
Preemption: 높은 우선순위의 Job이 낮은 우선순위의 Job을 밀어내는 메커니즘으로, 긴급한 상황(Emergency Situation)에 대응
이러한 정책들을 적절히 활용하면, HPC 클러스터의 자원 활용도를 높이고, 사용자 간의 형평성을 유지할 수 있다.