MxNet系列——how_to——model_parallel_lstm

博客新址: http://blog.xuezhisd.top
郵箱:[email protected]


使用模型並行的方式在多個GPUs上訓練LSTM

由於複雜的數據依賴,LSTM評價很困難。LSTM的訓練過程,在反向傳播階段有更嚴重的逆序的數據依賴,更加難以並行化。獲取有關LSTM更通用信息,請查看優秀的 簡介 (作者:Christopher)有關使用模型並行的方式在多個GPUs上訓練LSTM的資料,請查看 example/model-parallelism-lstm/

模型並行:將多個GPUs作爲流水線

最近,在應用機器學習中,有很多關於模型並行的熱烈討論。它最初是爲GoogleNet中的超大卷積層設計的。我們借鑑了一個網絡層位於一個GPU上的想法。模型並行的基元是神經網絡模型的網絡層。它帶來的好處是GPU沒有必要將所有網絡層的參數保存在內存中了。這降低了大規模任務對內存要求,例如,機器翻譯。

screen shot 2016-05-06 at 10 13 16 pm

在上圖中,不同的LSTM模型位於不同的GPUs上。GPU 1完成第一層的(第一個句子的)計算之後,輸出結果傳遞給GPU 2。同時,GPU 1 獲取下一個句子並開始訓練。這和數據並行明顯不同,因爲在每一次迭代的最後,沒有更新共享模型的衝突。絕大多數的通信發生在不同GPUs之間的流水線式(先後順序)的傳遞中間結果。

在這個實現中,網絡層定義在 lstm_unroll()

劃分工作負載

爲了在不同GPUs上劃分網絡,實現模型並行需要有關訓練任務的豐富知識。儘管它需要詳細的分析(已經超出了該節內容的範圍),你可以應用一些通用的原則:

  • 爲了避免數據傳輸,將相鄰層定義在同一個GPU上。
  • 爲了避免流水線的瓶頸,需要均衡GPUs之間的負載。
  • 記住不同的網絡層有不同的計算-內存屬性。
screen shot 2016-05-07 at 1 51 02 am

瀏覽以下上圖中的兩個流水線。他們都有八個網絡層,一個解碼層和一個編碼層。根據第一個原則,將所有相鄰層放在不同GPUs上是不明智的。我們也想均衡不同GPUs上的負載。儘管LSTM層比編碼/解碼層消耗更少的內存,但因爲展開LSTM的依賴性,它們會花費更多的計算時間。因此,左邊的流水線的負載更加均衡,因此比右邊的更快。

在這個實現中,網絡層在 lstm.py中劃分和在 lstm_ptb.py中使用 group2ctx 選項配置。

在模型並行中使用 Bucketing

爲了在模型並行中使用 bucketing,你需要爲每一個bucket把LSTM展開,以爲每一?生成一個執行器。關於模型時如何約束的細節,請查看 lstm.py

另一方面,因爲模型並行劃分模型/網絡層,輸入數據必須變換/轉置成一致的形狀。更多細節,請查看 bucket_io

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章