Caffe使用openblas实现CPU模式使用多线程
2018-01-16 09:41
1361 查看
(接前文)在Caffe的默认编译安装使用的是ATLAS库,但是这个版本的BLAS不能利用多核CPU,要使用多核CPU并行计算来加速Caffe则需要使用OpenBLAS。下面就说说怎样来使用OpenBLAS。
在默认编译Caffe后,我们使用“ldd build/tools/caffe”命令查看时可以看到使用的是openblas的单线程版本,如下:
如果要使用openblas的多线程版本,此时应该看到类似下面的结果,其中so文件最后的“p”即表示是多线程版本。
下面我们就看看应该怎样编译使用多线程版本OpenBLAS来编译caffe。
同时修改其中 BLAS_INCLUDE 和 BLAS_LIB 参数,修改如下:
然后,修改 “Makefile” 文件,将其中
修改完上面两个文件后,重新编译caffe
编译完成后,使用ldd检查caffe文件,可以看到已经使用多线程版本的的openblas了,如下:
然后我们需要先下载一下训练用的数据,在caffe的根目录下运行下面的命令来准备数据。
修改配置使其使用CPU模式运行训练模型,编辑 examples/mnist/lenet_solver.prototxt 文件。
运行训练模型
待训练程序启动后,使用 top 命令观察进程的 CPU 使用情况,由于上面我设置了 OPENBLAS_NUM_THREADS=2 , 所以此时进程的CPU利用率大约会是200%左右。
在默认编译Caffe后,我们使用“ldd build/tools/caffe”命令查看时可以看到使用的是openblas的单线程版本,如下:
$ ldd build/tools/caffe | grep openblas libopenblas.so.0 => /lib64/libopenblas.so.0 (0x00007f1fe656f000)
如果要使用openblas的多线程版本,此时应该看到类似下面的结果,其中so文件最后的“p”即表示是多线程版本。
$ ldd build/tools/caffe | grep openblas libopenblasp.so.0 => /lib64/libopenblasp.so.0 (0x00007f0854b90000)
下面我们就看看应该怎样编译使用多线程版本OpenBLAS来编译caffe。
编译
首先,修改 “Makefile.config” 文件,将其中BLAS := atlas 改为 BLAS := open
同时修改其中 BLAS_INCLUDE 和 BLAS_LIB 参数,修改如下:
BLAS_INCLUDE := /usr/include/openblas BLAS_LIB := /usr/lib64/libopenblasp.so
然后,修改 “Makefile” 文件,将其中
LIBRARIES += openblas 改为 LIBRARIES += openblasp
修改完上面两个文件后,重新编译caffe
make clean make all make test make runtest
编译完成后,使用ldd检查caffe文件,可以看到已经使用多线程版本的的openblas了,如下:
$ ldd build/tools/caffe | grep openblas libopenblasp.so.0 => /lib64/libopenblasp.so.0 (0x00007f0854b90000)
测试
我们跑个训练模型来验证一下,要让caffe使用指定的CPU个数,我们可以通过设置环境变量 OPENBLAS_NUM_THREADS 来实现。如下:$ export OPENBLAS_NUM_THREADS=2
然后我们需要先下载一下训练用的数据,在caffe的根目录下运行下面的命令来准备数据。
$ ./data/mnist/get_mnist.sh $ ./examples/mnist/create_mnist.sh
修改配置使其使用CPU模式运行训练模型,编辑 examples/mnist/lenet_solver.prototxt 文件。
将其中 solver_mode: GPU 修改为 solver_mode: CPU
运行训练模型
$ ./examples/mnist/train_lenet.sh
待训练程序启动后,使用 top 命令观察进程的 CPU 使用情况,由于上面我设置了 OPENBLAS_NUM_THREADS=2 , 所以此时进程的CPU利用率大约会是200%左右。
相关文章推荐
- Caffe:CPU模式下使用openblas-openmp(多线程版本)
- Caffe:CPU模式下使用openblas-openmp(多线程版本)
- 使用命令模式实现多线程
- 使用Condition实现多线程之间调用(生产消费模式)
- 使用Lock锁机制实现 多线程的 多生产 多消费 模式。
- 多线程---使用ManualResetEvent来控制线程间的同步(实现了消费者和生产者模式)
- Caffe:CPU模式下使用Intel MKL做mnist训练
- Java多线程——使用wait/notify实现生产者/消费者模式
- 多线程---使用ManualResetEvent来控制线程间的同步(实现了消费者和生产者模式)
- IOS多线程使用GCD与信号量实现生产者与消费者模式
- 使用enum枚举数据类型实现多线程中的单例模式
- 利WMI实现监视局域网计算机CPU使用情况
- 使用ASP.Net Forms模式实现WebService身份验证
- 使用ASP.Net Forms模式实现WebService身份验证
- 使用ASP.Net Forms模式实现WebService身份验证
- 使用 异步多线程TCP Socket 实现进程间通信(VC 6.0 , BCB6.0调试通过)
- 使用ASP.Net Forms模式实现WebService身份验证
- 如何使用委托与事件来实现观察者模式
- 使用开放源代码框架的 Java 应用程序的 Web 服务集成模式,第 1 部分: 实现调用模式
- (23)枚举器模式-Iterator Pattern -使用 foreach 语句、实现多个枚举器