ubuntu16-04安装GPU版本的caffe

记录一下GPU版本的caffe的安装过程, 路慢慢其修远兮, 吾将上下而求索。 参考链接如下: 大佬一 大佬二

安装opencv

安装需要的两个opencv文件在我的百度云中可以下载,百度云链接地址:链接:链接: https://pan.baidu.com/s/1o8ZK76E 密码: hswb

具体安装教程见百度云中Linux下OpenCV安装PPT所示,讲解的很详细。编译成功之后可以用例子测试一下,PPT中也有具体讲解。

如何测试?

Ubuntu16.04下安装opncv

  1. Create a directory DisplayImagefor test project:
1
cd DisplayImage
  1. Create DisplayImage.cpp and edit it:
1
vim DisplayImage.cpp

Then edit the DisplayImage.cpp:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <opencv2/opencv.hpp>
using namespace cv;
int main(int argc, char** argv){
if(argc!= 2){
printf("usage:DisplayImage.out <Image_Path>\n");
return -1;
}
Mat image;
image= imread(argv[1], 1);
if(!image.data)
{
printf("Noimage data\n");
return -1;
}
namedWindow("DisplayImage",CV_WINDOW_AUTOSIZE);
imshow("DisplayImage",image);
waitKey(0);
return 0;
}
  1. Create a CMake file:
1
vim CMakeLists.txt

Then edit the CMakeLists.txt:

1
2
3
4
5
cmake_minimum_required(VERSION 2.8)
project(DisplayImage)
find_package(OpenCV REQUIRED)
add_executable(DisplayImage DisplayImage.cpp)
target_link_libraries(DisplayImage ${OpenCV_LIBS})

  1. Generate the executable file:
1
2
cmake .
make

如果编译时cmake报错

1
//usr/lib/x86_64-linux-gnu/libstdc++.so.6: error adding symbols: DSO missing from command line
直接使用g++进行编译

1
gcc test.cpp -o test `pkg-config opencv --cflags --libs` -fopenmp -ansi -pedantic -Wall -Wextra -Werror -pipe -lrt -lm -O2 -lstdc++
  1. Execute it:
1
2
./DisplayImage lena.jpg
lena.jpg is the test image

安装显卡驱动

手动安装

(1)查询NVIDIA驱动型号:
首先去官网 http://www.nvidia.com/Download/index.aspx?lang=en-us 查看适合自己显卡的驱动并下载: 驱动文件后缀名应当是以.run结尾的(即现在选项第一个)。我们要把这个文件移动到家目录下,原因是下面我们要切换到文字界面下,如果放到~/下载下面,我们没有办法进入下载这个目录(没有中文输入法,且中文全部是乱码) 图1.输入显卡型号

图2.显卡驱动搜索结果

(2)禁止集成的nouveau驱动 Ubuntu系统集成的显卡驱动程序是nouveau,它是第三方为NVIDIA开发的开源驱动,我们需要先将其屏蔽才能安装NVIDIA官方驱动。 将驱动添加到黑名单blacklist.conf中,但是由于该文件的属性不允许修改。所以需要先修改文件属性。

查看属性

1
$sudo ls -lh /etc/modprobe.d/blacklist.conf
修改属性
1
$sudo chmod 666 /etc/modprobe.d/blacklist.conf
用vim/gedit编辑器打开
1
$sudo vim /etc/modprobe.d/blacklist.conf
在该文件后添加一下几行:
1
2
3
4
5
blacklist vga16fb
blacklist nouveau
blacklist rivafb
blacklist rivatv
blacklist nvidiafb
执行以下命令,重新加载内核:
1
sudo update-initramfs -u
重启后,执行:lsmod | grep nouveau。如果没有屏幕输出,说明禁用nouveau成功。

(3)接下来就是自己安装显卡驱动了:

1).卸载你电脑中此刻有的nvidia的驱动。(复制命令就行,方便,后面也一样)

1
2
3
4
sudo apt-get remove –purge nvidia*
或者针对不同的安装方式有不同的卸载方法
sudo chmod +x NVIDIA-Linux-*.run
sudo ./NVIDIA-Linux-*.run --uninstall
运行了这个命令之后,你系统中的NVIDIA的一些驱动就应该被卸载了。

