文章目录
  1. 1. 安装一些通用的依赖:
  2. 2. 安装cmake
  3. 3. 安装glog, gflags, lmdb:
  4. 4. 安装atlas
  5. 5. 安装NCCL
  6. 6. 安装Caffe
  7. 7. HDF5没有装好,在/usr/include中无法找到,如果能找到但报错:
  8. 8. 重装HDF5
  9. 9. 第二个找不到的依赖:
  10. 10. 安装leveldb
  11. 11. 修复yum没有hdf5, leveldb等package的问题
  12. 12. atlas有问题,MKL挺麻烦,换openblas
  13. 13. 最后执行:
  14. 14. 运行make runtest那步出现一些so文件找不到的问题,比如:
  15. 15. 又提示没有libhdf5_hl.so.10这个文件
  16. 16. 不临时的方法修改LIBRARY_PATH
  17. 17. 重新编译
  18. 18. make runtest
  19. 19. 验证caffe是否正确安装,以MNIST为例
  20. 20. 运行成功,最终结果部分如下:
  21. 21. CIFAR10 例子
  22. 22. 编译pycaffe
  23. 23. Matlab安装及Caffe编译。
  24. 24. 总结

本文假设已经安装好了CUDA 8.0,NVIDIA GPU驱动以及cuDNN且读者主机可以连接互联网。

CUDA 8.0的安装也可见《CentOS 7 卸载CUDA 9.1 安装CUDA8.0》

建议先通读本文再决定安装步骤,直接按照本文一步一步来并不是最佳实践,因为本文踩过一些坑。

安装一些通用的依赖:

1
sudo yum install protobuf-devel leveldb-devel snappy-devel opencv-devel boost-devel hdf5-devel

~~

~~

安装cmake

1
2
3
4
5
wget https://cmake.org/files/v3.6/cmake-3.6.0.tar.gz
cd cmake-3.6.0.tar.gz/
./bootstrap
gmake
gmake install

安装glog, gflags, lmdb:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# glog
wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/google-glog/glog-0.3.3.tar.gz
tar zxvf glog-0.3.3.tar.gz
cd glog-0.3.3
./configure
make && make install
# gflags
wget https://github.com/schuhschuh/gflags/archive/master.zip
unzip master.zip
cd gflags-master
mkdir build && cd build
export CXXFLAGS="-fPIC" && cmake .. && make VERBOSE=1
make && make install
# lmdb
git clone https://github.com/LMDB/lmdb.git
cd lmdb/libraries/liblmdb

wget https://github.com/LMDB/lmdb/archive/mdb.master.zip
unzip mdb.master.zip
cd lmdb-mdb.master/libraries/liblmdb

make && make install

安装atlas

1
yum install atlas-devel

安装NCCL

1
2
3
4
5
6
7
git clone https://github.com/NVIDIA/nccl.git
cd nccl

wget https://github.com/NVIDIA/nccl/archive/master.zip
unzip master.zip
cd nccl-master
make install -j4

安装Caffe

1
2
3
4
5
6
7
8
9
10
11
wget https://github.com/BVLC/caffe/archive/1.0.tar.gz
tar -zxvf 1.0.tar.gz
cd caffe-1.0
cp Makefile.config.example Makefile.config
vim Makefile.config:

1)取消对行 USE_CUDNN := 1 的注释。这可以启用 cuDNN 加速。
2)取消对行 USE_NCCL := 1 的注释。这可以启用在多个 GPU 上运行Caffe 所需的 NCCL。
3)取消BLAS_LIB的注释,写上BLAS的路径(比如atlas安装在/usr/lib64/atlas下,那就写BLAS_LIB := /usr/lib64/atlas)

make all -j4

HDF5没有装好,在/usr/include中无法找到,如果能找到但报错:

1
2
3
4
5
6
src/caffe/layers/hdf5_data_layer.cpp:13:18: fatal error: hdf5.h: No such file or                                                                 directory
#include "hdf5.h"
^
compilation terminated.
make: *** [.build_release/src/caffe/layers/hdf5_data_layer.o] Error 1
make: *** Waiting for unfinished jobs....

