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

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

首先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的分佈式的框架,維護人員和用戶都不多,放棄使用了。ui

二. openMpi和Horovod的安裝:spa

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的文檔加上須要代碼就能夠運行集羣的訓練ip