中文内容
NVIDIA GB200 NVL72 通过将 NVIDIA NVLink 一致性扩展到整个机架,引入了一种构建 GPU 集群的全新方式。该设计可实现百亿亿次级性能,但也改变了许多调度系统赖以建立的假设。
因此,“机架级局部性”成为一项硬性约束。当工作负载跨越域边界时,性能会急剧下降;如果调度器将网络结构视为尽力而为的树形拓扑,就会以增加队列时间并降低应用性能的方式造成分配碎片化。
为解决这一问题,Slurm workload manager 引入了 topology/block 插件,并通过分段调度持续扩展其能力。该插件使管理员和用户能够将应用特定的 NVLink 需求表达为原子块,而不是松散优化的分配。
本文介绍 NVIDIA GB200 NVL72 架构的独特之处、Slurm 块调度如何帮助优化放置和性能,以及如何配置 topology.yaml、--segment 和相关功能,以便你能够从原型集群迈向生产级机架规模编排。
NVIDIA GB200 NVL72 架构有何独特之处?
NVIDIA GB200 NVL72 是一台单机架 exascale 计算机,代表了 GPU 集群设计的新范式。此前几代服务器在单个机箱内使用 NVIDIA NVLink,而 GB200 NVL72 将这一一致性内存域扩展到整个机架:72 块 NVIDIA Blackwell GPU 跨越 18 个计算托盘,并通过第五代 NVLink 实现统一。

机架内的所有通信都以 NVLink 速度运行:NVIDIA GB200 NVL72 为每块 GPU 提供 1.8 TB/s 的双向吞吐量,总聚合带宽为 130 TB/s。跨越域边界的通信会面临显著的性能下降,通常通过 InfiniBand 或 Ethernet 时为 50 GB/s(400 Gb/s)。
大规模运行 GB200 NVL72 集群需要新的工作负载调度算法,将 NVLink 域作为作业的硬边界来处理。虽然这些新算法对于高效处理工作负载至关重要,但它们也要求管理员对系统碎片化保持关注。topology/block Slurm 插件可在这两个方面帮助用户和管理员。
Slurm 中的块调度是如何工作的?
Slurm 长期以来一直支持拓扑感知的作业调度:topology/tree 插件一直是大规模集群的标准。它将网络计算结构建模为由交换机和节点组成的分层树。虽然 topology/tree 的主要目标是尽量减少作业跨越的交换机数量,但这是一种尽力而为的尝试。作业最终可能会严重分散在多个叶交换机之间,以便更早启动。
对于使用 InfiniBand 结构连接所有计算节点的集群而言,这种权衡是有意义的。相比位于单个叶交换机之下,拆分到多个叶交换机的作业运行速度可能会稍慢一些,但启动时间与性能之间的权衡通常被认为是可以接受的。
GB200 NVL72 和 GB300 NVL72 的引入需要一种新的方法。通过 NVIDIA 与 SchedMD 的共同努力,新的 topology/block 插件在 Slurm 23.11 版本中推出,用于支持 GB200 NVL72 等机架级架构。

如果作业提交的分配请求可以容纳在单个块内(18 个节点或更少),节点将始终从一个块中分配,并且作业不会被碎片化。

在 topology/block 的默认行为下,一个请求 16 个节点的作业会迫使调度器等待单个包含 16 个空闲节点的多节点 NVLink 域。这可能导致作业排队时间增加。实际上,应用程序的 NVLink 连接需求可能小于完整的 NVL72 域。
为了让用户能够将其应用程序的拓扑需求传达给作业调度器,Slurm 为 topology/block 作业引入了 --segment 参数。该参数充当一个可调旋钮,用于定义必须放置在同一块中的原子节点组,并帮助在调度器效率与应用程序的实际硬件局部性需求之间取得平衡。
通过修改此参数,可以显著放宽调度约束。例如,一个请求 12 个节点但指定 --segment=4 的作业可以被拆分到三个独立的块中。如果没有 --segment=4,这个新作业将无法运行,因为没有可用的包含 12 个节点的单个块。

