Ubuntu16.04安装和配置Caffe流程 (GPU版)

Ubuntu16.04安装和配置GPU版Caffe-ssd流程 (中途各种错误最后完美运行)

笔者用一台新服务器费时两天安装好caffe,以前用旧的服务器安装时由于一些库和配置版本的问题一直失败,这次吸取教训,每一步不确定的地方多检索多百度,另外不同的机器配置和环境可能不同,每一步都有可能不完全符合。终于安好了caffe,友情提示,由于需要修改的源码和安装的库比较多,请每一步务必谨慎,以防最后陷入死循环而很难卸载/还原干净导致心态爆炸。

初始环境: ubuntu 16.04
初始环境 ubuntu 16.04 x64
内存 Intel® Xeon® Silver 4114 CPU @ 2.20GHz × 40
GPU Quadro P4000/PCIe/SSE2
显卡驱动 V384.130
cudn
cudnn
opencv 系统自带的2.1
python 2.7.12以及3.5.2
以下各工具安装版本:
cudn V9.0.176
cudnn V7.5.1
opencv 3.4.3
巨人的肩膀:

https://blog.csdn.net/yggaoeecs/article/details/79163789
https://blog.csdn.net/u011974639/article/details/78804299
https://blog.csdn.net/yhaolpz/article/details/71375762
https://www.jianshu.com/p/71bc5f02ecd2

一、 安装显卡驱动

笔者的设备出厂自带显卡驱动,这一步可以参考上面几个博客

二、安装CUDA

CUDA是NVIDIA的编程语言平台,想使用GPU就必须要使用cuda。

主要参考:
https://blog.csdn.net/yggaoeecs/article/details/79163789
https://www.jianshu.com/p/71bc5f02ecd2

下载CUDA时一定要注意CUDA和NVIDIA显卡驱动的适配性。

现在的情况是:
CUDA_8.0支持375.及以上系列的显卡驱动;
CUDA_9.0支持384.及以上系列的显卡驱动;
CUDA_9.1支持389.及以上系列的显卡驱动。

1、查询显卡驱动版本:
sudo dpkg --list | grep nvidia-*

本文中的显卡驱动为384.130系列,所以不能下载最新版本的CUDA_9.1,最后下载的是cuda_9.0.176
当然,CUDA_8.0也是没问题的)。

2、验证自己的Linux版本是否支持 CUDA(Ubuntu 16.04没问题)

在终端中输入命令:

