把 GPU 定义成 GRES
한국어 원문으로 표시합니다.
목표
slurm.conf 와 gres.conf 를 함께 작성해 GPU 를 GRES 로 정의하고, 두 파일의 개수 일치를 검증합니다.
왜 중요한가
GRES 설정 오류 1위는 slurm.conf 의 GPU 개수와 gres.conf 의 장치 개수 불일치입니다. slurm.conf 에 gpu:a100:8 이라고 적었는데 gres.conf 에 File=/dev/nvidia[0-3] 이면 4개뿐이고, slurmd 가 count reported lower than configured 를 남기며 노드를 DRAIN 시킵니다. 이 검증은 배포 전에 스크립트로 자동화해야 하는 대표적인 항목입니다.
그리고 Cores= 로 NUMA 친화도를 알려 주면 Slurm 이 GPU 와 CPU 를 같은 소켓에 배치해 PCIe 왕복을 줄입니다. 대규모 학습에서 이 차이가 몇 퍼센트씩 납니다.
앞 실습(slurm-conf)에서 만든 /etc/slurm/slurm.conf 를 이어서 씁니다.
단계
/etc/slurm/slurm.conf에GresTypes=gpu를 추가하세요.- 세 노드의
NodeName줄에Gres=gpu:a100:4를 추가하세요. /etc/slurm/gres.conf를 만드세요. 세 노드 각각에 대해NodeName=,Name=gpu,Type=a100,File=을 포함한 줄이 있어야 하고,File은 장치 4개를 가리켜야 합니다.gpu-node01에 대해서는 장치를 하나씩 네 줄로 나눠 쓰고,/dev/nvidia0,/dev/nvidia1은Cores=0-15,/dev/nvidia2,/dev/nvidia3은Cores=16-31로 지정하세요. (나머지 두 노드는 3번의 범위 표기 그대로 두어도 됩니다.)/etc/slurm/slurm.conf에 GPU 전용 파티션gpu를 추가하세요.Nodes=는 세 노드 전부,MaxTime=72:00:00,State=UP입니다./root/slurm/gres-check.txt를 다음 두 줄로 만드세요. 값은 설정 파일을 파싱해 얻은 실제 개수입니다.SLURM_CONF_GPUS=<slurm.conf 의 Gres 로 선언된 GPU 총 개수>/GRES_CONF_DEVICES=<gres.conf 의 File 이 가리키는 장치 총 개수>두 값이 같아야 합니다./root/slurm/autodetect.txt를 다음 3줄로 만드세요.AUTODETECT=nvml/NEEDS=nvml-library/MANUAL_PRO=reproducible/root/slurm/gres-report.txt를 다음 4줄로 만드세요.GRESTYPES=gpu/NODES=3/GPUS_PER_NODE=4/PARTITIONS=<slurm.conf 의 PartitionName 줄 수>
참고
File=/dev/nvidia[0-3]는 장치 4개를 뜻합니다. 범위 표기를 전개해 세어야 합니다.- 실제 토폴로지는
nvidia-smi topo -m으로 확인합니다. - 6번의 개수 계산은 셸이나 python3 로 파싱해 구하세요. 손으로 세도 되지만 스크립트로 하면 8번까지 재사용됩니다.
- 흔한 실수 1: 2번에서 노드 하나만 고치고 나머지를 빠뜨리는 경우. 세 노드 모두 필요합니다.
- 흔한 실수 2: 4번에서 장치를 네 줄로 나눈 뒤 3번의 범위 표기 줄을 지우지 않아
gpu-node01의 장치가 8개로 세어지는 경우.
GRES 타입 선언
/etc/slurm/slurm.conf 에 GresTypes=gpu 를 추가하세요.
slurm.conf 최상단 영역에 한 줄이면 됩니다. 여러 타입은 쉼표로 구분합니다.
노드별 GPU 선언
세 노드의 NodeName 줄에 Gres=gpu:a100:4 를 추가하세요.
NodeName 줄에 Gres= 를 추가합니다. 형식은 이름:타입:개수 입니다.
gres.conf 작성
/etc/slurm/gres.conf 를 만드세요. 세 노드 각각에 대해 NodeName=, Name=gpu, Type=a100, File= 을 포함한 줄이 있어야 하고, File 은 장치 4개를 가리켜야 합니다.
노드마다 한 줄씩 쓰거나 장치마다 한 줄씩 쓸 수 있습니다. 범위 표기를 쓰면 간결합니다.
NUMA 친화도 표기
gpu-node01 에 대해서는 장치를 하나씩 네 줄로 나눠 쓰고, /dev/nvidia0, /dev/nvidia1 은 Cores=0-15, /dev/nvidia2, /dev/nvidia3 은 Cores=16-31 로 지정하세요. (나머지 두 노드는 3번의 범위 표기 그대로 두어도 됩니다.)
각 GPU 에 가까운 코어 범위를 적습니다. 장치를 반씩 나눠 두 소켓에 배분하세요.
GPU 전용 파티션
/etc/slurm/slurm.conf 에 GPU 전용 파티션 gpu 를 추가하세요. Nodes= 는 세 노드 전부, MaxTime=72:00:00, State=UP 입니다.
기존 파티션과 별개로 하나 더 정의합니다. 최대 시간을 길게 잡으세요.
개수 일치 검증
/root/slurm/gres-check.txt 를 다음 두 줄로 만드세요. 값은 설정 파일을 파싱해 얻은 실제 개수입니다.
SLURM_CONF_GPUS=<slurm.conf 의 Gres 로 선언된 GPU 총 개수> / GRES_CONF_DEVICES=<gres.conf 의 File 이 가리키는 장치 총 개수>
두 값이 같아야 합니다.
slurm.conf 의 Gres 개수 합과 gres.conf 의 File 범위에서 나오는 장치 수를 비교하세요.
AutoDetect 비교 메모
/root/slurm/autodetect.txt 를 다음 3줄로 만드세요.
AUTODETECT=nvml / NEEDS=nvml-library / MANUAL_PRO=reproducible
자동 탐지와 수동 정의의 트레이드오프를 키=값으로 정리합니다.
GRES 설계 보고서
/root/slurm/gres-report.txt 를 다음 4줄로 만드세요.
GRESTYPES=gpu / NODES=3 / GPUS_PER_NODE=4 / PARTITIONS=<slurm.conf 의 PartitionName 줄 수>
값은 작성한 설정을 파싱해 얻어야 합니다.