NVIDIA 集合通信库 (NCCL) 可实现针对 NVIDIA GPU 和网络优化的多 GPU 和多节点通信基元。NCCL 是用于多 GPU 深度学习训练的核心软件。它可以处理任何类型的 GPU 间通信,无论是通过 PCI、NVIDIA NVLink 还是网络。它使用先进的拓扑检测、优化的通信图形和调优模型,在 NVIDIA GPU 平台上直接获得出色性能。
在本文中,我们将讨论 NCCL 2.26 中发布的新功能和修复。有关更多详情,请访问 NVIDIA/nccl GitHub 资源库。请注意,NCCL 2.25 版本仅侧重于 NVIDIA Blackwell 平台支持,没有库功能更改。因此,尚未发布该版本的发布文章。
版本亮点
NVIDIA Magnum IO NCCL 是一个旨在优化 GPU 间和多节点通信的库,对于 AI 和 HPC 应用中的高效并行计算至关重要。最新版本的 NCCL 显著提升了性能、监控、可靠性和服务质量。以下功能支持这些改进:
- PAT 优化:CUDA 线程束级优化可改善 PAT 算法并行性。
- 隐式启动顺序:在多个通信器同时使用设备时防止死锁,并检测主机线程竞速启动。
- GPU 内核和网络分析器支持:新事件允许在内核和网络插件级别更全面地描述 NCCL 性能。
- 网络插件 QoS 支持:Communicator 级质量服务 (QoS) 控制,允许用户在通信器之间划分可用网络资源。
- RAS 改进:丰富了有关集合操作的信息,改进了诊断输出,并增强了稳定性。
NCCL 2.26 特性
本节深入探讨以下每个新功能的详细信息:
- PAT 优化
- 隐式启动顺序
- 支持 GPU 内核分析器
- 网络插件 profiler 支持
- 网络插件 QoS 支持
- RAS 改进
PAT 优化
此更改通过分离不同线程束上 PAT 步骤的计算和执行来优化 NCCL 2.23 中引入的 PAT 算法。
与初始实施不同,每个线程将计算 PAT 步骤并一次执行一个步骤,现在一个线程专用于计算 PAT 步骤,并且多达 16 个 warp 可以并行执行来自 16 个不同并行树的 16 个步骤。
在具有许多并行树的情况下,此优化将有所帮助。也就是说,具有至少 32 个秩和小运算的情况,并且算法的线性部分开始限制其性能;通常是大规模的。
隐式启动顺序
当每个设备使用多个 NCCL 通信器时,NCCL 要求用户将所有通信操作(通过 CUDA 流依赖项或同步)的顺序序列化为一致的全局总顺序。否则,如果设备端通信内核在不同秩上的顺序不同,则可能会导致死锁。
NCCL 2.26 可以选择通过添加对由 NCCL_LAUNCH_ORDER_IMPLICIT
控制的隐式启动顺序的支持来放松此要求。如果启用,NCCL 会在已启动的通信内核之间添加依赖项,以确保设备端顺序与主机上的启动顺序相匹配。这使得 NCCL 更易于正确使用,但由于这会增加延迟,因此在默认情况下处于关闭状态。我们鼓励难以调试挂起的用户尝试一下。
即使已启用,用户仍必须确保主机端启动的顺序与所有设备相匹配。通过从每个设备的单个主机线程按确定的顺序启动,即可轻松实现这一点。由默认开启的 NCCL_LAUNCH_RACE_FATAL
控制的互补机制会尝试检测启动到同一设备的多个主机线程之间的竞争。如果触发,操作将中止,并返回错误。
支持 GPU 内核和网络分析器
2.23 中引入的 NCCL 分析器插件接口现在支持 GPU 内核和网络定义事件。

