MPI 在大規模機器學習領域的前景如何?
我現在的工作是提高機器學習集群的網路性能。很多機器學習應用是本質是並行計算。Message passing interface(MPI)是高性能計算領域開發並行應用的標準API。所以我想MPI在機器學習系統中也應該有廣泛應用。但是近年出現的機器學習框架比如TensorFlow,Caffe,MXNET,Theano,GraphLab好像都沒有使用MPI。首先他們的論文中沒有提到使用何種通信API。百度 2014年以前的機器學習系統好像使用了MPI,但是之後就沒有出現MPI這個關鍵字。好像是他們自己開發了自己的通信框架。
希望諮詢如下問題:
1. MPI這個技術在以後的機器學習集群里的發展前景如何。以後大規模機器學習技術會向HPC的方向靠攏嗎?
2. MPI在機器學習系統里有其他哪些代替技術,相互有哪些優勢劣勢。網上有[pLSA和MPI:大數據的首要目標是大而不是快](http://cxwangyi.github.io/story/01_plsa_and_mpi.md.html)這篇文章。裡面提到Stubby、Thrift、Poppy,rpc package這些技術在與MPI競爭。能具體說明一下嗎?
這個取決於場景,如果要在超算(super computer)上跑機器學習,用MPI是不錯的選擇。但在雲上,不管是公有雲的例如AWS/Azure/GCP或者私有雲,MPI沒有太多必要。
MPI定義的是介面,具體用的時候我們是用某個特定的實現,例如openmpi或者mpich2. 為了簡單,這裡統一叫MPI。
用MPI實現機器學習是沒問題的,不管是對高維稀疏模型還是深度學習。MPI的介面在一些演算法的實現上很方便,另外一些地方(例如非同步)繞一繞也是可以的。例如雖然MXNet沒有用MPI,不過使用MPI來實現個kvstore的backend也是可行的。
MPI的一大優勢是支持各種網路硬體,例如infiniband和Intel Omni Path,或者網路拓撲結構,例如cray的dragonfly。通常MPI會做各種針對性的優化從而得到不錯的性能。這一點 @SIY.Z 已經提到了。
這個優勢主要體現在超算上。而對於雲,通常使用常見的網路硬體(例如Ethernet)和連接結構(multi-rooted tree),MPI做的優化通常不會有太大效果。
在雲上,MPI的一大問題是容災。任何一個節點出問題會導致整個任務失敗,會導致運營成本增加。(回答裡面有提到百度有MPI集群。我當年是最大的用戶,一度使用超過50%的節點。對於這一點我是深有體會,例如凌晨3點起來重啟任務。)
所以結論是,如果要在雲上跑機器學習的話,MPI前景不大。但如果是使用Top500類似的超算,MPI是不錯的選擇。我在博士期間一直使用 MPI 進行大規模機器學習任務。樓上各位大神已經評論得非常詳細了,我在這裡再補充一些。
其實 mpi 只是一個網路傳輸介面,和 tensorflow, mxnet, spark 都不是一個層面的技術。換句話說,mpi 的對比對象應該是 zmq 或者底層 socket 這樣的網路介面。我們可以使用類似於 mpi 或者 zmq 這樣的介面去實現這些系統。
特定於機器學習任務,mpi 最大的優勢有兩點。一是 mpi 有一個高性能 allreduce 的實現,底層實現了 tree aggregation. 二是程序可以無縫移植到異構高性能計算環境,例如 infiniband.
mpi 的速度也是非常快的,比zmq快。我自己手寫的消息傳輸也怎麼優化也達不到 mpi 的速度。畢竟Argonne實驗室的科學家每天都在研究怎麼讓 mpich 更快。並且對於很多機器學習任務,例如深度學習,網路傳輸已經不是瓶頸,這會隨著萬兆網的普及越來越明顯。有人說 mpi 的非同步傳輸比較坑,其實很多人用 mpi 都是直接用 send + recv ,配合一個自己寫的 signal queue 就行了。
mpi 的缺點也很明顯,對於機器學習任務來說,主要是支持的語言介面太少,只能拿 C/C++ 或者 fortran 來寫,最近也有一個 java mpi 的實現,不知道性能如何。
其實 mpi 不支持容錯問題並不大,因為容錯的邏輯本身也應該是開發者自己來搞定,除非你能忍受 hadoop 這樣的龜速。不過這裡有一個小 trick, 使用 MPICH 需要把 auto-cleanup 關掉。因為 mpi manager 默認是只要一個 task 掛掉,就會殺掉所有進程。
這裡先簡要回答一下。MPI在高性能計算界(特別是成熟的科學計算軟體中)幾乎是標配,其對高性能通信(特別是rdma)優化較好。但是寫過高性能計算軟體都有經驗,即能用openmp/opencl的時候不會去輕易寫MPI,因為開發難度大,而且MPI對數據的支持太原始太底層了,有時候寫起來要把高級的對象強行reinterpret成float *實在不爽。另外,MPI的主流版本(比如OpenMPI,Intel MPI)大小都不小,而且偶爾配置起來會有點坑,像mxnet之類的框架,如果支持MPI就變得太重了,所以輕型的框架我想不是那麼樂意使用的(很多雲端系統上也默認沒有配MPI,讓用戶自己折騰目測不太好)。TensorFlow使用了google自己的gRPC來進行一些跨節點的通信,今年我們中國科大(USTC)在一個rdma相關的比賽上試圖優化過,但是結論是gRPC對rdma親和性遠不如MPI,原因之一恐怕是RPC模型太高層了,高性能計算中用的較少。但是rdma的支持配件(Infiniband)還是很貴的,沒有大規模使用,所以估計也沒有必要過急做rdma的適配。另外rdma上退而求其次用IPoIB也是不錯的,不會比對rdma有特別優化的MPI慢太多。至於是否會做向MPI的移植,科大目前已經有團隊做了(把tensorflow改成MPI版的),至於是否效率會有明顯提升目前未知,取決於具體應用的主要瓶頸是否在通信和RPC封裝。
不看好MPI在深度學習中的前景。
高票答案很贊,補充兩點1. MPI的確對RDMA支持比較好(編譯MPICH時加個選項就行了,不需要寫RDMA代碼),但是據我了解CNN中只有alexnet和vggnet屬於模型比較大,像resnet,googlenet, inception,基本上萬兆網的帶寬就夠了。2. MPI的非同步通信比較坑,雖然MPI標準裡面已經有MPI_ISend和MPI_IRecv,但是很多實現並不是非同步的。OpenMPI中基本上就是同步的,MPICHI可以加一個"MPICH_ASYNC_PROGRESS" 選項,但是實際測試結果來看,性能並不理想,甚至在CPU比較吃緊的情況下性能反而下降。所以用MPI來實現async sgd基本上就是坑。
3. 深度學習數據並行情況下,通信模式其實是一個allreduce ,雖然mpi的allreduce做了很多topology-aware,tree-aggregation的優化,但是為了這一個介面就得忍受mpi其他限制不太值得。說到計算和通信的overlap,mxnet這點做的的確不錯,看看mxnet在param_update時設置的priority就知道了。關於容錯,我覺得對深度學習最好的方式就是checkpoint,一般模型都在100MB以內,相對計算時間,checkpoint開銷幾乎可以忽略,但是如果機器爛到連一個epoch都算不下來,就得另當考慮了。在這個場景下容錯不好並不是MPI不選MPI的原因。
另外,MPI對RDMA,GPUDirect 支持比較好,當有個單機的計算框架想改成分散式,同時又想利用到這些硬體的時候,最簡單粗暴快的方式就是MPI。
以上我覺得這個問題的背景是大規模吧.
相比普通的機器學習, 大規模不光是指問題的複雜度, 更多應該是數據吧. 如果你的數據在100TB以上呢, 而且數據之間是sequential關聯的呢?
用MPI處理的確在communication的效率上會高很多, 尤其是在sync的時候的確會有優勢. 但是如果用別的計算框架或者雲框架, 那麼它們已經整合了一套更好的處理數據和模型. 關鍵是對數據的管理.
另一個大規模機器學習的問題是目標問題的複雜度. 很多objective function 是non-separable的. 這就在並行上產生了很大的困難. 怎麼把函數拆分 怎麼把結果整合才是問題的關鍵.
至於MPI的優勢, 我覺得不妨考慮在distributed的時候做一些asynchronous的變化會不會也能解決呢?
ref: Big Data Analytics in the Cloud: Spark on Hadoop vs MPI/OpenMP on Beowulf
以上只是個人愚見.
關鍵是機器學習需要數據,而數據不在 MPI 有優勢的機器架構上,也就是超算。為什麼超算架構不支持大數據?因為超算架構不具備資源彈性。往後會有性能又好,又有彈性的架構。面向這種架構會有新的編程模式出現。我們目前能看清的趨勢是,每個節點會變成一個響應式、可恢復的「微服務」。並行演算法基於這些微服務來實現。不然,就沒辦法做到真正的規模化。
MPI集群是標配好吧,王益講的容錯在分散式機器學習系統里不是很需要,又不是常駐內存的,掛的機會並不多,待過的幾家大廠都用的很多。
如果你指的機器學習是 DNN 的話 那用處不大,至少目前來看還沒有用起來,原因在於大部分的neural network 的參數沒那麼多,所以矩陣也就沒那麼大,而目前結果表明batch size提高對training速度提高不大,batch size 上不去那麼每次迭代的計算量也沒有那麼高。綜上最合適的架構是4路titan,就這樣也沒把flops用滿。除非網路結構或者training的形式大變,否則MPI暫時用不上的。(純cpu解決方案也許需要)如果是廣義的機器學習,那MPI太有用了。只要涉及大矩陣運算的還沒有什麼能超過MPI的。spark之類的差的太遠。
Broadcast和All_to_All在各層之間傳信息非常簡單暴力,但是不知道大廠是怎麼玩的。
感覺深度學習所需要的通信模式也不是非常複雜,基於mpi可以快速實現,但是想做一些定製化的邏輯可能比較難。
推薦閱讀:
※知道美國哪些機器學習和計算機視覺的實驗室有PHD位置么?
※深度學習或者機器學習中有哪些演算法涉及貪心演算法或者動態規劃演算法的思想?
※機器學習在凝聚態(多體、強關聯)的研究現狀如何?
※需要做聚類、分類、時間序列分析,用什麼工具比較好?
※本科生沒讀研怎麼讓自己機器學習水平更近一步?