编译分布式并行版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):

有什么错误的地方,欢迎大家指出哈,要转载的,请说明来自此篇博客!

猜你喜欢

转载自blog.csdn.net/qq_21368481/article/details/81257265
mpi