把 GPU 定义成 GRES
目标
同时编写 slurm.conf 和 gres.conf,把 GPU 定义为 GRES,并检查两个文件中的数量是否一致。
为什么重要
GRES 配置错误排名第一的是: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 이 가리키는 장치 총 개수>(占位符依次为 slurm.conf 中通过 Gres 声明的 GPU 总数与 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 줄 수>(占位符为 slurm.conf 中 PartitionName 行的行数)
参考
File=/dev/nvidia[0-3]表示 4 个设备。必须展开范围写法后再计数。- 实际拓扑用
nvidia-smi topo -m确认。 - 第 6 步的数量计算,请用 shell 或 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 声明的 GPU 总数与 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 줄 수>(占位符为 slurm.conf 中 PartitionName 行的行数)
值必须通过解析你编写的配置得到。