FAST INTER-GPU COMMUNICATION WITH NCCL FOR DEEP LEARNING TRAINING, AND MORE

SYLVAIN JEAUGEY, DAVID ADDISON

目录


多GPU计算 (MULTI-GPU COMPUTING)

NCCL是多GPU计算的关键通信库,针对所有平台进行了优化,从桌面级到DGX Superpod。

NCCL代码可在https://developer.nvidia.com/nccl下载,并在NGC容器中可用。源代码位于https://github.com/nvidia/nccl

不同GPU互联方式示例 (Page 2)
图示展示了不同GPU互联方式的硬件配置:
- PCI: 多个GPU通过PCIe连接。
- NVLink: 多个GPU通过NVLink连接。
- NVLink + Infiniband: 多个GPU通过NVLink连接,并与Infiniband网络接口卡连接,用于多节点通信。

深度学习训练 (DEEP LEARNING TRAINING)

从数据到AI (From data to AI)

深度学习过程包括从数PB级数据到AI的转化,涉及训练和推理两个主要阶段。

深度学习流程概览 (Page 4)
- 数据: 兆字节级别的数据。
- 训练: 需要8到数千个GPU,高功耗、高内存,训练时间从1小时到1周。NCCL旨在使多GPU训练尽可能高效,以减少训练时间。
- 推理: 在嵌入式设备或数据中心进行,低功耗、低内存,推理时间从1毫秒到1秒。

单GPU上的深度学习训练 (On a single GPU)

在单个GPU上进行深度学习训练时,数据经过处理,计算出梯度,更新模型参数以最小化误差。

单GPU深度学习训练示意图 (Page 5)
图示:数据流入GPU进行计算,产生梯度,并更新模型参数以减少误差。

多GPU上的深度学习训练 (On multiple GPUs)

在多GPU训练中,每个GPU处理一部分数据并计算局部梯度。然后,通过NCCL AllReduce操作聚合这些局部梯度,形成全局梯度,并用于更新所有GPU上的模型参数。

多GPU深度学习训练示意图 (Page 7)
图示:多个GPU并行处理数据,每个GPU计算局部梯度。NCCL AllReduce操作将局部梯度汇集并分发全局梯度,然后用于更新每个GPU上的模型参数。

AllReduce 性能 (ALLREDUCE PERFORMANCE)

AllReduce的性能对于多GPU和多节点深度学习训练至关重要。

AllReduce总线带宽性能比较 (Page 9)
该图表展示了NCCL在不同互连技术和硬件配置下的AllReduce总线带宽(GB/s):
- 多GPU(PCI/NVLink):
- PCI Gen4: 24 GB/s
- PCI Gen5: 48 GB/s
- NVLink2 (V100): 122 GB/s
- NVLink3 (A100): 232 GB/s
- NVLink4 (H100): 330-350 GB/s
- NVLink4 SHARP (H100): 500+ GB/s

  • 多节点(IB/RoCE/TCP/IP):
    • 100GbE, TCP/IP Sockets: 10 GB/s
    • 100Gb IB/RoCE: 12 GB/s
    • 8x 100Gb (DGX-2): 82 GB/s
    • 8x 200Gb (DGX A100): 192 GB/s
    • 8x 400Gb (DGX H100): 330-350 GB/s
    • 8x 400Gb SHARP (DGX H100): 500+ GB/s

深度学习训练:NCCL性能为何关键 (Why NCCL performance is critical)

NCCL的性能对于实现高效的深度学习训练扩展至关重要。

不同互联下深度学习训练扩展性能 (Page 10)
该图表比较了两种不同互联方式下的深度学习训练性能:

1. DL训练规模扩展,PCI Gen 3 + 100G:

  • 效率: 77%
  • 最大加速比: 640x
  • 图表显示,随着GPU数量的增加(从1/256/256到2048/64K/32),训练时间(尤其是Allreduce部分)显著增加,导致整体加速比低于理想情况。

2. DL训练规模扩展,NVLink + 8x200G:
- 效率: 97%
- 最大加速比: 4800x
- 图表显示,在NVLink + 8x200G互联下,随着GPU数量的增加,训练时间(尤其是Allreduce部分)保持在较低水平,实现了接近理想的线性扩展。

