深度学习在GPU和KNL上的扩展(上)


ABSTRACT

神经网络训练速度现已成为深度学习研究和发展的巨大瓶颈。例如在ImageNet数据集上用一个Nvidia K20 GPU训练GoogleNet就需要21天[11]。在提升训练速度方面,现在的深度学习系统都严重依赖硬件加速器。然而这些加速器相比CPUs来说都有着比较明显的片上内存有限的缺点,为了处理大数据集,这些硬件加速器需要从CPU内存或者远程处理器处获取数据。我们同时使用自托管(self-hosted)的Intel Knights Landing(KNL)集群和多GPU集群来作为我们的目标平台。从算法角度来看,当前分布式机器学习系统主要是为云系统设计服务的,这些算法通常被设计为分布式的以满足云系统的低网络和高错误容忍需求。我们聚焦Elastic Averaging SGD(EASGD 弹性平均随机梯度算法)来为HPC集群设计算法,原生的EASGD按机器等级ID排序使用轮询的方式来通信和更新,然而这在HPC集群中并不有效。

首先,我们为HPC重新设计了四个有效算法来提升EASGD在集群中糟糕的可扩展性。在各种比对中,异步EASGD、异步MEASGD和Hogwild EASGD都比他们原来的版本更快(原来的版本即未改进的版本)。最后,我们设计了Sync EASGD,它与所有方法的最佳性能保持一致,同时具有确定性。(Finally, we design Sync EASGD, which tiesfor the best performance among all the methods while being deterministic.)

除了算法性提升外,我们使用一些系统-算法协同设计技术来扩展算法。通过将通信百分比从87%降至14%,在相同的平台下,我们的同步EASGD相比原生的EASGD实现了5.3倍的速度提升。我们在4253 KNL核心上获得91.5%的缩放效率,这已经超过了现有水平。

KEYWORDS

分布式深度学习,Knights Landing,可扩展算法
ACM引用格式:
YangYou, Aydın Buluc¸, and James Demmel. 2017. Scaling Deep Learning n GPU andKnights Landing clusters. In Proceedings of SC17, Denver, CO, USA, November12–17, 2017, 12 pages.
DOI: 10.1145/3126908.3126912

MAJOR CONTRIBUTIONS

(1)同步EASDH和Hogwild EASGD算法。
我们记录了实现这两个算法的过程,它们最终实现了比现有方法更好的性能。现存EASGD使用轮询更新规则,我们称其为原生EASGD(original EASGD)。我们在实现异步EASGD时首先将轮询规则改为参数-服务器规则。原生EASGD与异步EASGD的区别在于原生EASGD是有序的而异步EASGD是无序的。在实现异步MEASGD时我们又加入了动量。无论是异步EASGD还是异步MEASGD都相对于原生EASGD来说都没有明显的提速(如图8)。

在原生EASGD和异步EASGD中,the master同一时间只能和一个worker通信,现在我们放松了这一需求,允许the master同一时间与多个workers来得到Hogwild EASGD(allow the master tocommunicate with multiple workers at a time to get Hogwild EASGD)。The master首先从不同workers处接收多个权重,然后the master通过Hogwild(lock-free)更新规则来处理这些权重,我们观察到lock-free Hogwild使得Hogwild EASGD比原生EASGD运行速度更快。对于凸情况来说,我们可以证明在一些假设下该方案是更安全快速的
https://www.cs.berkeley.edu/_y ... f.pdf)。

我们在同步EASGD中使用三个归约算法来替代轮询机制来获取更快的速度(Θ(logP) vs Θ(P))。这是非常重要的,因为深度学习研究者通常需要调超参(hyperparameters),而这一操作是非常耗时的。还有一个并不是我们的主要贡献:我们记录了一些我们中间考虑到的算法的性能排序。例如,我们观察到异步EASGD比异步SGD速度更快,异步MEASGD比异步MSGD更快速。

(2)为多GPU设计的算法-系统协同设计。
算法级的优化后,我们推出一个多GPU系统上的有效设计。我们通过改变数据的物理位置来减少通信消耗。我们还设计一些策略来将通信消耗部分重叠到计算中。在算法-系统协同设计后我们相比原生EASGD完成了5.3倍的速度提升。

