昆仑山

注册

 

发新话题 回复该主题

Blink基于NVLink的高性能数据聚 [复制链接]

1#
北京皮炎诚信医院 https://m-mip.39.net/news/mipso_8888025.html

来源:SysML,作者:GuanhuaWang,译者:彭焯艺,编辑:星云Clustar

大规模分布式机器学习应用中,GPU间参数聚合的速度对整体训练速度起到至关重要的作用,尤其当今GPU算力越来越强,参数聚合速度的重要性也日益显著。这篇文章介绍Blink,一个基于NVLink构建的高性能的参数聚合通讯库,并通过实验来证明其有效性。星云Clustar希望该篇文章对大家有所帮助。

1.引言

大型深度学习模型进行训练时,需要花费不少的时间,如ImageNet1K等模型通常需要数天甚至数周才能在单个GPU上进行训练,所以就需要从单GPU扩展到多GPU进行训练。减少DNN训练时间最广泛使用的方法是使用数据并行随机梯度下降(SGD)来并行化训练。在数据并行训练中,每个GPU具有模型参数的完整副本,并且在输入数据的子集上独立地训练,GPU经常需要与参与训练的其他GPU交换参数。在大规模训练时,跨GPU同步参数会带来显著的开销-这个问题会因为GPU计算越来越快,模型规模越来越大而变得更加严重,从而使得通信成本上的问题变得愈发突出。

模型参数交换通常使用collective通信原语实现,例如All-Reduce[2]。NVIDIAcollective通信库(NCCL)[7]是一种先进的实现方式,可通过PCIe或更新的互连方式(如NVLink)提供GPU间collective通信原语。通过将NCCL纳入Tensorfow[1],Uber的研究人员表明,端到端的训练过程可以加快60%。

但是,对于某个特定拓扑结构,NCCL并不总是有效地使用所有可用链路。这是因为NCCL使用的是基于环的模式进行数据传输,并在给定拓扑中创建尽可能多的环。考虑图1中的拓扑,是现代NVIDIADGX-1的拓扑实现,这里我们从GPUA使用Broadcast操作。由于每个链路都是双向的,我们可以构建两个环,如图1所示(a)。从一个环开始是A-B-D-C-A,另一个反方向是A-C-D-B-A。要做广播A可以将数据分成两部分,并在每个环上发送一个部分。因此,如果数据大小为n并且链路带宽大小为b,则所花费的时间将是n除以2b。请注意,A-D和B-C(虚线表示)的两个交叉链接没被有效利用起来。

为实现更高的链路利用率,从而加快速度传输,我们提出Blink,这是一系列使用基于广播的数据传输方案的协议,能够充分利用相连的GPU组来实现更高效率。Blink还旨在克服拓扑异构性的困难,这种困难是由于使用的GPU数量不同、硬件层的异构性,多机器训练而引起的。例如,在图1(b)中,我们在Blink中展示了一个广播协议。在这种情况下,从GPUA发送到GPUB的数据,然后再被广播到GPUC和GPUD。我们可以构造三个这样的转发树,因此链路利用率提高,并且所花费的总时间变为n除以3b。

通常,Blink的协议遵循如下分层方案:对于给定网络拓扑,首先将网络划分为组内所有节点完全连接的组。在第一阶段,执行内部广播,其中使用组内的每个全连接节点进行通信交换数据。在第二阶段,执行跨组转发,跨组进行通信,并转发相应组内的跨组数据。我们在Blink中为四个通信原语(Broadcast,Gather,All-Gather,All-Reduce)设计了对应的通信协议。在NVIDIADGX-1机器上使用多达8个GPU的实验表明,与最先进的库相比,Blink可以实现高达2倍的加速。

2.背景

GPU互连拓扑:在这项工作中使用的主要测试平台是NVIDIADGX-1,它是一个配备8个P或VGPU的架构。GPU不仅可以通过PCIe连接,还可以通过新设计的被称为NVLink[8]的互连技术连接。NVLink是一种高带宽且节能的互联技术,可实现20-25GB/s的吞吐量。如图2(a)所示,基于P的DGX-1具有NVLink拓扑。该拓扑结构由两个方形GPU组连接组成,此外还有2条跨GPU组的长连接。

广播与环:基于环的NCCL数据传输浪费了无法形成新环的链路。基于网络拓扑结构,NCCL将拓扑划分为不相交的环。在大多数情况下,我们有剩余的、不能形成新的环的连接,导致这些链接闲置或浪费。在我们基于P的DGX-1机器的NCCL基准测试中,如果我们使用4到7个GPU,它只能形成一个双向环(如图2(a)所示),超过一半的链路空闲。例如,如果我们在DGX-1机器内的8个GPU中使用6个GPU,则它仅使用16个NVLink中的6个。

3.BLINK

接下来,我们来说明Blink中基于广播的协议,将如何提高链路利用率,并处理可变数量的GPU。通常在调度数据传输之前,我们首先将节点划分为完全连接的组,在每个组内执行collective通信,然后跨组进行同步。虽然可以在任何网络拓扑中实现此节点分组,但为了简单起见,我们将讨论基于DGX-1拓扑的AllReduce协议。

3.1Blink中的AllReduce

基于DGX-1拓扑,我们的协议以分层方式进行。首先,我们将此拓扑划分为两组,每组包含4个完全连接的GPU。我们使用内部广播在每个组内执行reduce,然后跨组通过跨组转发进行通信。

内部广播:在内部广播阶段,我们使用reduce-scatter协议。如果,每个组中有4个GPU,并将每个GPU上的数据分成4个块。然后,我们让GPU1,GPU2,GPU3将他们的第一块数据(即图2(b)中的B1,C1,D1)传输到GPU0,这样在这个reduce-scatter步骤之后,GPU0将拥有最终的第一块组内的结果(即ABCD1)。同时,我们将所有第二块数据传输到GPU1,以便GPU1具有第二块的最终结果,以此类推。在此阶段结束时,每个GPU将具有来自组内的最终结果的一个块。注意,即使当不使用组中的所有节点时(例如,当跨6个GPU执行all-reduce时),该方案也适用。由于来自完全连接组的节点的子集也完全连接,所以,我们可以复用上述相同的内部广播协议。

跨组转发:在跨组转发阶段,我们使用跨组链接来聚合其他组的内部结果,并在组内转发最终结果。在我们的示例中,GPU0从另一个组中接收GPU4的结果(即图2(c)中的EFGH1),并和自身的结果(即ABCD1)进行聚合,然后在组内转发最终结果的第一个数据块。整个过程用图2(c)中带箭头的线表示。注意,可以同时执行该聚合和转发。

3.2Benchmark

接下来,介绍上述AllReduce方案的性能基准。我们使用NVIDIADGX-1机器并在每个GPU上初始化1GB数据。随着GPU的数量从2变为8,我们比较了NCCL2和Blink实现的吞吐量。如图3所示,与NCCL2相比,Blink可以在4到7个GPU情况下实现2倍的吞吐量。吞吐量差异的主要原因是Blink可以使用我们的两步数据传输方案来利用更多NVLink链路。

4.未来工作与结论

本文介绍了Blink,一个包含了一系列基于广播的collective通信原语的通讯库。与NCCL中基于环的数据传输相比,此方案可以实现更好的链路利用率、更高的吞吐量并在不同数量的GPU场景下依然有效。在当下硬件异构,以及跨机器Collective通信的环境中,我们将继续推广和拓展Blink。

原文链接:

分享 转发
TOP
发新话题 回复该主题