paper note 003 && Large Scale Distributed Deep Networks - louiss007/lsml GitHub Wiki
摘要
最近在无监督特征学习和深度学习的相关工作证实了训练大模型可以极大地提醒模型的性能。本文,我们考虑这个一个问题,使用数以万计的CPU核训练数以百亿计参数的深度神经网络。我们研发了一个叫DistBelief的框架,它可以利用由上万机器组成的集群来训练大模型。利用这个框架,我们开发了两种训练大规模分布式训练的算法:(i)Downpour SGD,一种支持很多模型副本的异步随机梯度下降算法;(ii)Sandblaster,一个支持多种分布式批量优化的算法框架,包括一种L-BFGS的分布式实现。Downpour SGD和Sandblaster L-BFGS既增加了神经网络的训练规模,又加快了收敛的速度。我们使用此框架成功训练了比之前模型还大30倍的深度网络,并在ImageNet上,在有1600万图片和21000个分类的目标检测上,获得了目前最好的效果。我们证实了同样的技术极大地加速了用于商业语音识别服务的小体积的深度网络。虽然我们主要集中和报告这些技术应用在大型神经网络上的性能,但是潜在的算法适用任何基于梯度的机器学习模型。
主要思想
简介
近年来GPU一直是个前沿的热点,其使小型的神经网络训练在实践中成为可能。但GPU的一个限制是当模型不能放到GPU的内存中时,训练的加速度非常小。为了有效地适用GPU,减少CPU到GPU传输的瓶颈,研究者通常减少训练样本的数量或者模型的大小。
DistBelief支持单机模型并行(通过多线程来实现),多机模型并行(通过消息传递来实现)。并行,同步,通信的细节,框架来负责。DistBelief不仅支持模型并行,也支持数据并行,通过一个模型的多个副本优化一个单一的目标来实现数据并行。利用这个框架,我们研发了两种新的大规模分布式训练算法:(i)Downpour SGD,一种异步的随机梯度下降算法,其利用了自适应学习率,并且支持大量的模型副本;(ii)Sandblaster L-BFGS,一种L-BFGS的分布式实现,支持数据并行和模型并行。对比常规的SGD和L-BFGS,我们的算法获得了更大的训练加速。
我们的算法不仅极大地加速了小模型的训练速度,同时也可以训练比预期大的多的模型。
之前的工作
近年来,随着数据量的增大,大家都转向了研究大规模机器学习算法,这些研究主要集中在线性,凸优化模型方面。在凸优化情况下,分布梯度计算是自然的第一步,但是有时由于同步的问题带来收敛慢的结果。对于该问题,有些前景的努力,想Hogwild利用异步SGD无锁更新参数。不幸的是,这些方法不适合稠密的非凸问题,例如训练深度结构时遇到的问题。
在深度学习领域,大部分工作集中在单机训练相对较小的模型上。一个有趣的尝试利用GPU集群,训练多个小模型,然后将多个小模型的预测结果平均,或者修改标准的深度网络,使它们内在的符合平行性。与之前的工作相反,在对模型形式不加限制的情况下,我们主要集中在训练非常大模型的深度学习技术上,那些拥有几十亿参数的模型。这种情况下,模型并行,思想类似于[23],是一个关键因素,但是需要融合利用数据并行的分布式优化技术。
对于我们的问题,我们考虑了许多现有的大规模计算工具,MapReduce和GraphLab。最后结论是MapReduce,为并行数据处理而设计,并不适合深度网络训练内有的迭代计算模式。GraphLab,为(非结构化)图计算而设计,对于深度神经网络中的结构化图不能充分利用其计算的有效性。
模型并行
DistBelief支持神经网络和分层图模型中的分布式计算。用户定义要进行的计算,也可以将模型切分放在几台机器上。框架在训练和推断时自动进行并行计算,负责机器间的通信,同步和数据传输。
分布在多台机器上的深度网络的性能提升取决于网络的连接结构和模型的计算需求。有大量参数的模型和高计算需求的模型受益于更多的CPU和内存,此时通信开销占主导。带有局部连接结构的网络比全连接的网络更适合大量的分布式,原因在于更低的通信开销。没有达到预期的加速原因在于每台机器运行处理的时间有差别,导致很多机器要等待那台最慢的机器完成计算。结合数据并行,利用大模型在多台机器上的副本,可以进一步降低训练时间。
分布式优化算法
DistBelief框架的并行计算允许我们实例化和运行比之前大的多的神经网络。为了在合理的时间内训练这样的大模型,我们不仅要利用单一模型实例的并行计算,而且要利用多个模型实例进行分布式训练。本节我们描述并行的第二阶段,利用多个模型实例或者副本,同时解决单一的优化问题。
Downpour SGD和Sandblaster L-BFGS,都利用了中心化切片的参数服务器的概念,多个模型副本共享他们的参数。两种方法允许在各自独立的副本上进行分布式的计算。最重要的是,两种方法可以容忍机器间运行时的时间差异,甚至可以容忍有大量模型副本的运行失败。两种方法允许我们在每个模型副本上同时处理不同的训练样本,周期性地融合结果优化我们的目标函数。
传统的SGD公式,由于内在是串行的限制,很难应用到大数据集上。为了使SGD应用到大数据集上,我们提出了异步SGD的一种变体,Downpour SGD,利用一个单一模型的多个副本。基本方法如下:我们将训练数据分为很多子集,在每个子集上跑一个模型的副本。这些模型通过一个中心化的参数服务器进行通信更新,参数服务器保存了模型的所有参数的当前状态,模型的所有参数被分片放在多台机器上(例如,我们有10个参数服务器分片,每个分片负责存储和更新模型参数的十分之一)。这个方法是异步的,表现在两个不同的方面,模型副本彼此独立的运行,参数服务器分片也彼此独立运行。
在最简单的实现中,在处理mini-batch数据之前,模型副本请求参数服务器服务,更新一次模型副本。因为DistBelief模型本身被划分在多台机器上,每台(worker)机器只需要与相对应的参数服务器分片进行通信即可。参数副本更新之后,DistBelief模型副本处理mini-batch数据,计算梯度,将梯度发送给参数服务器,然后ps将其应用到当前的模型参数值上。
Downpour SGD通过限制每个模型副本请求更新参数的频率和发送更新梯度值的频率来降低通信开销。Downpour SGD相比于标准(同步)SGD对机器失败更加鲁棒。对于同步SGD,如果一台机器挂了,整个训练过程被延迟;然后对于异步SGD,如果一个机器上的一个模型副本挂了,其他的模型副本处理其上的数据并通过参数服务器来更新模型参数。尽管由于各种原因,导致模型参数一致性问题得不到保证,但是在实践中,放松一致性要求,效果也非常的好。
Sandblaster的关键思想是参数的分布式存储和操作。此优化算法(eg. L-BFGS)的核心在于调度过程,算法不直接访问模型参数。相反,调度器触发一小部分指令,可以被参数服务器每个分片独立执行的,将结果存储在当前局部的shard机器上。额外的信息,例如L-BFGS的历史缓存也被存储在参数服务器shard机器上。这样就可以在不引起发送所有的参数和梯度到单一中心服务器上带来的通信开销进行大规模训练了。
缺点
每个worker节点上是存储了参数的一个分片,还是模型的全部参数?个人感觉怎么好像还是全部参数,那么当模型大过单机内存怎么办?
总结
本文主要提出了一个进行大规模机器学习的分布式计算框架,并介绍了两种改进的适用于大规模训练的优化算法Downpour SGD和Sandblaster L-BFGS。介绍了大规模机器学习模型并行的优势,结合Downpour SGD介绍了数据并行的优势,为了进一步提高大规模机器学习的性能,结合两种并行会更好。Sandblaster是一种进行大规模机器学习的离线优化算法。