uname -m && cat /etc/*release

结果为:

x86_64
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.1 LTS"
NAME="Ubuntu"
VERSION="16.04.1 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.1 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
UBUNTU_CODENAME=xenial

3、验证系统是否安装了gcc

在终端中输入:gcc --version

结果为:

gcc (Ubuntu 5.4.0-6ubuntu1~16.04.11) 5.4.0 20160609
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

若未安装请使用下列命令进行安装:

sudo apt-get  install  build-essential
4、验证系统是否安装了kernel header和 package development

查看正在运行的系统内核版本,在终端中输入:uname -r

结果显示:4.4.0-31-generic

安装对应kernel版本的kernel header和package development,终端输入:

sudo apt-get install linux-headers-$(uname -r)

结果:

正在读取软件包列表... 完成
正在分析软件包的依赖关系树       
正在读取状态信息... 完成       
linux-headers-4.4.0-31-generic 已经是最新版 (4.4.0-31.50)。
升级了 0 个软件包,新安装了 0 个软件包,要卸载 0 个软件包,有 346 个软件包未被升级。

表示系统里已经有了,不用重复安装。
若以上各项验证检查均满足要求,便可进行下面的正式安装过程。如果没有满足要求的话,可以参考cuda的官方文档,里面有详细的针对每个问题的解决方案。

5、下载CUDA

在官网上https://developer.nvidia.com/cuda-toolkit-archive下载CUDA。

本文中的显卡驱动为384.130系列,所以不能下载最新版本的CUDA_9.1,最后下载的是cuda_9.0.176
当然,CUDA_8.0也是没问题的)。

下载界面如下图4所示。
Ubuntu16.04安装和配置Caffe流程 (GPU版)_第1张图片
接着选择下载类型
Ubuntu16.04安装和配置Caffe流程 (GPU版)_第2张图片
选择第一个Base Installer,下完后进入到下载的deb包所在目录下,打开终端执行以下命令:

md5sum cuda-repo-ubuntu1604-9-0-local_9.0.176-1_amd64.deb 
#(此行仅为解释)md5sum 后面为你自己下的安装包的名字,不固定

用MD5 检验,如果序号不和,得重新下载。
然后使用以下四条命令即可将cuda和对应的显卡驱动安装成功:

sudo dpkg -i cuda-repo-__.deb
sudo apt-key add /var/cuda-repo-/7fa2af80.pub
sudo apt-get update
sudo apt-get install cuda

重启电脑,检查Device Node Verification
执行:ls /dev/nvidia*

结果显示

/dev/nvidia0  /dev/nvidiactl  /dev/nvidia-modeset  
/dev/nvidia-uvm

或者

/dev/nvidia0    /dev/nvidiactl      /dev/nvidia-uvm

则安装成功。

6、设置环境变量

终端中输入:sudo gedit /etc/profile

在打开的文件末尾,添加以下两行:

export PATH=/usr/local/cuda-9.0/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-9.0/lib64\

###如果是32位系统第二行去掉‘64’数字
在许多别人的教程中,第二行为
export LD_LIBRARY_PATH=/usr/local/cuda-9.0/lib64\${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
不清楚为什么笔者不加后面一段也可以成功
###

保存文件,并重启。因为source /etc/profile是临时生效,重启电脑才是永久生效。

这里有点与官方安装文档稍有不同,需要说明:
官方文档里说只需在终端中运行上述两条export语句即可,但如果不将它们不写入/etc/profile文件的话,这样的环境变量在你退出终端后就消失了,不起作用了,所以写入才是永久的做法。

重启电脑,检查上述的环境变量是否设置成功
a、 验证驱动版本,在终端中输入以下命令:
cat /proc/driver/nvidia/version

结果显示

NVRM version: NVIDIA UNIX x86_64 Kernel Module  
384.130  Wed Mar 21 03:37:26 PDT 2018
GCC version:  gcc version 5.4.0 20160609 
(Ubuntu 5.4.0-6ubuntu1~16.04.1) 

b、 验证CUDA Toolkit,在终端中输入以下命令:ncvv -V
会输出CUDA的版本信息:

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2017 NVIDIA Corporation
Built on Fri_Sep__1_21:08:03_CDT_2017
Cuda compilation tools, release 9.0, V9.0.176
7、验证CUDA配置成功

尝试编译cuda提供的例子
1)打开终端输入:

cuda-install-samples-9.0.sh cuda_samples
###直接拷贝到我的Home目录下,文件名是cuda_samples,
等编译完这个例子,这个文件夹就可以删掉了。###

然后进入NVIDIA_CUDA-9.0_Samples目录后打开终端输入:sudo make

系统就会自动进入到编译过程,整个过程大概需要十几到二十分钟,请耐心等待。如果出现错误的话,系统会立即报错停止。

如果编译成功,最后会显示Finished building CUDA samples,如下图所示。
Ubuntu16.04安装和配置Caffe流程 (GPU版)_第3张图片
然后运行编译生成的二进制文件。
编译后的二进制文件 默认存放在NVIDIA_CUDA-9.0_Samples/bin中。
接着在上一个终端中输入 : ./deviceQuery

结果如下图所示:看到类似如下图片中的显示,则代表CUDA安装且配置成功,其中 Result = PASS代表成功,若失败 Result = FAIL
Ubuntu16.04安装和配置Caffe流程 (GPU版)_第4张图片
最后再检查一下系统和CUDA-Capable device的连接情况
终端输入 :./bandwidthTest

看到类似如下图片中的显示,则代表成功
Ubuntu16.04安装和配置Caffe流程 (GPU版)_第5张图片
证明,cuda安装成功并可以使用了!

三、安装cudnn

在官网上https://developer.nvidia.com/cudnn下载cudnn的tgz包,需要注册帐号。
注意对应你的CUDA版本下,这里选择Download cuDNN v7.5.1 (April 22, 2019), for CUDA 9.0
然后选cuDNN Library for Linux

下完后进入下载所在目录打开终端执行以下四条命令即可安装。

tar -xzvf cudnn-9.0-linux-x64-v7.tgz 
sudo cp cuda/include/cudnn.h /usr/local/cuda/include
sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64
sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*

四、安装opencv 3.4.3

opencv是个大坑,无论是windows还是linux上都是。。。
这里找到一个很好的参考源,https://blog.csdn.net/u011974639/article/details/78804299
博主DFann事先安装了一个插件ffmpeg,笔者并没有安装它最后也成功了,如果你按照此文的流程失败的话可以试一下按照原文流程安装。
之前git下来OpenCV的源码,然后一点点配置,后面都不知道哪里出了问题(到处都是问题),这次从github上找了一个安装脚本,方便了(傻瓜式)很多。

先在home下新建一个文件夹opencv,进入目录后打开终端输入以下代码下载安装脚本:

git clone https://github.com/jayrambhia/install-opencv

下完了后会出现一个install-opencv的文件夹,进入install-opencv/Ubuntu/后终端输入:

chmod +x * 
./opencv_latest.sh

然后默默的等待完成即可~
如果出现错误参考https://blog.csdn.net/u011974639/article/details/78804299
我们解决完错误后,可以直接进入刚刚脚本建立的opencv目录

cd ~/Install-OpenCV/Ubuntu/OpenCV/opencv-3.3.1/build
make

到此为止,OpenCV算是安装完事了,接下来就要安装Caffe本身了~

五、安装caffe

1、安装Caffe依赖包

安装各种依赖:

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 libgflags-dev libgoogle-glog-dev liblmdb-dev
sudo apt-get install libatlas-dev 
sudo apt-get install liblapack-dev 
sudo apt-get install libatlas-base-dev

安装ATLAS:AUTOMATIC TUNED LINEAR ALGEBRA SOFTWARE,BLAS线性算法库的优化版本

udo apt-get install libatlas-base-dev

到此,Caffe的依赖算是安装完事了~可以稍微休息一下了,迎接接下来的‘持久战’

2、安装caffe

这里大部分网上很多教程,笔者就直接借鉴copy了

1、在home下创建caffe文件夹,进入后终端输入:

git clone https://github.com/weiliu89/caffe.git

如果没有git可以通过命令sudo apt-get install git安装

如果出现克隆失败error: RPC failed; curl 56 GnuTLS recv error (-54): Error in the pull...

可能是git缓存太小,解决方法是:使用下面的命令增加缓存大小

git config --global http.postBuffer 2000000000

2、下完后进入对应的目录:cd caffe

执行安装指令
(这一步会遇到很多问题,做好心理准备)

注意!!!接下来所有的终端命令除非特别说明,否则一律是在caffe根目录下 运行!!!

cp Makefile.config.example Makefile.config
### 拷贝一个安装配置文件,如果后面修改此文件多了无法回到初始配置就删除Makefile.config,重新执行此命令

2.1、打开并修改配置Makefile.config文件:

sudo gedit 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、最重要的地方:
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/serial 
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu/hdf5/serial

2.2、打开并修改配置Makefile文件:

sudo gedit Makefile

做如下修改:
1、

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

改为:

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

2、

LIBRARIES += glog gflags protobuf boost_system boost_filesystem m

改为:

LIBRARIES += glog gflags protobuf boost_system boost_filesystem m hdf5_serial_hl hdf5_serial

为了加速编译过程,可以选择开启全内核同时编译,通过设置-关于这台计算机或者键入命令nproc查看内核数目,笔者机器为40个核心。
改好后就编译

make all -j40 
# 编译caffe -j40是使用多核优化,加速编译  
# make all的时间比较长,过程很可能会出现了错误,要先解决再进行下一步

此时出现错误:

# 前面省略若干行错误信息
./include/caffe/util/cudnn.hpp:21:10: warning: enumeration value ‘CUDNN_STATUS_RUNTIME_FP_OVERFLOW’ not handled in switch [-Wswitch]
In file included from ./include/caffe/util/device_alternate.hpp:40:0,
                 from ./include/caffe/common.hpp:19,
                 from src/caffe/net.cpp:10:
./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’:
./include/caffe/util/cudnn.hpp:21:10: warning: enumeration value ‘CUDNN_STATUS_RUNTIME_IN_PROGRESS’ not handled in switch [-Wswitch]
   switch (status) {
          ^
./include/caffe/util/cudnn.hpp:21:10: warning: enumeration value ‘CUDNN_STATUS_RUNTIME_FP_OVERFLOW’ not handled in switch [-Wswitch]

github上有解决方案:因为cudnn.hpp比较老,最近的7.x.x版本的cudnn不支持,只需要复制以下代码替换/caffe/include/caffe/util/cudnn.hpp内容即可!

https://raw.githubusercontent.com/BVLC/caffe/master/include/caffe/util/cudnn.hpp

这是成功的结果:

$ make all -j8
LD -o .build_release/lib/libcaffe.so.1.0.0
CXX/LD -o .build_release/tools/caffe.bin
CXX/LD -o .build_release/tools/upgrade_solver_proto_text.bin
CXX/LD -o .build_release/tools/convert_imageset.bin
CXX/LD -o .build_release/tools/upgrade_net_proto_binary.bin
CXX/LD -o .build_release/tools/extract_features.bin
CXX/LD -o .build_release/tools/upgrade_net_proto_text.bin
CXX/LD -o .build_release/tools/compute_image_mean.bin
CXX/LD -o .build_release/examples/siamese/convert_mnist_siamese_data.bin
CXX/LD -o .build_release/examples/cifar10/convert_cifar_data.bin
CXX/LD -o .build_release/examples/cpp_classification/classification.bin
CXX/LD -o .build_release/examples/mnist/convert_mnist_data.bin
CXX/LD -o .build_release/tools/caffe.bin

如果一切正常,进行下一步,否则,先解决问题~

make test -j40

这里笔者出现一个错误:

CXX src/caffe/test/test_embed_layer.cpp
CXX src/caffe/test/test_internal_thread.cpp
CXX src/caffe/test/test_crop_layer.cpp
NVCC src/caffe/test/test_im2col_kernel.cu
nvcc fatal   : Unsupported gpu architecture 'compute_20'
Makefile:606: recipe for target '.build_release/cuda/src/caffe/test/test_im2col_kernel.o' failed
make: *** [.build_release/cuda/src/caffe/test/test_im2col_kernel.o] Error 1
make: *** 正在等待未完成的任务....

应该时gpu架构不支持的问题,网上找到解决方案:异常原因是 caffe的makefile.config中有cuda版本限制,设置的参数有可能cuda不支持。打开makefile.config,找到下图所在处,注释掉报错的gpu architecture:

CUDA_ARCH :=  -gencode arch=compute_20,code=sm_20 \
        -gencode arch=compute_20,code=sm_21 \
        -gencode arch=compute_30,code=sm_30 \
        -gencode arch=compute_35,code=sm_35 \
        -gencode arch=compute_50,code=sm_50 \
        -gencode arch=compute_52,code=sm_52 \
        -gencode arch=compute_60,code=sm_60 \
        -gencode arch=compute_61,code=sm_61 \
        -gencode arch=compute_61,code=compute_61 

笔者将其改为:

CUDA_ARCH := #-gencode arch=compute_20,code=sm_20 \
		-gencode arch=compute_20,code=sm_21 \
		-gencode arch=compute_30,code=sm_30 \
		-gencode arch=compute_35,code=sm_35 \
		-gencode arch=compute_50,code=sm_50 \
		-gencode arch=compute_52,code=sm_52 \
		-gencode arch=compute_60,code=sm_60 \
		-gencode arch=compute_61,code=sm_61 \
		-gencode arch=compute_61,code=compute_61

继续编译:make test -j40
成功了:

NVCC src/caffe/util/im2col.cu
NVCC src/caffe/util/math_functions.cu
NVCC src/caffe/solvers/adagrad_solver.cu
NVCC src/caffe/solvers/adam_solver.cu
#此处省略n行
CXX/LD -o .build_release/examples/cpp_classification/classification.

bin
CXX/LD -o .build_release/examples/mnist/convert_mnist_data.bin

接着run一下:

sudo make runtest -j40

漫长的等待,看见疯狂飘绿的代码就问题不大了
然后就发现了一个彩蛋:

[       OK ] EmbedLayerTest/2.TestForwardWithBias (2 ms)
[ RUN      ] LSTMLayerTest/3.TestGradientNonZeroContBufferSize2WithStaticInput
冈布迷之森[       OK ] LSTMLayerTest/3.TestGradientNonZeroContBufferSize2WithStaticInput (21074 ms)
[ RUN      ] LSTMLayerTest/3.TestGradient
[       OK ] LSTMLayerTest/3.TestGradient (1665 ms)
#此处省略n行
[       OK ] NeuronLayerTest/1.TestExpLayerBase2Shift1 (0 ms)
[==========] 2207 tests from 285 test cases ran. (416033 ms total)
[  PASSED  ] 2207 tests.

到这里,算是安装完事了~祝贺你喜提caffe!!!
接下来为了方便使用caffe,需要安装python接口

make py -j40

报错:

CXX/LD -o python/caffe/_caffe.so python/caffe/_caffe.cpp
python/caffe/_caffe.cpp:10:31: fatal error: numpy/arrayobject.h: 没有那个文件或目录
compilation terminated.
Makefile:509: recipe for target 'python/caffe/_caffe.so' failed
make: *** [python/caffe/_caffe.so] Error 1

缺少numpy链接,输入sudo apt-get install python-numpy
显示已经安装,重新make py,结果还是一样。
输入:python进入python,然后写下
import numpy as np np.get_include()显示numpy库地址为
/usr/local/lib/python2.7/dist-packages/numpy/core/include
将地址复制后替换Makefile.config中

PYTHON_INCLUDE := /usr/include/python2.7 \
		/usr/lib/python2.7/dist-packages/numpy/core/include

PYTHON_INCLUDE := /usr/include/python2.7 \ /usr/local/lib/python2.7/dist-packages/numpy/core/include
再运行make py就没问题了。

此时如果你进入caffe/python/下终端输入python然后import caffe是没问题的,但是其他目录下的终端进入python是找不到caffe模块的:

Python 2.7.12 (default, Nov 12 2018, 14:36:49) 
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import caffe
Traceback (most recent call last):
  File "", line 1, in 
ImportError: No module named caffe

需要添加环境变量以后任何地方的目录下都能一劳永逸

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

然后再输入以下命令使环境变量生效:

source ~/.bashrc

再打开文档

sudo gedit /etc/profile

在弹出的文档末尾另起一行添加:

export PYTHONPATH=/home/lenovo/caffe/python:$PYTHONPATH
# /home/lenovo/替换成你的caffe所在根目录,或者直接在你caffe/python下随便查看一个文件属性,把路径替换掉上行冒号前的路径,然后保存文档

再输入source /etc/profile使之生效
此时打开一个新终端,然后随便进一个目录下打开python导入caffe:

lenovo@lenovo-ThinkStation-P720:~/data$ python
Python 2.7.12 (default, Nov 12 2018, 14:36:49) 
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import caffe
>>> 

这才是真正的配置完美了!enjoy it!不要慌,此时建议你重启一下电脑,让设置的环境变量永久生效,再检测一下是不是真的可以随意import caffe了。

接下来笔者将另开一帖,记录运行caffe的demo流程,中间也遇到了很多大家都碰到过的问题。

你可能感兴趣的:(Ubuntu16.04安装和配置Caffe流程 (GPU版))