翻译自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性能能够提高系统的整体销量。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:如何提高分布式机器学习系统的执行效率? - Python技术站