那就修改一下Makefile.config如下:

1
2
3
4
5
6
7
8
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib

--->

INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/include/
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/include/hdf5/lib/
(具体路径需要看系统)

重装HDF5

1
2
3
4
5
6
7
wget https://support.hdfgroup.org/ftp/HDF5/current18/src/hdf5-1.8.20.tar.gz
tar -zxvf hdf5-1.8.20.tar.gz
./configure --prefix=/usr/include/hdf5 #安装路径
make
make check # run test suite.
make install
make check-install # verify installation.

第二个找不到的依赖:

1
2
3
4
./include/caffe/util/db_leveldb.hpp:7:24: fatal error: leveldb/db.h: No such file or directory
#include "leveldb/db.h"
^
compilation terminated.

通过如下命令发现也没装上:

1
2
3
4
5
6
7
8
$ yum install leveldb-devel
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
* base: centos.ustc.edu.cn
* extras: mirror.bit.edu.cn
* updates: centos.ustc.edu.cn
No package leveldb-devel available.
Error: Nothing to do

安装leveldb

1
2
3
4
5
6
7
8
9
10
wget https://github.com/google/leveldb/archive/master.zip
unzip master.zip
cd leveldb-master
make
cp -r include/leveldb /usr/include

cp libleveldb.so.1.18 /usr/lib
cd /usr/lib
sudo ln -s libleveldb.so.1.18 libleveldb.so.1
sudo ln -s libleveldb.so.1 libleveldb.so
ldconfig # 将动态链接库加到缓存中,这样系统才能真正使用这个动态链接库。

网上的流程是上面这么说的,但是make完之后居然没有libleveldb.so.1.18这个东西。

修复yum没有hdf5, leveldb等package的问题

1
2
yum install epel-release
然后再安装leveldb-devel, hdf5-devel就可以了,简直神器

据说,leveldb 已经被 caffe 推荐不使用了,可以在 Makefile.config 中将 USE_LEVELDB := 0 注释掉,就不用安装了【1】

atlas有问题,MKL挺麻烦,换openblas

1
2
3
4
5
wget https://github.com/xianyi/OpenBLAS/archive/v0.2.20.tar.gz
tar -zxvf v0.2.20.tar.gz
cd OpenBLAS-0.2.20/
make
make PREFIX=/usr/local install

然后在Makefile.config中改为BLAS := open即可。

最后执行:

1
2
3
4
5
make all -j4  # 4线程同时编译,可调

检测编译是否成功:
make test
make runtest

运行make runtest那步出现一些so文件找不到的问题,比如:

1
2
.build_release/tools/caffe: error while loading shared libraries: libglog.so.0: cannot open shared object file: No such file or directory
make: *** [runtest] Error 127

以及libcudart找不到等。

对于cuda相关的so文件找不到的问题,我们首先看环境变量是否添加了
安装CUDA必要添加环境变量的三行,如果有的话试试source一下。

对于glog, gflags等依赖so文件缺失的问题,首先要检查环境变量,因为前面我们自己make编译安装的这些以来,好像默认为安装到/usr/local/lib中,如果这个路径不在环境变量中或者不在Makefild.config中,就有可能找不到so文件。奇怪的是,我的Makefild.config中有LIBRARY路径/usr/local/lib,却还是会报这些so文件找不到,很奇怪。那就在环境变量中添加吧。

又提示没有libhdf5_hl.so.10这个文件

直接yum再安装一下,发现还不行,原因是yum安装的是libhdf5_hl.so.10,这个so在我们之前源码安装的时候是装在/usr/include/hdf5/lib中的,所以加一条环境LIBRARY_PATH到这个地址是比较简便的方法了。

不临时的方法修改LIBRARY_PATH

为了不总在环境变量里面加路径,可以有另外一个方法

1
2
3
4
5
进入/etc/ld.so.conf.d
新建一个conf文件:/etc/ld.so.conf.d/glog.conf,里面写:/usr/local/lib
再新建一个conf文件:/etc/ld.so.conf.d/hdf5.conf,里面写:/usr/local/hdf5-1.8.3/lib
最后执行:
/sbin/ldconfig -v

