作者电脑配置是win10+ubuntu16.04双系统,gtx1070,因为需要学习深度神经网络用到了caffe,在windows下苦装了一个多星期都没有成功,而又不满虚拟机下只能使用cpu的尴尬速度和内存问题,因此决定安装双系统并在ubuntu上配置caffe,没想到ubuntu下的配置也一路深坑,于是特此记录。
在做准备工作之前参考了不少博客,发现各博主关于caffe应配对的各cuda、opencv版本莫衷一事,因此作者自己尝试调配自己的caffe环境,虽然一路波折但最后也总算成功。希望能帮到有需要的同学。
------------------------------------------------------------------------------------------
ubuntu16.04系统安装
0、
主要参考【最新图文讲解如何在win10环境下安装ubuntu双系统】https://blog.csdn.net/ajay666/article/details/75208509,这里不展开说明。
-------------------------------------------------------------------------------------------
CUDA9.1安装
ps:最开始作者在百度上搜了许多教程,但都把系统搞崩了三四次,因此在这里提个醒,不是每篇博客教程都适合每台机器,要根据官方文档进行调配!
http://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html
1、
首先,将以下链接作为CUDA安装的主要参考流程(链接中的一些注也是同样需要大家注意的):【Ubuntu 16.04 上安装 CUDA 9.0 详细教程】https://blog.csdn.net/qlulibin/article/details/78714596
对显卡版本、gcc、kernel等做检验,查看是否需要apt-get install 缺少的依赖库等,直到第四步1)完成后。
2、
在第四步1)完成后,作者发现重新输入lsmod | grep nouveau依然有输出信息,检查后发现该完成的操作都完成了,于是在禁用nouveau后sudo reboot(不清楚加不加sudo有无影响,但一般情况下许多操作只有获得权限才能进行,因此顺手加上去),重启后可能会发现分辨率变成800x600,这时请不要惊慌或着急重装系统(你猜我怎么准确把握到你们的心思的...),猜测大概是禁用该功能后导致驱动没有连接上之类的原因,作者后来选择无视这种情况,重新输出lsmod指令,发现已无信息。接下来继续根据主要参考流程,直到步骤四3)完成后。
3、
步骤四3)完成后,作者使用与步骤四4)不同的指令进行安装(结合网上其他教程和官方文档提供的命令表格),输入sudo sh cuda9.1_xxx.run --no-opengl-libs ,其中xxx为具体cuda版本,根据之前下好的run文件输入。这里加了选项no opengl主要是因为不加可能会引起装完cuda后循环登陆或黑屏的情况(但实际上还有其他原因导致这种情况,后面会提到)。等待十多秒,cuda冗长的安装说明文档会出现,可以按z或回车读完,读完后会有几条安装提示,决定是否安装,这里作者的所有选项都选择安装,输入y或accept或回车默认路径。然后!这里作者就遇到了神坑:
"the driver installation is unable to locate the kernel source..."
为了解决这个问题,作者主要参考了:
【ubuntu14.04.5装cuda7.5记录(解决unable to locate the kernel source,装cuda黑屏问题,装cuda循环登录问题)】https://blog.csdn.net/AutoRobot410/article/details/52862479 中的方法二。
再次强调,该方法不一定对所有人适用,我遇到了两次该问题,第一次试用其他指令,没有解决,重装系统。第二次,作者首先根据上述博客,卸载已存显卡驱动,然后安装了最新版本nvidia驱动(应该是385),reboot后发现分辨率恢复正常,此时再重新安装cuda,发现循环登陆,然后我选择只卸载了已存在的显卡驱动(其实就是刚刚装的最新版本的385),然后就直接重新安装cuda,发现成功安装!但回到图形界面的同时发现分辨率又变为800x600,此时作者猜测就是显卡驱动没有安装的问题导致的,于是随便安装了个显卡驱动(为什么是随便,因为刚刚装最新的驱动之后仍然无法安装cuda,猜测太新的版本可能不适应,所以折中选择了352版本,后面会提到应该如何选择安装显卡驱动),reboot后成功恢复分辨率!
总结:直接sudo apt-get --purge remove nvidia*,然后重新安装cuda。(或者试着和作者一样进行迷之操作,说不定弄着弄着就好了...)
4、
然后继续跟着主要参考流程进入步骤四5),完成后续操作。但是在进行步骤五2)和3)的时候,作者发现Result=failed,并且提示有"cuda driver version is insufficient for cuda runtime version",出现该问题的原因在于上一步没有安装好对应的显卡驱动版本!因此,参考【Ubuntu16.04安装CUDA9.1、cuDNN7详细教程】https://blog.csdn.net/jonms/article/details/79318566 的步骤3)安装合适的驱动,完美解决!再次验证./deviceQuery和./bandwidthTest,成功通过!至此,CUDA安装完成。
-------------------------------------------------------------------------------------------
Cudnn7.0.5安装
5、
注意,要在nvidia官网上下载cudnn的话需要先注册帐号再登录,不知道作者这是不是因为校园网问题无法登录进官网,后来翻墙才下了下来,有需要的同学可以评论我,我有时间可以将这个版本放在云盘上。
然后参考【 Ubuntu16.04 Caffe 安装步骤记录(超详尽)】https://blog.csdn.net/yhaolpz/article/details/71375762 的第7步,这里注意在#删除原有动态文件及后面几行指令中,需要根据当前你安装的版本来删除,例如作者的是libcudnn.so.7,可以通过tabtab来查看当前存在什么版本。
-------------------------------------------------------------------------------------------
OpenCV3.4.1安装
6、
继续使用步骤5的教程,到第8步,只是将版本换成3.4.1而已,其他指令都相同。这里作者并没有出现cuda和opencv不兼容问题,因此也不需要修改源文件。一路顺畅,成功安装。
-------------------------------------------------------------------------------------------
anaconda2安装
7、
到官网下载anaconda2的linux版本(好像是因为caffe有一些代码不支持python3),下下来之后bash Anaconda2-xxx.sh,其中xxx是对应版本文件名。这里需要注意的是在安装过程中有一项是否将anaconda2添加到系统环境中的选项,默认是no,作者懒得后面重新在bashrc文件中设置这里就选择了yes,安装程序就会自动帮我们添加anaconda2的路径。安装完成之后重新打开一个终端,输入conda list,如果找到命令就说明安装成功,输入python也能看到有anaconda2版本的显示。如果不成功则需要手动添加路径,网上有教程,这里不多说。
-------------------------------------------------------------------------------------------
Caffe-ldl安装
8、
这里作者使用的caffe版本不是原版,而是经过修改的版本:https://github.com/zeakey/LDLForests ,该代码的作者重构了caffe的框架,适应其项目的需求( Label Distribution Learning Forest,感兴趣的同学可以看看论文),具体修改了什么我也没有去研究,个人认为是大同小异,以后有需要装其他caffe也不会有太大问题,毕竟配置已经基本落实。
根据github上原项目的readme,按顺序输入指令:
git clone https://github.com/zeakey/LDLForest --recursive
cd LDLForest/caffe-ldl
cp Makefile.config.example Makefile.config
到这里,我们需要修改Makefile.config配置文件,作者主要参考【Ubuntu16.04+cuda8.0+opencv3.1+anaconda2.7+caffe安装教程】https://zhuanlan.zhihu.com/p/25709284 ,修改了以下部分:
a)将#USE_CUDNN := 1去掉注释,因为需要使用cudnn。
b)将#OPENCV_VERSION := 3去掉注释,因为需要使用opencv,而且版本是3开头的。
c)将#WITH_PYTHON_LAYER := 1去掉注释,因为需要使用python接口。
d)修改python路径,因为我们使用到了anaconda2,所以将第一个python_include注释掉,后面的anaconda_home和第二个python_include去掉注释,并且修改为anaconda2的根目录位置,这里需要注意的是要看清楚需要注释的代码是否有多行,不要漏掉第二三行:
# NOTE: this is required only if you will compile the python interface.
# We need to be able to find Python.h and numpy/arrayobject.h.
# PYTHON_INCLUDE := /usr/include/python2.7 \
# /usr/lib/python2.7/dist-packages/numpy/core/include
# Anaconda Python distribution is quite popular. Include path:
# Verify anaconda location, sometimes it's in root.
ANACONDA_HOME := $(HOME)/anaconda2
PYTHON_INCLUDE := $(ANACONDA_HOME)/include \
$(ANACONDA_HOME)/include/python2.7 \
$(ANACONDA_HOME)/lib/python2.7/site-packages/numpy/core/include \
# We need to be able to find libpythonX.X.so or .dylib.
# PYTHON_LIB := /usr/lib
PYTHON_LIB := $(ANACONDA_HOME)/lib
e)
将# Whatever else you find you need goes here.下面的
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
(因为ubuntu16.04的文件包含位置发生了变化)
f)在Makefile文件中:
将(大概409行的样子):
NVCCFLAGS +=-ccbin=$(CXX) -Xcompiler-fPIC $(COMMON_FLAGS)
替换为:
NVCCFLAGS += -D_FORCE_INLINES -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)
这里写图片描述
在Makefile文件的第大概181行,把 hdf5_hl和hdf5修改为hdf5_serial_hl 和 hdf5_serial,即
将:
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
9、
修改完毕后,接着刚刚的终端输入指令:
make -j$(nproc) && make pycaffe && cd ..
这里,作者遇到了nvcc fatal : Unsupported gpu architecture 'compute_20'
解决方法:在Makefile.config中,在CUDA_ARCH设置中去掉前两行,也就是包含compute_20的两行。
10、
等待编译完成之后,需要将caffe产生的python文件夹路径放入系统变量中,否则在import caffe时可能会报no module named caffe错误。输入指令:
sudo gedit ~/.bashrc
在文件末尾加上:
export PYTHONPATH=~/caffe/python:$PYTHONPATH
其中,路径根据python真实存放位置修改,然后保存文件并关闭,继续在终端输入指令:
source ~/.bashrc
系统变量正式生效,然后测试caffe是否能被成功import,在终端输入python,然后import caffe,发现出现No module named google.protobuf.internal的报错,解决办法是安装相应依赖库,在终端中输入conda install protobuf。
至此,caffe正式编译完成!
最后感谢各位参考博客教程的作者!T.T谢谢!
-------------------------------------------------------------------------------------------