LabHub
배우기 러닝패스 코스

HPCとSlurm

slurm.confを正確に書く

LabHub 에서 이어서 보기

한국어 원문으로 표시합니다.

한 줄 요약

slurm.conf모든 노드에서 동일해야 하는 단일 진실이다. 한 노드만 다르면 그 노드가 조용히 빠진다.

概念マップ: 모든 노드에서 동일해야 하는 단일 진실・에러가 늦게, 엉뚱한 곳에서 나타난다・DNS 나 hosts 로 모든 노드에서 해석돼야 한다.・큐와 작업 상태가 저장되는 곳.

왜 이게 필요했나

Slurm 설정 오류의 특징은 에러가 늦게, 엉뚱한 곳에서 나타난다는 것이다. 노드가 INVAL 이나 DOWN 으로 빠지고, 로그에는 원인이 한 줄 찍혀 있는데 그걸 안 보면 며칠 헤맨다.

어떻게 동작하나

필수 키

ClusterName=labhub-hpc
SlurmctldHost=ctl01
SlurmUser=slurm
SlurmdUser=root
StateSaveLocation=/var/spool/slurmctld
SlurmdSpoolDir=/var/spool/slurmd
SlurmctldPidFile=/run/slurmctld.pid
SlurmdPidFile=/run/slurmd.pid
AuthType=auth/munge

스케줄링과 자원 선택

SchedulerType=sched/backfill
SelectType=select/cons_tres
SelectTypeParameters=CR_Core_Memory
ProctrackType=proctrack/cgroup
TaskPlugin=task/cgroup,task/affinity

노드 정의

NodeName=gpu-node01 Sockets=2 CoresPerSocket=16 ThreadsPerCore=2 CPUs=64 RealMemory=257000 Gres=gpu:a100:8 State=UNKNOWN

여기서 가장 자주 나는 실수 두 가지가 있다.

  1. CPUsSockets × CoresPerSocket × ThreadsPerCore 와 다르다. 이 경우 slurmctld 가 Low socket*core*thread count 로 노드를 INVAL 상태에 넣는다.
  2. RealMemory 를 실제 물리 메모리보다 크게 잡는다. 노드가 보고하는 값보다 크면 Low RealMemory 로 DOWN 된다. 반대로 너무 작게 잡으면 메모리를 낭비한다. OS 가 쓰는 몫을 빼고 잡는 것이 관례다 — 256GB 노드면 RealMemory=257000 정도(MB 단위).

노드의 실제 값은 slurmd -C 로 확인할 수 있다. 그 출력을 그대로 붙여 넣는 것이 가장 안전하다.

파티션 정의

PartitionName=batch Nodes=gpu-node[01-03] Default=YES MaxTime=24:00:00 State=UP
PartitionName=short Nodes=gpu-node[01-03] MaxTime=01:00:00 Priority=100 State=UP

로깅과 상태

SlurmctldLogFile=/var/log/slurm/slurmctld.log
SlurmdLogFile=/var/log/slurm/slurmd.log
AccountingStorageType=accounting_storage/none
JobAcctGatherType=jobacct_gather/cgroup
ReturnToService=2

ReturnToService=2 는 DOWN 된 노드가 유효한 설정으로 다시 등록하면 자동 복귀하게 한다. 기본값 0 은 관리자가 명시적으로 RESUME 해야 한다.

변경 후

scontrol reconfigure            # 대부분의 변경은 이것으로 반영
systemctl restart slurmctld     # 일부 핵심 변경은 재기동 필요
scontrol show config | head -40

설정 파일을 모든 노드에 배포하는 것을 잊지 마라. 한 노드만 다르면 그 노드가 조용히 빠진다. 그래서 대부분의 클러스터는 /etc/slurm 을 공유 스토리지에 두거나 형상 관리로 배포한다.

현장에서 만나는 모습

slurmd -C 출력을 그대로 쓰지 않아 생기는 문제. 손으로 계산하다 ThreadsPerCore 를 빼먹거나 하이퍼스레딩을 잘못 세면 노드가 INVAL 로 빠진다. 그 노드에서 slurmd -C 를 돌려 나온 줄을 그대로 붙이는 것이 가장 확실하다.

다음 실습에서 할 것

요구사항에 맞는 slurm.conf 를 처음부터 작성하고, munge 키 권한을 맞추고, 일관성 검증 스크립트를 직접 만든다. 채점기가 그 스크립트를 정상 설정과 깨진 설정 양쪽으로 실행한다.