Slurm 块调度如何优化性能?
一个经常让用户感到意外的重要细节是,Slurm 可以将同一作业的多个分段分配到同一个块。
使用分段对于根据工作负载的具体局部性要求优化性能至关重要:张量并行(TP)可能需要小而紧密的分段,以将对延迟敏感的通信保持在高速 NVLink 结构上;而专家并行(EP)可能需要更大的分段大小,以确保 all-to-all 集合操作始终在单个 NVLink 域内执行。
使用较大的分段值(例如 --segment=16)也是一种使节点在各块之间实现均衡分配的方法。图 4 显示了 32 个节点被拆分为块 3 上 18 个节点和块 4 上 14 个节点。改用 --segment=16 则会确保每个块上正好有 16 个节点,如图 5 所示。

Slurm 25.11 中引入的命令行参数 --consolidate-segments 和 --spread-segments 使用户能够影响分段的放置。
如何配置 Slurm 块调度
对于 topology/block,我们建议 Slurm 管理员为集群中的每个 GB200 NVL72 域(18 个节点)定义一个块。对于小于 18 个节点且未指定 --segment 的作业,Slurm 不会跨块边界拆分分配。相反,它会将作业保持在队列中,直到集群中有足够资源可用。
这确保了为该作业分配的所有节点都能够通过 NVLink 进行通信,无论集群当前状态如何,都能提供一致的性能。对于大于 18 个节点且未指定 --segment 的作业,Slurm 会将分配放入所需的最少块数中。
要配置 topology/block,建议依赖 topology.yaml 文件,这是 Slurm 25.05 中引入的一项功能。例如,要定义两个 GB200 NVL72 域,请使用以下脚本:
---
- topology: gb200-nvl72
cluster_default: true
block:
block_sizes:
- 18
blocks:
- block: block01
nodes: node[0001-0018]
- block: block02
nodes: node[0019-0036]
Slurm topology/block 插件支持多级层次化分组,其中第一级可以是 NVL72 域,更高层级的块可以反映计算网络结构设计的物理实际情况,例如跨越数据中心行或数据中心大厅时对性能的影响。
对于计算网络结构采用完整胖树拓扑的 GB200 NVL72 集群,建议仅为多节点 NVLink 域使用单一级别的 Slurm 块,因为跨越叶交换机造成的性能下降并不像跨越 NVLink 域造成的性能下降那样陡峭。最小可调度单元是单个节点(四个 GPU)。
可以使用以下命令验证 Slurm 创建的块拓扑:
$ scontrol show topology BlockName=block01 BlockIndex=0 Nodes=node[0001-0018] BlockSize=18 BlockName=block02 BlockIndex=1 Nodes=node[0019-0036] BlockSize=18
为了充分利用这一新功能,并提交应用程序可受益于额外拓扑要求的作业,集群用户需要使用 --segment 参数提交作业,该参数现在已在集群管理级别启用。当仅需在四个 GPU(一个节点)之间使用 NVLink 时,应使用 --segment=1,因为它能为调度器提供最大的放置灵活性。
可以不建议使用 --segment=18,而推荐使用 --segment=16。这为 Slurm 使用包含已排空或宕机节点的块提供了更多机会。集群管理员还可以决定从指导转为强制执行,拒绝不符合集群准则的作业。这可以通过一个简单的 cli_filter/lua 脚本实现:
function slurm_cli_pre_submit(options, pack_offset)
if options["segment"] == "18" then
slurm.log_error("error: using --segment=18 is currently not allowed.")
return slurm.ERROR
end
return slurm.SUCCESS
end
function slurm_cli_setup_defaults(options, early_pass)
return slurm.SUCCESS
end
function slurm_cli_post_submit(offset, job_id, step_id)
return slurm.SUCCESS
end
$ srun -N18 --segment=18 hostname
srun: error: lua: error: using --segment=18 is currently not allowed.
srun: error: cli_filter plugin terminated with error
如何配置 NVIDIA IMEX
除了配置块调度之外,还应确保用于 NVLink 网络的 NVIDIA IMEX 服务在 Slurm 中得到正确配置,以便在同一多节点 NVLink 域上运行的作业之间实现驱动程序级隔离。
要在 NVLink 域内的节点之间启用 GPU 内存导入和导出,必须在集群的所有计算节点上启动 NVIDIA IMEX 服务。当 IMEX 配置文件是静态的时,推荐的方法是在启动时直接启动 nvidia-imex systemd 服务,并在所有 Slurm 作业中保持同一个服务实例。
建议启用 switch/nvidia_imex 插件(在 Slurm 24.05 中引入),以允许 Slurm 为每个作业管理 IMEX 通道的分配。这可以在作业之间提供驱动程序级隔离,并防止意外干扰。要启用该插件,请在 slurm.conf 中使用以下单行配置:
SwitchType=switch/nvidia_imex
采用这种方法时,IMEX 服务和通道的管理不需要在 Slurm prolog 和 epilog 脚本中使用自定义逻辑。
topology/block 的高级功能有哪些?
在 topology/block 插件首次发布后,NVIDIA 一直与 Slurm 社区密切合作,引入新功能,以便更好地控制 topology/block 插件的行为。
从 Slurm 25.05 开始,你现在可以在 Slurm 拓扑文件中声明不完整的块(节点数少于已定义块大小的块)。你甚至可以声明一个完全没有节点的块作为占位符。这在集群早期阶段非常有用,因为此时一个域中的所有节点可能尚未上线。自 Slurm 24.05 起,也可以在一个域中声明备用节点:只需列出多于已定义块大小的节点即可。
topology.yaml 文件的引入消除了传统方法中的一个主要限制:现在可以在一个 Slurm 集群上同时使用多个拓扑插件,并为每个 Slurm 分区关联不同的拓扑插件。该功能被用于定义一种方式,让集群管理员可以出于故障排查目的绕过 topology/block 插件。这可以通过在 topology.yaml 中定义一个“扁平”拓扑来实现:
- topology: gb200-flat cluster_default: false flat: true
然后在 slurm.conf 中将此拓扑关联到仅限管理员使用的分区:
PartitionName=admin-flat AllowAccounts=admin Default=NO Nodes=nodes[0001-0036] Hidden=YES Topology=gb200-flat
段大小对节点可用性有什么影响?
为了研究适当设置 --segmen t 的重要性,可以使用一个简化的数学模型,展示对于给定作业,段大小对有效可用集群容量的影响。管理员需要了解段大小如何影响节点可用性。

你还可以观察到 --segment=9 的影响:随着节点不可用率 λ 增加,预期可用容量会迅速下降,因为只要有一个节点不可用,该域对于使用 --segment=9 的作业就只能贡献九个节点。而对于 --segment=16,只要不可用节点少于三个,一个域就会贡献 16 个节点。
开始优化你的机架级架构
机架级架构是 AI 计算的未来,而 NVIDIA Blackwell GB200 NVL72 是这一设计的首个迭代版本,随着技术朝着更大的域规模发展。软件基础设施需要演进,以支持这一新范式。Slurm topology/block 插件提供了基础,并体现了继续与 Slurm 社区合作的承诺,以便更轻松地进行大规模部署、理解、优化和运维。
准备好优化你的机架级编排了吗?请查看 Slurm topology.yaml 文档和 NVIDIA MNNVL User Guide,开始在你的 Blackwell 集群上实施块调度。要了解更多信息,请参阅 Unlock Exascale Performance on NVIDIA GB200 NVL72 with Slurm Topology-Aware Job Scheduling。
标签

















