翻譯自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性能可以提升系統的總體銷量。