首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

分布式机器学习平台比较:Spark/PMLS/TensorFlow

来源:https://yq.aliyun.com/articles/158322

本文调查分析了多个分布式机器学习平台所使用的设计方法,并提出了未来的研究方向。

机器学习,特别是深度学习(DL),最近已经在语音识别、图像识别、自然语言处理、推荐/搜索引擎等领域获得了成功。这些技术在自主驾驶汽车、数字卫生系统、CRM、广告、物联网等方面都存在着非常有前景的应用。当然,资金驱动着这些技术以极快的速度向前发展,而且,最近我们已经看到了有很多机器学习平台正在建立起来。

由于在训练过程中要涉及到庞大的数据集和模型的大小,因此机器学习平台通常是分布式平台,而且并行运行了10到100个作业来训练模型。据估计,在不久的将来,数据中心的绝大多数任务将是机器学习任务。

我的知识背景是分布式系统,因此,我们决定从分布式系统的角度来研究这些机器学习平台,分析这些平台的通信和控制瓶颈。我们还研究了这些平台的容错性和编程的难易性。

我们根据三种基本的设计方法对分布式机器学习平台进行了分类,分别是:

基本数据流

参数服务器模型

高级数据流

我们将对每一种方法进行简单的介绍,我们使用 Apache Spark 作为基本数据流方法的示例,使用 PMLS(Petuum)作为参数服务器模型的示例,使用TensorFlow 和 MXNet 作为高级数据流模型的示例。 我们将提供它们之间的性能比较评估结果。有关更多的评估结果,请参阅本文最开始提到的那篇论文。不幸的是,我们无法作为一个来自学术界的小团队进行规模上的评估。

001

Spark

在 Spark 中,计算被建模为有向无环图(DAG, directed acyclic graph),其中的每个顶点表示弹性分布式数据集(RDD, Resilient Distributed Dataset),每个边表示 RDD 上的操作。 RDD 是以逻辑分块进行划分的对象集合,它缓存在内存中,当内存不够时,会保存到磁盘上。

在 DAG 上,从顶点 A 到顶点 B 的边 E 表示 RDD B 是在 RDD A 上执行操作 E的结果。有两种类型的操作:转换和动作。转换(例如,映射、过滤、连接)就是对 RDD 执行操作并产生新的 RDD。

Spark 用户将计算作为 DAG 进行建模,该 DAG 会转换并运行 RDD 上的动作。DAG 会分阶段进行编译。每个阶段将作为一系列的任务并行执行(每个分区一个任务)。窄的依赖关系有利于高效的执行,而广泛的依赖关系会带来瓶颈,因为它们会破坏流水线,而且需要通信密集的随机操作。

Spark 中的分布式执行是通过对机器上的 DAG 阶段进行分块来实现的。这个图清晰地展示了 master-worker 架构。Driver 包含了两个调度组件,DAG 调度器和任务调度器,用于给 workers 分配任务,以及协调 workers。

Spark 是为一般数据处理而不是为机器学习设计的。然而,利用专用于 Spark 的 MLlib,使得在 Spark 上进行机器学习成为可能。在基本的设置中,Spark 将模型参数存储在 driver 节点中,而 workers 与 driver 进行通信,以便在每次迭代后更新参数。对于大规模的部署来说,模型参数可能不适合保存在 driver 中,而应该将其作为 RDD 进行维护。这引入了很大的开销,因为需要在每次迭代中创建新的 RDD 以保存更新过的模型参数。更新模型包括在机器/磁盘之间混洗数据,这限制了 Spark 的可扩展性。这是 Spark 中基本数据流模型(DAG)不足的地方。 Spark 不支持机器学习所需的迭代。

002

PMLS

PMLS 从诞生的那一天起就是专门为机器学习设计的。它引入了参数服务器(parameter-server,简写为PS)抽象用于迭代密集型机器学习训练过程。

PS(在图中用绿色的框表示)用于分布式内存键值的存储。它复制和分片的方式是这样的:每个节点既是模型中某个分片的主节点,又是其他分片的辅节点(或副本)。因此,PS 可以通过增加节点数量的方法很容易地进行扩展。

PS 节点用于存储和更新模型参数,并响应 workers 的请求。workers 从本地 PS 副本中请求最新的模型参数,并对分配给自己的数据集分区进行计算。

