HPC 와 Slurm · Slurm 구성요소와 설정 파일 · 이론
slurm.conf 를 정확히 쓰기
한 줄 요약
slurm.conf 는 모든 노드에서 동일해야 하는 단일 진실이다. 한 노드만 다르면 그 노드가 조용히 빠진다.
왜 이게 필요했나
Slurm 설정 오류의 특징은 에러가 늦게, 엉뚱한 곳에서 나타난다는 것이다. 노드가 INVAL 이나 DOWN 으로 빠지고, 로그에는 원인이 한 줄 찍혀 있는데 그걸 안 보면 며칠 헤맨다.
어떻게 동작하나
필수 키
ClusterName=labhub-hpcSlurmctldHost=ctl01SlurmUser=slurmSlurmdUser=rootStateSaveLocation=/var/spool/slurmctldSlurmdSpoolDir=/var/spool/slurmdSlurmctldPidFile=/run/slurmctld.pidSlurmdPidFile=/run/slurmd.pidAuthType=auth/mungeClusterName— 여러 클러스터를 한 DB 로 관리할 때 구분자. 소문자여야 한다.SlurmctldHost— 컨트롤러 호스트 이름. DNS 나 hosts 로 모든 노드에서 해석돼야 한다.SlurmUser— slurmctld 를 돌릴 계정. 보통slurm전용 계정.StateSaveLocation— 큐와 작업 상태가 저장되는 곳. 이 디렉터리를 잃으면 실행 중이던 작업 정보가 사라진다. HA 구성에서는 공유 스토리지에 둔다.
스케줄링과 자원 선택
SchedulerType=sched/backfillSelectType=select/cons_tresSelectTypeParameters=CR_Core_MemoryProctrackType=proctrack/cgroupTaskPlugin=task/cgroup,task/affinitySelectType=select/cons_tres— 자원을 노드 단위가 아니라 코어/메모리/GRES 단위로 쪼개 할당한다. GPU 클러스터에서는 사실상 필수다. 옛 이름은cons_res.SelectTypeParameters=CR_Core_Memory— 코어와 메모리를 둘 다 소비 자원으로 본다. 메모리를 빼면 한 노드에 메모리 초과 작업이 몰려 OOM 이 난다.ProctrackType=proctrack/cgroup— 작업의 프로세스를 cgroup 으로 추적한다. 이게 없으면 작업이 끝나도 자식 프로세스가 남는다.TaskPlugin=task/cgroup— 자원 격리를 cgroup 으로 강제한다. 요청하지 않은 GPU 가 안 보이게 만드는 것이 이 플러그인이다.
노드 정의
NodeName=gpu-node01 Sockets=2 CoresPerSocket=16 ThreadsPerCore=2 CPUs=64 RealMemory=257000 Gres=gpu:a100:8 State=UNKNOWN여기서 가장 자주 나는 실수 두 가지가 있다.
1. CPUs 가 Sockets × 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=UPPartitionName=short Nodes=gpu-node[01-03] MaxTime=01:00:00 Priority=100 State=UPNodes=에 적은 노드가 모두 NodeName 으로 정의돼 있어야 한다. 없는 노드를 참조하면partition ... has unknown node ...경고가 나고 그 노드는 무시된다.Default=YES는 파티션 하나에만 준다.- 범위 표기
gpu-node[01-03]를 쓸 수 있다.
로깅과 상태
SlurmctldLogFile=/var/log/slurm/slurmctld.logSlurmdLogFile=/var/log/slurm/slurmd.logAccountingStorageType=accounting_storage/noneJobAcctGatherType=jobacct_gather/cgroupReturnToService=2ReturnToService=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 키 권한을 맞추고, 일관성 검증 스크립트를 직접 만든다. 채점기가 그 스크립트를 정상 설정과 깨진 설정 양쪽으로 실행한다.