ubuntu16.04上配置cuda+caffe环境
原文链接 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_INCLUDE
和PYTHON_LIB
注释掉。
f.若要使用Python来编写layer,则取消下面的注释。
# WITH_PYTHON_LAYER := 1
g.修改INCLUDE_DIRS
和LIBRARY_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.h5
和cifar10_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图片进行分类。得到下面的结果
默认的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
输出结果: