Ubuntu16.04 caffe配置 GPU

Ubuntu16.04 安装配置Caffe GPU+cuda+Cudnn

caffe第二次安装配置,以前仅配置的是CPU所以不用安装cuda+cudnn,现在配置GPU版本的,踩的坑比较多,同时由于被其他事打扰,所以无法专心配置,现在特地写一博客,解决配置过程以及踩过的坑如何解决!!!!

caffe配置: Ubuntu16.04+GPU+cuda8.0+cudnn5.1
安装过程

安装相关依赖项

sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler
sudo apt-get install --no-install-recommends libboost-all-dev
sudo apt-get install libopenblas-dev liblapack-dev libatlas-base-dev
sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev

安装NVIDA驱动

注意ubuntu16.04可以利用软件驱动更新装载显卡驱动不需要以下的操作,可以直接在终端输入: sudo nvidia-smi,若列出了如下GPU的信息列表则表示驱动安装成功,不用进行下面的配置操作。

(1)查询NVIDIA驱动
  首先去官网 http://www.nvidia.com/Download/index.aspx?lang=en-us 查看适合自己的显卡驱动并下载:驱动文档后缀名应当是以.run结尾的。


输入显卡型号

显卡驱动搜索结果

(2)安装驱动
在终端下输入:sudo gedit /etc/modprobe.d/blacklist.conf
输入密码后在最后一行加上blacklist nouveau,这是将Ubuntu自带的显卡驱动加入黑名单。
在终端输入:sudo update-initramfs -u
重启电脑~
这里要尤其注意,安装显卡驱动要先切换到文字接口,(按Ctrl+Alt+F1~F6).所以,启动电脑后,先进入文字接口。
然后,输入命令sudo service lightdm stop
现在可以安装驱动了,先进入家目录cd ~,然后:sudo ./NVIDIA-Linux-x86_64-375.20.run,按照提示一步步来~。
完成后,再次重启电脑。
安装完成之后输入以操作进行验证:sudo nvidia-smi,若列出了GPU的信息列表则表示驱动安装成功。如下图:

安装CUDA

CUDA是NVIDIA的编程语言平台,想使用GPU就必须要使用cuda。
(1)下载CUDA
首先在官网上https://developer.nvidia.com/cuda-downloads下载CUDA:


(2)下载后完成执行一下命令:
1 sudo chmod 777 cuda_8.0.61_375.26_linux.run  
2 sudo ./cuda_8.0.61_375.26_linux.run  

注意 cuda_8.0.44_linux.run 需对应自己下载的版本
执行后会有一系列提示让你确认,但是注意,有个让你选择是否安装nvidia367驱动时,一定要选择否:
Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 367.48?
因为前面我们已经安装了更加新的nvidia367,所以这里不要选择安装。其余的都直接默认或者选择是即可。

(3)环境变量配置
打开~/.bashrc文档:sudo gedit ~/.bashrc
将以下内容写入~/.bashrc尾部:

export PATH=/usr/local/cuda-8.0/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda8.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

(4)测试CUDA的samples

1 cd /usr/local/cuda-8.0/samples/1_Utilities/deviceQuery  
2 make  
3 sudo ./deviceQuery

如果显示一些关于GPU的信息,则说明安装成功。

配置cuDNN

cuDNN是GPU加速计算深层神经网络的库。
首先去官网https://developer.nvidia.com/rdp/cudnn-download下载cuDNN,需要注册一个账号才能下载。下载版本号如下图:


下载cuDNN5.1之后进行解压:(对应自己下载的版本)
sudo tar -zxvf ./cudnn-8.0-linux-x64-v5.1.tgz
进入cuDNN5.1解压之后的include目录,在命令行进行如下操作:
cd cuda /include
sudo cp cudnn.h /usr/local/cuda/include  #复制头文档

再将进入lib64目录下的动态文档进行复制和链接:

cd ..
cd lib64
sudo cp lib* /usr/local/cuda/lib64/    #复制动态链接库
cd /usr/local/cuda/lib64/
sudo rm -rf libcudnn.so libcudnn.so.5    #删除原有动态文档
sudo ln -s libcudnn.so.5.0.5 libcudnn.so.5  #生成软衔接
sudo ln -s libcudnn.so.5 libcudnn.so      #生成软链接

画重点
此处sudo ln -s libcudnn.so.5.0.5 libcudnn.so.5中的libcudnn.so.5.0.5文档需要与你电脑中/usr/local/cuda/lib64/文档夹中的对应,如果不对应就会在编译caffe时make all 报如下错误:(原因是cudnn链接没有弄好)


错误如:
LD -O .build_release/lib/libcaffe.so.1.0.0
/usr/bin/ld:找不到 -lcudnn
collect2: error: ld returned 1 exit status
Makefile:573:recipe for target '.build_release/lib/libcaffe.so.1.0.0' failed
Make: *** [.build_release/lib/libcaffe.so.1.0.0] Error1

例如本人/usr/local/cuda/lib64/文档夹对应的文档为:

所以sudo ln -s libcudnn.so.5.0.5 libcudnn.so.5需要改为sudo ln -s libcudnn.so.5.0.10 libcudnn.so.5,否则会报错,谷歌百度,上都没有答案,仅此一家!

安装opencv 3.1