2).添加一个PPA到系统,等一下安装驱动要用的。复制下面的话命令就行(放在这里是因为你现在还在图形界面,复制方便)

1
2
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt-get update
重启电脑

3).上面的准备工作做完,马上就要脱离图形界面进入字符界面了,要是这个时候你看不到教程,还是推荐用手机或者平板边看教程边操作。按CTRL+ATL+F1进入终端1(输入用户名和密码后和终端很相似,可以大胆进去), CTRL+ATL+F7是进入图形页面. 在终端下面运行:

1
sudo service lightdm stop(关闭图形界面)
查看适合自己的最新版NVIDIA显卡驱动
1
sudo apt-cache search nvidia*
对照搜索结果和之前下载的文件编号, 然后输入:
1
sudo apt-get install nvidia-390(你下载的驱动是什么版本这里就写什么)
然后就等待驱动安装好。。。。。 安装好之后,运行sudo service lightdm start来启动图形界面,并且登录。然后,你这个时候应该又回到图形界面了。 这时候你可以运行:nvidia-smi来看是不是能够输出你的GPU的一些信息。要是不能够输出的话,重启。能够输出的话,也建议重启一次

自动安装

选择系统自动更新即可
输入以下指令进行验证:

1
sudo nvidia-smi
## 安装过程可能遇到的问题 > 如果在安装过程中, 提示驱动与电脑的secure boot模式冲突, 驱动无法生效, 进入bios, 设置 secure boot 为 not enable, 否则即使安装成功了, 也无法正常使用驱动.

关于secure boot和UEIF以及BIOS的种种可以参考这个博客

检查是否安装成功

1
2
nvidia-smi #若列出GPU的信息列表,表示驱动安装成功
nvidia-settings #若弹出设置对话框,亦表示驱动安装成功