(3)使用KNL集群来为DNN训练提速。
GPUs是训练DNN的好工具,但是我们也想要为深度学习应用开发更多的可供选择的硬件平台。我们选择了KNL,因为他有强大的计算和内存单元。

1.jpg


BACKGROUND

(1)Intel Knights Landing 架构
KNL架构是Intel Xeon Phi.的最新版本(Intel首款专门针对高度并行工作负载而设计的可独立自启动的主处理器),相对于上一个版本Knights Cornor(KNC)KNL有稍微更多的cores(大约72或68 vs 60)。和KNC一样,每个KNL core有4个硬件线程并且支持用于SIMD数据并行的512位指令。KNL主要特征如下:

① 自托管平台:传统的加速器(例如FPGA,GPUs和KNC)依赖CPU进行控制和IO管理。对某些应用来说,以PCIE作为传输路径可能会造成运行瓶颈,因为加速器的内存是有限的(例如Nvidia K80 GPU只有12GB的GDDR5片上内存)(解释一下:加速器上内存有限,加速器需要去CPU内存或者别的处理器内存找数据,这时要通过很慢的PCIE,影响运行速度)。KNL并不需要主机管理,他可以通过一个例如CentOS7的OS进行自管理。

② 更好的内存:KNL的DDR4内存要比KNC的内存大小要大得多(384 GB vs 16GB)。而且,KNL配备了16GB的多通道DRAM(MCDRAM)。MCDRAM的测量带宽是475GB/s(STREAM benchmark),KNL的常规DDR4带宽是90GB/s。MCDRAM有三个模式:a)缓存模式:KNL将其作为最后一级缓存;b)平坦模式:KNL将其作为常规DDR使用;c)混合模式:它的一部分作为缓存使用,一部分作为常规DDR使用(如图二)

③ 可配置的NUMA:支持多对多(A2A)、象限/半球(Quad/Hemi)、sub-NUMA(SNC-4/2)集群的缓存操作模式。A2A:内存地址统一的分布在片上所有标记目录上。Quad/Hemi:芯片被分成四部分被称为象限,空间被分为四组内存控制器,一个象限内的内存控制器只保证映射到包含在本象限内的标记目录上。半球则是分成两部分,而不是四部分。SNC-4/2模式就是将芯片分为四个象限或者两个半球后再以NUMA节点的方式暴露出去,在这种模式下,NUMA感知的软件可以将软件线程引导到包含标记目录和访问NUMA本地内存的同一象限(半球)。

(2)DNN和SGD
本节我们聚焦CNN,图3是CNN示意图。CNN由一系列的张量构成,我们说的张量是权重。在运行时,CNN的输入是图片X(图3中图片X被存储为32×32的矩阵)。经过一系列的张量-矩阵操作,CNN的输出是一个整数y(例如:y∈{0,1,2,……,9})。张量-矩阵操作可以通过密集矩阵-矩阵相乘、FFT、密集矩阵-向量相乘、密集向量-向量相加和非线性变换(例如:Tanh、sigmod、Relu等)来完成。

图三是一个手写图片识别的例子。输入图片X应该被人类识别为3,如果y是3,那么这个输入图片通过CNN框架得到了正确的分类。为了得到正确的分类,我们需要得到一个可行的权重集合,这些权重是用使用现实世界的数据集训练得到的。为了简单,我们将权重看作W训练数据集是{Xi,yi},i∈{1,2,……,n},n是训练的图片个数,yi是Xi的正确标签。训练过程包含三部分:1)向前传播;2)向后传播;3)权值更新。

向前传播:Xi从神经网络的第一层被传递到最后一层(图3从左到右)。预计输出y‘i应该是Xi的标签。
向后传播:我们得到yi和y’i间误差的一个数值估计E,然后我们将E从最后一层传递到第一层来得到W的梯度,我们称该梯度为ΔW。
权重更新:我们通过更新权重:W ß W – ηΔW来改善CNN框架,这里η是学习率(通常是0.01)。
在模型最优化之前,所有的图片都要迭代地经历这三个步骤。这个方法就被称作随机梯度下降(SGD)[7],随机即我们随机选择一批图片(b个)作为一次迭代。通常b是一个16到2048的整数,如果b太大,那么SGD的收敛性就会下降[19]。

