博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
伯克利与微软联合发布Blink:使GPU计算实现高达2倍加速
阅读量:6227 次
发布时间:2019-06-21

本文共 3150 字,大约阅读时间需要 10 分钟。

本文来自SysML 2018,由星云Clustar编译并授权InfoQ发布,原文链接:

大规模分布式机器学习应用中,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%。

但是,对于某个特定拓扑结构,NCCL并不总是有效地使用所有可用链路。这是因为NCCL使用的是基于环的模式进行数据传输,并在给定拓扑中创建尽可能多的环。考虑图1中的拓扑,是现代NVIDIA DGX-1的拓扑实现,这里我们从GPU 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(虚线表示)的两个交叉链接没被有效利用起来。

\"image\"

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

通常,Blink的协议遵循如下分层方案:对于给定网络拓扑,首先将网络划分为组内所有节点完全连接的组。在第一阶段,执行内部广播,其中使用组内的每个全连接节点进行通信交换数据。在第二阶段,执行跨组转发,跨组进行通信,并转发相应组内的跨组数据。我们在Blink中为四个通信原语(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拓扑。该拓扑结构由两个方形GPU组连接组成,此外还有2条跨GPU组的长连接。

\"image\"

广播与环:基于环的NCCL数据传输浪费了无法形成新环的链路。基于网络拓扑结构,NCCL将拓扑划分为不相交的环。在大多数情况下,我们有剩余的、不能形成新的环的链接,导致这些链接闲置或浪费。在我们基于P100的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.1 Blink中的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.2 Benchmark

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

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

\"image\"

4.未来工作与结论

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

转载地址:http://oanna.baihongyu.com/

你可能感兴趣的文章
Python 安装cx_Oracle模块折腾笔记
查看>>
wvs_patcher批量测试网站
查看>>
【转】Lua编程规范
查看>>
P4779 【模板】单源最短路径(标准版)
查看>>
二三维联动之MapControl与SceneControl的联动
查看>>
cocos2dx ScrollView 测试二 自定义Item和boundingBox
查看>>
洛谷P4175 网络管理
查看>>
js监听input输入字符变化
查看>>
tcpdump详解
查看>>
JAVA基础:ArrayList和LinkedList区别
查看>>
不仅仅完成功能,避免无效成本浪费
查看>>
[转载]SCSF 系列:Smart Client Software Factory 中 MVP 模式最佳实践
查看>>
什么是零宽断言
查看>>
复制延迟排查
查看>>
5.01 列出模式中的表
查看>>
Algs4-1.4DoublingRatio
查看>>
html介绍和head标签
查看>>
(转)C语言位运算详解
查看>>
[题解]Codeforces Round #519 - B. Lost Array
查看>>
Python 学习 —— 进阶篇(装饰器、类的特殊方法)
查看>>