keras分佈式訓練模型 openMpi+Horovod+keras -Effective DeepLearning

最近因爲項目的需要我們之前做的模型的分類猛增3,4倍,數量的數據也隨之增加導致了訓練模型的時間從原來的10幾個小時增加到現在的大概要100小時,這時候之前用的單機雙GPU的訓練方式明顯已經遇到了瓶頸(我們的開發機GPU是GTX1080i PC級別算是最好的了吧)。這時候我們只能從單機訓練方式轉化到分佈式的訓練方式。Keras官文首頁寫着方便遷移方便做分佈式訓練的所以想都不想就開工做了,誰知道原來這纔是踩坑的開始o(╥﹏╥)o。所以寫下整個踩坑過程希望對大家有點幫助。

首先Keras關於如何使用分佈式訓練英文官網文檔(中文文檔完全沒有估計中文是翻譯過來的並不是真正官方維護)裏面只有4行,而且4行都是跳轉到其他Githup的頁面。4行裏面分別是叫你用multi_gpu_model, horovod, spark+keras和xxxx 4種方法,下面是我對這4個方法的個人感受。首先multi_gpu_model 這個是多gpu訓練,但是我找到的資料這個方法只能是單機多GPU的訓練並不能多機多GPU的訓練 ̄□ ̄|| 如果哪位知道怎麼用這個方法做多機多GPU訓練麻煩告知;然後再看看 spark+keras和xxxx 這兩個方法,打開Githup看到文檔稀疏的幾行,維護人員也只有5,6個,這情況只能放棄了;最後只剩下horovod這個開源方法。

咋一看horovod文檔也算清晰以爲可以輕鬆搞定,然鵝並不是o(╥﹏╥)o。一輪吐槽之後正式開始

一. 背景
現在keras的分佈式的訓練的方法在它的官網上總共列了下面4個解決方案(官網鏈接 https://keras.io/why-use-keras/#keras-has-strong-multi-gpu-support-and-distributed-training-support),詳細的解析如下
1. built-in support for multi-GPU data parallelism 這裏是指用keras的keras.utils.training_utils裏面的multi_gpu_model這個方法。這個方法只能用在單機多GPU的情況下,多機多GPU不能用,由於每個物理機器能搭載的gpu數量總有限制,而且我們現狀是多機多GPU所以不適用。
2. Horovod, from Uber, has first-class support for Keras models  Horovod 是 Uber做的一個開源的支持keras做分佈式運算的一個框架。正在用的方案
3.Keras models can be turned into TensorFlow Estimators and trained on clusters of GPUs on Google Cloud  這個是指將Keras轉換成TensorFlow Estimators 然後在Google Cloud上運行。未來的方向
4.Keras can be run on Spark via Dist-Keras (from CERN) and Elephas  Dist-Keras 這是Yahoo工程師做的一個支持Keras的分佈式的框架,維護人員和用戶都很少,放棄使用了。

二. openMpi和Horovod的安裝:

1.安裝 NCCL2
NCCL是NVIDIA的Multi-GPU多卡通信框架,細節自行百度瞭解了。安裝包在https://developer.nvidia.com/nccl下載 nccl_2.2.13-1+cuda9.0_x86_64。 這裏需要的注意的是如果要重新安裝要對應上你安裝gpu內核的時候用的cuda的版本,我們cuda版本是9.0所以就是nccl2+cuda9.0版本。去到上面的目錄,然後將解壓目錄下所有文件複製到/usr/local/nccl下,然後修改/etc/profile和~/.bashrc文件,在最後添加export LD_LIBRARY_PATH=/usr/local/nccl/lib:$LD_LIBRARY_PATH,保存退出,暫時不需要激活因爲後面還需要修改這兩個文件,最後一併改完之後再激活。

2. 安裝Open MPI
安裝包在https://www.open-mpi.org/下的openmpi-3.1.2,解壓然後切換到改目錄下。先運行./configure —prefix=/usr/local/openmpi,準備好之後再運行make && make install,就可以把openmpi編譯並放到/usr/local/openmpi下。 然後分別修改/etc/profile和~/.bashrc文件,在上面第1步的基礎上修改export LD_LIBRARY_PATH=/usr/local/nccl/lib:/usr/local/openmpi/lib:/usr/local/cuda-9.0/lib64:$LD_LIBRARY_PATH  和  export PATH=/usr/local/openmpi/bin:/usr/local/cuda-9.0/bin:$PATH。 把openmpi的包還有可執行文件放到環境裏面。這裏由於要修改系統的PATH所以要格外小心,注意一定要把$PATH帶上不然操作系統會被弄壞的就要重裝系統了。/etc/profile和~/.bashrc文件都改完之後用命令 source ~/.bashrc 先激活當前用戶的環境,看看沒有問題之後,再用命令
source /etc/profile 激活整個系統的環境,這樣第一次激活如果有錯,也可以通過切換用戶來糾正。
這裏必須要修改~/.bashrc不然做集羣的時候其他機器不能訪問改機器了。另外需要集羣必須要設置各個機器之間免密登錄,不免密也是訪問不了喔,這個就不在這裏說了。

3. 安裝 horovod
這裏比較坑的是不能直接pip install horovod這樣去安裝,這樣會導致horovod這個框架沒有把nccl和mpi的包編譯進去,最後導致用的時候一直只能用cpu的方法去跑。安裝一定要用這個命令HOROVOD_NCCL_HOME=/usr/local/nccl HOROVOD_GPU_ALLREDUCE=NCCL pip3 install --no-cache-dir horovod 這樣子就可以安裝完成了。整個過程其實不復雜但是由於horovod的安裝指引沒有把gpu的支持放在顯眼的地方,所以如果按照官網首頁的步驟去裝就會踩坑。到這裏就基本完成安裝,然後再按照horovod的文檔加上需要代碼就可以運行集羣的訓練

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