1. 程式人生 > >編譯分散式並行版caffe(Open MPI)教程

編譯分散式並行版caffe(Open MPI)教程

又雙叒叕,我來更新部落格了,最近為了調通PSPNet的訓練過程,真的是感覺自己日漸消瘦,原文作者用了Open MPI來支援多塊GPU訓練,並優化了視訊記憶體,使得能以更大的batch size進行訓練,batch size對最後的精度真的很重要啊有木有,無奈限制於顯示卡的物理視訊記憶體,導致batch size是不可能很大的,親測利用官方版本的caffe訓練PSPNet(用的voc 2012資料集),11G視訊記憶體的1080ti居然只能設定batch_size=1,感覺整個人都不好了,所以為了加大batch size,按照作者的描述,下載了yjxiong貢獻的帶有Open MPI的caffe,整個過程可以來說是一步一個坑了,所以在此記錄一下該版本caffe的編譯過程。

首先需要安裝Open MPI,下載地址為:

https://www.open-mpi.org/software/ompi/v1.8/

注意所需要的Open MPI版本必須大於1.7.4,因為要支援cuda,具體可參見:

https://www.open-mpi.org/faq/?category=runcuda

我下載的版本為openmpi-1.8.5.tar.gz

不敢下載太高版本的,以免出現各種bug,大家自行選擇哈。

下載完後手動解壓(終端命令解壓太麻煩,右鍵選擇Extract Here即可),接下去就是安裝過程了,開啟終端依次輸入:

cd openmpi-1.8.5
./configure --prefix=/usr/local/openmpi --with-cuda --enable-mpi-thread-multiple

注:openmpi-1.8.5為解壓後的資料夾,因為我放在了home下,所以可以直接cd,如果不是放在home下,則自行寫上完整路徑;--prefix後為openmpi的安裝路徑(按照上述的路徑就行了,不然下面編譯caffe時可能找不到,而且建立openmpi這個資料夾可以方便解除安裝,解除安裝的時候只需要將該資料夾刪除就可);--with-cuda和--enable...一句都不能少。

進入漫長等待的等待...(要編譯很久)

編譯完成後,再輸入以下安裝命令:

sudo make all install

安裝完後,進行測試是否安裝成功,cd到openmpi-1.8.5/examples路徑,然後進行編譯,再測試,如下:

cd openmpi-1.8.5/examples
make
mpirun -np 4 hello_c

注:mpirun為Open MPI的命令,後面的-np表示the number of process(處理節點的數目,具體百度一下)

測試結果如下則表示安裝成功:

下載支援Open MPI的caffe,目前已知的有浪潮的Caffe-MPI和yjxiong的action_recog,因為後者不僅支援多分散式並行而且對訓練和測試過程中的網路進行了優化,使得訓練時網路所佔的視訊記憶體可以減少到原來的一半,所以這裡選擇了yjxiong貢獻的帶有Open MPI的caffe。

下載完後,進行手動解壓,得到資料夾caffe-action_recog,特別要注意的是該版本只支援cudnn5.0和cudnn6.0,所以大家自行選擇相應的cuda版本和cudnn版本,個人建議cuda8.0+cudnn6.0(不過多版本的cuda是可以共存的,大家自行百度,對於cudnn雖然無法共存,但不需要按照,下載下來替換檔案,更新軟連結就行,切換起來很方便),為何用cudnn6.0的原因是cudnn5.0不支援擴張卷積(也稱空洞卷積),具體可以參見連結https://github.com/yjxiong/caffe/issues/161

在終端cd到caffe跟目錄下(即資料夾caffe-action_recog下),然後輸入依次輸入以下命令(注意第二句命令後面的-DUSE_MPI=ON即表示開啟Open MPI,此句沒有則不會開啟;-DMPI_CXX_COMPILER後的路徑一定得是Open MPI的安裝路徑下的bin中的mpicxx路徑,在/usr/bin下也有這個mpicxx,不要錯寫路徑了):

mkdir build && cd build
cmake .. -DUSE_MPI=ON -DMPI_CXX_COMPILER=/usr/local/openmpi/bin/mpicxx

如下圖所示:

在cmake的過程中,會發現matlab介面沒有開啟(狀態為OFF),如下所示:

