翻译自http://weibo.com/p/1001603913581535062112,做者是CMU邢波教授的高徒。算法
目前有不少开源的分布式机器学习和深度学习系统,例如DMLC,Spark,MLlib,Petuum,parameter server,Caffe,Torch,Theano和TensorFlow等等。然而,如何在集群上高效的执行分布式机器学习过程呢?数据库
这要从机器学习算法的特色提及,机器学习算法与排序或数据库查询等算法不一样,它是基于登山(hill-climbing)的算法,经过多个计算步骤到达最优解(对应山顶或谷底,此时机器学习模型具备最高的预测准确度)。在计算过程当中,算法每次计算出距离最近的山顶或谷底方向,并向该方向移动一小步。当算法靠近山顶时,移动的步长愈来愈小,直到最后收敛。网络
上述登山算法具备如下特征:机器学习
1)容错性(error tolerance)。即使是在登山过程当中有屡次方向错误,但最终仍然可以达到最优解。所以可利用算法的容错性,在计算过程当中引入某种程度上的偏差(例如在worker间采用异步通讯模式,而不是mapreduce式的严格同步模式),提升计算效率。异步
2)结构依赖性(dependency structure)。登山的路径可能会比较复杂,到达山顶或谷底的过程比较复杂,然而大部分并行机器学习算法每每须要收集齐全部机器的计算结果才能肯定最终的登山方向,所以使用100台机器并行执行一个机器学习算法并不能达到100倍的加速比。分布式
3)不均匀的收敛性(uneven convergence)。机器学习模型每每包含多个模型参数,每一个模型参数至关于登山方向的一个维度。一般有80~90%的样本在迭代计算初期已经收敛,然而绝大部分并行机器学习算法并无利用这一特征,从而重复计算这些已收敛的参数,浪费计算资源。性能
如何利用上述特征设计一个高效的分布式机器学习系统呢?须要考虑如下四个方面的问题:学习
a)如何在不一样的机器间切割机器学习算法并使其并行化?优化
b)多个机器间须要交换执行进度信息,然而网络通讯速度比CPU和GPU慢不少,如何在较慢的通讯速度基础上达到较快的计算和收敛速度?翻译
c)如何管理机器间的通讯过程?通讯的优先级以及通讯拓扑结构对系统性能有多大影响?
d)机器间须要哪些通讯消息?可以压缩机器间的通讯量?
针对上述每一个问题的优化均可能使系统性能提高2~5倍。不一样的分布式机器学习系统对于上述问题有不一样的处理方案,例如DMLC中每一个应用相对独立,没有一个通用的engine,而Spark MLlib则直接创建在通用engine基础上,在Petuum系统中,采用了通用的engine,此时提升engine性能可以提升系统的总体销量。