TT Lab
开始
学习 学习路径 课程

HPC 与 Slurm

把 GPU 定义成 GRES

在 TT Lab 中继续学习

目标

同时编写 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。

步骤

  1. 在 /etc/slurm/slurm.conf 中添加 GresTypes=gpu。
  2. 在三个节点的 NodeName 行中添加 Gres=gpu:a100:4。
  3. 创建 /etc/slurm/gres.conf。三个节点中的每一个都要有一行,包含 NodeName=、Name=gpu、Type=a100、File=,并且 File 必须指向 4 个设备。
  4. 对于 gpu-node01,把设备逐个分成四行来写,/dev/nvidia0 和 /dev/nvidia1 指定为 Cores=0-15,/dev/nvidia2 和 /dev/nvidia3 指定为 Cores=16-31。(另外两个节点可以保持第 3 步的范围写法不变。)
  5. 在 /etc/slurm/slurm.conf 中添加 GPU 专用分区 gpu。Nodes= 为三个节点全部,MaxTime=72:00:00,State=UP。
  6. 把 /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 所指向的设备总数) 两个值必须相同。
  7. 把 /root/slurm/autodetect.txt 创建为下面 3 行。 AUTODETECT=nvml / NEEDS=nvml-library / MANUAL_PRO=reproducible
  8. 把 /root/slurm/gres-report.txt 创建为下面 4 行。 GRESTYPES=gpu / NODES=3 / GPUS_PER_NODE=4 / PARTITIONS=<slurm.conf 의 PartitionName 줄 수>(占位符为 slurm.conf 中 PartitionName 行的行数)

参考

声明 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 行的行数)

值必须通过解析你编写的配置得到。