(3)数据并行和模型并行
让我们在P个机器上使用并行化的方式进行DNN训练。有两种主要的并行化策略:数据并行(图4.1)和模型并行(图4.2).所有后来的并行方法都是这两种并行的变形。

数据并行:数据集被分为P个部分,每个机器上执行一部分。每个机器上都有一个神经网络副本,机器间的通信包括所有梯度ΔWi的总和和W的广播。通信的第一部分是在向后传播居然权重更新之间进行的:当The master收到所有来自workers的子梯度ΔWi后,通过W<— W-η∑pi=1ΔWi来更新W。然后通信的第二部分是the master机器将W广播给所有的workers机器(图4.1是4台机器上的数据并行例子)。

模型并行[3]:数据并行是在每个机器中复制一份神经网络,而模型并行则是将神经网络分成P份,拆分神经网络意味着让矩阵操作在被分割的机器上并行进行。因此,模型并行和单机是一样的。图4.2展示了3个机器上的模型并行。三个机器分割每层的矩阵操作,然而,因为典型的批量大小(<=2048)和图片大小(32×32)相对较小,矩阵操作规模并不大。例如并行2048×1024×1024的矩阵计算只需要一到两个机器。因此现有最高水平的模型通常使用数据并行。

(4)我们的方案评估
这篇文章主体是针对HPC系统设计一个分布式算法来在比现有算法更短的时间内获得同等或者更高的精确度。如果我们的优化可能会影响算法的收敛,我们会报告时间和精度。否则,我们只报告实验时间。本文所有算法使用对比都在相同的硬件(CPUs、GPUs或KNLs)和相同的超参(batch size、学习率等)环境下。我们不对比不同的架构(例如KNL和K80 GPU),因为它们的性能、能耗和价格都不同。

RELATED WORK

本章,我们回顾下先前的并行或分布式系统上的可扩展神经网络。
(1)参数服务器(异步SGD)
图5是参数服务器或异步SGD示意图,在该框架下,每一个worker机器有一个权重W副本,数据集被分个到所有的worker机器上。在每一步,第i个worker根据它自己的数据集和W计算出一个子梯度(ΔWi),然后将第i个worker机器上的子梯度送到master机器上(i∈{1,2,……,p})。The master接收ΔWi来进行权重更新,然后将新的权重送给第i个机器。所有的workers通过先到先服务(FCFS)方式异步完成该步骤。

2.jpg


3.jpg


4.jpg


(2)Hogwild(Lock free)
Hogwild方法[21]可以看作异步SGD的一个变形。The master是共享内存系统,对异步SGD来说,如果在the master与第i个worker交互期间,第j个worker也传来了子梯度,那么在W<—W - ηΔWi完成之前W<—W – ηΔWj将被阻塞(i,j∈{1,2,……,p})。这意味着为了避免在the master机器共享内存系统内的权值更新冲突,这里使用了锁机制。锁机制确保master中同一时间只有一个子梯度进行权值更新。而Hogwild方法移除了锁机制,允许master同一时间处理多个子梯度。文章[21]证明了Hogwild的lock free方法的收敛性。

5.jpg


(3)EASGD(轮询)
弹性平均SGD(EASGD)也可以被看作是异步SGD的一种变形,异步SGD对每个子梯度采用先到先服务的异步方式。EASGD使用一个轮询机制来顺序更新,即W<—W - ηΔWi不能发生在W<—W - ηΔWi-1之前(i∈{2,3,……,p})。而且EASGD要求workers完成本地更新(公式(1)),在所有workers本地更新之前,the master要更新全局权重(公式(2))。

6.jpg


公式(1)(2)中的ρ是连接全局更新参数和本地更新参数的一个系数。原生的SGD方法框架如算法1所示。

(4)其他方法
Chao Li等人 [17]聚焦单节点的内存优化。这个想法被包含在我们的实施中。 还有一些工作[3],[15]通过模型并行方法扩展深层神经网络,这超出了本文的范围,本文关注点在数据并行。神经网络的低精度表示是另一个研究方向,其主要想法是使用低精度浮点数(比如使用8位而不是32位)在可接受的准确度范围内来减少计算和通信消耗([4][8][10][22]),这也是我们未来要研究的。

7.jpg


———未完待续———

ML二期新二维码海报.jpg

0 个评论

要回复文章请先登录注册

返回顶部