安装cuda8.0

  1. 首先在官网上(https://developer.nvidia.com/cuda-downloads) 下载CUDA(1G以上那个):

(2)下载完成后执行以下命令:

1
sudo chmod 777 cuda_8.0.44_linux.run(输入自己下载的cuda文件名,因为软件要进行更新优化,所以过一段时间名字就会略有不同)
特别注意: 下面安装时要注意:执行后会有一系列提示让你确认,但是注意,有个让你选择是否安装nvidia367驱动时,一定要选择否
1
Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 390.25
因为前面我们已经安装了更加新的nvidia390,所以这里不要选择安装。其余的都直接默认或者选择是即可。 安装:
1
sudo sh cuda_9.1.85_387.26_linux.run
(3)环境变量配置
打开~/.bashrc文件: sudo gedit ~/.bashrc
将以下内容写入到~/.bashrc尾部:
1
2
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
2
3
cd /usr/local/cuda-8.0/samples/1_Utilities/deviceQuery 
make
sudo ./deviceQuery
如果显示一些关于GPU的信息,则说明安装成功。

cuda版本安装错误, 如何卸载? 在目录:

1
/usr/local/cuda-7.0/bin
有CUDA自带的卸载工具uninstall_cuda_toolkit_7.0.pl,使用命令:
1
2
sudo ./uninstall_cuda_toolkit_7.0.pl

(5)配置cuDNN
首先,看看自己电脑的计算能力,如果自己电脑计算能力不超过3就不要进行这一步了,因为cuDNN仅能在计算能力为3以上的电脑上运行,强行装的话后面安装Caffe时会报错。查看自己电脑显卡的计算能力:https://developer.nvidia.com/cuda-gpus

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

1
2
3
sudo tar -zxvf ./cudnn-8.0-linux-x64-v5.1.tgz
# 把刚刚解压的那个cuda文件更名为cuda-9.0
mv cuda cuda-8.0
然后执行:
1
2
3
4
5
6
7
cd cuda-8.0
sudo cp lib64/lib* /usr/local/cuda/lib64/
sudo cp include/cudnn.h /usr/local/cuda/include/
# 建议进行如下操作
cuda-8.0
sudo cp lib64/lib* /usr/local/cuda-8.0/lib64/
sudo cp include/cudnn.h /usr/local/cuda-8.0/include/
更新软连接:
1
2
3
4
5
6
cd /usr/local/cuda-8.0/lib64/
sudo chmod +r libcudnn.so.5.1.10
sudo ln -sf libcudnn.so.5.1.10 libcudnn.so.5
sudo ln -sf libcudnn.so.5 libcudnn.so
sudo ldconfig
sudo ldconfig /usr/local/cuda-8.0/lib64/
请注意,请到自己解压后的lib64文件夹看这个文件libcudnn.so.5.0.5 ,电脑配置不同后面的数字型号不同,进行相应的修改,否则会报错。

安装caffe

目标安装caffe、pycaffe、matcaffe

(1) 安装依赖包

1
2
3
4
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

参看caffe官网

(2) 设置Makefile.config文件

1
2
sudo cp Makefile.config.example Makefile.config
sudo gedit Makefile.config #打开Makefile.config文件

修改如下:

1
2
3
USE_CUDNN := 1  #去掉#号
OPENCV_VERSION := 3
WITH_PYTHON_LAYER := 1 #使用python来编写层
重要的:
将 # Whatever else you find you need goes here. 下面的
1
2
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib
修改为:(主要路径间的空格)
1
2
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
matcaffe部分需要修改的是:
1
2
$ vim Makefile.config
MATLAB_DIR := /usr/local/MATLAB/R2016b
## (3) 修改Makefile文件

修改一:

1
2
3
4
5
6
$ vim Makefile  
- opencv_core opencv_highgui opencv_imgproc
+ opencv_core opencv_highgui opencv_imgproc opencv_imgcodecs
在位置((LIBRARIES += glog gflags protobuf leveldb snappy \
lmdb boost_system hdf5_hl hdf5 m \
opencv_core opencv_highgui opencv_imgproc opencv_imgcodecs))处添加 opencv_imgcodecs
修改二:
1
2
3
$ vim examples/cpp_classification/classification.cpp  
+ #include <opencv2/imgproc/types_c.h>
+ #include <opencv2/objdetect/objdetect_c.h>
matcaffe部分需要修改的:
1
2
3
4
5
6
vim Makefile
- NVCCFLAGS += -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)
+ NVCCFLAGS += -D_FORCE_INLINES -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)
# 这个操作是为了解决版本过低的问题
410 CXXFLAGS += -MMD -MP
在410行下面加上 CXXFLAGS += -std=c++11
引入一下路径:
1
2
3
4
5
sudo vim ~/.bashrc
export LD_LIBRARY_PATH="/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH"
export PATH=$PATH:/usr/local/MATLAB/R2016b/bin
source ~/.bashrc
sudo ldconfig

(4) 编译

查看物理cpu个数

1
grep 'physical id' /proc/cpuinfo | sort -u
查看核心数量
1
grep 'core id' /proc/cpuinfo | sort -u | wc -l
查看线程数
1
grep 'processor' /proc/cpuinfo | sort -u | wc -l
开始编译
1
2
3
4
5
6
7
8
cd caffe-master
mkdir build
cd build
cmake ..
cd ..
make all -j6
make test -j6
make runtest -j6

(5) 安装python接口

首先回到caffe的根目录,然后执行安装代码:

1
2
3
4
cd ~/caffe
sudo apt-get install gfortran
cd ./python
for req in $(cat requirements.txt); do sudo pip install $req; done
安装完成以后,再次回到caffe根目录我们可以执行:
1
2
cd ..
sudo pip install -r python/requirements.txt
编译python接口:
1
make pycaffe
配置环境变量,以便python调用:
1
sudo gedit ~/.bashrc
将以下内容添加到文件中
1
2
3
4
5
export PATH=/user/local/cuda-8.0/bin:$PATH
export LD_LIBRARY_PATH=/user/local/cuda/lib64:$LD_LIBRARY_PATH
# 以上两个也要有
export PYTHONPATH=/home/caffe/python:$PYTHONPATH
export PYTHONPATH=~/caffe/python
然后执行
1
source ~/.bashrc
> 重启

