NCCL

内部想参考NCCL库开发一套针对性的函数库。通过官方文档、源码、网上博客,整理了一些有关资料。图片都来源于网络,比较直观的介绍了NVIDIA GPU互联互通的底层硬件架构,和基于硬件链接开发的优化通信库NCCL

介绍

NCCL是Nvidia Collective multi-GPU Communication Library的简称,它是一个实现多GPU的collective communication通信(all-gather, reduce, broadcast)库,Nvidia做了很多优化,可以在PCIe、Nvlink、InfiniBand上实现较高的通信速度。其中NCCL 1.x版本提供单节点内多GPU卡之间的高效数据通信,NCCL 2.x 在 NCCL 1.x的基础上增加了对多节点通信支持。

nccl test 步骤 nccl support_nccl test 步骤

硬件互联基础

介绍一下CPU和GPU卡,GPU卡之间的互联技术。NCCL只有借助底层的通信部件,才能有针对性的实现高效的特定数据通信功能函数

PCIe Switch

CPU和两个GPU卡都挂在PCIe Switch上

nccl test 步骤 nccl support_nccl test 步骤_02


两个CPU,每个CPU和4张GPU卡挂在一个PCIe Switch上,CPU和CPU之间有高速链接通道,本计算节点通过IB卡和其他节点通信

nccl test 步骤 nccl support_nccl test 步骤_03


在硬件支持下,可以实现 GPU Peer-To-Peer通信,GPUDirect RDMA节点间通信

GPU Peer-to-Peer示意图

nccl test 步骤 nccl support_CUDA GPU_04

GPUDirect RDMA示意图

nccl test 步骤 nccl support_高性能计算_05

CPU-GPU,GPU-GPU之间互联的架构细节(包括PCIe 和NVLink)

连接到CPU的单一GPU

nccl test 步骤 nccl support_高性能计算_06


通过PCIe总线连接的双GPU

nccl test 步骤 nccl support_高性能计算_07


通过NVLink技术连接的双GPU

nccl test 步骤 nccl support_CUDA GPU_08

NVLink

NVLink是GPU卡之间的高速互连技术(相当于GPU上的网卡角色),与传统的 PCIe 系统解决方案相比,能为多 GPU 系统提供更快速的替代方案。NVLink 技术通过连接两块 NVIDIA 显卡,能够实现显存和性能扩展,从而满足最大视觉计算工作负载的需求。目前已知的NVLink分两种,一种是桥接器的形式实现NVLink高速互联技术,另一种是在主板上集成了NVLink接口。2016年P100上搭载第一款NVLink产品(NVLink 1.0), 最新产品是A100上的NVLink3.0,总带宽为每秒600G/s,差不多是PCIe Gen 4带宽的10倍。

V100上的NVLink,总计6个Ports

nccl test 步骤 nccl support_神经网络_09


下图是8张V100通过NVLink实现多对多链接

nccl test 步骤 nccl support_数据_10


NVLink的性能指标数据

nccl test 步骤 nccl support_数据_11

NVSwitch

NVSwitch 将多个 NVLink 加以整合,在单个节点内以 NVLink 的较高速度实现多对多的 GPU 通信,从而进一步提高互联性能(多GPU卡之间交换机角色)。NVLink 和 NVSwitch 的结合使性能扩展到多个 GPU。

NVSwitch 1.0是首款节点交换架构,可在单个服务器节点中支持 8 到 16 个全互联的 GPU。第二代NVSwitch 2.0 可助力NVLink以 600 GB/s 的速度在所有 GPU 对之间同时进行通信。该技术借助直接 GPU 对等内存寻址支持完整的多对多通信。这 16 个 GPU 还可用作单个高性能加速器,拥有统一内存空间和10 petaFLOPS 的深度学习计算性能。

2个NVSwitch 1.0连接16个V100实现0跳互联

nccl test 步骤 nccl support_CUDA GPU_12


2个NVSwitch 2.0连接16个A100实现0跳互联

nccl test 步骤 nccl support_nccl test 步骤_13

NCCL软件功能

NCCL主要是为深度学习神经网络在多Nvidia GPU卡多机上的并行训练优化而设计。神经网络并行训练一般采用数据并行的方式: 模型参数数据在所有节点复制,训练输入数据在多个GPU节点间划分,并行正向计算,反向参数更新需要将所有节点的局部结果汇总(关键操作: All-reduce)。NCCL计算节点间通信功能基本等同于MPI提供的功能,内部算法采用了Ring拓扑方式进行了优化。

深度学习神经网络分布式数据并行示意图

nccl test 步骤 nccl support_CUDA GPU_14


参考: 深度学习分布式策略优化、显存优化、通信优化、编译优化综述

NCCL主要通信函数和内部核心算法
  • Collective通信函数: Reduce, Allreduce, ReduceScatter, Allgather, Broadcast
  • Point-to-Point通信函数: Send,Recv

基于Ring拓扑的优化算法: Allreduce。Allreduce示意图:从多个sender那里接收数据,最终规约到每一个节点上:

nccl test 步骤 nccl support_神经网络_15


NCCL采用Ring拓扑实现Allreduce操作,避免了多次通过CPU系统内存进行数据移动,同时利用GPU间P2P功能,合理利用Ring拓扑组织通信模式,避免信道竞争拥挤,提高信道利用率,示意图:

nccl test 步骤 nccl support_CUDA GPU_16


参考:

NCCL 和MPI比较
  • NCCL提供了MPI很小一部分针对NVIDIA 多GPU卡多节点的数据通信函数子集
  • NCCL和MPI可以同时使用(GPU-Aware MPI版本可能会产生死锁)
NCCL资料参考