HPC 와 Slurm · 노드·파티션·GRES 정의 · 이론
GRES 로 GPU 를 정의하기
한 줄 요약
Slurm 에서 GPU 는 GRES(Generic RESource) 라는 일반화된 장치 자원으로 다뤄진다. 두 파일이 서로 맞아야 한다 — slurm.conf 와 gres.conf.
왜 이게 필요했나
CPU 와 메모리는 Slurm 이 스스로 셀 수 있다. 그런데 GPU 는? FPGA 는? NVMe 는? Slurm 은 이런 것들을 직접 알지 못하므로 관리자가 선언해 주는 구조를 만들었다. 그게 GRES 다.
어떻게 동작하나
두 파일의 역할
| 파일 | 무엇을 적나 | 배포 범위 |
| --- | --- | --- |
| slurm.conf | 어떤 GRES 타입이 존재하고, 각 노드에 몇 개 있는가 | 모든 노드 동일 |
| gres.conf | 그 GRES 가 실제로 어느 장치 파일에 대응하는가 | 노드별로 다를 수 있음 |
slurm.conf 쪽:
GresTypes=gpuNodeName=gpu-node01 ... Gres=gpu:a100:4 State=UNKNOWNgres.conf 쪽:
NodeName=gpu-node01 Name=gpu Type=a100 File=/dev/nvidia[0-3] Cores=0-15둘의 개수가 반드시 일치해야 한다. slurm.conf 에 gpu:a100:8 이라고 적었는데 gres.conf 의 File=/dev/nvidia[0-3] 이면 4개뿐이다. 이 경우 slurmd 가 gres/gpu count reported lower than configured 를 로그에 남기고 노드를 DRAIN 시킨다. 가장 흔한 GRES 설정 오류다.
Cores 와 NUMA 친화도
NodeName=gpu-node01 Name=gpu Type=a100 File=/dev/nvidia0 Cores=0-15NodeName=gpu-node01 Name=gpu Type=a100 File=/dev/nvidia1 Cores=0-15NodeName=gpu-node01 Name=gpu Type=a100 File=/dev/nvidia2 Cores=16-31NodeName=gpu-node01 Name=gpu Type=a100 File=/dev/nvidia3 Cores=16-31Cores= 는 그 GPU 와 물리적으로 가까운(같은 NUMA 노드에 붙은) CPU 코어를 알려 준다. Slurm 은 이 정보로 GPU 와 CPU 를 같은 소켓에 배치해 PCIe 왕복을 줄인다. 대규모 학습에서 이 차이가 몇 퍼센트씩 난다.
실제 토폴로지는 nvidia-smi topo -m 으로 확인한다.
AutoDetect
AutoDetect=nvmlNVML 라이브러리로 GPU 를 자동 탐지한다. 장치 파일과 NUMA 친화도를 알아서 채워 주므로 편하지만, NVML 이 설치돼 있어야 하고 슬럼이 그것과 함께 빌드돼 있어야 한다. 그리고 자동 탐지 결과가 slurm.conf 의 선언과 다르면 여전히 노드가 빠진다 — 자동이 검증까지 대신해 주지는 않는다.
수동 정의는 번거롭지만 명시적이고 재현 가능하다. 폐쇄망이나 이기종 클러스터에서는 수동이 더 안전한 경우가 많다.
MIG
A100/H100 의 MIG 를 쓰면 물리 GPU 하나가 여러 인스턴스로 쪼개진다. 이때는 각 MIG 인스턴스가 별도의 GRES 항목이 되고 Type= 에 프로파일 이름이 들어간다.
NodeName=gpu-node01 Name=gpu Type=1g.10gb File=/dev/nvidia-caps/...MIG 구성이 바뀌면 gres.conf 도 함께 바뀌어야 한다. 이것을 자동화하지 않으면 MIG 재구성 때마다 노드가 빠진다.
GPU 요청
sbatch --gres=gpu:2 train.sh # 타입 무관 2장sbatch --gres=gpu:a100:2 train.sh # a100 2장sbatch --gpus=2 train.sh # 최신 문법sbatch --gpus-per-node=2 --nodes=2 train.sh # 노드당 2장씩 총 4장작업 안에서는 CUDA_VISIBLE_DEVICES 가 자동으로 설정된다. 그 값은 물리 장치 번호가 아니라 0부터 시작하는 논리 번호다. 코드에서 물리 번호를 하드코딩하면 안 되는 이유다.
현장에서 만나는 모습
GPU 개수 불일치. 노드에서 GPU 한 장이 하드웨어 오류로 사라졌는데 설정은 그대로다. slurmd 가 count 불일치를 보고하고 노드가 DRAIN 된다. 이 알람은 오히려 좋은 것이다 — 고장 난 GPU 로 작업이 돌아 이상한 결과가 나오는 것보다 낫다.
Cores= 를 안 적어 성능이 안 나오는 경우. GPU 와 CPU 가 다른 소켓에 배치되면 PCIe 를 건너 데이터가 오간다. 멀티 GPU 학습에서 특히 두드러진다.
다음 실습에서 할 것
slurm.conf 에 GRES 타입과 노드별 GPU 를 선언하고, gres.conf 를 작성하고, 두 파일의 개수 일치를 검증하는 것까지 한다.