• 作者: Karthik Mandakolathur
  • 机构: NVIDIA

A1 主要贡献

本文主要介绍了NVIDIA Collective Communication Library (NCCL) 2.12版本中的一项关键性能优化。

  • 核心问题: 现代分布式AI训练工作负载(如推荐系统和自然语言处理)严重依赖集合通信(Collective Communications)的性能。特别是all2all这类操作,在拥有数百个GPU的大规模集群中,会产生巨大的消息量($O(N^2)$),容易引发网络拥塞和热点,从而成为性能瓶瓶颈。此外,在某些GPU与NIC(网络接口卡)配比不均衡或通信器只包含部分GPU的拓扑结构下,传统的环形(ring)算法效率低下,甚至无法有效工作。

  • 研究目标: 持续提升NCCL中集合通信的性能,解决大规模分布式训练中的通信瓶颈。

  • 创新点: NCCL 2.12引入了一项名为PXN (PCI × NVLink) 的新功能。其核心创新在于改变了GPU与NIC之间的数据传输路径。PXN允许一个GPU通过高速的NVLink将数据发送到节点内的另一个GPU上,再由后者通过其本地的PCIe总线与NIC通信。这种方式避免了跨越CPU插槽的低速互连(如QPI),保证了数据传输的全带宽。PXN通过这种机制实现了消息聚合和网络流量优化,从而显著提升了all2all的性能,并为all-reduce在特定拓扑下的高效执行提供了更大的灵活性。

A3 背景知识与设计原则

PXN (PCI × NVLink) 的核心机制
NCCL 2.12中引入的新功能称为PXN,即PCI × NVLink,因为它使GPU能够通过NVLink,然后通过PCI与节点上的NIC进行通信。这种方式替代了通过CPU并使用QPI或其他CPU间协议的路径,后者无法提供全部带宽。如此一来,即使每个GPU仍然尝试尽可能多地使用其本地NIC,它也可以在需要时访问其他NIC。

数据传输路径的改变
GPU不再为其本地NIC在本地内存中准备缓冲区,而是通过NVLink在一个中间GPU上准备缓冲区并写入数据。然后,它通知管理该中间GPU对应NIC的CPU代理数据已准备就-绪,而不是通知其自己的CPU代理。尽管GPU-CPU之间的同步可能会因为需要跨越CPU插槽而稍慢一些,但数据本身只使用NVLink和PCI交换机,从而保证了最大的带宽。

在Rail-optimized拓扑中的应用
在图1所示的拓扑中,来自每个DGX系统的NIC-0都连接到同一个叶交换机(L0),NIC-1都连接到同一个叶交换机(L1),以此类推。这种设计通常被称为“rail-optimized”(按通道优化)。Rail-optimized网络拓扑有助于最大化all-reduce性能,同时最小化数据流之间的网络干扰。它还可以通过减轻“rail”之间的连接负载来降低网络成本。PXN利用节点内GPU之间的NVIDIA NVSwitch连接,首先将数据移动到与目标位于同一个“rail”上的GPU,然后将数据发送到目的地,而无需跨越“rail”。这使得消息聚合和网络流量优化成为可能。

图1. Rail-optimized拓扑
图1. Rail-optimized拓扑

优化消息路径示例
在NCCL 2.12之前,图2中的消息需要经过三跳网络交换机(L0、S1和L3),这可能会导致争用并被其他流量拖慢。而通过PXN,在同一对NIC之间传递的消息被聚合起来,以最大化有效的消息速率和网络带宽。

图2. 从DGX-A中的GPU0到DGX-B中的GPU3的消息路径示例
图2. 从DGX-A中的GPU0到DGX-B中的GPU3的消息路径示例

A2 方法细节

消息聚合

多接收(multireceive)功能的实现
借助PXN,一个节点上的所有GPU可以将其数据移动到单个GPU上,以便发送到给定的目的地。这使得网络层能够通过实现一个新的multireceive函数来聚合消息。该函数使得远程CPU代理能够在所有消息准备就绪后,将它们作为一整个包一次性发送出去。

多接收操作示例
例如,如果一个节点上的某个GPU正在执行all2all操作,并且需要从一个远程节点的所有八个GPU接收数据,NCCL会调用一个带有八个缓冲区和相应大小的multireceive操作。在发送端,网络层可以等待所有八个发送操作都准备就绪,然后一次性发送所有八条消息,这对消息速率有显著的提升效果。

连接共享与路由影响
消息聚合的另一个方面是,一个节点上所有GPU到特定目的地的连接现在是共享的。这意味着需要建立的连接数量更少。然而,如果路由算法依赖于大量不同的连接来获得良好的熵(entropy),这也可能会影响路由效率。

PXN对alltoall延迟的改进
图3对比了使用和不使用PXN时完成alltoall集合操作的时间。此外,PXN也为all-reduce操作提供了更灵活的GPU选择。

图3. NCCL 2.12 PXN性能改进
图3. NCCL 2.12 PXN性能改进

PXN提升all2all性能

all2all通信模式的挑战
图4显示,all2all操作涉及每个进程到所有其他进程的通信。换句话说,在一个N-GPU集群中,作为all2all操作一部分交换的消息数量是$O(N^2)$。

图4. 四个参与进程间的all2all集合操作
图4. 四个参与进程间的all2all集合操作

传统方法的局限性
在GPU之间交换的消息是各不相同的,无法使用诸如树/环(用于allreduce)之类的算法进行优化。当你在数百个GPU上运行数十亿参数的模型时,消息的数量会引发拥塞,造成网络热点,并对性能产生负面影响。

