PMLS 是专为机器学习设计的,没有其它杂乱的历史。它引入了参数服务器(PS: parameter-server)的抽象概念,支持密集迭代的机器学习训练过程。 其中 PS(图中绿色方框)被用作分布式的内存键值存储(distributed in-memory key-value store)。它会被复制和共享:每个节点都被用作这个模型(参数空间)一个分片的主节点以及其它分片的次要节点/副本。因此在节点数量方面,PS 可以很好地扩展。 PS 节点会存储和更新模型参数以及响应来自工作器的请求。工作器会请求来自它们的局部 PS 副本的最新模型参数,j2直播,并在分配给它们的数据集部分上执行计算。 PMLS 还采用了 SSP(Stale Synchronous Parallelism)模型,这比 BSP(Bulk Synchronous Parellelism)模型更宽松——其中工作器在每次迭代结束时同步。SSP 为工作器的同步减少了麻烦,确保最快的工作器不能超过最慢的工作器 s 次迭代。宽松的一致性模型仍然可以用于机器学习训练,因为这个过程有一定的噪声容错能力,我在 2016 年 4 月的这篇文章中谈过这个问题:https://muratbuffalo.blogspot.com/2016/04/petuum-new-platform-for-distributed.html TensorFlow 谷歌有一个基于参数服务器模型的分布式机器学习平台 DistBelief。参阅我对 DistBelief 论文的评论:https://muratbuffalo.blogspot.com/2017/01/google-distbelief-paper-large-scale.html。在我看来,DistBelief 的主要缺陷是:为了编写机器学习应用,需要操作低级代码。谷歌想要自己的所有员工无需精通分布式执行就能编写机器学习代码——基于同样的理由,谷歌为大数据处理编写了 MapReduce 框架。 所以为了实现这一目标,谷歌设计了 TensorFlow。TensorFlow 采用了数据流范式,但是是一种更高级的版本——其中计算图无需是 DAG,而且包含循环且支持可变状态。我认为 Naiad 设计可能对 TensorFlow 设计有所影响。 TensorFlow 使用节点和边的有向图来表示计算。节点表示计算,状态可变。而边则表示多维数据数组(张量),在节点之间传输。TensorFlow 需要用户静态声明这种符号计算图,并对该图使用复写和分区(rewrite & partitioning)将其分配到机器上进行分布式执行。(MXNet,尤其是 DyNet 使用了图的动态声明,这改善了编程的难度和灵活性。) TensorFlow 中的分布式机器学习训练使用了如图所示的参数服务器方法。当你在 TensorFlow 中使用 PS 抽象时,你就用到了参数服务器和数据并行。TensorFlow 让你还能做更复杂的事情,但那需要编写自定义代码并进入全新的疆域。 一些评估结果 我们的评估使用了 Amazon EC2 m4.xlarge 实例。每个实例包含 4 个由 Intel Xeon E5-2676 v3 驱动的 vCPU 和 16 GiB RAM。EBS 带宽为 750Mbps。我们使用了两个常见的机器学习任务进行评估:二分类 logistic 回归和使用多层神经网络的图像分类。我在这里仅给出了几张图,查看我们的论文可以了解更多实验。但我们的实验还有一些局限性:我们使用了少量机器,不能大规模测试。我们也限制了 CPU 计算,没有测试 GPU。 这幅图展示了各平台的 logistic 回归执行速度。Spark 表现不错,但落后于 PMLS 和 MXNet。 这幅图展示了各平台的深度神经网络(DNN)执行速度。相比于单层的 logistic 回归,Spark 在两层神经网络上有更大的性能损失。这是因为两层网络需要更多迭代计算。在 Spark 中我们将参数保存在驱动器中,这样它们可以拟合;如果我们将参数保存在一个 RDD 中并且在每次迭代后更新,情况还会变得更加糟糕。 (责任编辑:本港台直播) |