GPU在高性能计算和深度学习加速中扮演着非常重要的角色, GPU的强大的并行计算能力,大大提升了运算性能。
随着运算数据量的不断攀升,GPU间需要大量的交换数据,因此,GPU通信性能成为了非常重要的指标。
在 AI 集群中进行分布式训练时,通信是必要环节,同时也是相比于单机训练而言多出来的系统开销。通信与计算的时间比例往往决定了分布式机器学习系统加速比的上限。
因此,分布式机器学习的关键是设计通信机制,从而降低通信与计算的时间比例,更加高效地训练出高精度模型。
下面给大家介绍AI集群通信的软硬件、NCLL集合通信库、InfiniBand网络通信技术协议、AI集群和AI框架中对于InfiniBand的应用。
文章较长,建议先点赞收藏,后续再慢慢观看。另外,我撰写的
大模型相关的博客及配套代码
均整理放置在Github:llm-action,有需要的朋友自取。
通信硬件
通信硬件的实现方式
通信的实现方式分为两种类型:机器内通信与机器间通信。
机器内通信:
共享内存(QPI/UPI),比如:CPU与CPU之间的通信可以通过共享内存。
NVLink,通常是GPU与GPU之间的通信,也可以用于CPU与GPU之间的通信。
机器间通信:
RDMA (Remote Direct Memory Access) 网络协议。
PCIe
PCI-Express(peripheral component interconnect express),简称PCIe,是一种高速串行计算机扩展总线标准,主要用于扩充计算机系统总线数据吞吐量以及提高设备通信速度。
PCIE本质上是一种全双工的的连接总线,传输数据量的大小由通道数(lane,信道)决定的。
通常,1个连接通道lane称为X1,
每个通道lane由两对数据线组成,一对发送,一对接收,每对数据线包含两根差分线。即X1只有1个lane,4根数据线
,每个时钟每个方向1bit数据传输。依此类推,X2就有2个lane,由8根数据线组成,每个时钟传输2bit。类似的还有X12、X16、X32。
image.png
2003 年 PCIe 1.0 正式发布,可支持每通道传输速率为 250MB/s,总传输速率为 2.5 GT/s。
2007 年推出 PCIe 2.0 规范。在 PCIe 1.0 的基础上将总传输速率提高了一倍,达到 5 GT/s,每通道传输速率从 250 MB/s 上升至 500 MB/s。
2022 年 PCIe 6.0 规范正式发布,总传输速率提高至 64 GT/s。
2022年6月,PCI-SIG 联盟宣布 PCIe 7.0 版规范,单条通道(x1)单向可实现128 GT/s 传输速率,计划于2025年推出最终版本。
image.png
PCIe吞吐量(可用带宽)计算方法:
吞吐量=传输速率*编码方案
传输速率为每秒传输量(GT/s),而不是每秒位数(Gbps),是因为传输量包括
不提供额外吞吐量的开销位
,比如:PCIe 1x和PCIe 2x使用8b/10b编码方案,导致占用了20%(=2/10)的原始信道带宽。
GT/s,Giga transtion per second (千兆传输/秒),即每一秒内传输的次数,重点在于描述物理层通信协议的速率属性,可以不和链路宽度等关联。
Gbps,Giga Bits per second (千兆位/秒)。GT/s和Gbps之间不存在成比例的换算关系。
PCIe 2.0协议支持5.0GT/s,即每一条Lane上支持每秒钟传输5G个Bit,但这并不意味着PCIe 2.0协议的每一条Lane支持5Gbps的速率。为什么这么说呢,因为PCIe 2.0的物理层协议中使用的是8b/10b编码方案,即每传输8个Bit,需要发送10个Bit,这多出来的2Bit并不是对上层有意义的信息。那么,PCIe 2.0协议的每一条Lane支持
5*8/10=4Gbps=500MB/s
的速率。以一个PCIe 2.0 x8的通道为例,x8的可用带宽为
4*8=32Gbps=4GB/s
。
同理,PCIe 3.0协议支持8.0GT/s,即每一条Lane上支持每秒钟传输8G个Bit。而PCIe 3.0的物理层协议中使用的是128b/130b编码方案,即每传输128个Bit,需要发送130个Bit,那么,PCIe 3.0协议的每一条Lane支持
8*128/130=7.877GB/s=984.6MB/s
的速率。以一个PCIe 3.0 x16的通道为例,x16的可用带宽为
7.877*16=126.032 Gbps=15.754GB/s
。
PCIE体系架构
:
PCIE体系架构一般包含根组件RC(root-complex),交换器switch,终端设备EP(endpoint)等类型的PCIE设备组成。RC在总线架构中只有一个,用于处理器和内存子系统与I/O设备之间的连接,而switch的功能通常是以软件形式提供的,它包括两个或更多的逻辑PCI到PCI的连接桥(PCI-PCI Bridge),以保持与现有PCI兼容。
image.png
NVLink
背景
:
算力的提升不仅依靠单张 GPU 卡的性能提升,往往还需要多 GPU 卡组合。在多 GPU 系统内部,GPU 间通信的带宽通常在数百GB/s以上,PCIe总线的数据传输速率容易成为瓶颈,且PCIe链路接口的串并转换会产生较大延时,影响GPU并行计算的效率和性能。
GPU发出的信号需要先传递到PCIe Switch, PCIe Switch中涉及到数据的处理,CPU会对数据进行分发调度,这些都会引入额外的网络延迟,限制了系统性能。
image.png
为此,NVIDIA推出了能够提升GPU通信性能的技术——GPUDirect P2P技术,使GPU可以通过 PCI Express 直接访问目标GPU的显存,避免了通过拷贝到CPU host memory作为中转,大大降低了数据交换的延迟,但受限于PCI Express总线协议以及拓扑结构的一些限制,无法做到更高的带宽。此后,NVIDIA 提出了 NVLink 总线协议。
NVLink简介
:
NVLink 是一种高速互连技术,旨在加快 CPU 与 GPU、GPU 与 GPU 之间的数据传输速度,提高系统性能。NVLink通过GPU之间的直接互联,可扩展服务器内的多GPU I/O,相较于传统PCIe总线可提供更高效、低延迟的互联解决方案。
image.png
NVLink的首个版本于2014年发布,首次引入了高速GPU互连。2016年发布的P100搭载了第一代NVLink,提供 160GB/s 的带宽,相当于当时 PCIe 3.0 x16 带宽(双向)的 5 倍。之后陆续发布了很多新版本,V100搭载的 NVLink2 将带宽提升到300GB/s ,A100搭载了NVLink3带宽为600GB/s。H100中包含18条第四代NVLink链路,总带宽(双向)达到 900 GB/s,是PCIe 5.0 x16带宽(双向)的7倍。
image.png
image.png
NVLink高速互联主要有两种:
image.png
NVSwitch
为了解决GPU之间通讯不均衡问题,NVIDIA引入NVSwitch。NVSwitch芯片是一种类似交换机的物理芯片(ASIC),通过NVLink接口可以将多个GPU高速互联到一起,可创建无缝、高带宽的多节点GPU集群,实现所有GPU在一个具有全带宽连接的集群中协同工作,从而提升服务器内部多个GPU之间的通讯效率和带宽。NVLink和NVSwitch的结合使NVIDIA得以高效地将AI性能扩展到多个GPU。
image.png
第一代 NVSwitch于2018年发布,采用台积电 12nm FinFET 工艺制造,共有 18 个 NVLink 2.0 接口。目前 NVSwitch 已经迭代至第三代。第三代 NVSwitch 采用台积电 4N 工艺(台积电 4N 工艺专为NVIDIA定制设计,并进行了一系列优化,它与普通台积电5nm节点相比,可实现更好的电源效率与性能,并且密度有所提升)构建,每个 NVSwitch 芯片上拥有 64 个 NVLink 4.0 端口,GPU 间通信速率可达 900GB/s。
image.png
Nvidia GPU 服务器 PCIe 版 和 SXM 版的区别
英伟达GPU卡间互连的内存插槽有2种,一种是PCIe口,一种是SXM口。
PCIe口是一个相对通用的协议,PCIe口相对慢一些,SXM是专门用来做卡间互连的,SXM协议是铺在电路板上,SXM协议做卡间互连会更快,对NVLink原生支持更好,显存带宽比PCIe高一些。PCIe和SXM都可以用NVLink,但是SXM是更好使用NVLink的方法。
SXM 架构是一种高带宽插座式解决方案,用于将 GPU 连接到 NVIDIA 专有的 DGX 和 HGX 系统。SXM 版 GPU 通过主板上集成的 NVSwitch 实现 NVLink 的连接,不需要通过主板上的PCIe进行通信,它能支持8块GPU卡的互联互通,实现了GPU之间的高带宽。未阉割的A100是600GB/s、H100是900GB/s,阉割过的A800、H800为400GB/s。
把 PCIe 版 GPU 卡插到 PCIe 插槽上,就可以和CPU、同一个服务器上其他的GPU卡进行通信,也可以通过网卡与其他的服务器节点上的设备进行通信,这种就是PCIe的通信方式,但是这种传输速度不快。如果想要和SXM一样,有很快的传输速度,可以使用NVlink桥接器实现GPU和CPU之间的通信,但是和SXM不一样的地方就是它只能实现2块GPU卡之间的通信。即 PCIe 版只有成对的 GPU 通过 NVLink Bridge 连接,通过 PCIe 通道进行数据通信。同时,最新的PCIe网络带宽有128GB/s的限制。
image.png
TCP/IP
TCP/TP (或传输控制协议/Internet 协议)用于通过 Internet 互连网络设备。它确定了数据应该如何被打包、寻址、传输、路由和接收。TCP/IP 非常重视两台计算机之间的准确数据传输。如果系统在一次发送消息时遇到问题,则必须重新发送整个消息。
此外,TCP/IP 的功能分为四个不同的层:
数据链路层、互联网层、传输层和应用层
。数据在被另一端接收之前必须经过这四层。然后,TCP/IP 将通过以相反顺序传递层来重组数据并将其呈现给接收器。这样,您可以通过升级某些层而不是整个系统来提高数据中心的性能或安全性。
RDMA
RDMA(远程直接数据存取)就是为了解决网络传输中服务器端数据处理的延迟而产生的,
无需使用CPU,就可以从一个主机或服务器的内存直接访问另一主机或服务器的内存
。它释放了CPU去执行其应做的工作,比如:运行应用程序和处理大量数据。这既提高了带宽又降低了延迟、抖动和 CPU 消耗。
对比传统的网络传输机制,RDMA无需操作系统和TCP/IP协议栈的介入。
RDMA的内核旁路机制,允许应用与网卡之间的直接数据读写
,将服务器内的数据传输时延降低到1us以下。同时,RDMA的内存零拷贝机制,允许接收端直接从发送端的内存读取数据,极大的减少了CPU的负担,提升CPU的效率。
image.png
大致有三类RDMA网络,分别是Infiniband、RoCE、iWARP。其中,Infiniband是一种专为RDMA设计的网络,从硬件级别保证可靠传输 ,而RoCE 和 iWARP都是基于以太网的RDMA技术,支持相应的verbs接口。
RDMA最早在Infiniband传输网络上实现,技术先进,但是价格高昂(
只有Mellanox(现已被英伟达收购)和Intel(2012年,英特尔公司出资收购了QLogic的InfiniBand技术)供应商提供全套网络解决方案
),后来业界厂家把RDMA移植到传统Ethernet以太网上,降低了RDMA的使用成本,推动了RDMA技术普及。在Ethernet以太网上,根据协议栈融合度的差异,分为iWARP和RoCE两种技术,而RoCE又包括
RoCEv1和RoCEv2两个
版本(RoCEv2的最大改进是支持IP路由)。各RDMA网络协议栈的对比,如下图所示:
image.png
IB(InfiniBand):
基于 InfiniBand 架构的 RDMA 技术,由 IBTA(InfiniBand Trade Association)提出。搭建基于 IB 技术的 RDMA 网络需要专用的 IB 网卡和 IB 交换机。
iWARP(Internet Wide Area RDMA Protocal):
基于 TCP/IP 协议的 RDMA 技术,由 IETF 标 准定义。iWARP 支持在标准以太网基础设施上使用 RDMA 技术,但服务器需要使用支持iWARP 的网卡。
RoCE(RDMA over Converged Ethernet):
基于以太网的 RDMA 技术,也是由 IBTA 提出。RoCE 支持在标准以太网基础设施上使用RDMA技术,但是需要交换机支持无损以太网传输,需要服务器使用 RoCE 网卡。
在三种主流的RDMA技术中,可以划分为两大阵营。一个是IB技术,另一个是支持RDMA的以太网技术(RoCE和iWARP)。其中, IBTA力挺的技术自然是IB和RoCE, Mellanox公司是这方面的急先锋。而iWARP则是IEEE/IETF力挺的技术,主要是Chelsio公司在推进。
在存储领域,支持RDMA的技术早就存在,比如:SRP(SCSI RDMA Protocol)和iSER(iSCSI Extensions for RDMA)。如今兴起的NVMe over Fabrics如果使用的不是FC网络的话,本质上就是 NVMe over RDMA。换句话说,NVMe over InfiniBand, NVMe over RoCE 和 NVMe over iWARP 都是 NVMe over RDMA。
InfiniBand
InfiniBand(直译为 “无限带宽” 技术,缩写为IB)是一个为大规模、易扩展机群而设计的
网络通信技术协议
。可用于计算机内部或外部的数据互连,服务器与存储系统之间直接或交换互连,以及存储系统之间的互连。
InfiniBand 最重要的一个特点就是
高带宽
、
低延迟
,因此在高性能计算项目中广泛的应用。主要用于高性能计算(HPC)、高性能集群应用服务器和高性能存储。
InfiniBand 链路速率
InfiniBand在物理层定义了多种链路速度,例如:1X,4X,12X。每个单独的链路是四线串行差分连接(每个方向两根线)。
image.png
以早期的SDR(单数据速率)规范为例,1X链路的原始信号带宽为2.5Gbps,4X链路是10Gbps,12X链路是30Gbps。1X链路的实际数据带宽为2.0Gbps(因为采用8b/10b编码)。由于链路是双向的,因此相对于总线的总带宽是4Gbps。
随着时间的推移,InfiniBand的网络带宽不断升级,下图展示了 InfiniBand 从SDR、DDR、QDR、FDR、EDR发展到HDR、NDR的网络带宽,其速度是基于 4x 链路速度。
image.png
SDR(Single Data Rate):2.5Gb/s (10Gb/s for 4x)。
DDR(Double Data Rate):5 Gb/s (20Gb/s for 4x)。
QDR(Quad Data Rate):10 Gb/s (40Gb/s for 4x)。
FDR(Fourteen Data Rate):14Gb/s (56Gb/s for 4x)。
EDR(Enhanced Data Rate):25 Gb/s (100Gb/s for 4x)。
HDR(High Data Rate):50 Gb/s (200Gb/s for 4x)。
NDR(Next Data Rate):100 Gb/s (400Gb/s for 4x)。
image.png
InfiniBand 网络互连产品
InfiniBand 网络中,使用的线缆区别于传统的以太网线缆和光纤线缆。针对不同的连接场景,需使用专用的InfiniBand线缆。
InfiniBand网络互连产品包括:
DAC高速铜缆
、
AOC有源线缆
以及
光模块
。
DAC高速线缆和AOC有源光缆都是用于数据中心、高性能计算机等大容量储存器设备间的传输设备。
DAC高速线缆
,也叫直连铜缆(Direct Attach Copper cable), 它的线材是铜缆,是低压脉冲传输信号;因为材料的不同导致功耗、传输距离和价格的不同,DAC高速线缆的功耗比较低,但传输距离相对比较短,低于10米。价格方面相对便宜一些。
image.png
AOC有源光缆
(Active Optial Cable),它的线材是光缆,为光信号传输,通过电-光-电的转换;功耗相对比较大些但传输的距离可达到100米,价格方面相对高些。
image.png
光模块
的作用也是光电信号之间的转换,主要用于交换机与设备之间传输的载体,和光纤收发器的原理相同,只是光模块相比收发器更具效率性、安全性。光模块按照封装形式分类,常见的有 SFP,SFP+,XFP,SFP28,QSFP+,QSFP28 等。
光纤收发器
是将短距离的电信号和长距离的光信号进行转换的设备,一般应用在远距离传输中,通过光纤进行传输,将电信号转换成光信号发送出去,同时,在接收端将接收到的光信号转换成电信号。在很多地方也被称之为光电转换器(Fiber Converter)。光纤收发器为需要将系统从铜线升级到光纤,为缺少资金、人力或时间的用户提供了一种廉价的方案。
image.png
光模块与光纤收发器如何配对使用?
波长和传输距离必须一致,比如:采用1310nm波长,传输距离应该是10KM/20KM。
光纤跳线尾纤接口选择需注意,一般光纤收发器采用的SC口,光模块采用的是LC口。
速率必须一样,比如:千兆收发器对应 1.25G 光模块,百兆连百兆,千兆连千兆。4、光模块类型需要采用相同类型,单纤对单纤,双纤对双纤。
image.png
InfiniBand 的网络架构
InfiniBand 是一种基于通道的结构,组成单元主要分为四类:
HCA(Host Channel Adapter,主机通道适配器)
TCA(Target Channel Adapter,目标通道适配器)
InfiniBand link(连接通道,可以是电缆或光纤,也可以是板上链路)
image.png
通道适配器就是搭建InfiniBand通道用的。所有传输均以通道适配器开始或结束,以确保安全或在给定的QoS(服务质量)级别下工作。
使用 InfiniBand 的系统可以由多个子网(Subnet)组成,每个子网最大可由 6 万多个节点组成。
子网内部,InfiniBand 交换机进行二级处理。
image.png
InfiniBand 的二级处理过程非常简单,每个 InfiniBand 子网都会设一个子网管理器,生成16位的 LID(本地标识符)。InfiniBand 交换机包含多个 InfiniBand 端口,并根据第二级本地路由标头中包含的LID,将数据包从其中一个端口转发到另一个端口。
除管理数据包外,交换机不会消耗或生成数据包
。
简单的处理过程,加上自有的Cut-Through技术,InfiniBand 将转发时延大幅降低至 100ns 以下,明显快于传统以太网交换机。
在 InfiniBand 网络中,数据同样以数据包(最大4KB)的形式传输,采用的是串行方式。
InfiniBand 的协议栈
InfiniBand 协议同样采用了分层结构,各层相互独立,下层为上层提供服务,如下图所示:
image.png
物理层
定义了在线路上如何将比特信号组成符号,然后再组成帧、数据符号以及包之间的数据填充等,详细说明了
构建有效包的信令协议
等。
链路层
定义了数据包的格式以及数据包操作的协议,如:流控、 路由选择、编码、解码等。
网络层
通过在数据包上添加一个40字节的全局的路由报头(Global Route Header, GRH)来进行路由的选择,对数据进行转发。
在转发的过程中,路由器仅仅进行可变的CRC校验,这样就保证了端到端的数据传输的完整性
。Infiniband报文封装格式如下图所示:
image.png
传输层
再将数据包传送到某个指定的队列偶(Queue Pair, QP)中,并指示 QP 如何处理该数据包。
可以看出,InfiniBand 拥有自己定义的 1-4 层格式,是一个完整的网络协议。端到端流量控制,是 InfiniBand 网络数据包发送和接收的基础,可以实现无损网络。
QP(队列偶)说明:
QP是RDMA技术中通信的基本单元。队列偶就是一对队列,SQ(Send Queue,发送工作队列)和 RQ(Receive Queue,接收工作队列)。用户调用API发送接收数据的时候,实际上是将数据放入QP当中,然后以轮询的方式,将QP中的请求一条条的处理。
image.png
Mellanox OFED 软件栈
Mellanox OFED 是一个单一的软件堆栈,包括驱动、中间件、用户接口,以及一系列的标准协议 IPoIB、SDP、SRP、iSER、RDS、DAPL(Direct Access Programming Library),支持 MPI、Lustre/NFS over RDMA 等协议,并提供 Verbs 编程接口;Mellanox OFED 由开源 OpenFabrics 组织维护。
Mellanox OFED 软件堆栈是承载在 InfiniBand 硬件和协议之上的,软件通过协议和硬件进行有效的数据传输。
image.png
OpenSM 子网管理器
OpenSM 软件是符合InfiniBand的子网管理器(SM),运行在Mellanox OFED软件堆栈进行 IB 网络管理,管理控制流走业务通道,属于带内管理方式。
OpenSM 包括
子网管理器、背板管理器和性能管理器
三个组件,绑定在交换机内部的必备部件。提供非常完备的管理和监控能力,如:
设备自动发现、设备管理、Fabric可视化、智能分析、健康监测
等等。
image.png
InfiniBand 组网
InfiniBand 组网跟普通的交换机不太一样,InfiniBand 的组网成本很高。如果希望这个网络中任何两个计算节点的网卡之间互相无损地通信,需要使用一种叫做胖树(Fat Tree)的网络拓扑,大概是如下一种拓扑结构,方块是交换机,椭圆是计算节点。
胖树主要有两层,上面一层是核心层,不连任何计算节点,它的功能就是转发流量;下面一层是接入层,接入各类计算节点。
胖树拓扑成本高的主要原因是:某一个汇聚交换机上,假如有36个口,那如果为了达到无损速率,一半的口,也就是18个口可以给计算节点连,剩下一半要连到上层的核心交换机上。要知道,任何一根线,就是1万多块钱呢,如果达到无损,就要冗余地做这些连接。
image.png
NVIDIA InfiniBand 商用产品
Mellanox 在全球 InfiniBand 市场的占有率基本上无敌的存在,在英伟达收购 Mellanox 之后,也于2021年推出了自己的第七代 NVIDIA InfiniBand 架构:NVIDIA Quantum-2。
NVIDIA Quantum-2 平台包括:NVIDIA Quantum-2 系列交换机、NVIDIA ConnectX-7 InfiniBand 适配器、BlueField-3 InfiniBand DPU以及电缆。
image.png
NVIDIA Quantum-2 系列交换机
采用紧凑型1U设计,包括风冷和液冷版本。交换机的芯片制程工艺为7nm,单芯片拥有570亿个晶体管(比A100 GPU还多)。单个交换机采用64个400Gb/s端口或128个200Gb/s端口的灵活搭配,提供总计 51.2Tb/s的双向吞吐量。NVIDIA NDR 400Gb/s InfiniBand 交换机如下图所示:
image.png
NVIDIA ConnectX-7 InfiniBand 适配器
支持PCIe Gen4和Gen5,具有多种外形规格,可提供 400Gb/s 吞吐量。
image.png
InfiniBand 常用命令
ibv_asyncwatch
:监视 InfiniBand 异步事件
ibv_devices
或
ibv_devinfo
:列举 InfiniBand 设备或设备信息 -
ibstatus
:查询 IB 设备的基本状态
iblinkinfo
:查看IB交换模块的所有端口的连接状态。此命令会将集群内所有的IB交换模块都进行列举。
通信软件
通信软件指用于分布式训练时,多个计算设备之间的集合通信。在分布式系统中,各个节点间往往存在大量的集合通信需求,而我们可以用消息传递接口 (Message Passing Interface,MPI,一套集合通信相关的接口标准) 来定义一些比较底层的消息通信行为。譬如 Reduce、AllReduce、Scatter、Gather、AllGather 等。
常见的集合通信库(如:Open MPI、Gloo、NCCL等)都在 MPI 的基础上,对各种集合通信的模式和算法作了各自的实现。
Open MPI
:
Open MPI 是一个开源 MPI(消息传递接口 )的实现,由学术,研究和行业合作伙伴联盟开发和维护。因此,Open MPI 可以整合高性能计算社区中所有专家,技术和资源,以构建可用的最佳 MPI 库。
Gloo
:
Gloo 是 Facebook 开源的一套集体通信库,提供了对机器学习中有用的一些集合通信算法。如:Barrier,Broadcast,AllReduce。
NCCL
:
NCCL(Nvidia Collective multi-GPU Communication Library)是英伟达基于 NVIDIA GPU 的一套开源的集合通信库,如其官网描述:NVIDIA 集合通信库(NCCL)实现了针对 NVIDIA GPU 性能优化的多 GPU 和多节点集合通信原语。NCCL 提供了诸如 All Gather,All Reduce,Broadcast,Reduce,Reduce-Scatter 等实现,这些实现优化后可以通过 PCIe、 NVLink、InfiniBand 等高速互联,从而实现高带宽和低延迟。
因为 NCCL 是 NVIDIA 基于自身硬件定制的,能做到更有针对性且更方便优化,故在英伟达硬件上,NCCL 的效果往往比其它的通信库更好。
NCCL主要做几件事:
探测计算节点的网络设备和拓扑结构
,使用算法自动调优选择一个最优的通信方式。
image.png
NCCL 集合通信库
通信原语
并行任务的通信一般可以分为 Point-to-point communication 和 Collective communication 。
P2P 通信这种模式只有一个sender和一个receiver,实现起来比较简单。
集合通信包含多个sender多个receiver,一般的通信原语包括broadcast,gather,all-gather,scatter,reduce,all-reduce,reduce-scatter,all-to-all等。
简单介绍几个常用的操作:
Reduce
:从多个sender那里接收数据,最终combine到一个节点上。
image.png
All-reduce
:从多个sender那里接收数据,最终combine到每一个节点上。
image.png
NCCL 实现
NCCL 实现成 CUDA C++ kernels,包含3种 primitive operations:Copy,Reduce,ReduceAndCopy。
NCCL 1.0 版本只支持单机多卡,卡之间通过 PCIe、NVlink、GPUDirect P2P 来通信。
NCCL 2.0 支持多机多卡,多机间通过 Sockets (Ethernet) 或者 InfiniBand with GPUDirect RDMA 通信。
单机内多卡通过PCIe以及CPU socket通信。
image.png
多机通过InfiniBand通信,在多机多卡内部,也要构成一个通信环。
image.png
对比 NCCL 在不同硬件架构下网络带宽
下图是 Allreduce 在单机不同架构下的速度比较:
image.png
前面三个是单机多卡典型的三种连接方式:
第一种是两个GPU通过CPU然后通过QPI和另一个CPU上的两块卡相连,因此速度最慢,但也能达到>5GB/s。
第二种是两个GPU通过PCIe switch相连后再经过CPU连接,速度会稍微低一点。
第三种是四张卡都在一个PCIe switch上,所以带宽较高,能达到>10GB/s PCIe的带宽大小。
第四种是DGX-1架构,这是Nvidia推出的深度学习平台,带宽能达到60GB/s。
下图是 Allreduce 多机下的速度表现。其中,左图2机8卡,机内PCIe,机间InfiniBand能达到>10GB/s的速度,InfiniBand基本上能达到机内的通信速度;右图4机32卡,机内NVLink,机间InfiniBand,带宽能达到>40GB/s。
image.png
下图是 NCCL 在 CNTK ResNet50 上的可扩展性(scalability),32 卡基本能达到线性加速比。
image.png
NCCL 常见的环境变量设置
NCCL_P2P_DISABLE
该变量禁用 P2P 传输,该传输使用 NVLink 或 PCI 在GPU之间使用CUDA直接访问。
设定为 1 相当于设置
NCCL_P2P_LEVEL=0
,并且会被 NCCL_P2P_LEVEL 的值所覆盖。
NCCL_P2P_LEVEL
:
该变量允许用户精细地控制何时在GPU之间使用 P2P 传输。该级别定义了NCCL将使用P2P传输的GPU之间的最大距离。
如果未指定,NCCL 将尝试根据其运行的体系结构和环境来最佳选择一个值。
可选值:
NVL :当 GPU 通过 NVLink 连接时使用 P2P
PIX :当 GPU 位于同一 PCI 交换机上时使用 P2P。
PXB:当 GPU 通过 PCI 交换机(可能是多跳)连接时使用 P2P。
PHB :当 GPU 位于同一 NUMA 节点上时使用 P2P。流量将通过 CPU。
SYS :在 NUMA 节点之间使用 P2P,可能跨越 SMP 互连(例如:QPI/UPI)。
NCCL_NET_GDR_LEVEL
:
该变量允许用户精细控制何时在NIC和GPU之间使用GPUDirect RDMA。该级别定义NIC和GPU之间的最大距离。
如果未指定,NCCL 将尝试根据其运行的体系结构和环境来最佳选择一个值。
可选值:
LOC:从不使用 GPU Direct RDMA。(始终禁用)
PIX:当 GPU 和 NIC 位于同一 PCI 交换机上时,使用 GPU Direct RDMA。
PXB:当 GPU 和 NIC 通过 PCI 交换机(可能是多跳)连接时,使用 GPU Direct RDMA。
PHB :当 GPU 和 NIC 位于同一 NUMA 节点上时,使用 GPU Direct RDMA。流量将通过 CPU。
SYS :即使跨 NUMA 节点之间的 SMP 互连(例如 QPI/UPI)也使用 GPU Direct RDMA。(始终启用)
NCCL_NET_GDR_READ
:
只要 GPU-NIC 距离在 NCCL_NET_GDR_LEVEL 指定的距离内,NCCL_NET_GDR_READ 变量就会在发送数据时启用 GPU Direct RDMA。
2.4.2之前,默认情况下禁用GDR读取,即发送数据时,数据先存储在 CPU 内存中,然后再发送到 InfiniBand 卡。
自 2.4.2 起,基于 NVLink 的平台默认启用 GDR 读取。
注意:已知在某些平台(例如:PCI-E)上,发送数据时直接从 GPU 内存读取比从 CPU 内存读取稍慢。
可选值为0或1。定义并设置为1以使用GPU Direct RDMA直接将数据发送到NIC(绕过CPU)。
在 2.4.2 之前,所有平台的默认值都是 0。自 2.4.2 起,基于 NVLink 的平台的默认值为 1,否则为 0。
NCCL_IB_DISABLE
:
该变量将禁用 NCCL 要使用的IB传输。NCCL 将使用IP sockets 。
定义并设置为1以强制使用IP sockets 。
NCCL_SOCKET_IFNAME
:
指定NCCL使用的SOCKET网卡。如:
NCCL_SOCKET_IFNAME=bond0,eth0
。
NCCL_IB_HCA
:
该变量指定要用于通信的 RDMA 接口。使用IB通信必须要设置的(指定NCCL使用的IB网卡)。可以通过 ibstat 查看IB网卡名。
用法: