演算法研發工作中對於MPI和Spark的一些困惑?

我們組主要從事互聯網廣告中ML,DM相關演算法的研發工作,由於mahout,weka之類很難適用於目前的工作場景或者說得到比較好的結果,所以主要的工作內容是基於業務數據研發新的模型(從樣本數據的清洗和採樣開始,工業界嘛,你懂的),並且最終提供可以實現的版本,支持公司業務。現在主要是用SAS、R、Matlab建模,然後通過C++,BLAS和MPI等實現,目前在生產環境中需要支持一個小型的MPI集群(本來是申請升級到CUDA的...)。

最近大Boss提出考慮要採用spark,以及其中的Mlib實現機器學習演算法。希望能夠兼顧整個產品的平台性,如果將來向外部客戶提供解決方案的話,可以整體打包直接部署,而不用在目前的演算法平台和產品環境中做遷移。比如目前用MPI開發,可能和Spark兼容性有問題,所以索性直接用Mlib做,然後部署起來風險最低,或者可以在Spark上開發演算法。

小弟對Spark不是特別了解,所以有幾點困惑請各位指教:

1. 我們的模型大多是做離線模型,然後在線部分通過增量學習的方式加以自學習。如果使用spark取代MPI集群,到底能夠在哪些方面對一般的演算法建模帶來提升?比如說:效率、精度。

2. 我們組一半是機器學習專業,更熟悉C++,Python,Matlab;另一半是統計專業,更熟悉SAS, R, Python。現在後者建模,前者開發模型並且實現演算法並行化。如果用了spark,是不是對目前的工作內容和分工會產生影響?

3. 如果只想老老實實做一些偏演算法的設計和研發工作,Spark是不是一個必須具備的技能?如果是的話,小弟可能會考慮跟上潮流,免得以後找不到工作?

小弟才疏學淺,求輕拍,求解答。


1. 以我的理解來看, MPI是分散式領域裡的彙編語言,Hadoop是分散式領域裡的C語言,Spark是分散式領域裡的Java語言。從介面的易用性上,MPI &< Hadoop &< Spark;從控制的精細程度上,當然是MPI &> Hadoop = Spark;性能方面,一個編寫良好的的MPI程序肯定是比Hadoop和Spark快的,但是代碼量巨大,非常繁瑣。

Spark的介面比Hadoop簡潔,表達力比Hadoop強,性能也比Hadoop好,在做Machine Learning / Data analytics 方面的工作,Spark是最好的選擇。如果你們組人多,類似於百度,Google那樣,有很多人力投入,可以用MPI精雕細琢,否則強烈建議Spark。Hadoop與Spark比的話,如果是一次性批量處理的任務,Spark沒有明顯優勢,如果是迭代型(iterative)演算法(大部分機器學習都是迭代的),那麼Spark就有很大的優勢。

2. 沒影響,建模的那幫人還是用Matlab等建模,你則用Spark寫出分散式的訓練演算法。

3. 針對最後一個問題,如果你想從事研發工作,而不是做research(畢竟做research的人時少數), 那麼當下最好要掌握兩個工具,一個是理論層面多了解機器學習的各種model,二是在代碼方面,多寫分散式的演算法,」分散式+機器學習「,這種人才是現在各大公司急需的。MPI, Hadoop, Spark, GraphLab等分散式工具,你都需要去了解它們的思想,合理利用它們的特性,寫出分散式的機器學習演算法。所謂兩手抓,兩手都要硬。

樓上說Spark是給門外漢用的,我感覺樓上沒有用過mllib, 也沒有用Spark寫過程序。首先, MLlib 內置了一些機器學習演算法,的確門外漢都可以用,但是,當mllib里還沒有你需要的model,你可以自己調用Spark的介面,寫一個新的Model出來自己用,寫得好的話,還可以貢獻給mllib, 這定製性,這自由度,哪裡是給門外漢用的?Spark都開源了,你想怎麼改就怎麼改,你想怎麼提高性能就可以任意修改。


1. 開發效率會得到提升,運行效率略有下降(有些計算密集的,可以用BLAS之類的庫來做,可以上MKL,CUDA。這些都和Spark沒有衝突)。至於精度,我不太清楚題主在說什麼。

2. 不會影響你們的分工。

實現。只不過實現演算法並行化的時候,平台換成了Spark,語言可以是Scala,Java,Python,就分工結構來說,沒有什麼變化。不過,值得注意的是,Spark目前對於非同步更新的演算法支持不是很好(這是由其計算模式本身決定的),這可能會影響你們的發揮。另外就是,MLlib本身還不夠成熟,很多工作需要自己完成,現成的可能不夠用。

建模。Spark還能夠提升建模人員的效率(主要是對於使用Python的人員)。就目前來說,Spark已經有IPython Notebook可用了,等SparkR更加成熟一些,選擇就更多了。

3. 我覺得對於Spark的投入是很合適的。Spark非常適合做「偏演算法的設計和研發工作」,需要做的投入也不算很多,而回報卻異常豐厚。

Spark是一個非常優秀並且有潛力的項目。我相信學習一個有生命力的東西,也會讓你自己更有活力,因為你總是能夠感受到「無限」的可能


我只會c++,說下我的觀點,可能帶偏激,僅供參考

1.spark和mlib是給門外漢準備的,比如說,你們公司沒有機器學習人才,但必須上機器學習系統,或者沒有分散式人才,但必須上分散式系統,或者,老闆被忽悠了,要求必須上spark

2.SAS和R用戶,去別的組工作,你能忍受一半人用SAS或R或Matlab做建模,然後另一半人用C++把Matlab重新實現一遍?除非演算法牛逼到可以無視工程

3.演算法和spark沒有關係,你需要跟上的是演算法的潮流,而不是學習如何使用某種API,既然已經知道mahout,weka沒法用,難道還不能明白這些現成的xxx都是沒法用的?


Spark算是高級的mapreduce計算模型,支持DAG計算流優化,容錯,更快的調度,利用內存。適

mpi的容錯性是個問題,可能需要自己主動做checkpoint來手動做容錯,粒度比較大。mpi更多來說提供了高效的通信模型,如果有ib那就更好了。

Spark更適合做數據統計一類的工作,mpi是天生為HPC服務的。

機器學習參數迭代多,試一試ps模型。


樣本處理特徵提取這一塊可以用spark或mr,業界正轉向spark,推薦學習;

訓練這一步依據你們的數據量和特徵量,mllib幾百萬特徵就跑不動了,不太推薦。可以嘗試xgboost或其他工業界驗證過的開源工具;

自己開發訓練工具的話,基於ps-lite或rabbit開發是極好的,c++開發後可以jni或別的封裝兼容spark生態,參考xgboost4j;

mpi成本太大,不太適合業務迭代快的小公司,像百度這種大公司另說;

matlab、R、SAS做模型,工業界沒見過,求開眼界


拋磚引玉,從沒在知乎回答過本行的問題

關於你提的第二點,MATLAB更趨同於統計軟體,用來跑樣本數據做快速的早期測試

實現演算法並行化還是需要C++這類的語言

所以按你說描述的分工方法,現在就存在一些問題會對組內合作影響


我最近嘗試搭建了spark,使用mllib去做數據挖掘類的工作,感覺mllib內置的幾個演算法在使用上沒weka靈活。比如在不均衡數據的情況下,眼睜睜看著ROC = 0.5 卻沒辦法去設置懲罰參數等去調整模型,所以現在又轉回weka了。


您好,請問您的mpi集群的容錯機制是怎樣做的


推薦閱讀:

做大數據相關專業,如Hadoop、Hive、Impala等研究與優化的人就業情況如何呢?
如何進入大數據領域,學習路線是什麼?
大數據,hadoop,spark,mahout的學習路線和需要的基礎知識,以及掌握到什麼程度?
MapReduce和Spark主要解決哪些方面的問題?
Spark可以完全替代hadoop嗎?

TAG:機器學習 | Hadoop | 系統架構 | MPI | Spark |