重新编译

1
2
3
4
5
make clean
make all
make test #4分钟
make runtest #1分钟
make pycaffe #40秒

make runtest

最终,make runtest语句终于能走通了。

1
2
3
4
5
6
7
8
9
10
[----------] 2 tests from EuclideanLossLayerTest/3, where TypeParam = caffe::GPUDevice<double>
[ RUN ] EuclideanLossLayerTest/3.TestGradient
[ OK ] EuclideanLossLayerTest/3.TestGradient (23 ms)
[ RUN ] EuclideanLossLayerTest/3.TestForward
[ OK ] EuclideanLossLayerTest/3.TestForward (1 ms)
[----------] 2 tests from EuclideanLossLayerTest/3 (24 ms total)

[----------] Global test environment tear-down
[==========] 2101 tests from 277 test cases ran. (614680 ms total)
[ PASSED ] 2101 tests.

验证caffe是否正确安装,以MNIST为例

1
2
3
4
5
6
7
8
9
10
sudo sh data/mnist/get_mnist.sh
会下载如下数据到data/mnist/目录:

train-images-idx3-ubyte: 训练集样本 (9912422 bytes)
train-labels-idx1-ubyte: 训练集对应标注 (28881 bytes)
t10k-images-idx3-ubyte: 测试集图片 (1648877 bytes)
t10k-labels-idx1-ubyte: 测试集对应标注 (4542 bytes)

这些数据不能在caffe中直接使用,需要转换成LMDB数据:
sudo sh examples/mnist/create_mnist.sh

输出:

1
2
3
4
5
6
7
8
9
10
11
sh examples/mnist/create_mnist.sh
Creating lmdb...
I0316 00:08:16.962158 8318 db_lmdb.cpp:35] Opened lmdb examples/mnist/mnist_train_lmdb
I0316 00:08:16.963549 8318 convert_mnist_data.cpp:88] A total of 60000 items.
I0316 00:08:16.963567 8318 convert_mnist_data.cpp:89] Rows: 28 Cols: 28
I0316 00:08:20.275429 8318 convert_mnist_data.cpp:108] Processed 60000 files.
I0316 00:08:23.038358 8341 db_lmdb.cpp:35] Opened lmdb examples/mnist/mnist_test_lmdb
I0316 00:08:23.038920 8341 convert_mnist_data.cpp:88] A total of 10000 items.
I0316 00:08:23.038970 8341 convert_mnist_data.cpp:89] Rows: 28 Cols: 28
I0316 00:08:23.549976 8341 convert_mnist_data.cpp:108] Processed 10000 files.
Done.

【以下来自Caffe学习系列(9):运行caffe自带的两个简单例子
转换成功后,会在 examples/mnist/目录下,生成两个文件夹,分别是mnist_train_lmdbmnist_test_lmdb,里面存放的data.mdblock.mdb,就是我们需要的运行数据。

接下来是修改配置文件,如果你有GPU且已经完全安装好,这一步可以省略,如果没有,则需要修改solver配置文件。

需要的配置文件有两个,一个是lenet_solver.prototxt,另一个是train_lenet.prototxt

首先打开lenet_solver_prototxt

1
$ sudo vi examples/mnist/lenet_solver.prototxt

根据需要,在max_iter处设置最大迭代次数,以及决定最后一行solver_mode,是否要改成CPU。

保存退出后,就可以运行这个例子了:

1
$ sudo time sh examples/mnist/train_lenet.sh

CPU运行时候大约13分钟,GPU运行时间大约4分钟,GPU+cudnn运行时候大约40秒,精度都为99%左右

【以上就是Caffe学习系列(9):运行caffe自带的两个简单例子

运行成功,最终结果部分如下:

1
2
3
4
5
6
7
8
9
.....
I0316 00:10:01.473722 8369 solver.cpp:397] Test net output #0: accuracy = 0.9906
I0316 00:10:01.473759 8369 solver.cpp:397] Test net output #1: loss = 0.029267 (* 1 = 0.029267 loss)
I0316 00:10:01.473793 8369 solver.cpp:315] Optimization Done.
I0316 00:10:01.473810 8369 caffe.cpp:259] Optimization Done.

