Caffe:CPU模式下使用openblas-openmp(多线程版本)

从所周知,所有的深度学习框架使用GPU运行是最快的,但是在不具备Nvidia显卡的环境下只使用CPU来运行,慢就慢点吧,对于学习阶段还是够用的。

Caffe用到的Blas可以选择Altas,OpenBlas,Intel MKL,Blas承担了大量了数学工作,所以在Caffe中Blas对性能的影响很大。
MKL要收费,Altas略显慢(在我的电脑上运行Caffe自带的example/mnist/lenet_solver.prototxt,大概需要45分钟。。。)
根据网上资料的介绍使用OpenBlas要快一些,于是尝试安装使用OpenBlas来加速训练过程。

我用的系统是CentOS6.5 64位,双至强处理器(24核),CPU是够强悍的,只是没有Nivdia显卡

安装OpenBlas的过程有两个办法,最简单的就是安装yum源提供的编译好的二进制版本。另一个是自己下载源码去编译。现在先讲最简单的yum安装

yum 安装

执行

sudo yum install openblas-devel

安装了如下软件

openblas.x86_64 0.2.18-5.el6 @epel
openblas-devel.x86_64 0.2.18-5.el6 @epel
openblas-openmp.x86_64 0.2.18-5.el6 @epel
openblas-threads.x86_64 0.2.18-5.el6 @epel

OpenBlas这就算安装好了,简单吧?
然后,如下编译Caffe,

#!/bin/sh
# 执行cmake生成Makefile
mkdir build && cd build
cmake -DBLAS=Open -DCPU_ONLY=ON -DBUILD_python=OFF -DBUILD_python_layer=OFF -DBoost_INCLUDE_DIR=/usr/include/boost148 -DBoost_LIBRARY_DIR=/usr/lib64/boost148 ..
# 开始编译 24线程
make install -j 24

-DBLAS=Open用于指定BLAS使用OpenBlas,也可以用cmake-gui修改,如下图

Caffe:CPU模式下使用openblas-openmp(多线程版本)_第1张图片

关于CentOS6.5下编译Caffe的过程参见我的另一篇博客《CentOS6.5编译Caffe过程记录(系统存在多个编译器)》

编译好后,执行ldd查看caffe的依赖库,指向了/usr/lib64/libopenblas.so.0
Caffe:CPU模式下使用openblas-openmp(多线程版本)_第2张图片

mnist测试

再执行mnist训练,大概耗时13分钟,比用altas速度快了3倍多。

./build/tools/caffe train –solver=examples/mnist/lenet_solver.prototxt

但运行时我也发现,虽然电脑有24核,实际只用到一个核,也就是说Caffe在运行时基本上是单线程工作的。。。

请注意前面安装OpenBlas的软件列表,有一项是openblas-openmp,看到这里我似乎明白了什么。到网上一查,果然openblas-openmp是OpenBlas的多线程优化版本。

在/usr/lib64下不仅有libopenblas.so.0(单线程版本),还有一个libopenblasp.so.0,这个就是前面软件列表中的openblas-openmp的so文件(多线程版本),
Caffe:CPU模式下使用openblas-openmp(多线程版本)_第3张图片

于是用cmake-gui打开build目录如下图将OpenBLAS_LIB改为多线程版本,再点”Generate”按钮重新重新Makefile。
Caffe:CPU模式下使用openblas-openmp(多线程版本)_第4张图片
重新执行make编译Caffe后再执行ldd,显示已经依赖/usr/lib64/libopenblasp.so.0
Caffe:CPU模式下使用openblas-openmp(多线程版本)_第5张图片
再执行mnist训练,CPU立即被占满了
Caffe:CPU模式下使用openblas-openmp(多线程版本)_第6张图片
但耗时20分钟,却更慢了,为什么?现在也没搞明白。
于是修改OMP_NUM_THREADS或(OPENBLAS_NUM_THREADS)参数减少OpenBlas的线程数再试

export OMP_NUM_THREADS=4 && ./build/tools/caffe train –solver=examples/mnist/lenet_solver.prototxt

关于OMP_NUM_THREADSOPENBLAS_NUM_THREADS的详细用法说明参见《OpenBlas github网站》

训练时间减少到10分钟,CPU跑满4核
Caffe:CPU模式下使用openblas-openmp(多线程版本)_第7张图片

编译安装OpenBlas

从https://github.com/xianyi/OpenBLAS/tree/v0.2.18下载0.2.18版本,解压缩后开始编译安装。编译时使用USE_OPENMP=1选项

#!/bin/sh
unzip OpenBLAS-0.2.18.zip
cd OpenBLAS-0.2.18
make USE_OPENMP=1
sudo make install

关于OpenBLAS更详细的安装说明参见《OpenBLAS编译和安装简介》
默认安装到/opt/OpenBLAS下,cmake生成Caffe的Makefile时会自动找到,剩下的步骤就和前面一样了。

最后的问题:

用OpenBlas时,OPENBLAS_NUM_THREADS设置为最大,让CPU负载跑满,并不能大幅提高速度,这是为什么?一直没搞明白。
看到Caffe上有人提交了《Parallel version of caffe for CPU based on OpenMP》,据说在CPU模式下有高达10倍的但似乎为了减少代码维护的复杂性,Caffe官方并没有接受这个PR。根据Caffe的作者Yangqing Jia的回复,应该会在Caffe2中解决这个问题。

你可能感兴趣的:(deeplearning)