GPU 内核事件
在 2.26 版本之前,NCCL 分析器插件接口仅限于网络代理事件。但是,这些事件仅捕获部分 NCCL 行为,而忽略 GPU。为了解决这一限制,并向分析器用户提供更准确的信息,在 2.26 中,NCCL 核心扩展了新的 kernel 分析器基础设施,允许主机代码监控独立和融合内核 (即分组操作) 中单个集合和点对点操作的进度。
融合核函数会为每个通道的每个运算生成一个事件,允许分析器将其直接关联到原始 NCCL 运算。
每当 NCCL 内核开始或结束执行新操作时,它会将其传达给主机。相应地,NCCL 中的主机代码会调用分析器 startEvent
或 stopEvent
回调函数。
分析器插件接口已通过新的 ncclProfileKernelCh
事件进行扩展,该事件可捕获 NCCL 主机代码观察到的内核活动。其父节点为 ncclProfileColl
或 ncclProfileP2p
事件。
需要注意的是,NCCL 报告的 kernel 事件的准确性受到当前设计的限制,因为当前设计利用 proxy 线程 (也用于推进网络操作) 来监控 GPU 内核活动。这一限制将在未来的 NCCL 版本中得到解决。
网络定义事件
2.23 版本中引入的 NCCL 分析器插件接口仅限于 NCCL 核心事件。但是,用户往往对网络产生的事件感兴趣。为解决 2.26 中的此限制,分析器插件接口已扩展,支持网络定义事件。网络插件开发者现在可以定义特定于插件的事件,并将其传播到分析器插件。
这是通过 NCCL 中的以下扩展程序实现的:
- 新的
ncclProfileNetPlugin
事件:NCCL 在代表网络插件调用分析器时使用的 Wrapper 事件。 - V10 网络插件接口扩展:将这些新事件应用于所有相关的初始化和数据操作功能。
ncclResult_t (*init)(ncclDebugLogger_t logFunction,
ncclProfilerCallback_t profFunction)
ncclResult_t (*isend)(void* sendComm, void* data,
size_t size, int tag, void* mhandle,
void* phandle, void** request)
ncclResult_t (*irecv)(void* recvComm, int n, void** data,
size_t* sizes, int* tags,
void** mhandles, void** phandles,
void** request)
- NCCL 核心分析器回调:由网络插件通过 NCCL 调用分析器。 eHandle:Profiler 插件事件句柄 (事件开始时返回值,事件停止时输入值) 类型:启动 (0) 或停止 (1) 网络定义事件 pHandle:NCCL 核心内部对象的指针,由 NCCL 本身在 isend/irecv 调用期间提供,并由 NCCL 在回调期间将
ncclProfileNetPlugin
事件链接到其父对象 pluginId:网络和分析器插件用于同步网络类型和事件版本的唯一标识符 (如果分析器插件无法识别所提供的 pluginId,则应忽略事件) extData:网络定义事件,提供给分析器回调,并由 NCCL 作为ncclProfileNetPlugin
事件的一部分传播给分析器插件
ncclResult_t (*ncclProfilerCallback_t)(void** eHandle,
int type,
void* pHandle,
int64_t pluginId,
void* extData)
用于kernel和network事件的经过更新的分析器事件层次结构如下所示:
ncclProfileGroup
|
+- ncclProfileColl/ncclProfileP2p
| |
| +- ncclProfileProxyOp
| | |
| | +- ncclProfileProxyStep
| | |
| | +- ncclProfileNetPlugin
| |
| +- ncclProfileKernelCh
ncclProfileProxyCtrl
网络插件 QoS 支持
网络通信中的 QoS 对于确保 HPC 工作负载的良好性能至关重要。例如,在 LLM 训练期间,几种类型的网络通信会重叠,例如 pipeline parallelism (PP) 和 data parallelism (DP) 通信。PP 通信通常驻留在关键路径上,而 DP 通信则不驻留。当这些通信重叠时,两者都会在争夺共享网络资源时遇到减速。通过优先处理关键路径上的通信,应用程序的端到端性能得到显著提高。
为启用 QoS,NCCL 使用 ncclCommInitRankConfig
API 提供每个通信器配置选项。NCCL 现在支持现有 ncclConfig_t
结构中的新 trafficClass
字段。trafficClass
是一个整数,用于抽象表示通信网络流量的 QoS 级别。应用程序可以使用默认值或用户定义的设置来设置此字段。trafficClass
的具体含义由网络系统管理员和网络栈实现者决定。
struct {
...
int splitShare;
int trafficClass; // add trafficClass to communicator
} ncclConfig_t
NCCL 将 trafficClass 传递给网络插件,而无需对其进行修改
网络插件接口还通过新的 ncclNetCommConfig_t
结构进行扩展,该结构包含 trafficClass
,并传递给网络插件中的每个连接。例如,connect 函数会添加输入参数 ncclNetCommConfig_t*
config。
struct {
int trafficClass; // Plugin-specifig trafficClass value
} ncclNetCommConfig_t
ncclResult_t (*connect)(int dev, ncclNetCommConfig_t* config, void* handle, void** sendComm, ncclNetDeviceHandle_v10_t** sendDevComm);
网络插件实现者可以使用 trafficClass
值在其网络数据包中设置特定字段,以启用 QoS。扩展插件接口旨在支持内部和外部网络插件。例如,该值可以传递给 NCCL 内部的 net_ib
插件,如果定义了 trafficClass
,则可用于配置 qpAttr.ah_attr.grh.traffic_class
字段。
RAS 改进
在此版本中,RAS 子系统的大部分更改都是内部增强功能,旨在大规模提高其稳定性和内存占用。用户可见性改进包括:
- 针对每种操作类型,单独报告集合操作计数中的不匹配。这可能有助于识别不确定的启动顺序场景。
- 提供有关未能报告的communicator等级的详细信息。在 2.26 之前,在这种情况下只提供等级号,而 RAS 无法可靠地确定缺乏等级信息是由于该等级无法访问,还是仅仅因为该等级不再是给定的communicator的成员。现在可以区分这两种情况,前者报告为
INCOMPLETE
错误,后者报告为MISMATCH
警告,并具有新的NOCOMM
等级状态 (替换之前使用的UNKNOWN
) 。
特定于 RAS 的修复包括:
- 避免计算图形捕获的collective。根据所使用的collective算法,一些截取图形的collective操作可能会导致collective操作计数在秩之间不同步,从而导致RAS发出假阳性警告。图形捕获collective的计数功能现已禁用。
- 在终止之前清理 RAS 资源。这不仅可以避免来自各种第三方泄漏检测工具的额外噪音,而且如果在不终止进程的情况下动态卸载 libnccl.so 库,还可以避免在仍在运行的 RAS 线程尝试执行未映射的代码时崩溃。
问题修复和次要功能
NCCL 2.26 提供以下额外更新:
- 添加 Direct NIC 支持 (如果 GPU 通过 C2C 连接到 CPU,则适用于连接到 CPU 的 NIC 的 GPUDirect RDMA,通过
NCCL_NET_GDR_C2C
进行控制) - 为 NCCL 诊断消息添加时间戳 (默认情况下,为 WARN 消息启用;可通过
NCCL_DEBUG_TIMESTAMP_LEVELS
和NCCL_DEBUG_TIMESTAMP_FORMAT
进行配置) - 使用 NVLink SHARP 减少内存占用
- 将 Intel Emerald Rapids 和 Sapphire Rapids CPU 的性能数据整合到 NCCL 性能模型中
- 在 nccl.conf 文件中添加对注释行 (以# 开头) 的支持
- 修复了建立连接时split-shared通信器出现的竞争条件
- 修复了
NCCL_CROSS_NIC=1
仍会交替环的性能回归问题,这会破坏 GPU-NIC 关联的环 - 改进了容器环境中的 IB/RoCE GID 检测
- 修复了无阻塞通信的竞争条件,其中对不同communicator的连续集合操作可能导致崩溃
- 修复了 B203 上 NCCL 请求的共享内存超过设备支持的内存的问题
- 修复了当用户中止communicator时,进程线程会旋转网络进度而导致的挂起问题
- 修复了 network plugin 的测试调用返回错误时的挂起问题
- 修复了混合不同架构时 rank 最终可能具有不同通信模式的挂起问题
- 修复了
ncclCommInitRank
和ncclCommFinalize
失败时的双重释放崩溃问题 - 修复了在极少数情况下,config file中指定的一些变量可能会被忽略的问题
总结
NCCL 2.26 引入了一些重要的新功能和改进,包括 PAT 优化、隐式启动排序、GPU 内核分析器支持、网络插件分析器支持、网络插件 QoS 支持和 RAS 改进。
如需详细了解之前的 NCCL 版本,请参阅以下帖子:
- 2.24:使用 NCCL 2.24 实现大规模 Networking 可靠性和 Observability
- 2.23:使用 NVIDIA Collective Communications Library 的新扩展算法和初始化 2.23
- 2.22:NVIDIA Collective Communications Library的显存效率、更快的初始化和成本估算 2.22
详细了解 NCCL 和 NVIDIA Magnum IO。查看点播会议 NCCL:支持多 GPU AI 的 Inter-GPU 通信库 | GTC 25 2025 | NVIDIA On-Demand