理论模型参数: 模型大小 500MB,计算时间 300ms / 256个样本。
图示横轴表示:GPU数量 / 总批次大小 / 每个GPU的批次大小。

AllReduce 算法 (ALLREDUCE ALGORITHMS)

环形算法 (RING ALGORITHM)

环形算法是AllReduce的一种实现方式,数据在环形拓扑结构中的节点之间传递。

环形算法初始状态 (Page 12)
图示:AllReduce环形算法的初始状态,每个Input数据(Input0, Input1, Input2, Input3)对应一个GPU和最终的Output。

环形算法数据流 (Page 13)
图示:展示了环形算法中数据如何在一个逻辑环中进行通信,例如,Output0从Input0和Input1接收数据,并传递给Output1。

树形算法 (TREE ALGORITHM)

树形算法是AllReduce的另一种实现方式,它利用树形结构进行数据的归约和广播。

树形算法示意图 (Page 14)
图示:树形算法的详细过程。
- 阶段1: 归约 (Reduce)
- 阶段2: 广播 (Broadcast)
- 关键特点: 每棵树用于处理总数据的一半。每个机器在一棵树上是节点,在另一棵树上是叶子。每台机器接收2倍的半数据,并发送2倍的半数据。
- 图中展示了两棵树,左侧用于将数据归约到节点0,右侧用于将数据归约到节点31,然后通过广播将结果分发给所有节点。