PMLS 还采用了 SSP(Stale Synchronous Parallelism,变味的同步并行)模型,它放宽了 BSP(Bulk Synchronous Parellelism,批量同步并行)模型中 workers 在每次迭代最后要进行同步操作的要求。 SSP 减少了 workers 同步的难度,确保最快的 worker 不能在最慢的 worker 之前迭代。由于对过程中产生的噪声具有一定的容错能力,这个宽松的一致性模型仍可适用于机器学习训练。

003

TensorFlow

Google 有一个基于分布式机器学习平台的参数服务器模型,名为 DistBelief。人们对 DistBelief 主要的抱怨是编写机器学习应用程序的时候会弄乱底层代码。Google 希望公司内的任何员工无需精通分布式执行就能编写机器学习代码,这也是 Google 为大数据处理编写 MapReduce 框架的原因。

所以,TensorFlow 正是为了实现这一目标而设计的。TensorFlow 采用了数据流范例,但在它的高级版本中,计算图不需要是DAG,但可以包括循环和支持可变状态。我想,可能是 Naiad 的设计对 TensorFlow 产生了一些影响吧。

TensorFlow 中的计算可以表示为一个带有节点和边的有向图。节点表示具有可变状态的计算。边表示在节点之间传递的多维数据矩阵(张量)。 TensorFlow 要求用户静态地声明这个符号计算图,并且使用图形的重写和分区来让机器进行分布式的执行。

如上图所示,这个 TensorFlow 中的分布式机器学习训练使用了参数服务器的方法。在 TensorFlow 中使用 PS 抽象的时候,可以使用参数服务器和数据并行机制。对于 TensorFlow 来说,你可以做更为复杂的事情,但这需要编写自定义代码并走入未知的领域。

004

一些评估结果

为了对这些平台进行评估,我们使用了 Amazon EC2 m4.xlarge 实例。每个实例包含由 Intel Xeon E5-2676 v3 处理器和 16GB RAM 组成的4个 vCPU。EBS 带宽为750Mbps。我们使用两种常见的机器学习任务进行评估:使用多层神经网络的二级逻辑回归和图像分类。我只是在这里提供几张图,请查看我们的论文以进行更多的实验。我们的实验有几个限制:我们使用的机器比较少,不能进行规模上的测试。我们的测试仅限于 CPU 计算,并没有进行 GPU 计算测试。

该图显示了逻辑回归平台的速度。Spark 比 PMLS 和 MXNet 慢,但表现得还算可以。

该图显示了 DNN 平台的速度。与单层逻辑回归相比,Spark 的性能损失比两层 NN 更大,这是因为需要更多的迭代计算。这里,我们将 driver 的参数保存在Spark 中。如果我们将参数保存在 RDD 中并且在每次迭代之后进行更新,情况会更糟。

该图显示了平台的 CPU 利用率。 Spark 应用程序的 CPU 利用率明显比较高,主要是因为存在序列化的开销。

005

结语,以及未来的方向

机器学习/深度学习应用程序有着令人尴尬的并行机制,而且从并发算法角度来看也并不是很有趣。可以肯定的是,参数服务器方法赢得了分布式机器学习平台训练的青睐。

至于瓶颈问题,网络仍然是分布式机器学习应用程序的瓶颈。更好的数据或模型分级比更先进的通用数据流平台更有用,请重视数据和模型。

然而,也存在着一些令人惊讶和微妙的地方。 在 Spark 中,CPU 开销正在成为比网络限制更为重要的瓶颈。 Spark 中使用的编程语言(例如Scala/JVM)会显着影响它的性能。因此,特别需要一个更好的工具来进行分布式机器学习平台的监控和性能预测。近来,已经出现了一些能够解决 Spark 数据处理程序问题的工具,例如 Ernest 和 CherryPick。

支持机器学习运行时的分布式系统存在着许多悬而未决的问题,例如资源调度和运行时性能提升。通过对应用程序运行时的监控和分析,下一代分布式机器学习平台应该要为正在运行的任务提供计算、内存、网络资源的通用运行时弹性配置和调度。

最后,还有编程和软件工程支持方面的问题有待解决。适用于机器学习应用程序的分布式编程抽象是什么?还需要更多的研究来检验和确认分布式机器学习应用程序。

▼长按识别了解更多 Spark 相关知识

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180920B1HWXP00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券