前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Caffe:CPU模式下使用openblas-openmp(多线程版本)

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

作者头像
10km
发布2019-05-25 22:33:08
2.1K0
发布2019-05-25 22:33:08
举报
文章被收录于专栏:10km的专栏10km的专栏

版权声明:本文为博主原创文章,转载请注明源地址。 https://cloud.tencent.com/developer/article/1433726

从所周知,所有的深度学习框架使用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,

代码语言:javascript
复制
#!/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修改,如下图

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

编译好后,执行ldd查看caffe的依赖库,指向了/usr/lib64/libopenblas.so.0

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文件(多线程版本),

于是用cmake-gui打开build目录如下图将OpenBLAS_LIB改为多线程版本,再点”Generate”按钮重新重新Makefile。

重新执行make编译Caffe后再执行ldd,显示已经依赖/usr/lib64/libopenblasp.so.0

再执行mnist训练,CPU立即被占满了

但耗时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核

编译安装OpenBlas

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

代码语言:javascript
复制
#!/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中解决这个问题。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016年10月02日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • yum 安装
  • mnist测试
  • 编译安装OpenBlas
  • 最后的问题:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档