PXN的解决方案
如前所述,PXN结合了NVLink和PCI通信,以减少通过二层(second-tier)核心(spine)交换机的流量并优化网络流量。它还通过将多达八条消息聚合成一条来提高消息速率。这两项改进都显著提升了all2all的性能。

在1:1 GPU:NIC拓扑上的all-reduce优化

1:1 GPU:NIC拓扑下的挑战
PXN解决的另一个问题是每个NIC附近只有一个GPU的拓扑情况。传统的环形(ring)算法要求每个NIC附近有两个GPU:数据必须从网络进入第一个GPU,通过NVLink环绕所有GPU,然后从最后一个GPU输出到网络。第一个和最后一个GPU都必须靠近该NIC。第一个GPU必须能够高效地从网络接收数据,而最后一个GPU必须能够高效地通过网络发送数据。如果某个NIC附近只有一个GPU,那么就无法闭合环,必须通过CPU发送数据,这会严重影响性能。

PXN如何解决环形算法问题
有了PXN,只要环中的最后一个GPU能够通过NVLink访问第一个GPU,它就可以将其数据移动到第一个GPU。数据从那里被发送到NIC,从而使所有传输都保持在PCI交换机的局部范围内。

在GPU子集通信中的应用
这种情况不仅与每个PCI交换机上有一个GPU和一个NIC的PCI拓扑相关,当NCCL通信器(communicator)只包含GPU子集时,也可能发生在其他拓扑上。以一个拥有8个GPU并以NVLink超立方网格(hypercube mesh)互连的节点为例(图5)。

图5. NVIDIA DGX-1系统中的网络拓扑
图5. NVIDIA DGX-1系统中的网络拓扑

全GPU通信器下的环形路径
图6显示了当通信器包含系统中所有8个GPU时,可以利用拓扑中可用的高带宽NVLink连接形成一个环。这是可能的,因为GPU0和GPU1共享对同一个本地NIC的访问权限。

图6. NCCL使用的示例环形路径
图6. NCCL使用的示例环形路径

GPU子集通信器下的问题
通信器可以只包含GPU的一个子集。例如,它可以只包含GPU 0、2、4和6。在这种情况下,不跨越“rail”就无法创建环:从GPU 0进入节点的环将不得不从GPU 2、4或6退出,而这些GPU无法直接访问GPU 0的本地NIC(NIC 0和1)。

PXN在GPU子集通信下的优势
另一方面,PXN使得环的形成成为可能,因为GPU 2可以在数据通过NIC 0/1之前,将数据移回到GPU 0。

模型并行下的实际用例
这种情况在模型并行(model parallelism)中很常见,具体取决于模型的分割方式。例如,如果一个模型被分割到GPU 0-3上,而另一个模型运行在GPU 4-7上。这意味着GPU 0和GPU 4负责模型的相同部分,因此需要在所有节点上为所有GPU 0和GPU 4创建一个NCCL通信器,以便为相应的层执行all-reduce操作。没有PXN,这些通信器无法高效地执行all-reduce操作。

PXN带来的模型并行灵活性
到目前为止,实现高效模型并行的唯一方法是将模型分割到GPU 0、2、4、6和1、3、5、7上,这样NCCL子通信器将包含[0,1]、[2,3]、[4,5]和[6,7]而不是[0,4]、[1,5]、[2,6]和[3,7]。新的PXN功能为您提供了更大的灵活性,并简化了模型并行的使用。

A4 实验环境

本文未提供详细的实验环境配置,但根据文中的描述和图示,可以推断出以下信息:
- 硬件配置:
- 平台: 提及了NVIDIA DGX系统,如图1中的DGX-A系统和图5中的DGX-1系统。这些系统内部GPU通过NVSwitch和NVLink高速互连。
- GPU: DGX系统中集成了多个NVIDIA GPU。
- 网络: 节点间通过高速网络(如InfiniBand或Ethernet)连接,并采用了“rail-optimized”拓扑设计,即特定编号的NIC连接到相同的叶交换机。
- 软件配置:
- 核心库: 对比了NCCL 2.12版本(启用PXN)与之前版本的性能。
- 模型与数据集:
- 未指定用于基准测试的具体AI模型或数据集。性能测试是直接针对ncclAlltoall集合操作的延迟进行的。

A5 实验结果

  • 实验内容: 评估NCCL 2.12中引入的PXN功能对alltoall集合通信操作性能的影响。实验通过测量在启用和未启用PXN的情况下,不同消息大小下alltoall操作的完成时间(延迟)来进行对比。

  • 实验结果与分析:

    • 根据图3的性能曲线图,与之前的版本(橙线)相比,启用了PXN的NCCL 2.12(蓝线)在所有测试的消息大小下,alltoall操作的延迟都显著降低。
    • 这一结果证实了PXN通过优化数据路径(利用NVLink)、减少跨交换机的流量以及聚合消息,能够有效减少通信开销,从而大幅提升alltoall操作的性能,实现了文章标题所说的性能“倍增”效果。

A6 结论

NCCL 2.12版本通过引入PXN功能,显著提升了all2all集合通信的性能。这项新功能优化了GPU与网络之间的数据流,特别是在大规模、多节点的分布式训练环境中,能够有效缓解网络瓶颈,提高通信效率。此外,PXN还增强了模型并行等场景下的灵活性和性能。作者鼓励用户下载并使用最新的NCCL版本,以获得这些性能改进。