从官网http://opencv.org/downloads.html下载Opencv,并将其解压到你要安装的位置,假设解压到了/home/opencv

1 unzip opencv-3.1.0.zip
2 sudo cp ./opencv-3.1.0 /home
3 sudo mv opencv-3.1.0 opencv

安装前准备,创建编译文档夹:

cd ~/opencv
mkdir build
cd build

配置:

1 sudo apt install cmake
2 sudo cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..

编译:

sudo make -j8 

-j8表示并行计算,根据自己电脑的配置进行设置,配置比较低的电脑可以将数字改小或不使用,直接输make。

可能出现问题:


这是因为opecv3.0与cuda8.0不兼容导致的。解决办法:修改 ~/opencv/modules/cudalegacy/src/graphcuts.cpp文档内容,如图:

其中,#if !defined (HAVE_CUDA) || defined (CUDA_DISABLER)||(CUDART_VERSION>=8000)是我们修改的。
以上只是将opencv编译成功,还没将opencv安装,需要运行下面命令进行安装:

sudo make install

配置caffe

(1) 使用Git直接下载Caffe非常简单,或者去https://github.com/BVLC/caffe下载。由于我习惯去github上找代码,所以就直接去下载的源码。下载完成后,会在家目录下的下载里找到caffe-master.zip,用unzip命令解压到家目录下,然后重命名为caffe.
(2) 因为make命令只能make Makefile.config文档,而Makefile.config.example是caffe给出的makefile例子,因此,首先将Makefile.config.example的内容复制到Makefile.config:

sudo cp Makefile.config.example Makefile.config

(3) 打开并修改配置文档:
sudo gedit Makefile.config #打开Makefile.config文档 根据个人情况修改文档:
a.若使用cudnn,则将#USE_CUDNN := 1修改成:USE_CUDNN := 1;
b.若使用的opencv版本是3的,则将#OPENCV_VERSION := 3修改为:OPENCV_VERSION :=3;
c.若要使用python来编写layer,则将#WITH_PYTHON_LAYER := 1 修改为 WITH_PYTHON_LAYER := 1;
d.重要的一项 :
将 # Whatever else you find you need goes here. 下面的

1 INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include
2 LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib 

修改为:

1 INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial
2 LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu/hdf5/serial       

这是因为ubuntu16.04的文档包含位置发生了变化,尤其是需要用到的hdf5的位置,所以需要更改这一路径。
(4)修改makefile文档
打开makefile文档,做如下修改:
将:

NVCCFLAGS +=-ccbin=$(CXX) -Xcompiler-fPIC $(COMMON_FLAGS)  

替换为:

NVCCFLAGS += -D_FORCE_INLINES -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)

(5) 编辑/usr/local/cuda/include/host_config.h 将其中的第115行(或119行)注释掉:

#error-- unsupported GNU version! gcc versions later than 4.9 are not supported!
改为
//#error-- unsupported GNU version! gcc versions later than 4.9 are not supported!

(6) 编译
make all -j8 #-j根据自己电脑配置决定 编译过程中可能会出现如下错误:
错误内容1:”fatal error: hdf5.h: 没有那个文档或目录”
解决办法:
step1: 在Makefile.config文档的第85行,添加/usr/include/hdf5/serial/ 到 INCLUDE_DIRS,也就是把下面第一行代码改为第二行代码。
将:

INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include

替换为:

INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial/

stept2: 在Makefile文档的第173行,把 hdf5_hl 和hdf5修改为hdf5_serial_hl 和 hdf5_serial,也就是把下面第一行代码改为第二行代码。
将:

LIBRARIES += glog gflags protobuf boost_system boost_filesystem m hdf5_hl hdf5

改为:

LIBRARIES += glog gflags protobuf boost_system boost_filesystem m hdf5_serial_hl hdf5_serial  

错误内容2:
“libcudnn.so.5 cannot open shared object file: No such file or directory”
解决办法是将一些文档复制到/usr/local/lib文档夹下:
注意自己CUDA的版本号!

1 sudo cp /usr/local/cuda-8.0/lib64/libcudart.so.8.0 /usr/local/lib/libcudart.so.8.0 && sudo ldconfig
2 sudo cp /usr/local/cuda-8.0/lib64/libcublas.so.8.0 /usr/local/lib/libcublas.so.8.0 && sudo ldconfig
3 sudo cp /usr/local/cuda-8.0/lib64/libcurand.so.8.0 /usr/local/lib/libcurand.so.8.0 && sudo ldconfig
4 sudo cp /usr/local/cuda-8.0/lib64/libcudnn.so.5 /usr/local/lib/libcudnn.so.5 && sudo ldconfig

(8)测试

make test
make runtest

如果运行之后出现下图,说明caffe配置成功。


到此caffe配置完毕!

MNIST数据集测试

配置caffe完成后,我们可以利用MNIST数据集对caffe进行测试,过程如下:
1.将终端定位到Caffe根目录
cd ~/caffe

2.下载MNIST数据库并解压缩
./data/mnist/get_mnist.sh

3.将其转换成Lmdb数据库格式
./examples/mnist/create_mnist.sh

4.训练网络
./examples/mnist/train_lenet.sh
训练的时候可以看到损失与精度数值,如下图:

到此OK,大家加油~