NCCL通信函数库相关资料整理

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的基础上增加了对多节点通信支持。

在这里插入图片描述

硬件互联基础

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

PCIe Switch

CPU和两个GPU卡都挂在PCIe Switch上
在这里插入图片描述
两个CPU,每个CPU和4张GPU卡挂在一个PCIe Switch上,CPU和CPU之间有高速链接通道,本计算节点通过IB卡和其他节点通信
在这里插入图片描述
在硬件支持下,可以实现 GPU Peer-To-Peer通信,GPUDirect RDMA节点间通信

GPU Peer-to-Peer示意图

在这里插入图片描述

GPUDirect RDMA示意图

在这里插入图片描述

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

连接到CPU的单一GPU
在这里插入图片描述
通过PCIe总线连接的双GPU
在这里插入图片描述
通过NVLink技术连接的双GPU

在这里插入图片描述

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
在这里插入图片描述
下图是8张V100通过NVLink实现多对多链接
在这里插入图片描述
NVLink的性能指标数据
在这里插入图片描述

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跳互联
在这里插入图片描述
2个NVSwitch 2.0连接16个A100实现0跳互联
在这里插入图片描述

NCCL软件功能

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

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

在这里插入图片描述
参考: 深度学习分布式策略优化、显存优化、通信优化、编译优化综述

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

基于Ring拓扑的优化算法: Allreduce。Allreduce示意图:从多个sender那里接收数据,最终规约到每一个节点上:
在这里插入图片描述
NCCL采用Ring拓扑实现Allreduce操作,避免了多次通过CPU系统内存进行数据移动,同时利用GPU间P2P功能,合理利用Ring拓扑组织通信模式,避免信道竞争拥挤,提高信道利用率,示意图:

在这里插入图片描述
参考:

NCCL 和MPI比较
  • NCCL提供了MPI很小一部分针对NVIDIA 多GPU卡多节点的数据通信函数子集
  • NCCL和MPI可以同时使用(GPU-Aware MPI版本可能会产生死锁)
NCCL资料参考
PyTorch的NCCL(NVIDIA Collective Communication Library)库是专为加速深度学习训练中分布式计算而设计的。它是基于CUDA高性能、低延迟的通信库,特别适合在多个GPU和NVIDIA的GPU集群上进行模型并行训练。NCCL支持GPU之间的全双工数据通信,可以显著提高多GPU模型之间的同步和数据交换效率。 NCCL的主要特点包括: 1. **高效的GPUGPU通信**:NCCL使用了优化的算法来减少内存拷贝和提高数据传输速率,这对于大规模并行训练至关重要。 2. **广播和收集操作**:支持所有节点同时对同一张张量进行广播或收集操作,这对于训练中的梯度同步非常关键。 3. **可扩展性**:随着越来越多的GPU加入,NCCL能轻松地扩展到数百甚至数千个GPU的大型集群。 4. **容错机制**:提供了错误检测和恢复功能,即使在一些节点出现故障时,也可以保证其他节点的正常运行。 5. **兼容性**:与PyTorch的DistributedDataParallel (DDP) 和 DistributedCPU等模块无缝集成,使得开发者可以方便地实现模型在多GPU和分布式环境下的训练。 如果你正在使用PyTorch构建分布式应用,了解如何设置NCCL环境、配置过程以及如何优化通信策略是非常重要的。相关问题可能包括: 1. 如何在PyTorch中启用NCCL支持? 2. NCCL如何影响模型的训练速度? 3. 如何调整NCCL的配置参数以优化性能? 4. NCCL是否支持跨GPU机群通信?如果需要,如何配置网络连接? 5. 有没有特定的场景下,不推荐使用NCCL库?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值