ubuntu16.04+caffe+cuda8.0+cudnn+opencv3+python3安装教程

这篇博客记录了一位技术新手在Ubuntu16.04上安装Caffe、CUDA8.0、CUDNN和OpenCV3及Python3的详细过程,包括安装依赖、NVIDIA驱动、CUDA配置、CUDNN安装、OpenCV编译和Python环境配置等步骤,以及遇到的问题和解决方法。

本人是技术小白,刚开始接触caffe。第一次写博客,目的就是为了把自己的笔记存档,方便以后查阅。所以如果有写的不好或者不对的地方,还望各位大佬多多指教。
caffe的安装是在ubuntu16.04下安装的,关于ubuntu系统的安装这里不再陈述,网上有大量的教程可供参考。这篇文章主要讲一下自己在安装配置caffe的过程中遇到的各种问题和各种坑。。。
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

2.安装NVIDIA驱动
(1)查询NVIDIA驱动
首先去官网(http://www.nvidia.com/Download/index.aspx?lang=en-us)查看适合自己显卡的驱动,下面是适合我的显卡的驱动:
这里写图片描述
这里写图片描述
(2)安装驱动
安装之前先卸载已经存在的驱动版本:
这里有两种方法:
(1)利用“软件和更新”来安装,依次选择 系统设置->软件和更新->附加驱动->选择最新的驱动->应用更改
安装时可能遇到的问题:点击完应用更改一段时间后并没有成功安装,再次点击却出现闪退的现象,后来发现是因为依赖的问题,通过在终端输入以下命令:$sudo apt-get install -f $sudo apt-get update后 再次安装问题就解决了。
备注:之前都是用这种方法,可是后来重装系统后再次安装闪退,使用这个方法也解决不了,就用的命令行安装的
(2)命令行安装:

sudo add-apt-repository ppa:xorg-edgers/ppa
sudo apt-get update
sudo apt-get install nvidia-375 #注意在这里指定自己的驱动版本!

安装完成之后输入以下指令进行验证:
$sudo nvidia-smi 或者$sudo nvidia-settings
若列出了GPU的信息列表则表示驱动安装成功。
3.cuda 安装
这里我需要说一下,cuda7.5和cuda8.0我都安装过,开始安装cuda7.5的过程中,后来make时出现nvcc错误,查阅发现ubuntu16.04适合安装cuda8.0,果断转8.0
cuda都是在官网下载的,这里不再赘述

在终端cd到所下载的安装包所在的目录,进行MD5检验,确保安装包正常:
$sudo md5sum cuda.run
检验正确后,输入如下代码安装(第一行修改文件权限,第二行执行文件安装):

$ chmod 777 cuda.run
$ sudo ./cuda.run --override

注意后面的override是必须的,这样才能保证安装的过程中,不会出现编译器不支持的错误。另外,在选择条件的过程中,一定不要再次安装nvidia驱动,虽然cuda.run文件本身是包含又nvidia驱动的,但是本处直接安装会出错。下图是安装.run文件的配置:
这里写图片描述
这里可能会出现miss library的情况,解决方案参考http://stackoverflow.com/questions/22360771/missing-recommended-library-libglu-so
4.cudnn安装
下载地址:https://developer.nvidia.com/cudnn
cudnn-7.0-linux-x64-v4.0-prod.tgz
进入下载目录解压:
$ tar zxvf cudnn-7.0-linux-x64-v4.0-prod.tgz
cd进入cudnn解压之后的include目录,在命令行进行如下操作:
$ sudo cp cudnn.h /usr/local/cuda/include/ #复制头文件
再将lib64目录下的动态文件进行复制和链接:

$ sudo cp lib* /usr/local/cuda/lib64/ #复制动态链接库
$ cd /usr/local/cuda/lib64/                  
$ sudo ls -al | grep libcudnn#查看已有链接

结果如下:
这里写图片描述

$ sudo rm -rf libcudnn.so libcudnn.so.4    #删除原有动态文件
$ ls -al | grep libcudnn    #再次查看已有链接

这里写图片描述

建立新的链接
$ sudo ln -s libcudnn.so.4.0.7 libcudnn.so.4
$ sudo ln -s libcudnn.so.4 libcudnn.so
再次查看
$ ls -al | grep libcudnn

这里写图片描述
已链接好!
然后设置环境变量和动态链接库:

$ sudo gedit /etc/profile

然后再打开的文件末尾加上(“=”前后不要有空格)

export PATH=/usr/local/cuda-8.0/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64:$LD_LIBRARY_PATH

保存之后创建链接文件:

$ sudo vim /etc/ld.so.conf.d/cuda.conf

这时出现vim找不到命令,就使用$sudo rpm检查一下vim是否安装,提示rpm找不到命令,证明rpm没有安装,根据$sudo apt install rpm 安装,再执行sudo rpm -qa|grep vim 什么结果也没返回。在命令行输入命令sudo apt install vim 再执行sudo vim /etc/ld.so.conf.d/cuda.conf 现在就可以打开了。
按下字母i在文件中编辑加入以下内容:

/usr/local/cuda-8.0/lib64

按下esc,输入:wq保存后退出。并在终端输入以下命令使该链接生效:$ sudo ldconfig 出现下列情况:
这里写图片描述

解决方法:
$ sudo mv /usr/lib/nvidia-375/libEGL.so.1 /usr/lib/nvidia-375/libEGL.so.1.org
$ sudo mv /usr/lib32/nvidia-375/libEGL.so.1 /usr/lib32/nvidia-375/libEGL.so.1.org
$ sudo ln -s /usr/lib/nvidia-375/libEGL.so.375.39 /usr/lib/nvidia-375/libEGL.so.1
$ sudo ln -s /usr/lib32/nvidia-375/libEGL.so.375.39 /usr/lib32/nvidia-375/libEGL.so.1

使用sample里面的例子来测试还需要编译。因为当前的cuda还不支持gcc5.0以上的版本,在编译之前,我们需要修改配置文件,否则无法编译成功。(之前试过降低gcc版本,搞了很久没成功,这样改会有warning,但是还是先这样吧。)

$ cd /usr/local/cuda-8.0/include/
$ sudo cp host_config.h host_config.h.bak  #备份编译头文件
$ sudo gedit host_config.h

117行如下:

#if __GNUC__ > 5 

查看自己的gcc版本:
$ gcc –version
是5.4的版本。所以将117行修改为:

#if __GNUC__ > 5 || (__GNUC__ == 5 && __GNUC_MINOR__ > 9)

保存后退出。然后进入用例文件进行编译(注意执行第二步命令时候需要较长时间是正常现象):

$ cd /usr/local/cuda-8.0/NVIDIA_CUDA-8.0_Samples/
$ sudo make all

可能报错:
这里写图片描述

$sudo apt-get install freeglut3 freeglut3-dev

http://blog.sina.com.cn/s/blog_9579544301014mt5.html (参考)
这里写图片描述
因为在usr/lib下有这个库文件,所以执行

$sudo ln -s libnvcuvid.so.1 libnvcuvid.so

参考http://blog.csdn.net/jiqiujia/article/details/19406609
执行了之后还是报错,又goole之后,执行$sudo sed -i "s/nvidia-367/nvidia-375/g" $grep "nvidia-367" -r ./ -l,重新make
编译成功。

$cd bin/x86_64/linux/release/
$sudo ./deviceQuery

这里写图片描述
说明显卡驱动和cuda安装成功。
5.opencv安装
官网下载之后解压:

$ unzip opencv-3.2.0.zip 
$ cd opencv
$ mkdir build
$ cd build

安装一些依赖项:

$ sudo apt-get update
$ sudo apt-get install build-essential
$ sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
$ sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
$ sudo cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..

生成的文件在bulid中,而生成的CMakeList.txt文件在上一级文件中;

$cd ../
$vim CMakeLists.txt

在弹出的文件开头加入一行(注意里面的引号要英文状态下的):
set(CMAKE_CXX_FLAGS “${CMAKE_CXX_FLAGS} -D_FORCE_INLINES”)
然后按esc和:wq保存退出。

编译安装:

$ cd build/
$ sudo cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
$ sudo make all -j2

此步出现的问题:

/home/july/software/opencv-3.2.0/build/opencv_lapack.h:2:45:fatalerror:LAPACKE_H_PATH-NOTFOUND/lapacke.h: 没有那个文件或目录

解决方法:

sudo apt-get install liblapacke-dev checkinstall
$ sudo cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
$ sudo make all -j2

以上只是将opencv编译成功,还没将opencv安装,需要运行下面指令进行安装:

$ sudo make install

6.python安装与配置
第一是直接安装anaconda,去官网下载 ,选择linux 64bit 2.7版本下载安装,anaconda安装方便但是需要在最后的make配置文件中更改python包含路径。
第二种方法就是使用原生的python2.7版本,终端下

$sudo apt-get install python-pip  安装pip

这里我们用pip安装一些python需要的依赖包,不过为了避免各种问题,也可以通过apt-get安装,反正我这两种方式都安装了一遍(-.-)
第一种:
选择的是anaconda linux64 2.7版本python2.7 。下载完成之后,最好也要进行md5sum的检验。

完成之后,cd进入下载文件所在的目录,在命令行输入:

bash Anaconda2-4.3.1-Linux-x86_64.sh

yes
(ENTER)
yes
这一选项把PATH=/home/mwp/anaconda2/bin加到了环境变量中。
添加库:

sudo gedit ~/.bashrc

添加

export LD_LIBRARY_PATH=/home/mwp/anaconda2/lib:$LD_LIBRARY_PATH

重启电脑之后,在命令行输入:
ipython
就可以看到Python的版本。

第二种:
使用原生的python2.7版本,终端下
sudo apt-get install python-pip #安装pip
这里我们用pip安装一些python需要的依赖包,不过为了避免各种问题,也可以通过apt-get安装,反正我这两种方式都安装了一遍(-.-)

$sudo apt-get install python-numpy python-scipy python-matplotlib ipython ipython-notebook python-pandas python-sympy python-nose

以caffe默认解压到/home/mwp/ ,文件夹名caffe为例

$ cd /home/mwp/caffe/python
$ sudo su
$ for req in $(cat requirements.txt); do pip install $req; done

这里用pip安装可能速度很慢,很可能下载好几个小时,推荐用清华大学的pip源临时安装,所以命令改为如下:

$ for req in $(cat requirements.txt); do pip install -i https://pypi.tuna.tsinghua.edu.cn/simple $req; done

这里如果第一次有很多红字错误,建议再运行几遍指导安装成功,对于黄字提示无需理会,可能是pip版本需要更新。

安装了python还不行,还得安装一下ipython,后者更加方便快捷,更有自动补全功能。而ipython notebook是ipython的最好展现方式。最新的版本改名为jupyter notebook,我们先来安装一下。(如果安装了anaconda, jupyter notebook就已经自动装好,不需要再安装)

$sudo pip install jupyter(这里我已安装好,所有没有再次安装)

备注:
如果安装的是python3版本的anaconda,打开notebook时可能会出现类似”/lib/libstdc++.so.6: version `GLIBCXX_3.4.21’ not found”的问题,命令行查找发现:

$ strings /home/mwp/anaconda3/lib/libstdc++.so.6 | grep GLIBCXX  
显示如下:
GLIBCXX_3.4
......
GLIBCXX_3.4.19//未找到GLIBCXX_3.4.21

原因是anaconda3中自带的libgcc版本是libgcc 4.8.5-2,然而caffe中编译python需要更高的版本libgcc5.2.0。
解决办法:

$ conda install libgcc
$ strings /home/mwp/anaconda3/lib/libstdc++.so.6 | grep GLIBCXX  
就会显示如下:
GLIBCXX_DEBUG_MESSAGE_LENGTH
GLIBCXX_3.4
......
GLIBCXX_3.4.19
GLIBCXX_3.4.20
GLIBCXX_3.4.21

这时就可以运行notebook

$ jupyter notebook

就会在浏览器中打开notebook, 点击右上角的New-python2, 就可以新建一个网页一样的文件,扩展名为ipynb。在这个网页上,我们就可以像在命令行下面一样运行python代码了。输入代码后,按shift+enter运行,更多的快捷键,可点击上方的help-Keyboard shortcuts查看,或者先按esc退出编辑状态,再按h键查看。

安装python3的其实和上面基本是一致的,只不过是把对应的版本号换掉即可,但是,在caffe的配置中真真差了很多事啊。因为我后来重新配置的python3的环境,心累。。。。。
7.caffe安装与配置
下载caffe:

$ cd ~
$ git clone https://github.com/BVLC/caffe.git    //从github上git caffe

安装配置caffe:

$ cd caffe
$ cp Makefile.config.example Makefile.config
$ sudo gedit Makefile.config

配置文件修改(看英文提示根据具体修改):

OPENCV_VERSION := 3 #取消注释符号#,应用opencv3  
注释第66行自带的python 
ANACONDA_HOME := /home/mwp/anaconda2 #将具体anaconda2路径写入
PYTHON_INCLUDE := $(ANACONDA_HOME)/include \
          $(ANACONDA_HOME)/include/python2.7 \
          $(ANACONDA_HOME)/lib/python2.7/site-packages/numpy/core/include \
PYTHON_INCLUDE之前的注释#去掉,以及之后两行前的#也去掉
PYTHON_LIB := $(ANACONDA_HOME)/lib

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

如果安装的是Anaconda3,则按照下面的方式:

OPENCV_VERSION := 3 #取消注释符号#,应用opencv3  
注释第66行自带的python 
ANACONDA_HOME := /home/mwp/anaconda3 #将具体anaconda2路径写入

PYTHON_LIBRARIES := boost_python3 python3.5m 之前的注释去掉
PYTHON_INCLUDE := $(ANACONDA_HOME)/include \
          $(ANACONDA_HOME)/include/python3.5m \
          $(ANACONDA_HOME)/lib/python3.5/site-packages/numpy/core/include \
PYTHON_INCLUDE 之前的注释#去掉,以及之后两行前的#也去掉
PYTHON_LIB := $(ANACONDA_HOME)/lib
WITH_PYTHON_LAYER := 1之前的注释#去掉

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

为hdf5之类的文件创建新的链接
\首先执行下面两句话:

$ cd /usr/lib/x86_64-linux-gnu/
$ sudo find . -type f -exec sed -i -e 's^"hdf5/serial/hdf5.h"^"hdf5/serial/hdf5.h"^g' -e 's^"hdf5/serial/hdf5_hl.h"^"hdf5/serial/hdf5_hl.h"^g' '{}' \;

执行

ls -al | grep libhdf

然后根据情况执行下面两句:

$ sudo ln -s libhdf5_serial.so.10.1.0 libhdf5_.so 
$ sudo ln -s libhdf5_serial_hl.so.10.0.2 libhdf5_hl.so 

注意:这里的10.1.0和10.0.2根据不同的系统可能对应的数字会不同,比如在ubuntu16.04中其数字就是10.1.0.
具体的数字可以在输入命令时候使用tab键补全查看 .

打开makefile文件搜索并替换

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

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

在命令行输入:

$ source ~/.bashrc #编译立即生效 
$ sudo gedit ~/.bashrc

在打开的文件末尾加上:

export LD_LIBRARY_PATH=/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH

在命令行输入:

$ sudo ldconfig #编译立即生效

然后进入caffe目录:

$sudo make all -j2编译成功。 
$sudo make test -j2
$sudo make runtest

如果编译的是Anaconda3版本的,则可能出错:

CXX .build_release/src/caffe/proto/caffe.pb.cc
PROTOC (python) src/caffe/proto/caffe.proto
LD -o .build_release/lib/libcaffe.so.1.0.0-rc3
CXX/LD -o python/caffe/_caffe.so python/caffe/_caffe.cpp
/usr/bin/ld: cannot find -lboost_python3
collect2: error: ld returned 1 exit status
make: *** [python/caffe/_caffe.so] 错误 1

因为在配置文件的第 74 行中有 PYTHON_LIBRARIES := boost_python3 ,但是在系统中无法找到 boost_python3.lib 这个库文件。

解决方案如下:

检查是否有如下文件:

ls /usr/lib/x86_64-linux-gnu/libboost_python-py35.so

如果有,说明我们的系统中已经有了这种库文件,只是文件名不同。

cd /usr/lib/x86_64-linux-gnu/
sudo ln -s libboost_python-py34.so libboost_python3.so

重新编译即可通过。
编译成功,界面显示如下:
这里写图片描述
在运用anaconda和matlab时都需要修改相应的内容。
anaconda需要将caffe头文件进行链接:

$ sudo gedit ~/.bashrc

输入

export PYTHONPATH=/home/mwp/caffe/python:$PYTHONPATH

保存后在命令行输入:

$sudo ldconfig
$sudo make pycaffe

这里写图片描述
python也配置成功;

$sudo make distribute
$ipython
 import caffe

报错如下:
这里写图片描述
命令操作如下:
A.把环境变量路径放到 ~/.bashrc文件中

$ sudo echo export PYTHONPATH="~/caffe/python" >> ~/.bashrc

B.使环境变量生效

$ source ~/.bashrc

继续报错:
这里写图片描述
执行命令:$ pip install opencv-python
这里写图片描述
执行conda install libgcc,报错:
这里写图片描述
我装的是anaconda2, 解决方法是在其中安装protobuf最新版本

$sudo chmod 777 -R anaconda2
$conda install protobuf

这里写图片描述
这里写图片描述
这里写图片描述
编译成功,即可调用caffe模块。

至此,caffe的安装结束,在整个过程中,重装系统n多次,都快郁闷死了,就是不断的查询不断的改,不断的make,成功的那一刻确实是很开心的。

——————————————————————————————————
更新:
后来在服务器上配置caffe,进入ipython,输入import caffe,报错:

 QXcbConnection: Could not connect to display 
Aborted (core dumped)

查询之后,采取以下解决方法:

In [1]: import os

In [2]: os.environ['QT_QPA_PLATFORM']='offscreen'

In [3]: import caffe

就可以了。
但是进入python,直接import caffe,并没有出错,所以这里出错的原因也不知道是为什么。既然在ipython界面import报错,就直接在python下import好了。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值