slurm.confを書く
한국어 원문으로 표시합니다.
목표
요구사항에 맞는 slurm.conf 를 처음부터 작성하고, 일관성 검증 스크립트를 직접 만듭니다.
왜 중요한가
Slurm 설정 오류는 에러가 늦게, 엉뚱한 곳에서 나타납니다. 노드가 INVAL 이나 DOWN 으로 빠지고 로그에 원인이 한 줄 찍혀 있는데, 그걸 안 보면 며칠 헤맵니다. 가장 흔한 두 가지는 CPUs 가 소켓×코어×스레드와 다른 것과 파티션이 정의되지 않은 노드를 참조하는 것입니다. 둘 다 사람이 손으로 계산하다 나는 실수이고, 둘 다 스크립트로 미리 잡을 수 있습니다.
실제 slurmd 는 돌리지 않습니다. 작성한 설정과 검증 스크립트를 채점합니다.
이 실습의 요구사항
- 클러스터 이름
labhub-hpc, 컨트롤러 호스트ctl01 - 노드 3대:
gpu-node01~gpu-node03, 각각 소켓 2 / 소켓당 코어 16 / 코어당 스레드 2 / 메모리 257000MB / GPU a100 4장 - 파티션 2개:
batch(전체 노드, 기본, 최대 24시간),short(전체 노드, 최대 1시간)
단계
/etc/slurm과/root/slurm두 디렉터리를 만드세요./etc/slurm/slurm.conf를 만들고 다음 키를 넣으세요.ClusterName=labhub-hpc,SlurmctldHost=ctl01,SlurmUser=slurm,StateSaveLocation=/var/spool/slurmctld,SlurmdSpoolDir=/var/spool/slurmd,AuthType=auth/munge- 스케줄링 관련 키를 추가하세요.
SchedulerType=sched/backfill,SelectType=select/cons_tres,SelectTypeParameters=CR_Core_Memory,ProctrackType=proctrack/cgroup,TaskPlugin=task/cgroup,task/affinity - 노드 3대를 정의하세요. 각 줄은
NodeName=으로 시작하고Sockets,CoresPerSocket,ThreadsPerCore,CPUs,RealMemory,State를 포함해야 합니다.CPUs값이 소켓×코어×스레드와 일치해야 합니다. - 파티션 2개를 정의하세요.
batch는Default=YES와MaxTime=24:00:00,short는MaxTime=01:00:00입니다. 두 파티션 모두Nodes=에 적은 노드가 4번에서 정의한 것이어야 합니다. - 로그와 계정 관련 키를 추가하세요.
SlurmctldLogFile=/var/log/slurm/slurmctld.log,SlurmdLogFile=/var/log/slurm/slurmd.log,JobAcctGatherType=jobacct_gather/cgroup,ReturnToService=2 munge사용자와 그룹을 만들고,/etc/munge/munge.key를 1024바이트 랜덤 데이터로 생성한 뒤 권한0400, 소유자munge:munge로 설정하세요./root/slurm/validate.sh를 작성하세요. 첫 번째 인자로 slurm.conf 경로를 받아 다음 두 규칙을 검사하고, 위반이 없으면 종료 코드 0, 있으면 0 이 아닌 값으로 끝나야 합니다.- 규칙 1: 모든
NodeName=줄에서CPUs가Sockets × CoresPerSocket × ThreadsPerCore와 같아야 한다 - 규칙 2: 모든
PartitionName=줄의Nodes=에 나오는 노드가NodeName=으로 정의돼 있어야 한다 (범위 표기gpu-node[01-03]를 전개해 확인할 것) 채점기가 여러분의/etc/slurm/slurm.conf(통과해야 함)와/opt/fixtures/slurm/broken/slurm.conf(실패해야 함) 양쪽으로 실행합니다.
- 규칙 1: 모든
참고
- 랜덤 키 생성:
dd if=/dev/urandom of=/etc/munge/munge.key bs=1 count=1024 - 범위 표기 전개:
gpu-node[01-03]→gpu-node01 gpu-node02 gpu-node03. bash 의 중괄호 확장이나 seq 로 처리할 수 있습니다. - 실제 노드의 값은 그 노드에서
slurmd -C를 돌리면 그대로 나옵니다. 손 계산보다 안전합니다. - 흔한 실수 1: 4번에서
CPUs=32처럼 계산을 틀리는 경우. 2×16×2 = 64 입니다. - 흔한 실수 2: 8번 스크립트가 범위 표기를 전개하지 않아 정상 설정도 실패로 판정하는 경우.
설정 디렉터리 준비
/etc/slurm 과 /root/slurm 두 디렉터리를 만드세요.
표준 경로는 /etc/slurm 입니다. 작업용 디렉터리도 따로 만드세요.
기본 키 작성
/etc/slurm/slurm.conf 를 만들고 다음 키를 넣으세요.
ClusterName=labhub-hpc, SlurmctldHost=ctl01, SlurmUser=slurm, StateSaveLocation=/var/spool/slurmctld, SlurmdSpoolDir=/var/spool/slurmd, AuthType=auth/munge
클러스터 이름, 컨트롤러 호스트, 실행 계정, 상태 저장 경로, 인증 방식이 기본입니다.
스케줄러와 자원 선택
스케줄링 관련 키를 추가하세요.
SchedulerType=sched/backfill, SelectType=select/cons_tres, SelectTypeParameters=CR_Core_Memory, ProctrackType=proctrack/cgroup, TaskPlugin=task/cgroup,task/affinity
GPU 클러스터에서는 자원을 코어 단위로 쪼개는 선택 플러그인이 필요합니다. 메모리도 소비 자원에 포함해야 합니다.
노드 정의
노드 3대를 정의하세요. 각 줄은 NodeName= 으로 시작하고 Sockets, CoresPerSocket, ThreadsPerCore, CPUs, RealMemory, State 를 포함해야 합니다. CPUs 값이 소켓×코어×스레드와 일치해야 합니다.
CPUs 는 소켓 × 코어 × 스레드와 일치해야 합니다. 계산을 두 번 확인하세요.
파티션 정의
파티션 2개를 정의하세요. batch 는 Default=YES 와 MaxTime=24:00:00, short 는 MaxTime=01:00:00 입니다. 두 파티션 모두 Nodes= 에 적은 노드가 4번에서 정의한 것이어야 합니다.
Nodes 에 적은 노드가 모두 정의돼 있어야 합니다. 기본 파티션은 하나만 지정합니다.
로그와 계정
로그와 계정 관련 키를 추가하세요.
SlurmctldLogFile=/var/log/slurm/slurmctld.log, SlurmdLogFile=/var/log/slurm/slurmd.log, JobAcctGatherType=jobacct_gather/cgroup, ReturnToService=2
컨트롤러와 노드 각각의 로그 경로가 필요합니다. 자원 수집 플러그인도 지정하세요.
munge 키 준비
munge 사용자와 그룹을 만들고, /etc/munge/munge.key 를 1024바이트 랜덤 데이터로 생성한 뒤 권한 0400, 소유자 munge:munge 로 설정하세요.
키 파일의 권한과 소유자가 정확해야 munged 가 뜹니다. 크기도 정해진 값이 있습니다.
일관성 검증 스크립트
/root/slurm/validate.sh 를 작성하세요. 첫 번째 인자로 slurm.conf 경로를 받아 다음 두 규칙을 검사하고, 위반이 없으면 종료 코드 0, 있으면 0 이 아닌 값으로 끝나야 합니다.
- 규칙 1: 모든
NodeName=줄에서CPUs가Sockets × CoresPerSocket × ThreadsPerCore와 같아야 한다 - 규칙 2: 모든
PartitionName=줄의Nodes=에 나오는 노드가NodeName=으로 정의돼 있어야 한다 (범위 표기gpu-node[01-03]를 전개해 확인할 것) 채점기가 여러분의/etc/slurm/slurm.conf(통과해야 함)와/opt/fixtures/slurm/broken/slurm.conf(실패해야 함) 양쪽으로 실행합니다.
채점기가 정상 설정과 픽스처의 깨진 설정 양쪽으로 실행합니다. 종료 코드로 구분하세요.