树形算法多GPU应用 (Page 15)
图示:展示了树形算法在多GPU环境下的应用,其中涉及两个树结构(Tree 1 #7, Tree 2 #2)以及它们之间的连接(#3)。每个GPU处理各自的Input(Input0, Input1, Input2, Input3),并最终产生Output(Output0, Output1, Output2, Output3)。

COLLNET算法与Allreduce性能分析

COLLNET算法

链式版本

COLLNET算法的链式版本展示了网络内归约如何连接到一系列GPU。每个GPU(Input0到Input3)处理其各自的输入并生成对应的输出。

COLLNET ALGORITHM Chain version (Page 16)
COLLNET ALGORITHM Chain version (Page 16)

直接版本

COLLNET算法的直接版本描绘了四个GPU的互连,每个GPU都连接到网络内归约,并直接与其他GPU连接。这种配置在每个GPU拥有专用网卡时效果更好,并且需要nvswitch或alltoall连接。

COLLNET ALGORITHM Direct version (Page 17)
COLLNET ALGORITHM Direct version (Page 17)

算法总结:优缺点

本节总结了Rings、Trees和Collnet算法在延迟、带宽、计算和网络模式方面的优缺点。

Algorithm Latency Bandwidth Computing Network Pattern
Rings Linear Perfect Uniform Few flows
Trees Log Close to perfect Imbalanced Many flows
Collnet Constant Close to 2x Almost uniform Minimal flows

Collnet算法的延迟为常数,带宽接近2倍(可能受NVLink限制),计算分布几乎均匀,并且网络流最少。

下方的图表进一步展示了Allreduce的延迟和带宽表现:
* Allreduce延迟:Collnet显示出恒定的低延迟,而Rings和Trees的延迟随GPU数量线性或对数增长。
* Allreduce带宽:Collnet展现出最高的带宽,其次是Rings,最后是Trees(最佳和最差情况)。

ALGORITHMS SUMMARY Pros and cons (Page 18)
ALGORITHMS SUMMARY Pros and cons (Page 18)

硬件拓扑

Allreduce性能

本节展示了不同硬件配置下Allreduce的性能,包括多GPU和多节点配置,测量单位为GB/s。

在多GPU配置中,NVLink提供了显著的带宽提升,例如NVLink4 SHARP (H100) 可以达到500+ GB/s。
在多节点配置中,使用IB/RoCE和NVLink4 SHARP (DGX H100) 也能达到500+ GB/s的性能。

ALLREDUCE PERFORMANCE (Page 20)
ALLREDUCE PERFORMANCE (Page 20)

拓扑检测:将环形拓扑映射到硬件

幻灯片展示了大型GPU集群中将环形通信模式映射到物理硬件上的复杂互连方式。

TOPOLOGY DETECTION Mapping rings to the hardware (Page 21)
TOPOLOGY DETECTION Mapping rings to the hardware (Page 21)

不同硬件平台(如PCI平台、NVLink Cubemesh (DGX-1) 和 NVswitch (DGX A100))对环形拓扑的映射方式各不相同。

TOPOLOGY DETECTION Mapping rings to the hardware (Page 22)
TOPOLOGY DETECTION Mapping rings to the hardware (Page 22)

拓扑检测:将树形拓扑映射到硬件

与环形拓扑类似,本节展示了PCI平台、NVLink Cubemesh (DGX-1) 和 NVswitch (DGX A100) 如何映射树形通信模式。

TOPOLOGY DETECTION Mapping trees to the hardware (Page 23)
TOPOLOGY DETECTION Mapping trees to the hardware (Page 23)

节点间通信:轨优化设计

本节对比了经典的互连结构设计与轨优化设计。经典的结构设计要求完美的路由以确保所有流使用不同的链路。而轨优化设计则能确保所有流量都本地化到叶子交换机,从而从根本上避免路由冲突。

INTER-NODE COMMUNICATION Rail-optimized design (Page 24)
INTER-NODE COMMUNICATION Rail-optimized design (Page 24)

硬件拓扑:性能考量

本节讨论了GPU之间以及GPU与网卡(NIC)之间的通信性能。
* GPU到GPU:通过PCI交换机可以获得完美性能,而CPU通常只能达到峰值性能的50%到80%。
* GPU到网卡:需要GPU Direct RDMA以直接通过PCI交换机进行通信。

HARDWARE TOPOLOGY Performance considerations (Page 25)
HARDWARE TOPOLOGY Performance considerations (Page 25)

GPU Direct考量:ACS和ATS

幻灯片解释了在GPU Direct通信中,ACS(Access Control Services)和ATS(Address Translation Services)的作用。
* 如果ACS未进行正确的CPU端配置,会导致GPU Direct中断。目前大多数系统默认启用ACS,因为它在BIOS中启用,而Linux在没有安装VM管理程序(例如KVM)时不会配置ACS。
* ACS会将所有PCI到PCI的事务转发到CPU根复合体进行访问控制检查,这至少会将双向带宽减半。
* ATS通过缓存ACS结果,允许大部分流量直接从GPU流向网卡,从而提高效率。

GPU DIRECT CONSIDERATIONS ACS and ATS (Page 26)
GPU DIRECT CONSIDERATIONS ACS and ATS (Page 26)

点对点通信

Alltoall通信:示例与实现

Alltoall通信的NCCL用法示例代码:

ncclGroupStart();
for (int i=0; i<nranks; i++) {
    ncclSend(sendbuffs[i], count, type, i, comm);
    ncclRecv(recvbuffs[i], count, type, i, comm);
}
ncclGroupEnd();

通过8个p2p通道(即SMs/CTAs),可以并行处理64个对等体。图示进一步说明了每个SM/CTA的8个warp如何与8个不同的对等体进行发送和接收。

ALLTOALL COMMUNICATION Example and implementation (Page 28)
ALLTOALL COMMUNICATION Example and implementation (Page 28)

点对点通信:网络代理

点对点通信的网络代理机制描绘了CPU代理如何协调GPU(通过Send FIFO发送缓冲区)与网络链路之间的通信,并将数据通过Recv FIFO接收缓冲区传递给目标GPU。

POINT-TO-POINT COMMUNICATION Network proxy (Page 29)
POINT-TO-POINT COMMUNICATION Network proxy (Page 29)

Alltoall带宽

本节展示了不同硬件配置下Alltoall的有效带宽性能,单位为GB/s。
* 在多GPU配置中,DGX H100 (NVswitch) 实现了330-350 GB/s的带宽。
* 在多节点或PCI平台配置中,DGX H100 (NVLink4) 也能达到330-350 GB/s的最高带宽。

ALLTOALL BANDWIDTH (Page 30)
ALLTOALL BANDWIDTH (Page 30)

ALLTOALL 通信优化

ALLTOALL COMMUNICATION
PXN 优化

在全互联(Alltoall)通信中,大多数数据传输通过顶层交换机进行,尤其是在针对机架优化的设计中。
PXN(PCI x NVLink)允许 GPU 使用远端 NIC 发送数据,通过中间 GPU 进行传输。
PXN 还支持将所有消息聚合到相同的目的地。

ALLTOALL 通信中的 PXN 优化 (Page 31)

ALLTOALL LATENCY
NCCL Alltoall 延迟
DGX A100, InfiniBand, NCCL 2.12

下图展示了 NCCL Alltoall 延迟在不同节点/GPU 数量配置下的表现,并对比了 PXN 开启和关闭的情况。图表显示,随着节点和 GPU 数量的增加,PXN 开启时(灰色柱)的延迟显著低于 PXN 关闭时(深灰色柱),并且性能增益(绿色柱)也随之提高。在 128/1024 节点/GPU 配置下,PXN 提供了接近 1.25 的性能增益因子。

NCCL Alltoall 延迟性能图 (Page 32)

初始化 / 引导

INIT / BOOTSTRAP
INIT / BOOTSTRAP (Page 33)

NCCL INIT
引导与操作

NCCL 初始化过程分为两个主要阶段:

  • 一次性操作(通常在 worker0 上执行):

    • 生成一个唯一的 ID:ncclUniqueId id;
    • 获取该唯一 ID:ncclGetUniqueId(&id);
    • 将该 ID 广播给所有其他 rank:broadcast_to_all_ranks(&id);
    • 此步骤使用 CPU 侧通信(MPI 或其他方式)。
  • 在所有并行 worker 上执行的操作:

    • 初始化:

      • 获取唯一的 ID:get_unique_id(&id);
      • 初始化 NCCL 通信器:ncclCommInitRank(&comm, nranks, &id, rank);
    • 通信:

      • 执行 AllReduce 操作:ncclAllReduce(..., comm);
    • 清理:

      • 销毁 NCCL 通信器:ncclCommDestroy(comm);

该过程的引导线程/套接字通过 CPU 与各个 GPU 节点进行通信。

NCCL 初始化流程和架构图 (Page 34)

NCCL BOOTSTRAP
网络考虑

  • 引导(Bootstrap)通过简单的、未加密的 TCP/IP 套接字进行。
  • 每个 rank 需要能够通过 TCP/IP 与其他每个 rank 进行通信。这可能需要防火墙配置或将接口设置为“网桥”。
  • NCCL_SOCKET_IFNAME 可用于选择用于引导的接口。
  • 如果关注安全性,NCCL_SOCKET_IFNAME 应指向一个位于私有网络或 VLAN 上的接口。

未来发展

FUTURE
未来发展 (Page 36)

H100 SHARP
In-nvswitch 和 In-network

H100 SHARP 利用 NVLink 交换机和网络内(in-network)的规约功能,优化了数据传输和聚合。该图展示了 H100 GPU 之间如何通过 NVLink 交换机(中心矩形)连接,并利用网络内规约能力进行高效的通信。四个象限代表不同的 GPU 组,它们之间可以进行网络内规约操作。

H100 SHARP 网络内规约架构图 (Page 37)

USER BUFFER REGISTRATION
改进 alltoall 延迟

用户缓冲区注册通过优化数据传输路径来改进 alltoall 延迟。发送缓冲区(sendbuff)中的数据通过发送 FIFO 传输至 GPU,再通过互联结构(可能是 NVLink 和网络交换机)到达目标 GPU。接收端通过接收 FIFO 将数据写入接收缓冲区(recvbuff)。这个过程通过直接注册用户缓冲区来减少数据复制和提高传输效率。

用户缓冲区注册流程图 (Page 38)

FUTURE
其他改进

  • 持续优化 allreduce 和 alltoall 算法

    • 更多 allreduce 算法(direct+tree/ring, collnet+chain, ...)
    • 更高效的 CUDA 图支持
    • 更高效的聚合
    • 提高非 alltoall 情况下的点对点性能
  • 改进可用性

    • 更好地与性能分析器集成
    • 更好的错误报告
  • 改进容错性

    • 能够中止初始化/销毁操作

总结

SUMMARY
总结 (Page 40)

SUMMARY

NCCL 旨在为多 GPU 系统提供高性能的集合通信原语。

NCCL 产品和硬件展示 (Page 41)

NVIDIA Logo (Page 42)