real 0m43.368s
user 0m34.830s
sys 0m8.584s

花费40s左右。精度99.06%,其实不高。

CIFAR10 例子

1
2
3
sh data/cifar10/get_cifar10.sh
sh examples/cifar10/create_cifar10.sh
time sh examples/cifar10/train_quick.sh

到此,Caffe的安装告完结。

编译pycaffe

编译python的caffe接口需要安装boost依赖:

1
2
3
4
5
6
7
8
yum install boost-devel
或者

wget http://dl.bintray.com/boostorg/release/1.65.0/source/boost_1_65_0.tar.gz
tar -zxvf boost_1_65_0.tar.gz
cd boost_1_65_0/
./bootstrap.sh
./b2 cxxflags="-I /home/hadoop/anaconda3/include/python3.6m/" # python3如此编译

sudo ./b2 install --prefix=/usr cxxflags="-I /home/hadoop/anaconda3/include/python3.6m/" # python3如此安装

因为我们想在python中直接import caffe,在环境变量中加上:

1
export PYTHONPATH=$PYTHONPATH:/home/hadoop/caffe-1.0/python

后来发现编译pycaffe还需要安装protobuf依赖,原来anaconda装的不行。

安装protobuf,下载地址

1
2
3
4
5
6
7
8
9
10
11
12
13
tar -zxvf protobuf-cpp-3.2.0.tar.gz
cd protobuf-3.2.0
./configure
make
make check
make install
ldconfig

tar -zxvf protobuf-python-3.2.0.tar.gz
cd python
python setup.py build
python setup.py test
python setup.py install

Matlab安装及Caffe编译。

安装默认读者具有三个文件:

1
2
3
R2017a_glnxa64_dvd1.iso
R2017a_glnxa64_dvd2.iso
Matlab+2017a+Linux64+Crack目录,由rar解压而来

安装步骤:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mkdir -p /data/matlab/install       # 新建目录以供挂载
sudo mount -o loop R2017a_glnxa64_dvd1.iso /data/matlab/install # 挂载DVD1
/data/matlab/install/install -destinationFolder /data/matlab/Matlab2017a/ -fileInstallationKey 09806-07443-53955-64350-21751-41297 -agreeToLicense yes -outputFile /data/matlab/Matlab2017a/matworks.log -mode silent -activationPropertiesFile /home/hadoop/Matlab+2017a+Linux64+Crack/license_standalone.lic # 正式安装
DVD1安装完成后会一直提示 eject dvd1 and insert dvd2 to continue

开另一个Shell:
sudo umount -l /data/matlab/install # 取消之前的挂载
sudo mount -o loop R2017a_glnxa64_dvd2.iso /data/matlab/install # 挂载DVD2
第一台shell会自动开始安装
等待安装完成
sudo cp Matlab+2017a+Linux64+Crack/R2017a/bin/glnxa64/* /data/matlab/Matlab2017a/bin/glnxa64/ # 拷贝
sudo cp Matlab+2017a+Linux64+Crack/license_standalone.lic /data/matlab/Matlab2017a/licenses/ # 拷贝
sudo umount -l /data/matlab/install # 解挂
cd /data/matlab/Matlab2017a/bin
./matlab # 运行

然后编译Matcaffe:

1
2
3
4
# make matcaffe -j16
MEX matlab/+caffe/private/caffe_.cpp
Building with 'g++'.
MEX completed successfully.

总结

所以总结一下,能够联网的CentOS服务器上安装Caffe的步骤如下(root用户):

  • yum install epel-release
  • yum install protobuf-devel leveldb-devel snappy-devel opencv-devel boost-devel hdf5-devel
  • yum install gflags-devel glog-devel lmdb-devel
  • NCCL安装
  • OpenBLAS安装
  • Caffe安装
  • 进入/etc/ld.so.conf.d新建nccl.conf,填写/usr/local/lib,然后ldconfig -v
  • make test, make runtest测试Caffe安装是否成功

涉及的命令本文以上部分都有。

感谢网上众多资料的作者提供经验,特列出参考文献如下聊表感激:

等等。