您的位置:首页 > 编程语言 > Python开发

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

2017-06-07 18:19 1181 查看
本人是技术小白,刚开始接触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,成功的那一刻确实是很开心的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: