伯克利与微软联合发布Blink:使GPU计算实现高达2倍加速

发布于:2021-10-17 11:54:33


本文来自SysML 2018,由星云Clustar编译并授权InfoQ发布,原文链接:http://www.sysml.cc/doc/151.pdf



大规模分布式机器学*应用中,GPU间参数聚合的速度对整体训练速度起到至关重要的作用,尤其当今GPU算力越来越强,参数聚合速度的重要性也日益显著。伯克利与微软在SysML 2018上推出了一个基于NVLink构建的高性能的参数聚合通讯库Blink并发表了相关论文。文中重点介绍了Blink的设计,并通过实验来证明其有效性。


1.引言

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


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


但是,对于某个特定*私峁梗琋CCL并不总是有效地使用所有可用链路。这是因为NCCL使用的是基于环的模式进行数据传输,并在给定*酥写唇ň】赡芏嗟幕贰?悸峭1中的*耍窍执鶱VIDIA DGX-1的*耸迪郑饫镂颐谴覩PU A使用Broadcast操作。由于每个链路都是双向的,我们可以构建两个环,如图1所示(a)。从一个环开始是A-u0026gt; B-u0026gt; D-u0026gt; C-u0026gt; A,另一个反方向是A-u0026gt; C-u0026gt; D-u0026gt; B-u0026gt; A。要做广播A可以将数据分成两部分,并在每个环上发送一个部分。因此,如果数据大小为n并且链路带宽大小为b,则所花费的时间将是 n除以2b。请注意,A u0026lt; - u0026gt; D和B u0026lt; - u0026gt; C(虚线表示)的两个交叉链接没被有效利用起来。



为实现更高的链路利用率,从而加快速度传输,我们提出Blink,这是一系列使用基于广播的数据传输方案的协议,能够充分利用相连的GPU组来实现更高效率。Blink还旨在克服*艘旃剐缘睦眩庵掷咽怯捎谑褂玫腉PU数量不同、硬件层的异构性,多机器训练而引起的。例如,在图1(b)中,我们在Blink中展示了一个广播协议。在这种情况下,从GPU A发送到GPU B的数据,然后再被广播到GPU C和GPU D。我们可以构造三个这样的转发树,因此链路利用率提高,并且所花费的总时间变为n除以3b。


通常,Blink的协议遵循如下分层方案:对于给定网络*耍紫冉缁治槟谒薪诘阃耆拥淖椤T诘谝唤锥危葱心诓抗悴ィ渲惺褂米槟诘拿扛鋈咏诘憬型ㄐ沤换皇荨T诘诙锥危葱锌缱樽ⅲ缱榻型ㄐ牛⒆⑾嘤ψ槟诘目缱槭荨N颐窃贐link中为四个通信原语(Broadcast,Gather,All-Gather,All-Reduce)设计了对应的通信协议。在NVIDIA DGX-1机器上使用多达8个GPU的实验表明,与最先进的库相比,Blink可以实现高达2倍的加速。


2.背景

GPU互连*:在这项工作中使用的主要测试*台是NVIDIA DGX-1,它是一个配备8个P100或V100 GPU的架构。GPU不仅可以通过PCIe连接,还可以通过新设计的被称为NVLink [8]的互连技术连接。NVLink是一种高带宽且节能的互联技术,可实现20-25 GB / s的吞吐量。如图2(a)所示,基于P100的DGX-1具有NVLink*恕8猛*私峁褂闪礁龇叫蜧PU组连接组成,此外还有2条跨GPU组的长连接。



广播与环:基于环的NCCL数据传输浪费了无法形成新环的链路。基于网络*私峁梗琋CCL将*嘶治幌嘟坏幕贰T诖蠖嗍榭鱿拢颐怯惺S嗟摹⒉荒苄纬尚碌幕返牧唇樱贾抡庑┝唇酉兄没蚶朔选T谖颐腔赑100的DGX-1机器的NCCL基准测试中,如果我们使用4到7个GPU,它只能形成一个双向环(如图2(a)所示),超过一半的链路空闲。例如,如果我们在DGX-1机器内的8个GPU中使用6个GPU,则它仅使用16个NVLink中的6个。


3.BLINK

接下来,我们来说明Blink中基于广播的协议,将如何提高链路利用率,并处理可变数量的GPU。通常在调度数据传输之前,我们首先将节点划分为完全连接的组,在每个组内执行collective通信,然后跨组进行同步。虽然可以在任何网络*酥惺迪执私诘惴肿椋思虻テ鸺颐墙致刍贒GX-1*说腁llReduce协议。


3.1 Blink中的AllReduce

基于DGX-1*耍颐堑男橐苑植惴绞浇小J紫龋颐墙送*嘶治阶椋孔榘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.2 Benchmark

接下来,介绍上述AllReduce方案的性能基准。


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



4.未来工作与结论

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

相关推荐

最新更新

猜你喜欢