New Scaling Algorithm and Initialization with NVIDIA Collective Communications Library 2.23

发表时间: 2025-01

作者: Sylvain Jeaugey

文章主图
文章主图
速读

一句话结论 NVIDIA 在 NCCL 2.23 版本中通过引入对数级扩展的 PAT 算法、多 ID 负载均衡的初始化机制以及节点内用户缓冲区注册功能,解决了大规模集群下小数据量通信和初始化的扩展性瓶颈,并提供了细粒度的性能分析接口。

要解决什么问题 随着深度学习模型和 GPU 集群规模的扩大,多 GPU 及多节点间的通信面临四个具体的底层机制卡点。首先,在大规模集群中进行小数据量的 ReduceScatter 和 AllGather 操作时,传统的通信算法(如递归加倍)网络步骤数过多,扩展性极差。其次,在创建通信器时,NCCL 的引导步骤需要获取所有 rank 的地址,这依赖所有 rank 向同一个已知的唯一 ID 交换地址,这种“多对一”的通信模式在大规模场景下会造成严重的初始化时间瓶颈。第三,NCCL 的默认设计允许用户无需注册和维护任何持久性缓冲区即可工作,这极大地简化了可用性,但也带来了性能妥协:如果没有直接访问权限,NCCL 在传输数据时必须进行更多的控制流操作和缓冲处理,这不仅消耗更多 GPU 资源,还会在移动相同数据量时产生更高开销和多余拷贝,增加了内存子系统压力。最后,随着集群规模增加,性能异常变得越来越难以检测和定位,现有的系统缺乏能够以极低开销为正在运行的作业收集细粒度遥测数据的领域特定诊断工具。

怎么做的 针对上述卡点,NCCL 2.23 在算法、初始化、内存管理和监控四个维度进行了重构。第一,针对 ReduceScatter 和 AllGather 引入了基于 Bruck 算法变体的并行聚合树(PAT)算法。该算法为每个 rank 执行一个移位的二项树,其核心优势在于网络步骤数随节点数呈对数级 $O(\log N)$ 增长,且适用于任意数量的 rank 而不仅限于 2 的幂次方。随着数据量增加,PAT 会逐步增加网络传输次数以保持最小的缓冲需求。目前该算法专为每节点单 GPU 场景设计,完美契合大语言模型训练中张量并行与节点内 NVLink 对齐、其他并行维度跨节点单 GPU 的拓扑。第二,引入全新的 `ncclCommInitRankScalable` 初始化 API。该机制允许在创建通信器时传入多个唯一 ID,NCCL 会将地址交换负载均匀分散到这些 ID 上,只要提供的 ID 数量与通信器规模成比例增长,就能实现恒定的引导时间;同时支持通过 `NCCL_OOB_NET_ENABLE=1` 启用 IB/RoCE 等高速网络进行带外引导通信,并可通过 `NCCL_OOB_NET_IFNAME` 指定网络接口。第三,实现了节点内用户缓冲区注册。用户可通过 `ncclCommRegister` 显式注册或利用 CUDA Graphs 自动捕获(此版本将图分配的 `cudaMalloc` 等调用变为异步以加快捕获),使 NCCL 获得缓冲区的直接访问权限,从而彻底消除节点内节点间的额外拷贝,提升计算与通信的重叠率。该功能覆盖了多节点 NVLink 系统中每个域内的通信,以及除 `ncclReduce` 和 `ncclReduceScatter` 外的所有集合操作与 P2P 操作。第四,设计了层级化的分析器插件 API。通过 32 位事件激活掩码控制监控粒度,将事件按组、集合操作或 P2P 操作、代理进度通道、代理进度步骤等层级严格组织。API 暴露了五个生命周期回调:`init` 接收掩码并返回隔离的上下文对象;`startEvent` 分配并初始化事件返回句柄;`recordEventState` 允许第三方工具(如 PyTorch Kineto)在代理与 GPU 及网络协调传输数据发生状态转换时更新状态;`stopEvent` 标记完成并回收对象;`finalize` 释放资源。

效果如何 本文档为纯工程发布说明与算法设计阐述,作者并未在文中提供具体的数据集、模型规模、硬件配置等实验设置,也未提供任何定量的性能对比基线和图表数据。关于方法的有效性,作者仅基于算法复杂度给出了定性预期:PAT 算法在处理中小型消息时性能更优,且这种优势会随着工作负载规模的扩大而愈发明显。在局限性与代价方面,作者明确指出 PAT 算法当前仅支持每节点一个 GPU 的场景;节点内用户缓冲区注册功能虽然能提升性能,但无法使 `ncclReduce` 和 `ncclReduceScatter` 两个操作从中受益;此外,利用高速网络加速带外通信的功能由于在拓扑检测之前执行,若设备配置错误可能导致问题,因此默认处于禁用状态。此外,更新还包含边缘场景的修复:将默认 IB 超时从 18 增至 20,利用致命 IB 异步事件捕获链路断开错误,在每节点超两个 GPU 的 AMD CPU 上将 P2P 级别设为 PXB,并修复了混合大小操作的性能回归。

背景介绍

NVIDIA集合通信库(NCCL)是为NVIDIA GPU和网络优化的多GPU及多节点通信原语实现。它是多GPU深度学习训练的核心软件组件,负责处理各种GPU间通信,无论是通过PCI、NVLink还是网络。NCCL利用先进的拓扑检测、优化的通信图和调优模型,在NVIDIA GPU平台上实现开箱即用的最佳性能。本文将讨论NCCL 2.23版本中发布的新功能和修复。

主要贡献

NVIDIA Magnum IO NCCL库旨在优化GPU间和多节点通信,这对AI和高性能计算(HPC)应用中的高效并行计算至关重要。此版本的价值在于其新功能:
* 针对ReduceScatter和AllGather的全新PAT算法:引入了基于Brucks算法的并行聚合树(PAT)算法,用于AllGather和ReduceScatter,实现了对数级扩展性。
* 加速初始化:提升了初始化性能,包括能够使用带内网络进行引导通信。
* ncclCommInitRankScalable:一个新的初始化API,用于在创建通信器时使用多个ncclUniqueId,以加速大规模场景下的初始化。
* 节点内用户缓冲区注册:利用已注册的用户缓冲区进行节点内操作,提升性能。
* 新的分析器插件API:提供API钩子以测量细粒度的NCCL性能。

方法细节

PAT对数级扩展算法(用于ReduceScatter和AllGather)

新的ncclCommInitRankScalable API

加速的引导操作

节点内用户缓冲区注册

新的分析器插件API

ncclProfileGroup
+- ncclProfileColl
|  +- ncclProfileProxyOp
|     +- ncclProfileProxyStep
+- ncclProfileP2p
   +- ncclProfileProxyOp
      +- ncclProfileProxyStep

# ncclProfileProxyCtrl

补充细节与修复

实验设置

文章未提供详细的实验环境配置信息,如数据集、模型、硬件(GPU、CPU、网络)或软件(操作系统、代码库)的具体细节。

实验结果

文章主要对新功能进行了定性描述,并未提供定量的实验结果、图表或性能对比数据。文中提到的一些预期性能提升(如PAT算法对中小型消息的性能改善)是基于算法设计原理的推断。

结论

NVIDIA NCCL 2.23版本为优化AI和HPC应用中至关重要的GPU间和多节点通信引入了多项新功能和改进。关键增强功能包括:新的PAT算法、大规模场景下的加速初始化、节点内用户缓冲区注册以及新的分析器插件API。