分散式機器學習里的 數據並行 和 模型並行 各是什麼意思?
尤其是模型並行,求白話解釋
很巧這個問題出現在我的推薦上,一打開知乎就看到,遂答一發。
首先說下為什麼要並行,眾所周知目前的深度學習領域就是海量的數據加上大量的數學運算,所以計算量相當的大,訓練一個模型跑上十天半個月啥的是常事。那此時分散式的意義就出現了,既然一張GPU卡跑得太慢就來兩張,一台機器跑得太慢就用多台機器,於是我們先來說說數據並行,放張網上copy的圖
在上面的這張圖裡,每一個節點(或者叫進程)都有一份模型,然後各個節點取不同的數據,通常是一個batch_size,然後各自完成前向和後向的計算得到梯度,這些進行訓練的進程我們成為worker,除了worker,還有參數伺服器,簡稱ps server,這些worker會把各自計算得到的梯度送到ps server,然後由ps server來進行update操作,然後把update後的模型再傳回各個節點。因為在這種並行模式中,被劃分的是數據,所以這種並行方式叫數據並行。
然後呢咱們來說說模型並行,深度學習的計算其實主要是矩陣運算,而在計算時這些矩陣都是保存在內存里的,如果是用GPU卡計算的話就是放在顯存里,可是有的時候矩陣會非常大,比如在CNN中如果num_classes達到千萬級別,那一個FC層用到的矩陣就可能會大到顯存塞不下。這個時候就不得不把這樣的超大矩陣給拆了分別放到不同的卡上去做計算,從網路的角度來說就是把網路結構拆了,其實從計算的過程來說就是把矩陣做了分塊處理。這裡再放一張網上盜的圖表示下模型並行:
最後說說兩者之間的聯繫,有的時候呢數據並行和模型並行會被同時用上。比如深度的卷積神經網路中卷積層計算量大,但所需參數係數 W 少,而FC層計算量小,所需參數係數 W 多。因此對於卷積層適合使用數據並行,對於全連接層適合使用模型並行。 就像這樣:
關於這個更多地可以參考這篇博客,說的挺詳細的卷積神經網路的並行化模型--One weird trick for parallelizing convolutional neural networks
明天考試正好也剛看完……首答的答主咱們是校友嗎?
簡而言之核心思想是當單機性能瓶頸的時候通過多台機器來分擔工作量(也就是現在雲計算平台的思路了)
Model Parallelism:
當模型巨大,單機內存不足的時候,將計算工作 partiton,同一個大模型的不同部分交給不同機器負責(比如多層網路的各個節點),這樣就會有很大的通信開銷。(通常 Model parallelism 的定義不包括 data partition 但實際上很多框架都同時也有 data parallelism 的思想)
Data Parallelism:
當數據巨大的時候,通過網路來回搬運全部數據到多台機上工作是不現實的,因此我們可以將數據分片,讓不同的機器運算不同的數據分片,然後對所求目標進行收集處理,這就需要一個 sever 來完成這步工作。這種 parameter server 可以是 average 也可以是 update-based 的。
數據並行就是把train set分布給不同的worker,每個worker通過緩存在本地的,分配到的數據集來更新一個共有的parameter,比如mini-batch中每個worker隨機從本地數據集中選出一個batch,更新parameter。 關鍵點在於如何管理共有的paramter,比如有經典的ps和petuum 的ssp改進。petuum的bosen就是這種數據並行方式。
模型並行我只有大體的了解。比如一個model有1000維的parameter,那麼通過某種演算法讓10個worker中的每個只負責10維的parameter的更新。 petuum的strads是模型並行的。
最後安利下我自己的基於c++分散式平台Dogee,使用DSM模型,管理本地內存數據和管理分散式內存一樣簡單http://github.com/Menooker/Dogee早上剛剛看到。數據並行是指對訓練數據做切分,同時採用多個模型實例,對多個分片的數據並行訓練。要完成數據並行需要做參數交換,通常由一個參數伺服器(Parameter Server)來幫助完成。在訓練的過程中,多個訓練過程相互獨立,訓練的結果,即模型的變化量ΔW需要彙報給參數伺服器.數據並行有同步模式和非同步模式之分。模型並行將模型拆分成幾個分片,由幾個訓練單元分別持有,共同協作完成訓練。當一個神經元的輸入來自另一個訓練單元上的神經元的輸出時,產生通信開銷。多數情況下,模型並行帶來的通信開銷和同步消耗超過數據並行,因此加速比也不及數據並行。但對於單機內存無法容納的大模型來說,模型並行是一個很好的選擇數據並行的訓練程序太多時,不得不減小學習率,以保證訓練過程的平穩;模型並行的分片太多時,神經元輸出值的交換量會急劇增加,效率大幅下降。因此,同時進行模型並行和數據並行也是一種常見的方案。
推薦Eric P. Xing et al.的《大數據的分散式機器學習的策略與原則》。
數據並行是把訓練數據分成多份,在不同機器訓練,然後參數更新到parameter server;
模型並行會把模型分區,分配到不同的機器分別運行(按功能,層次),因為參數間存在依賴關係,需要調度器;
之前看到的一篇文章的一個比喻:
如果要修兩棟樓,有一個工程隊,怎麼操作?第一個方案是將人分成兩組,分別蓋樓,蓋好了就裝修;第二種做法是一組人蓋樓,等第一棟樓蓋好,另一組裝修第一棟,然後第一組繼續蓋第二棟樓,改完以後等裝修隊裝修第二棟樓。乍一看,第二種方法似乎並行度並不高,但第一種方案需要每個工程人員都擁有「蓋樓」和「裝修」兩種能力,而第二個方案只需要每個人擁有其中一種能力即可。第一個方案和數據並行類似,第二個方案則道出了模型並行的精髓。
數據總量大,需要大量設備同時處理,可以使用數據並行。主要目的是加速計算;
模型規模大,以至於單個設備無法容納,則可以使用模型並行,將模型的不同階段部署到不同設備上,比如把深度網路的不同層部署到不同GPU上,彼此通信來實現一個流水線。比起數據並行肯定會有額外的開銷,但這是個化不可能為可能的操作,必要的時候可以考慮
數據並行就是把訓練數據分多份,把數據分發到不同的slave,然後多個slave同時去訓練多個模型副本,然後融合模型結果。 當然,也可以多個slave採用SGD或者ASGD方式同時去更新master上的同一套模型參數。模型並行就是把模型參數分發到不同的slave,就是把模型參數拆分,然後各個slave更新自己分配到的參數。模型並行需要slave頻繁的交互,相對也難實現,而數據並行就簡單很多了。
推薦閱讀:
※有沒有國內寫的比較好的、深入淺出的、並且貼近實戰的機器學習與深度學習書籍或博客?
※有基於spark的parameter server嗎?
※分散式系統學習路線?
※深度學習GPU訓練代碼初學者,在寫神經網路代碼時,遇到了GPU計算結果與CPU計算結果不一致的問題?
TAG:人工智慧 | 機器學習 | 深度學習DeepLearning | 大規模機器學習 |