ubuntu16.04上配置cuda+caffe环境

2017-01-01 Lu Huang 更多博文 » 博客 » GitHub »

原文链接 https://hlthu.github.io/caffe/2017/01/01/ubuntu-cuda-caffe.html
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。


本文主要介绍在有NVIDIA GPU的ubuntu16.04上配置cuda8.0,opencv,caffe的环境。由于之前我也写过关于cuda配置和opencv编译的博客,这里主要还是关注caffe的编译。

1. 配置cuda和cudnn

cuda和cudnn的配置可以参考我之前写过的一篇文章:ubuntu16.04配置cuda。请注意:cudnn只支持computing capacity在3.0(含)以上的GPU上运行,所以在安装cudnn之前请检查你的GPU版本是否支持cudnn。检查方法在文中也指出了。

本文中,由于我的GPU是一块较老的Tesla C2075,computing capacity只有2.0,因此我并没有安装cudnn,当然读者应当根据自己的需求决定是否安装。

2. 编译安装opencv-3.1.0

opencv的编译安装我在之前的一篇博客中也有介绍:关于在linux下编译安装opencv,本文将不再赘述。提醒:如果是自己一个人用,不会和别人起冲突,建议把opencv安装到/usr/local中去,如果怕起冲突,可以安装到自己的目录下。

如果不想自己编译 opencv,可以用 apt-get 安装。

sudo apt install libopencv-dev

3. 安装caffe

3.1 解决依赖

(1)基本依赖

sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libhdf5-serial-dev protobuf-compiler
sudo apt-get install --no-install-recommends libboost-all-dev

(2)BLAS

可以选择ATLAS, OpenBLAS或MKL中的一个。

sudo apt-get install libopenblas-dev liblapack-dev libatlas-base-dev

(3)Python

在caffe的目录下,进入python目录,可以看到一个requirements.txt文件,这个文件列举了python的一些依赖,如果你不想使用caffe的python接口,可以不安装,他们依次是:

Cython>=0.19.2
numpy>=1.7.1
scipy>=0.13.2
scikit-image>=0.9.3
matplotlib>=1.3.1
ipython>=3.0.0
h5py>=2.2.0
leveldb>=0.191
networkx>=1.8.1
nose>=1.3.0
pandas>=0.12.0
python-dateutil>=1.4,<2
protobuf>=2.5.0
python-gflags>=2.0
pyyaml>=3.10
Pillow>=2.3.0
six>=1.1.0

如果你是用的系统自带的python,你可以选择使用sudo apt install <...>来安装;如果比使用的conda,可以使用conda install <...>来安装。

(4)其他依赖

sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev

3.2 编译caffe

(1)git clone

caffe是一个开源的计算工具,经常更新,使用时建议git clone最新的版本。

git clone https://github.com/BVLC/caffe.git

(2)修改Makefile.config文件

Makefile.config文件记录了make时的一些配置,可以根据自己的需要进行修改。

cp Makefile.config.example Makefile.config

a.若要使用cudnn,请取消下面的注释,由于我的GPU不支持cudnn,多以我并没有使用cudnn。

 # USE_CUDNN := 1

b.若使用的opencv版本是3的,则请取消下面的注释。

 # OPENCV_VERSION := 3

c.选择BLAS,可以选择ATLAS、MKL和OPENBLAS,这里我们选择的是OPENBLAS。

# BLAS choice:
# atlas for ATLAS (default)
# mkl for MKL
# open for OpenBlas
BLAS := open

d.如果你想使用MATLAB的接口,请填上MATLAB的地址。

# This is required only if you will compile the matlab interface.
# MATLAB directory should contain the mex binary in /bin.
# MATLAB_DIR := /usr/local

e.如果python使用的是conda,则取消

# ANACONDA_HOME := $(HOME)/anaconda
# PYTHON_INCLUDE := $(ANACONDA_HOME)/include \
        # $(ANACONDA_HOME)/include/python2.7 \
        # $(ANACONDA_HOME)/lib/python2.7/site-packages/numpy/core/include \

