什么是分布式机器学习?
通常来说,分布式机器学习(DML)是一个跨学科的领域,它几乎涵盖计算机科学的各个领域:理论(譬如统计学、学习理论、优化论)、算法、以及机器学习核心理论(深度学习、图模型、核方法)。在这些子领域中,有无数的问题需要探索和研究。另外,分布式能够很好地利用大数据,它已经成为目前工业界最广泛应用的机器学习技术。
分布式机器学习试图解决什么样的问题?
为了最容易的理解 DML,我们将它分成四类研究问题。但请注意,这些类别并非是相互排斥的。
如何使用统计学、优化理论和算法?
由于大多数机器学习任务本质上是在减小一组训练数据的「损失」,我们就更多关注以下问题:
优化过程需要多长时间才能达到收敛?或者说,收敛速度(收敛率)是多少?
收敛解有多少?
需要多少训练数据才能保证良好的解?
为了研究这些问题,研究人员采用了理论分析工具,如优化理论或统计学习理论。然而,在大规模机器学习的背景下,我们给出了更多的计算资源,我们的目标是通过并行或分布式计算技术利用额外资源来加速(即减少模型的训练/测试时间),我们也很想弄清楚另一组看上去相似但不同的问题:
通过分布式或并行训练,我们的模型和参数是否保证在没有加速的情况下收敛到相同的状态?
如果他们没有收敛到同一个状态,那么我们离原始解决方案有多远,我们距离真正的最优解决方案有多远?
达到「良好」趋同还需要哪些其他假设/条件?
如果我们将分布式训练和非分布式训练进行比较到底能有多快?我们如何评估这个?
我们如何设计培训过程(例如数据采样,参数更新)以确保良好的可扩展性和良好的收敛性?
如何开发更适合分布式设置的机器学习模型或训练算法
这一研究重点是开发新的机器学习模型或调整(扩展)现有模型以处理更大规模的数据。
如何构建大规模 DML 应用程序
还有一些特定的应用问题,如大规模图像分类,它需要扩展非常具体的模型/算法的研究。大多数这些解决方案可以直接部署到生产线中。
如何开发并行或分布式计算机系统来扩大机器学习
这一系列研究相当直观:如果我们的模型或算法无法在一个节点上完成计算工作流程,我们可以尝试开发分布式系统以使用更多节点(和更多的计算资源)。但是要做到这一点,我们需要面对很多系统问题:
一致性:如果多个节点同时朝着一个目标努力,我们如何确保它们的一致?例如,如果他们一起解决一个优化问题,但却有着数据集的不同分区呢?
容错:如果我们将工作负载分配到 1000 个计算节点的集群,那么 1000 个节点中的一个崩溃会怎么样?有没有办法能解决它而不只是从任务的最开始重新启动?
通信:机器学习涉及大量 I / O 操作(例如磁盘读写)和数据处理过程 – 我们是否可以设计存储系统,以便为不同类型的环境实现更快的 I / O 和非阻塞数据处理程序(例如,单节点本地磁盘,分布式文件系统,CPU I / O,GPU I / O 等等)?
资源管理:构建计算机集群的成本非常高,因此集群通常由许多用户共享。我们应该如何管理集群并适当地分配资源以满足每个人的要求,同时最大限度地提高使用率?
编程模型:我们是否应该按照与非分布式机器学习模型/算法相同的方式对分布式机器学习模型/算法进行编程?我们能否设计一种需要更少编码并提高效率的新的编程模型?我们可以用单节点方式编程,同时使用分布式计算技术自动放大程序吗?
这就是我们专注于 Petuum 研究方向的方面。事实上,我们今天使用的大部分主流 ML 软件都位于同一方面(例如 GraphLab,TensorFlow 等)。
了解分布式深度学习
分布式深度学习是通用分布式机器学习的一个子领域,由于其在各种应用中的有效性,最近变得非常突出。在深入分析深度学习的细节及其解决的问题之前,我们应该定义一些重要的术语:数据并行性和模型并行性。
数据并行性
数据并行性是一种通过分区数据启用的并行化技术。在数据并行分布式计算中,我们首先将数据划分为几个分区,其中分区的数量等于工作机器的数量(即计算节点)。然后,我们让每个工作者拥有一个独立的分区,让他们对该数据进行计算。由于我们有多个节点并行扫描数据,因此我们应该能够扫描比使用单个节点时更多的数据 – 我们通过分布式并行计算提高吞吐量。
在分布式机器学习中,我们的目标是加速使用多个节点的模型训练的收敛速度,应用数据并行性是相当直观的:我们让每个工作机在自己的数据分区上执行训练(即随机梯度下降)并生成一组其上的参数更新(即梯度)。然后,我们让所有节点通过网络通信同步其参数状态,直到达成一致。只要同步不花费太多时间并且我们得到较单节点结果的改进,我们就实现了目标!从本质上讲,这就是 Google 深度学习系统 DistBelief 的工作原理。
模型并行性
与数据并行性相比,模型并行性是一个更复杂和模糊的概念。一般来说,在模型并行性中,我们尝试对机器学习模型本身进行分区,以将工作负载分配给多个工作机,而不是对数据进行分区。例如,假设我们正在解决矩阵分解问题,其中矩阵非常庞大,我们想要学习这个巨大矩阵的每个参数。为了要应用模型并行性,我们必须将矩阵划分为许多小块(子矩阵),然后让每个工作机处理一些小块。这样,如果一个节点上的 RAM 不足以存储矩阵中的所有参数,我们就能够利用多个节点的额外 RAM 起到杠杆作用。由于不同的节点具有映射到矩阵的不同块的不同工作负载,我们因此能在并行计算时获得加速。
问题是,我们应该如何划分模型?由于我们有这么多的机器学习模型,每个模型都有自己的特征和表示,因此就没有实现模型并行的主要方法。