当前位置: 首页 > 科技观察

深度神经网络分布式训练概览:常用方法和技巧的综合总结

时间:2023-03-19 18:16:49 科技观察

独立研究人员KaranbirChahal和ManrajSinghGrover与IBM研究员KuntalDey最近发表了一篇关于深度神经网络分布式训练方法的论文,全面系统进行总结,涉及训练算法、优化技术、节点间通信方式等。机器之心摘录论文主要内容进行介绍。关于数学推理过程和算法步骤的更多解读,请参考原论文。论文地址:https://arxiv.org/abs/1810.11787深度学习给人工智能领域带来了巨大的发展和进步。然而,必须指出的是,训练深度学习模型需要大量的计算。虽然在配备现代GPU的单台机器上对ImageNet等基准数据集进行训练可能需要长达一周的时间,但研究人员观察到,将训练分布在多台机器上可以显着缩短训练时间。时间。最近的研究使用2048个GPU集群将ImageNet训练时间减少到4分钟。本文总结了用于分布式训练的各种算法和技术,并介绍了当前用于现代分布式训练框架的最佳方法。更具体地说,我们探索了分布式随机梯度下降的同步和异步变体、各种AllReduce梯度聚合策略,以及在集群上实现更高吞吐量和更低延迟的最佳实践,例如混合精度训练、大批量训练和梯度压缩。1.简介(1)背景和动机数据正以前所未有的规模生成。大型互联网公司每天产生数TB的数据,需要对其进行有效分析以提取有意义的见解[1]。新兴的深度学习是执行此类分析的强大工具,这些算法在视觉[2]、语言[3]和智能推理[4]领域的复杂任务上创造了最先进的技术。不幸的是,这些算法需要大量数据才能有效训练,这反过来又很耗时。第一个在ImageNet分类任务上取得最先进结果的深度学习算法花了整整一周的时间在单个GPU上进行训练。在当今时代,这种速度根本不够用,因为用于训练当前模型的数据甚至会使ImageNet数据集的大小相形见绌。在保持单GPU模型的准确性的同时,存在横向扩展深度学习训练的内在需求。理想情况下,这种训练的速度应该与机器数量成线性比例,具有容错性,并在高延迟网络条件下收敛。(2)分布式训练概述神经网络的分布式训练可以通过两种方式实现:数据并行化和模型并行化。数据并行化的目标是将数据集平均分配给系统的每个节点,其中每个节点都有神经网络及其局部权重的副本。每个节点处理数据集的不同子集并更新其本地权重集。这些局部权重在集群中共享,以通过累积算法计算一组新的全局权重。这些全局权重依次分发给所有节点,然后节点根据它们处理下一批数据。模型并行化是通过将模型的架构划分到不同的节点来实现训练的分布。AlexNet[2]是最早使用模型并行化的模型之一,它通过将网络分布在2个GPU上使模型适合内存。当模型架构太大而无法在单台机器上安装并且模型的某些部分可以并行化时,可以应用模型并行化。模型并行化可用于某些模型,例如目标检测网络[5],其中边界框绘制和类别预测部分相互独立。一般来说,大多数网络只能分配给2个GPU,这限制了可以实现的可扩展性,因此本文主要关注数据并行化。本文大致分为六章。第一部分将介绍现有的优化训练算法。第二节将重点介绍用于连接网络各个节点的通信策略。第三部分探讨了特定技术,例如大批量训练、梯度压缩和混合精度训练,以在低功耗设备和慢速网络上进行高效训练。第四节将消化前面章节中的信息,并为不同的设置选择最优的训练算法和通信原语。最后两节分别是未来研究的方向和结论。2.分布式训练框架的组成(1)分布式训练算法在分布式设置中训练的常用算法是随机梯度下降(SGD),这将是我们进一步讨论的核心点。需要指出的是,针对SGD提到的原理可以很容易地移植到其他常用的优化算法中,例如Adam[6]、RMSProp[7]等[8]。分布式SGD大致可以分为两种变体:异步SGD和同步SGD。同步SGD[9]的目标是在分布式设置中复制算法,从而将网络中的节点紧密耦合在一起。异步SGD[10]通过减少节点之间的依赖性来消除不同节点之间的耦合。虽然这种解耦可以实现更大程度的并行化,但不幸的是,它的稳定性和准确性略有下降。已经提出了对异步SGD的几种修改,以缩小与同步SGD的精度差距。最近的研究趋势是扩展同步SGD,更具体地说,大批量训练网络已经取得了很好的效果。更大的mini-batch大小有一些优势,主要的一个是在训练大mini-batch时,模型可以以更大的步幅达到局部最小值,从而加快优化过程。但在实践中,使用大批量可能会导致发散问题或“泛化差距”,网络的测试精度有时会低于在小批量上训练的模型。最近的几项研究已经通过缩放与批量大小成比例的学习率来实现大批量训练。实验发现,增加批量大小等同于降低学习率[11],并且使用大批量大小进行训练具有额外的好处,即在训练期间需要更新的总参数更少。通过将批量大小增加到8096并使用线性学习率调整,可以在不到一个小时的时间内在ImageNet[12]上训练[9]。一种称为LARS[13]的技术支持高达32k的批量大小,最近与[14]中的混合精度训练相结合,使用64k的批量大小在ImageNet数据库上成功地在4分钟内完成训练。火车。(2)节点间通信分布式训练还有一个重要组成部分,就是节点间的数据通信。由于一些分布式文件系统,如GFS[15]和Hadoop[16],这已经是一个成熟的研究课题。以点对点方式在节点之间实现高效和带宽感知通信需要集体通信原语[17],它首先在高性能计算(HPC)系统中引入,后来由[18]引入深度学习领域学习。TensorFlow[19]和PyTorch等现代深度学习框架将这些原语用于AllReduce过程,因为它们允许在最佳时间内完成互连节点之间的梯度传输。AllReduce[17]在实际应用中有很多变体,如RingAllReduce、RecursiveHalfing/Doubling、BinaryBlocks算法。在分布式训练中,为了实现有效的水平扩展,计算和通信的配置必须是最优的。如果通信步骤高效且与各个机器的计算同步,则训练是最佳的,即跨集群的计算应该大致在同一时间结束。如果网络速度很慢,那么节点之间的通信就会成为瓶颈。梯度压缩和混合精度训练都是提高网络整体吞吐量的有前途的技术。最近的一项研究[20]发现,使用周期性学习率可以将实现网络收敛所需的epoch数减少10倍,使其成为分布式训练中一个很有前途的研究方向。(3)随机梯度下降(SGD)的一种变体随机梯度下降[21]是一种训练神经网络的优化算法。这是梯度下降的一种变体,一种用于调整权重以使每个反向传播步骤后的结果更接近最小值的算法。SGD不同于纯梯度下降,因为它适用于小批量而不是单个训练示例。它的形式为:其中w_(t+1)是为当前批次计算的权重,n是小批次中训练样本的数量,?l(x,w_t)是为前一个批次计算的梯度训练样本。对于分布式情况,SGD大致可以分为两类:异步SGD和同步SGD。随后的章节详细描述了这两个SGD及其变体。3.同步SGD同步SGD是一种分布式梯度下降算法,是目前分布式训练最常用的优化方法之一。网络中的节点首先计算其本地批量数据的梯度,然后每个节点将其梯度发送到主服务器。主服务器通过对它们进行平均来累积这些梯度,为权重更新步骤构建一组新的全局梯度。这些全局梯度使用与单机SGD相同的方法更新每个节点的局部权重。整个过程类似于在一台机器上用单个小批量数据计算前向传播和反向传播步骤,因此同步SGD可以保证收敛。但是同步SGD也有一些局限性。4.异步SGD异步SGD是一种分布式梯度下降算法,允许在不同节点上使用不同的数据子集并行训练多个模型副本。模型的每个副本都从参数服务器请求全局权重,处理一个小批量计算梯度并将它们发送回参数服务器,然后参数服务器相应地更新全局权重。由于每个节点都是独立计算梯度,彼此之间没有交互,它们可以按自己的节奏工作,对机器故障的鲁棒性更强,即如果一个节点发生故障,其他节点可以继续处理,从而消除了同步障碍问题由同步SGD引入。5.RingAllReduce算法[17]中结合了两种算法:scatter-reduce和allgather。图1:环形算法scatterreduceworksp-1步,其中p是机器数。梯度向量被分成p个块。算法一:环形算法scatterreducescatterreduce过程结束后,每台机器都会有一部分最终结果。现在,每台机器只需将其部分结果广播给所有其他机器。这是使用allgather过程完成的,与scattergather非常相似,只是接收到的数据有所减少,这仅被视为最终结果并被存储。算法2:Ring算法的allgather6.Recursivehalvinganddoublingalgorithm[17]递归距离加倍和向量减半算法使用了4种不同的原语,如下:Recursivevectorhalving:向量在每个时间步减半。递归向量乘法:递归地收集分散在进程中的小向量片段以构建大向量。递归距离减半:机器之间的距离在每次通信迭代后减半。递归距离加倍:机器之间的距离在每次通信迭代后成倍增加。图2:减半加倍算法与Ring算法类似,这种AllReduce算法也由两个过程组成:scatter-reduce和allgather。该算法与Ring算法的不同之处在于这些过程执行操作的方式。算法3:ScatterReduce向量减半算法算法4:AllGather向量乘法算法7.BinaryBlocks算法BinaryBlocks算法是递归距离乘法和向量减半算法的扩展,其目标是当机器数不是幂时of2减少计数时的不平衡负载。在除2的幂以外的数字的原始算法中,有些机器会闲置直到算法完成,之后它们会收到结果向量。这种做法在某些情况下会导致大量空闲机器,比如一个600台机器的集群,会有86台机器空闲,进程只会在另外512台机器上执行。使用此方法可能会出现严重的负载不平衡。BinaryBlocks算法通过将机器数量分成多个2的幂的块来缓解这个问题。例如,对于一个有600台机器的集群,它可以分为4组,其中每组有2^9,2^6、2^4、2^3台机器。算法5:BinaryBlocksMasterServer算法算法6:ScatterReduceMasterClient算法8.容错AllReduce如果分布式集群由低可靠性设备组成,一旦出现机器故障,AllReduce算法需要重新启动。我们提出了一种容错二进制块算法,将Raft共识算法[31]的元素集成到AllReduce中。该算法对机器故障具有弹性,只要备份副本仍在运行,它就会继续执行。图3:Raft算法9.调整batchsize在实际训练深度神经网络时,学习率会随着训练经过多个epoch而慢慢地逐渐降低。这背后的直觉想法是让权重在训练的早期采取更大的步骤,并在模型接近收敛时采取更小的步骤。这在实践中相当有效,并且比以固定学习率训练的模型实现更好的收敛。这也是一种非常有效的方法,因为尽早使用较大的学习率可以在使用较小的学习率进行微调之前取得很好的进展。然而,大批量训练是一个很有前途的研究方向,因为这可以显着加快训练过程,将训练时间从几天缩短到几分钟,如[9,14,13]中所示;[11]中的研究强化了这一趋势,实验证明增加batchsize等同于降低学习率。大batchsize训练的好处是模型进行整体权重更新的次数少,训练速度更快,如图4所示。但是直接大batchsize训练也有问题,比如早熟与使用较小批量训练的模型相比,分歧和较低的最终验证准确性。图4:学习率下降与批量大小增加[11]10.张量融合对于ResNet等一些常见模型,研究人员观察到为梯度计算的张量大小非常小。更具体地说,卷积层的梯度张量大小远小于全卷积层。这种现象很重要,因为通过线路发送少量数据会导致大量延迟,并且还会未充分利用网络带宽。解决这个问题的一种简单方法是张量融合[14],它只是简单地将多个小张量融合在一起,形成一个至少超过某个最小尺寸的张量,然后在网络中发送这个张量。生成的张量。执行这种融合的好处是减少每台机器启动时间的负载,并降低网络流量的整体频率。这允许网络不那么混乱,并在最佳时间完成任务。然而,对小张量使用张量融合可能会导致RingAllReduce变得低效和缓慢。[14]提出了一种分层的AllReduce,使用多层主从设置。观察表明,这种方法可以带来更低的延迟。这种分层的AllReduce通过将所有机器分成不同的批次来工作,然后每个批次选择一个主节点来聚合梯度。这些主节点对自己执行RingAllReduce,之后主节点将更新后的梯度分发给各自的从节点。这种策略是通过减少batch的数量来减少延迟开销,然后逐渐减少RingAllReduce的开销。使用tensorfusion可以减少小网络的处理,提高网络的整体速度,强烈推荐。这种方法广泛应用于Horovord[38]和腾讯的框架[14]等工业系统,使其成为现代分布式训练框架的重要成员。11.低精度训练目前在ImageNet数据库[12]上训练ResNet模型[29]的最快时间是4分钟[14]。在那项研究中,研究人员使用低延迟零拷贝RDMA网络连接了2048个GPU,并结合了LARS、混合AllReduce、张量融合和混合精度训练。hybridAllReduce算法结合了RingAllReduce和hierarchicalversion,根据当前step的tensorsize进行切换。他们还使用一种新方法实现了这种整体训练速度增益:混合精度训练[39]。由此带来的吞吐量和带宽效率的提高使训练速度提高了8倍。顾名思义,混合精度训练使用两种不同的数据类型来训练神经网络——一种适用于大多数操作的较小数据类型,以及一种适用于大多数操作的较大数据类型用于精度关键操作。神经网络最初使用单精度或双精度数字作为默认数据类型,因为这些数据类型擅长捕获网络试图建模的任务的表示。单精度数是32位浮点数,双精度数是64位浮点数。最近的研究表明,通过对精度较低的数据类型进行训练,神经网络的速度和大小可以降低50%-80%[40,41]。一种常见的方法是使用16位浮点数来训练网络(FP16训练),但这些网络的测试精度将比使用单精度训练的相同网络更差[39]。造成这种情况的原因主要是权重更新步骤的准确性较低。更具体地说,将低精度梯度与学习率相乘有时会导致值溢出16位范围,从而导致计算错误,从而导致最终验证精度的损失。混合精度训练[39]旨在通过使用单精度(32位)权重的主副本并以半精度(16位)运行其他所有内容来解决此问题。混合精度训练可实现更高的吞吐量,减少计算和通信瓶颈。但是,混合精度训练也有一些注意事项,比如损失损失和较低的算术精度。12.梯度和参数压缩分布式训练过程中的一个主要瓶颈是节点间通信模型权重和梯度的高带宽成本。由于网络带宽低和连接速度慢,使用联邦学习[42]在设备(尤其是移动设备)上进行训练时,这种瓶颈尤为明显。针对这一问题,研究人员提出了多种有效利用网络带宽的方法。使用SGD的异步和同步变体允许节点独立通信,同时还可以实现并行化并在一定程度上提高网络带宽利用率[10,43,44];在梯度压缩方面也取得了一些重大进展,有希望[45]。这些方法主要基于两个主要思想:量化和稀疏化。算法7:节点k上朴素动量SGD的深度梯度压缩13.未来研究分布式训练领域在过去几年取得了长足进步,并有望进一步创新。相关领域目前正在将mini-batchsize限制增加到网络不发散或降低同步SGD最终验证精度的程度,同时也在研究异步SGD的陈旧梯度和最终验证精度降低的问题。低功耗设备上的训练以联邦学习[42]的形式获得了一些动力,并且出现了一些用于安全和分散训练的现代深度学习框架构建块。在消费级设备上进行训练有一些好处,其中之一是能够创建智能应用程序,根据消费者互动学习特定习惯,并且通过在设备上存储数据和执行训练,还可以确保用户的数据隐私。此类应用程序的一个示例是Android预测键盘,它在设备上学习一个小型个性化模型来预测下一个单词。在低功耗设备上进行训练的一个关键挑战是可用的网络带宽和计算资源很少。高效的框架可以在手机和物联网设备上进行大规模训练,从而实现便携式深度学习应用。[54]在低功耗设备的分布式训练方面做了一些出色的工作,使用强化学习算法在异构设备集群上安排训练任务。商品级设备的分布式训练需要在训练和通信方面进行多项优化。梯度压缩和混合精度训练是一些有前途的方向,并取得了良好的效果。总体而言,该领域的研究方向非常活跃和创新,有望成为更广泛智能应用的核心组件。总结我们介绍并总结了分布式训练框架的各个组成部分。为了创建高效且可扩展的分布式训练框架,我们推荐以下技术:建议使用同步SGD算法进行训练,因为它具有严格的收敛保证。GradientAccumulationAllReduce过程应该使用BinaryBlocks算法执行,因为它有更好的运行时间。为了有效地使用硬件和网络带宽,框架中应使用梯度压缩、量化和混合精度训练等多种技术。我们建议结合使用深度梯度压缩和混合精度训练。训练应该以非常大的批量大小进行,以最大限度地提高并行度并最大限度地减少运行时间。我们推荐LARS算法,因为它已被证明足够鲁棒,可以训练批量大小高达64000的网络。Machine(id:almosthuman2014)》]点此查看作者更多好文