Improved Performance and Monitoring Capabilities with NVIDIA Collective Communications Library 2.26
Improved Performance and Monitoring Capabilities with NVIDIA Collective Communications Library 2.26
文章标题:通过NVIDIA NCCL 2.26提升性能与监控能力
作者:Kamil Iskra
A1 主要贡献
NVIDIA Magnum IO NCCL是一个旨在优化GPU间和多节点间通信的库,对于AI和HPC应用中的高效并行计算至关重要。最新发布的NCCL在性能、监控、可靠性和服务质量方面带来了显著改进。这些改进通过以下新功能实现:
- PAT优化:通过CUDA warp级别的优化,提升了PAT算法的并行性。
- 隐式启动顺序:防止当一个设备被多个通信器同时使用时可能发生的死锁,并检测主机线程启动时的竞争情况。
- GPU内核和网络分析器支持:新增事件,允许在内核和网络插件层面更全面地表征NCCL性能。
- 网络插件QoS支持:提供通信器级别的服务质量(QoS)控制,允许用户在不同通信器之间划分可用的网络资源。
- RAS改进:丰富了集合操作的信息,改进了诊断输出,并增强了稳定性。
A3 背景知识
NCCL简介。 NVIDIA Collective Communications Library (NCCL) 是一个为NVIDIA GPU和网络优化的多GPU及多节点通信原语实现库。它是多GPU深度学习训练的核心软件组件,能够处理任何类型的GPU间通信,无论是通过PCI、NVIDIA NVLink还是网络。NCCL利用先进的拓扑检测、优化的通信图和调优模型,旨在NVIDIA GPU平台上实现开箱即用的最佳性能。
版本说明。 本文主要讨论NCCL 2.26版本中发布的新功能和修复。值得注意的是,NCCL 2.25版本的发布完全专注于对NVIDIA Blackwell平台的支持,没有库功能上的变更,因此未发布该版本的相关文章。
A2 方法细节
本节深入探讨了NCCL 2.26各项新功能的细节。
PAT优化
通过在不同warp上分离计算和执行来优化PAT算法。 此项变更是对NCCL 2.23中引入的PAT算法的优化。与初始实现中每个线程计算并逐一执行PAT步骤不同,新实现中有一个专用的线程负责计算PAT步骤,而多达16个warp可以并行执行来自16个不同并行树的16个步骤。
新优化的适用场景。 这种优化将有助于那些拥有大量并行树的场景,即至少有32个rank和小型操作,并且算法的线性部分开始限制其性能的场景,这通常发生在大规模计算中。
隐式启动顺序
放宽对通信操作序列化的用户要求以避免死锁。 当在单个设备上使用多个NCCL通信器时,NCCL要求用户将所有通信操作的顺序(通过CUDA流依赖或同步)序列化为一个一致的全局总顺序。否则,如果设备端的通信内核在不同rank上的排序不同,就可能导致死锁。NCCL 2.26通过增加对隐式启动顺序的支持,有选择地放宽了这一要求,该功能由NCCL_LAUNCH_ORDER_IMPLICIT环境变量控制。启用后,NCCL会在已启动的通信内核之间添加依赖关系,确保设备端的执行顺序与主机端的启动顺序相匹配。这使得NCCL更易于正确使用,但由于会增加延迟,因此默认是关闭的。我们鼓励遇到难以调试的挂起问题的用户尝试启用此功能。
确保主机端启动顺序一致性及竞争检测。 即使用户启用了隐式启动顺序,仍必须确保所有设备的主机端启动顺序保持一致。最简单的方法是通过每个设备的单个主机线程以确定性的顺序进行启动。一个补充机制由NCCL_LAUNCH_RACE_FATAL环境变量控制(默认开启),它会尝试检测多个主机线程向同一设备启动时的竞争情况。如果检测到竞争,操作将被中止并返回错误。
GPU内核和网络分析器支持
扩展分析器接口以支持GPU内核和网络事件。 NCCL 2.23版本中引入的NCCL分析器插件接口,现在已扩展支持GPU内核和网络定义的事件。
GPU内核事件
引入内核分析器基础设施以监控GPU活动。 在2.26版本之前,NCCL分析器插件接口仅限于网络代理事件,这些事件只捕捉了NCCL行为的一部分,忽略了GPU层面。为了解决这一限制并向分析器用户提供更准确的信息,NCCL 2.26的核心部分扩展了一个新的内核分析器基础设施,该设施允许主机代码监控独立内核和融合内核(即分组操作)中单个集合操作和点对点操作的进展。
融合内核的事件生成。 融合内核为每个通道的每一次操作生成一个事件,这使得分析器能够将这些事件直接与原始的NCCL操作关联起来。
事件通信与回调机制。 每当NCCL内核开始或结束执行一项新操作时,它会向主机发送通知。相应地,NCCL中的主机代码会调用分析器的startEvent或stopEvent回调函数。
新的事件类型及当前实现的局限性。 分析器插件接口扩展了一个新的ncclProfileKernelCh事件,用于捕获NCCL主机代码观察到的内核活动。该事件的父事件为ncclProfileColl或ncclProfileP2p。需要注意的是,NCCL报告的内核事件的准确性受到当前设计的限制,该设计利用了同时也用于推进网络操作的代理线程来监控GPU内核活动。这一限制将在未来的NCCL版本中得到解决。
网络定义的事件
扩展分析器接口以支持网络插件定义的事件。 NCCL 2.23版本中引入的分析器插件接口仅限于NCCL核心事件。然而,用户通常对网络层面产生的事件更感兴趣。为了解决这一局限性,2.26版本扩展了分析器插件接口,增加了对网络定义事件的支持。网络插件的开发者现在可以定义特定于插件的事件,并将它们传播到分析器插件。
实现网络事件支持的NCCL扩展。 这一功能通过NCCL中的以下扩展得以实现:
* 新的ncclProfileNetPlugin事件:这是一个包装器事件,当NCCL代表网络插件调用分析器时使用。
* 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:分析器插件事件句柄(在事件开始时作为返回值,在事件停止时作为输入值)。type:启动(0)或停止(1)一个网络定义的事件。pHandle:指向NCCL核心内部对象的指针,由NCCL在isend/irecv调用期间提供,用于在回调期间将ncclProfileNetPlugin事件链接到其父事件。pluginId:唯一标识符,由网络插件和分析器插件用于同步网络类型和事件版本(如果分析器插件不识别提供的pluginId,则应忽略该事件)。extData:网络定义的事件,提供给分析器回调,并由NCCL作为ncclProfileNetPlugin事件的一部分传播到分析器插件。
ncclResult_t (*ncclProfilerCallback_t)(void** eHandle,
int type,
void* pHandle,
int64_t pluginId,
void* extData)
更新后的分析器事件层级结构。 考虑到内核和网络事件,更新后的分析器事件层级结构如下:
ncclProfileGroup
+- ncclProfileColl/ncclProfileP2p
+- ncclProfileProxyOp
+- ncclProfileProxyStep
+- ncclProfileNetPlugin
+- ncclProfileKernelCh
+- ncclProfileProxyCtrl
网络插件QoS支持
QoS对HPC工作负载性能的重要性。 在网络通信中,服务质量(QoS)对于确保HPC工作负载的良好性能至关重要。例如,在LLM训练期间,流水线并行(PP)和数据并行(DP)通信等多种网络通信会发生重叠。PP通信通常位于关键路径上,而DP通信则不是。当这些通信重叠时,它们会因争夺共享网络资源而同时减速。通过优先处理关键路径上的通信,可以显著提高应用程序的端到端性能。
NCCL中QoS的实现机制。 为了实现QoS,NCCL通过ncclCommInitRankConfig API提供了一个按通信器配置的选项。NCCL现在在现有的ncclConfig_t结构中支持一个新的trafficClass字段。trafficClass是一个整数,作为通信器网络流量QoS级别的抽象表示。应用程序可以使用默认值或用户定义的设置来设置该字段。trafficClass的具体含义由网络系统管理员和网络协议栈实现者确定。
struct {
int splitShare;
int trafficClass;
} ncclConfig_t
NCCL将trafficClass不加修改地传递给网络插件。
QoS参数在NCCL与网络插件间的传递。 网络插件接口也扩展了一个新的ncclNetCommConfig_t结构,它包含了trafficClass并被传递给网络插件中的每个连接。例如,connect函数增加了一个输入参数ncclNetCommConfig_t* config。
struct {
int trafficClass;
} ncclNetCommConfig_t
ncclResult_t (*connect)(int dev, ncclNetCommConfig_t* config, void* handle, void** sendComm, ncclNetDeviceHandle_v10_t** sendDevComm);
网络插件对QoS参数的应用。 网络插件的实现者可以使用trafficClass值来设置其网络数据包中的特定字段以启用QoS。扩展的插件接口设计用于支持内部和外部网络插件。例如,该值可以传递给NCCL内部的net_ib插件,如果定义了trafficClass,它可用于配置qpAttr.ah_attr.grh.traffic_class字段。
RAS改进
RAS子系统的内部增强。 本版本对RAS(可靠性、可用性和可服务性)子系统的大部分更改是内部增强,旨在提高其在大规模部署时的稳定性和内存占用。
用户可见的RAS改进。 用户可见的改进包括:
- 按操作类型报告失配:针对每种操作类型分别报告集合操作计数的失配情况。这可能有助于识别非确定性的启动顺序场景。
- 提供未报告rank的详细信息:在2.26之前,当某个rank未能报告时,只提供rank编号,RAS无法可靠地区分信息缺失是由于该rank无法访问,还是因为该rank已不再是当前通信器的成员。现在这两种情况可以被区分:前者报告为
INCOMPLETE错误,后者报告为MISMATCH警告,并附带一个新的NOCOMMrank状态(取代了之前使用的UNKNOWN)。
RAS相关的特定修复。 具体的RAS修复包括:
* 避免计算图捕获的集合操作:根据所使用的集合算法,一些图捕获的集合操作可能导致rank间的集合操作计数不同步,从而引发RAS的假阳性警告。目前已禁用对图捕获集合操作的计数。
* 终止前清理RAS资源:这不仅避免了各种第三方内存泄漏检测工具产生的额外干扰,也避免了在libnccl.so库被动态卸载而进程未终止时,仍在运行的RAS线程尝试执行已被卸载的代码而导致的崩溃。
A7 补充细节
NCCL 2.26还提供了以下额外的更新和修复:
- 新增Direct NIC支持:为通过C2C连接到CPU的GPU所连接的NIC添加了GPUDirect RDMA支持,可通过
NCCL_NET_GDR_C2C进行控制。 - 为诊断消息添加时间戳:默认对
WARN级别的消息开启,可通过NCCL_DEBUG_TIMESTAMP_LEVELS和NCCL_DEBUG_TIMESTAMP_FORMAT进行配置。 - 减少NVLink SHARP的内存使用。
- 更新性能模型:将Intel Emerald Rapids和Sapphire Rapids CPU的性能数据整合到NCCL性能模型中。
- 支持配置文件中的注释:在
nccl.conf文件中添加了对以#开头的注释行的支持。 - 修复了拆分共享通信器在连接建立期间的竞争条件。
- 修复了一个性能回归问题:即
NCCL_CROSS_NIC=1仍会交替使用环形拓扑,破坏了环的GPU-NIC关联性。 - 改进了容器环境中的IB/RoCE GID检测。
- 修复了非阻塞通信中的竞争条件:在不同通信器上连续执行集合操作可能导致崩溃。
- 修复了B203上的一个错误:NCCL请求的共享内存超过了设备支持的上限。
- 修复了因进度线程在网络上空转导致的挂起问题:此问题发生在用户中止通信器时。
- 修复了当网络插件的
test调用返回错误时导致的挂起问题。 - 修复了混合不同架构时导致的挂起问题:该问题可能导致ranks最终采用不同的通信模式。
- 修复了在
ncclCommInitRank和ncclCommFinalize失败时的双重释放崩溃问题。 - 修复了一个罕见错误:在特定情况下,配置文件中指定的某些变量可能会被忽略。
A4 实验环境
本文档是一篇关于NCCL 2.26新功能的发布说明,未提供详细的实验环境配置。
A4 实验结果
本文档主要介绍NCCL 2.26的新功能和改进,未包含具体的实验结果和性能对比数据。
A5 结论
NCCL 2.26引入了多项重要的新功能和改进,包括PAT优化、隐式启动顺序、GPU内核分析器支持、网络插件分析器支持、网络插件QoS支持以及RAS改进。这些增强功能共同提升了NCCL的性能、可监控性和大规模环境下的稳定性。
💬 评论讨论
欢迎在这里分享您的想法和见解!