******************* Caffe Configuration Summary *******************
-- General:
--   Version           :   <TODO> (Caffe doesn't declare its version in headers)
--   Git               :   unknown
--   System            :   Linux
--   C++ compiler      :   /usr/bin/c++
--   Release CXX flags :   -O3 -DNDEBUG -fPIC -Wall -Wno-sign-compare -Wno-uninitialized
--   Debug CXX flags   :   -g -fPIC -Wall -Wno-sign-compare -Wno-uninitialized
--   Build type        :   Release
-- 
--   BUILD_SHARED_LIBS :   ON
--   BUILD_python      :   ON
--   BUILD_matlab      :   OFF
--   BUILD_docs        :   ON
--   CPU_ONLY          :   OFF

要開啟matlab介面的話,修改根目錄下的CMakeLists.txt檔案中的一句:

caffe_option(BUILD_matlab "Build Matlab wrapper" OFF IF UNIX OR APPLE)

改為

caffe_option(BUILD_matlab "Build Matlab wrapper" ON IF UNIX OR APPLE)

然後make clean掉剛才camke產生的各種檔案(make clean怎麼使用和官方版本的caffe一樣,終端cd到caffe根目錄,輸入make clean 即可)

接著和之前的步驟一樣,重新進行cmake。

但是問題又來了,cmake完後,發現matlab介面是開啟了,但MatlabMex路徑沒找到:

-- Could NOT find MatlabMex (missing:  Matlab_mex Matlab_mexext) 
-- Could NOT find Doxygen (missing:  DOXYGEN_EXECUTABLE) 
-- Found MPI_C: /usr/local/openmpi/lib/libmpi.so  
-- Found MPI_CXX: /usr/local/openmpi/lib/libmpi_cxx.so;/usr/local/openmpi/lib/libmpi.so  
-- Found Git: /usr/bin/git (found version "2.7.4") 
-- 
-- ******************* Caffe Configuration Summary *******************
-- General:
--   Version           :   <TODO> (Caffe doesn't declare its version in headers)
--   Git               :   unknown
--   System            :   Linux
--   C++ compiler      :   /usr/bin/c++
--   Release CXX flags :   -O3 -DNDEBUG -fPIC -Wall -Wno-sign-compare -Wno-uninitialized
--   Debug CXX flags   :   -g -fPIC -Wall -Wno-sign-compare -Wno-uninitialized
--   Build type        :   Release
-- 
--   BUILD_SHARED_LIBS :   ON
--   BUILD_python      :   ON
--   BUILD_matlab      :   ON
--   BUILD_docs        :   ON
--   CPU_ONLY          :   OFF
-- 
-- Dependencies:
--   BLAS              :   Yes (Atlas)
--   Boost             :   Yes (ver. 1.58)
--   glog              :   Yes
--   gflags            :   Yes
--   protobuf          :   Yes (ver. 2.6.1)
--   lmdb              :   Yes (ver. 0.9.17)
--   Snappy            :   Yes (ver. 1.1.3)
--   LevelDB           :   Yes (ver. 1.18)
--   OpenCV            :   Yes (ver. 3.4.1)
--   CUDA              :   Yes (ver. 8.0)
-- 
-- NVIDIA CUDA:
--   Target GPU(s)     :   Auto
--   GPU arch(s)       :   sm_61
--   cuDNN             :   Yes
-- 
-- Python:
--   Interpreter       :   /usr/bin/python2.7 (ver. 2.7.12)
--   Libraries         :   /usr/lib/x86_64-linux-gnu/libpython2.7.so (ver 2.7.12)
--   NumPy             :   /usr/lib/python2.7/dist-packages/numpy/core/include (ver 1.11.0)
-- 
-- Matlab:
--   Matlab            :   No
--   Octave            :   No

進行手動新增MatlabMex路徑:

find_program(Matlab_mex    NAMES mex    mex.bat    HINTS ${Matlab_DIR} PATH_SUFFIXES bin NO_DEFAULT_PATH)
find_program(Matlab_mexext NAMES mexext mexext.bat HINTS ${Matlab_DIR} PATH_SUFFIXES bin NO_DEFAULT_PATH)

改為(其中的路徑修改為你自己安裝的matlab路徑)

find_program(Matlab_mex    NAMES mex    mex.bat    HINTS /home/b622/Matlab2018 PATH_SUFFIXES bin NO_DEFAULT_PATH)
find_program(Matlab_mexext NAMES mexext mexext.bat HINTS /home/b622/Matlab2018 PATH_SUFFIXES bin NO_DEFAULT_PATH)

再次make clean,重新按上面步驟cmake,得到如下結果(MatlabMex的路徑找到了):

-- Found MatlabMex: /home/b622/Matlab2018/bin/mex  
-- Could NOT find Doxygen (missing:  DOXYGEN_EXECUTABLE) 
-- Found MPI_C: /usr/local/openmpi/lib/libmpi.so  
-- Found MPI_CXX: /usr/local/openmpi/lib/libmpi_cxx.so;/usr/local/openmpi/lib/libmpi.so  
-- Found Git: /usr/bin/git (found version "2.7.4") 
-- 
-- ******************* Caffe Configuration Summary *******************
-- General:
--   Version           :   <TODO> (Caffe doesn't declare its version in headers)
--   Git               :   unknown
--   System            :   Linux
--   C++ compiler      :   /usr/bin/c++
--   Release CXX flags :   -O3 -DNDEBUG -fPIC -Wall -Wno-sign-compare -Wno-uninitialized
--   Debug CXX flags   :   -g -fPIC -Wall -Wno-sign-compare -Wno-uninitialized
--   Build type        :   Release
-- 
--   BUILD_SHARED_LIBS :   ON
--   BUILD_python      :   ON
--   BUILD_matlab      :   ON
--   BUILD_docs        :   ON
--   CPU_ONLY          :   OFF
-- 
-- Dependencies:
--   BLAS              :   Yes (Atlas)
--   Boost             :   Yes (ver. 1.58)
--   glog              :   Yes
--   gflags            :   Yes
--   protobuf          :   Yes (ver. 2.6.1)
--   lmdb              :   Yes (ver. 0.9.17)
--   Snappy            :   Yes (ver. 1.1.3)
--   LevelDB           :   Yes (ver. 1.18)
--   OpenCV            :   Yes (ver. 3.4.1)
--   CUDA              :   Yes (ver. 8.0)
-- 
-- NVIDIA CUDA:
--   Target GPU(s)     :   Auto
--   GPU arch(s)       :   sm_61
--   cuDNN             :   Yes
-- 
-- Python:
--   Interpreter       :   /usr/bin/python2.7 (ver. 2.7.12)
--   Libraries         :   /usr/lib/x86_64-linux-gnu/libpython2.7.so (ver 2.7.12)
--   NumPy             :   /usr/lib/python2.7/dist-packages/numpy/core/include (ver 1.11.0)
-- 
-- Matlab:
--   Matlab            :   Yes (/home/b622/Matlab2018/bin/mex, /home/b622/Matlab2018/bin/mexext
--   Octave            :   No

cmake完後,正式開始編譯caffe,在終端輸入以下命令(注意此時的路徑還是上面的build資料夾路徑):

make -j8 && make install

如下圖所示:

不幸又來了,發生瞭如下錯誤:

/usr/bin/ld: cannot find -lpython2
collect2: error: ld returned 1 exit status

matlab/CMakeFiles/matlab.dir/build.make:60: recipe for target '../matlab/+caffe/private/caffe_.mexa64' failed
make[2]: *** [../matlab/+caffe/private/caffe_.mexa64] Error 255
CMakeFiles/Makefile2:1068: recipe for target 'matlab/CMakeFiles/matlab.dir/all' failed
make[1]: *** [matlab/CMakeFiles/matlab.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....

再次make clean(這次的make clean是在build資料夾路徑下,和上面的不同,上面的是在caffe根目錄下),如下圖:

完成後不要著急make -j8 && make install,先修改以下build/matlab/CMakeFiles/build.make檔案,如下:

-lpython2 -lboost_python -lmpi_cxx -lmpi -lprotobuf

改為(或直接暴力刪去-lpython2即可,當然這裡的版本得改成自己的,我這裡是python2.7,所以改為了lpython2.7)

-lpython2.7 -lboost_python -lmpi_cxx -lmpi -lprotobuf

然後再次輸入make -j8 && make install完成caffe的編譯和安裝,完成後如下圖:

python介面和matlab介面是預設按照好的,但需要將python和matlab寫入系統path。

終端輸入以下命令,將pycaffe路徑和matlab的bin路徑寫入系統:

gedit ~/.bashrc

在跳出來的檔案最後添上:

export PYTHONPATH=/home/b622/caffe-action_recog/python:$PYTHONPATH
export PATH=$PATH:/home/b622/Matlab2018/bin

如下圖:

儲存關閉檔案後,再在終端輸入以下命令使剛才的操作生效:

source ~/.bashrc

這時,就可以測試一下pycaffe和matcaffe了。

開啟終端,依次輸入以下命令:

python
import caffe

如果沒有報錯,則說明pycaffe安裝成功,如下圖:

測試matcaffe前,先下載一個用於分類的caffemodel,地址為:

http://dl.caffe.berkeleyvision.org/bvlc_reference_caffenet.caffemodel

下載好後,放入/home/b622/caffe-action_recog/models/bvlc_reference_caffenet資料夾下(這裡前面的路徑/home/b622改成你自己的)。

開啟matlab,然後用matlab開啟/home/b622/caffe-action_recog/matlab/demo資料夾下的classification_demo.m,依次輸入以下命令進行測試:

im = imread('../../examples/images/cat.jpg');
scores = classification_demo(im, 1);
[score, class] = max(scores);

如果發生如下報錯資訊:

Invalid MEX-file '/home/b622/caffe-action_recog/matlab/+caffe/private/caffe_.mexa64': libcaffe.so: cannot open shared object file: No
such file or directory.

開啟終端,cd到/etc/ld.so.conf.d下,輸入以下命令:

sudo gedit caffe.conf

在彈出的檔案中輸入編譯好的caffe中的build/lib資料夾路徑:

儲存後輸入以下命令使其生效:

sudo ldconfig

再次在matlab下輸入上述測試語句,得到結果如下:

如果得到class=282,則說明matcaffe介面成功。

最後,上一波PSPNet的訓練截圖看看該版本caffe的效果:

整個網路的引數需要9000多M視訊記憶體,最後batch size提高到了每張顯示卡一次訓練3張圖(視訊記憶體佔到了11000多M):

有什麼錯誤的地方,歡迎大家指出哈,要轉載的,請說明來自此篇部落格!