Caffe使用openblas实现CPU模式使用多线程

(接前文)在Caffe的默认编译安装使用的是ATLAS库,但是这个版本的BLAS不能利用多核CPU,要使用多核CPU并行计算来加速Caffe则需要使用OpenBLAS。下面就说说怎样来使用OpenBLAS。

在默认编译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%左右。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java一日一条

多种负载均衡算法及其 Java 代码实现

负载均衡 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展 网络设备和 服务器的带宽、增加 吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。

2281
来自专栏人工智能LeadAI

配置深度学习主机与环境(TensorFlow+1080Ti) | 第四章 基于Anaconda的TensorFlow安装

配置深度学习主机与环境(TensorFlow+1080Ti): 01 概念介绍 Anaconda Anaconda(https://www.continuu...

4215
来自专栏计算机视觉战队

NVIDIA DIGITS(非常好用的一个框架)

我也忘了在哪里看过几篇类似的文章,为了让更多朋友知道这个好工具,我今天也作为一名合格的搬运工,希望大家努力传播正能量,和大家共同进步!谢谢! NVIDIA为...

4245
来自专栏性能与架构

NoSql数据库的主要模型

KVP键值对模型 是一组两个关联的数据项,非常简单,有很高的灵活性和可扩展性 随着数据量的增加,KVP的计算也自然增加,所以使用KVP模型的数据库是指数型的 典...

3274
来自专栏Spark学习技巧

如何理解Linux中的load averages?

经常和 Linux 打交道的童鞋都知道,load averages 是衡量机器负载的关键指标,但是这个指标是怎样定义出来的呢?

922
来自专栏计算机视觉战队

NVIDIA DIGITS

我也忘了在哪里看过几篇类似的文章,为了让更多朋友知道这个好工具,我今天也作为一名合格的搬运工,希望大家努力传播正能量,和大家共同进步!谢谢! NVIDIA为...

3398
来自专栏章鱼的慢慢技术路

用ARM实现音乐电子相册

2682
来自专栏机器之心

专栏 | 想免费用谷歌资源训练神经网络?Colab详细使用教程

62111
来自专栏Python中文社区

Github|Python开源项目漫游指南(一)

Scikit-learn Scikit-learn是基于Scipy为机器学习建造的的一个Python模块,他的特色就是多样化的分类,回归和聚类的算法包括支持向量...

2377
来自专栏Spark学习技巧

几种简单的负载均衡算法

什么是负载均衡 负载均衡,英文名称为Load Balance,指由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务...

5425

扫码关注云+社区

领取腾讯云代金券