笔者用一台新服务器费时两天安装好caffe,以前用旧的服务器安装时由于一些库和配置版本的问题一直失败,这次吸取教训,每一步不确定的地方多检索多百度,另外不同的机器配置和环境可能不同,每一步都有可能不完全符合。终于安好了caffe,友情提示,由于需要修改的源码和安装的库比较多,请每一步务必谨慎,以防最后陷入死循环而很难卸载/还原干净导致心态爆炸。
初始环境 | 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是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.及以上系列的显卡驱动。
sudo dpkg --list | grep nvidia-*
本文中的显卡驱动为384.130系列,所以不能下载最新版本的CUDA_9.1,最后下载的是cuda_9.0.176
当然,CUDA_8.0也是没问题的)。
在终端中输入命令:
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
在终端中输入: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
查看正在运行的系统内核版本,在终端中输入: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的官方文档,里面有详细的针对每个问题的解决方案。
在官网上https://developer.nvidia.com/cuda-toolkit-archive下载CUDA。
本文中的显卡驱动为384.130系列,所以不能下载最新版本的CUDA_9.1,最后下载的是cuda_9.0.176
当然,CUDA_8.0也是没问题的)。
下载界面如下图4所示。
接着选择下载类型
选择第一个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
则安装成功。
终端中输入: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
尝试编译cuda提供的例子
1)打开终端输入:
cuda-install-samples-9.0.sh cuda_samples
###直接拷贝到我的Home目录下,文件名是cuda_samples,
等编译完这个例子,这个文件夹就可以删掉了。###
然后进入NVIDIA_CUDA-9.0_Samples目录后打开终端输入:sudo make
系统就会自动进入到编译过程,整个过程大概需要十几到二十分钟,请耐心等待。如果出现错误的话,系统会立即报错停止。
如果编译成功,最后会显示Finished building CUDA samples,如下图所示。
然后运行编译生成的二进制文件。
编译后的二进制文件 默认存放在NVIDIA_CUDA-9.0_Samples/bin中。
接着在上一个终端中输入 : ./deviceQuery
结果如下图所示:看到类似如下图片中的显示,则代表CUDA安装且配置成功,其中 Result = PASS代表成功,若失败 Result = FAIL
最后再检查一下系统和CUDA-Capable device的连接情况
终端输入 :./bandwidthTest
看到类似如下图片中的显示,则代表成功
证明,cuda安装成功并可以使用了!
在官网上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是个大坑,无论是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本身了~
安装各种依赖:
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的依赖算是安装完事了~可以稍微休息一下了,迎接接下来的‘持久战’
这里大部分网上很多教程,笔者就直接借鉴copy了
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
cd caffe
执行安装指令
(这一步会遇到很多问题,做好心理准备)
注意!!!接下来所有的终端命令除非特别说明,否则一律是在caffe根目录下 运行!!!
cp Makefile.config.example Makefile.config
### 拷贝一个安装配置文件,如果后面修改此文件多了无法回到初始配置就删除Makefile.config,重新执行此命令
sudo gedit Makefile.config
根据个人情况修改文件:
#USE_CUDNN := 1
行中去掉#变为USE_CUDNN := 1
#OPENCV_VERSION := 3
行中去掉#变为OPENCV_VERSION := 3
#WITH_PYTHON_LAYER := 1
行中去掉#变为WITH_PYTHON_LAYER := 1
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
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
就没问题了。
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了。