然后就能import caffe了

(6) 安装matcaffe接口

1
2
3
4
5
cd /usr/local/MATLAB/R2014a/sys/os/glnxa64/  
sudo mv libstdc++.so.6 libstdc++.so.6_back
sudo ldconfig
cd ~/caffe/
sudo make matcaffe -j5

如果执行了上面的命令,提示gcc版本过低的话,不用管它,看/home/weijian/caffe/matlab/+caffe/privat下面,有没有caffe_.mexa64这个文件,如果有的话,可以开始测试了。

测试

打开matlib如何使用matcaffe?
在Caffe根目录启动Matlab之后需要增加路径:

1
addpath ./matlab  
然后执行命令:
1
savepath  
以后就不用每次都输入addpath ./matlabl了
接着,执行:
1
2
3
gpu_id = 0
caffe.set_mode_gpu();
caffe.set_device(gpu_id);
没有报错,意味着编译成功了。

编译mattest

执行

1
sudo make mattest -j5
如果执行 sudo make mattest -j5出错
执行下面几个句子
1
2
export LD_LIBRARY_PATH=/usr/local/R2016b/sys/os/glnxa64  
export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libstdc++.so.6
再次执行,仍然出错的话,执行下面的句子,注意路径
1
2
export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu/:/usr/local/cuda-8.0/lib64  
export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libopencv_highgui.so.2.4:/usr/lib/x86_64-linux-gnu/libopencv_imgproc.so.2.4:/usr/lib/x86_64-linux-gnu/libopencv_core.so.2.4:/usr/lib/x86_64-linux-gnu/libstdc++.so.6:/usr/lib/x86_64-linux-gnu/libfreetype.so.6
参考这个http://blog.csdn.net/rt5rte54654/article/details/54742981

MNIST数据集测试

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

1
cd ~/caffe 
2.下载MNIST数据库并解压缩
1
./data/mnist/get_mnist.sh 
3.将其转换成Lmdb数据库格式
1
./examples/mnist/create_mnist.sh 
4.训练网络
1
./examples/mnist/train_lenet.sh 
训练的时候可以看到损失与精度数值,如下图: 可以看到最终训练精度是0.9906。

可能遇到的问题

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

场景1: 在命令行里进入python,输入“import caffe” 或者 直接使用caffe/build/tools/caffe 出现错误: ImportError: libcudart.so.8.0: cannot open shared object file: No such file or directory

使用这个命令:

1
sudo ldconfig /usr/local/cuda/lib64
> 场景2: 在jupyter中import caffe 报错如下:error while loading shared libraries: libcudart.so.8.0: cannot open shared object file: No such file or directory

解决办法:首先确认/etc/profile中的路径包含了cuda8.0的安装路径及相应的库文件

1
2
3
export PATH=$PATH:/usr/local/cuda-8.0/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-8.0/lib64
export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/cuda-8.0/lib64
然后
1
$source /etc/profile
使配置文件生效,再次执行。

然后在当前命令窗下启动jupyter

1
jupyter notebook --allow-root
若仍提示相同的错误,则执行以下命令,将相应的库文件复制到/usr/lib
1
2
3
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
ps. ldconfig命令是一个动态链接库管理命令,是为了让动态链接库为系统共享

如果仍然不行, 关掉此终端, 重新开启一个试一试.

.build_release/tools/caffe: error while loading shared libraries: libcudart.

解决方法:在/usr/lib/下建立一个 软链接将 libopenblas.so.0指向/openbls安装目录/lib/ libopenblas.so.0

ImportError: cannot import name cbook

问题描述:caffe环境编译成功,运行具体项目时,出现错误ImportError: cannot import name cbook。后来进入python环境发现,运行import caffe 和 import matplotlib 出现Import: No module named functools_lru_cache

找了好久才找到的解决方法,亲测有效:
卸载之前的matplotlib:

1
sudo pip uninstall matplotlib
使用该命令重新安装:
1
sudo apt-get install python-matplotlib
这样就解决了


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!