# PYTHON_LIB := $(ANACONDA_HOME)/lib

的注释,并将相应的使用系统python的PYTHON_INCLUDEPYTHON_LIB注释掉。

f.若要使用Python来编写layer,则取消下面的注释。

 # WITH_PYTHON_LAYER := 1 

g.修改INCLUDE_DIRSLIBRARY_DIRS如下,增加hdf5的路径。

# Whatever else you find you need goes here.
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu/hdf5/serial

(3)make

依次执行以下命令。

make all -j8
make test -j8
make runtest -j8
make pycaffe -j8
make examples -j8

当然有些步骤是可以根据自己的需要调整的。编译好了python包后,要把这个模块加入到python的路径下,在~/.bashrc中加入下面一句。

export PYTHONPATH=CAFFE_PATH/python:$PYTHONPATH

3.3 常见错误解决

(1)有关cuda,错误如下:

"libcudart.so.8.0 cannot open shared object file: No such file or directory"

解决方案如下:

sudo cp /usr/local/cuda-8.0/lib64/libcudart.so.8.0 /usr/local/lib/libcudart.so.8.0 && sudo ldconfig
sudo cp /usr/local/cuda-8.0/lib64/libcublas.so.8.0 /usr/local/lib/libcublas.so.8.0 && sudo ldconfig
sudo cp /usr/local/cuda-8.0/lib64/libcurand.so.8.0 /usr/local/lib/libcurand.so.8.0 && sudo ldconfig

(2)有关pycaffe的错误

这一部分主要要在之前安装好pycaffe的依赖,应该出错较少。我在安装时由于事先没有安装那些python依赖,导致pycaffe编译老是报错。这一部分的错误基本上可以在参考4中找到。

4. 测试caffe例程

4.1 MNIST数据集

配置caffe完成后,我们可以利用MNIST数据集对caffe进行测试,过程如下:

cd ~/caffe
./data/mnist/get_mnist.sh
./examples/mnist/create_mnist.sh
./examples/mnist/train_lenet.sh

运行结果如下: 运行结果 可以发现正确率为99.02%。

4.2 cifar训练集

先运行下面的命令。

./data/cifar10/get_cifar10.sh
./examples/cifar10/create_cifar10.sh
./examples/cifar10/train_quick.sh
./examples/cifar10/train_full.sh

运行完后会得到cifar10_full_iter_70000.caffemodel.h5cifar10_full_iter_70000.solverstate.h5等文件,然后我们使用模型来分类新数据。

指定自己的模型进行分类:

python python/classify.py \
    --model_def examples/cifar10/cifar10_quick.prototxt \
    --pretrained_model examples/cifar10/cifar10_quick_iter_4000.caffemodel.h5 \
    --center_only  examples/images/cat.jpg foo

上面这句话的意思是,使用cifar10_quick.prototxt网络 + cifar10_quick_iter_4000.caffemodel.h5模型,对examples/images/cat.jpg图片进行分类。得到下面的结果 5

默认的classify脚本不会直接输出结果,而是会把结果输入到foo文件里,不太直观,这里我在网上找了一个修改版,添加了一些参数,可以输出概率最高的分类。替换python/classify.py,下载地址:http://download.csdn.net/detail/caisenchuan/9513196.

这个脚本添加了两个参数,可以指定labels_file,然后可以直接把分类结果输出出来:

python python/classify.py \
    --model_def examples/cifar10/cifar10_full.prototxt \
    --pretrained_model examples/cifar10/cifar10_full_iter_70000.caffemodel.h5 \
    --labels_file  data/cifar10/batches.meta.txt \
    --center_only  --print_results \
    examples/images/cat.jpg  foo

输出结果: 6

参考

  1. ubuntu16.04上配置nvidia驱动、cuda和cudnn
  2. 关于在linux下编译安装opencv
  3. Caffe Ubuntu Installation
  4. caffe的配置过程
  5. caffe简易上手指南(一)—— 运行cifar例子