本文为 AI 研习社编译的技术博客,原标题为 Intro to Distributed Deep Learning Systems ,作者 Hao Zhang 。
翻译 | 余杭 机智的工人 江舟 校对 | Lamaric 整理 | MY
通常来说,分布式机器学习(DML)是一个跨学科的领域,它几乎涵盖计算机科学的各个领域:理论(譬如统计学、学习理论、优化论)、算法、以及机器学习核心理论(深度学习、图模型、核方法)。在这些子领域中,有无数的问题需要探索和研究。另外,分布式能够很好地利用大数据,它已经成为目前工业界最广泛应用的机器学习技术。
为了最容易的理解 DML,我们将它分成四类研究问题。但请注意,这些类别并非是相互排斥的。
1. 如何使用统计学、优化理论和算法?
由于大多数机器学习任务本质上是在减小一组训练数据的损失」,我们就更多关注以下问题:
优化过程需要多长时间才能达到收敛?或者说,收敛速度(收敛率)是多少?
收敛解有多少?
需要多少训练数据才能保证良好的解?
为了研究这些问题,研究人员采用了理论分析工具,如优化理论 (https://en.wikipedia.org/wiki/Mathematical_optimization) 或 统计学习理论(https://en.wikipedia.org/wiki/Statistical_learning_theory)。然而,在大规模机器学习的背景下,我们给出了更多的计算资源,我们的目标是通过并行或分布式计算技术利用额外资源来加速(即减少模型的训练/测试时间),我们也很想弄清楚另一组看上去相似但不同的问题:
通过分布式或并行训练,我们的模型和参数是否保证在没有加速的情况下收敛到相同的状态?
如果他们没有收敛到同一个状态,那么我们离原始解决方案有多远,我们距离真正的最优解决方案有多远?
达到「良好」趋同还需要哪些其他假设/条件?
如果我们将分布式训练和非分布式训练进行比较到底能有多快?我们如何评估这个?
我们如何设计培训过程(例如数据采样,参数更新)以确保良好的可扩展性和良好的收敛性?
2. 如何开发更适合分布式设置的机器学习模型或训练算法
这一研究重点是开发新的机器学习模型或调整(扩展)现有模型以处理更大规模的数据。
3. 如何构建大规模 DML 应用程序
还有一些特定的应用问题,如大规模图像分类(https://en.wikipedia.org/wiki/Computer_vision#Recognition),它需要扩展非常具体的模型/算法的研究。大多数这些解决方案可以直接部署到生产线中。
4. 如何开发并行或分布式计算机系统来扩大机器学习
这一系列研究相当直观:如果我们的模型或算法无法在一个节点上完成计算工作流程,我们可以尝试开发分布式系统以使用更多节点(和更多的计算资源)。但是要做到这一点,我们需要面对很多系统问题:
一致性:如果多个节点同时朝着一个目标努力,我们如何确保它们的一致?例如,如果他们一起解决一个优化问题,但却有着数据集的不同分区呢?
容错(https://en.wikipedia.org/wiki/Fault_tolerance):如果我们将工作负载分配到 1000 个计算节点的集群,那么 1000 个节点中的一个崩溃会怎么样?有没有办法能解决它而不只是从任务的最开始重新启动?
通信:机器学习涉及大量 I / O 操作(例如磁盘读写)和数据处理过程 - 我们是否可以设计存储系统,以便为不同类型的环境实现更快的 I / O 和非阻塞数据处理程序(例如,单节点本地磁盘,分布式文件系统,CPU I / O,GPU I / O 等等)?
资源管理:构建计算机集群(https://en.wikipedia.org/wiki/Computer_cluster)的成本非常高,因此集群通常由许多用户共享。我们应该如何管理集群并适当地分配资源以满足每个人的要求,同时最大限度地提高使用率?
编程模型:我们是否应该按照与非分布式机器学习模型/算法相同的方式对分布式机器学习模型/算法进行编程?我们能否设计一种需要更少编码并提高效率的新的编程模型?我们可以用单节点方式编程,同时使用分布式计算技术自动放大程序吗?
这就是我们专注于 Petuum 研究方向的方面。事实上,我们今天使用的大部分主流 ML 软件都位于同一方面(例如 GraphLab,TensorFlow 等)。
了解分布式深度学习
分布式深度学习是通用分布式机器学习的一个子领域,由于其在各种应用中的有效性,最近变得非常突出。在深入分析深度学习的细节及其解决的问题之前,我们应该定义一些重要的术语:数据并行性和模型并行性。
1. 数据并行性
数据并行性是一种通过分区数据启用的并行化技术。在数据并行分布式计算中,我们首先将数据划分为几个分区,其中分区的数量等于工作机器的数量(即计算节点)。然后,我们让每个工作者拥有一个独立的分区,让他们对该数据进行计算。由于我们有多个节点并行扫描数据,因此我们应该能够扫描比使用单个节点时更多的数据 - 我们通过分布式并行计算提高吞吐量。
在分布式机器学习中,我们的目标是加速使用多个节点的模型训练的收敛速度,应用数据并行性是相当直观的:我们让每个工作机在自己的数据分区上执行训练(即随机梯度下降)并生成一组其上的参数更新(即梯度)。然后,我们让所有节点通过网络通信同步其参数状态,直到达成一致。只要同步不花费太多时间并且我们得到较单节点结果的改进,我们就实现了目标!从本质上讲,这就是 Google 深度学习系统 DistBelief 的工作原理。
2. 模型并行性
与数据并行性相比,模型并行性是一个更复杂和模糊的概念。一般来说,在模型并行性中,我们尝试对机器学习模型本身进行分区,以将工作负载分配给多个工作机,而不是对数据进行分区。例如,假设我们正在解决矩阵分解问题,其中矩阵非常庞大,我们想要学习这个巨大矩阵的每个参数。为了要应用模型并行性,我们必须将矩阵划分为许多小块(子矩阵),然后让每个工作机处理一些小块。这样,如果一个节点上的 RAM 不足以存储矩阵中的所有参数,我们就能够利用多个节点的额外 RAM 起到杠杆作用。由于不同的节点具有映射到矩阵的不同块的不同工作负载,我们因此能在并行计算时获得加速。
问题是,我们应该如何划分模型?由于我们有这么多的机器学习模型,每个模型都有自己的特征和表示,因此就没有实现模型并行的主要方法。
分布式机器学习中的问题
当训练数据的大小更大时,数据并行性会变得非常有效,因为我们可以使用额外的节点更快地扫描数据。模型并行性更适用于模型大小对于一个节点来说太大的情况,因为它允许我们分割模型并在多个节点上利用额外的内存。
理想情况下,在分布式计算中,我们希望获得与我们分配的机器数量一样多的加速(我们通常将此度量称为可伸缩性)。详细地说,如果我们分配 K 台机器,并且我们的系统在单位时间内比单个节点上的数据扫描速度快 K 倍,那么我们的系统具有可扩展性 K 或线性可扩展性。线性可扩展性是这些系统的理想选择。
但是,由于同步任务导致的开销,在分布式计算机集群上完成一次训练迭代通常比在单个节点上完成一次迭代需要更长的时间。我们必须花费额外的时间在计算结束时跨多个节点同步(网络通信),以确保机器学习训练任务的收敛。实际上,同步过程可以与计算一样长,甚至更长。
为什么?一个主要原因是集群中的某些工作节点运行速度比其他节点慢(因为硬件更便宜或更旧),并且为了与它们同步,更快的工作节点必须等到慢的工作节点完成他们的计算任务 - 系统性能始终受到较慢工作节点的限制。在这些情况下,将 K 机器放在一起可能会导致负面的可扩展性,这极大地浪费了时间和金钱。
在以后的文章中,我们将讨论 Google 如何开始使用参数服务器来解决这个问题,以及 Petuum 如何开发出解决同步问题的原理方法。
这是一篇供你们获取更多相关知识的论文:
More Effective Distributed ML via a Stale Synchronous Parallel Parameter Server, by Qirong Ho, James Cipar, Henggang Cui, Seunghak Lee, Jin Kyu Kim, Phillip B. Gibbons, Garth A. Gibson, Greg Ganger, Eric P. Xing
论文链接:http://www.petuum.com/pdf/SSPTable_NIPS2013.pdf
我会推荐以下几篇论文:
Asymptotically Exact, Embarrassingly Parallel MCMC, by Willie Neiswanger, Chong Wang, Eric P. Xing. UAI 2014.
论文链接:https://arxiv.org/abs/1311.4780
LightLDA: Big Topic Models on Modest Compute Clusters, by Jinhui Yuan, Fei Gao, Qirong Ho, Wei Dai, Jinliang Wei, Xun Zheng, Eric P. Xing, Tie-yan Liu, Wei-Ying Ma. WWW 2015.
论文链接:https://arxiv.org/abs/1412.1576
SaberLDA: Sparsity-Aware Learning of Topic Models on GPUs, by Kaiwei Li, Jianfei Chen, Wenguang Chen, Jun Zhu. ASPLOS 2017.
论文链接:https://arxiv.org/abs/1610.02496
在 NIPS 2012 以及 2013 ICML 上发表的关于大规模分布式深度学习系统的两篇亮点论文,第一篇论文是关于谷歌内部第一代深度学习平台,第二篇论文的作者是 Adam Coates,他目前负责百度在硅谷的研究工作。两篇文章的核心思想是通过使用更多的计算组件来增大深度学习的计算速度——第一篇论文是数据平行,第二篇文论是通过模型平行。
Large Scale Distributed Deep Networks,by Jeffrey Dean, Greg Corrado, Rajat Monga, Kai Chen, Matthieu Devin, Mark Mao, Marc』aurelio Ranzato, Andrew Senior, Paul Tucker, Ke Yang, Quoc V. Le, Andrew Y. Ng.
论文链接https://static.googleusercontent.com/media/research.google.com/en//archive/large_deep_networks_nips2012.pdf
Deep Learning with COTS HPC, Adam Coates, Brody Huval, Tao Wang, David Wu, Bryan Catanzaro, Andrew Ng. ICML 2013.
论文链接:http://proceedings.mlr.press/v28/coates13.pdf
如果你对模型平行特别感兴趣,这是两篇亮点论文:
STRADS: A Distributed Framework for Scheduled Model Parallel Machine Learning, by Jin Kyu Kim, Qirong Ho, Seunghak Lee, Xun Zheng, Wei Dai, Garth A. Gibson, Eric P. Xing. EuroSys 2016.
论文链接:http://www.petuum.com/pdf/strads-kim-eurosys16_cr.pdf
Device Placement Optimization with Reinforcement Learning, by Azalia Mirhoseini Lt ; / RTI
论文链接:https://arxiv.org/abs/1706.04972
原文链接:
https://medium.com/@Petuum/intro-to-distributed-deep-learning-systems-a2e45c6b8e7
点击文末【阅读原文】即可观看更多精彩内容:
实例+代码,你还怕不会构建深度学习的代码搜索库吗
使用 Scikit-learn 理解随机森林
十个例子,教你用统计学方法高效完成机器学习项目
深度学习优化入门:Momentum、RMSProp 和 Adam
等你来译:
剖析深度学习框架
如何基于 Keras, Python,以及深度学习进行多 GPU 训练
可以使用的深度学习模型
现代游戏理论和多代理式强化学习系统
想知道关于机器学习更多知识?
欢迎点击“阅读原文”
或者移步 AI 研习社社区~