概要
对于caffe的安装过程,可以说是让我终身难忘。两个星期就为了一个caffe,这其中的心路历程只有自己懂。从实验室的低配置显卡开始装Ubuntu,到编译caffe,解决各种报错,这个过程花费了一周的时间。把cuda版本和N卡驱动版本一降再降,仍然不管用。因此手剁了一台8000的高配置主机。之后为了平衡实验室项目,首先花了半天时间将win10下的相关和其他杂七杂八的软件配置。只有以为只需Ubuntu安装好,caffe编译成功即可,不想安装完Ubuntu之后,却电脑没有引导启动项,把网上的方法试了个遍,却仍无法解决。因此听到一种说法是,win10的启动路径覆盖了Ubuntu启动路径。因此,决定重新再来,将自己的固态和机械全部初始化,首先在固态上安装Ubuntu16.04,在机械上安装Win10,对于双系统的安装请参照我的另一篇博客:Win10与Ubuntu16.04双系统安装教程。在这种情况下参加那个caffe安装成功。请注意,对于双系统建议先安装Ubuntu,并将caffe编译成功之后在去机械上安装Win10。Caffe的安装教程请参照如下安装教程。
1 安装相关依赖库
第一步是安装caffe的相关依赖库。依次在ubuntu的终端中输入以下命令。我们对第一条命令进行过程进行展示。遇见输入Yes/No时,请输入y即可。
代码语言:javascript复制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
sudo apt-get install git cmake build-essential
2 安装Nvidia驱动
可能部分读者安装Ubuntu之后未安装Nividia驱动,因此我们在安装Cuda10.1之前必须安装安装Nividia驱动。首先进入英伟达中国驱动官网输入显卡型号查看支持显卡驱动的版本,这个过程可能会有一定的延迟,请耐心等待。我的显卡是Nvidia RTX2060,支持的驱动版本为418。
虽然英伟达官网给的是418版本的驱动,但是为了保守起见,我在这里安装410的版本驱动。没办法,caffe对于库之间的依赖性太强了。接下来依次输入以下命令进行安装英伟达驱动:
代码语言:javascript复制sudo apt-get purge nvidia-* //这是卸载以前的nvidia驱动
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt-get update
sudo apt-get install nvidia-410 可能安装过程中会出现如图中**不支持设置属性的警告**,不要紧,无视就可。后面我们也有类似的情况,依旧是无视即可。 #后面的数字请根据你自己在官网上显示数字进行修改
reboot //重启
这个过程可能会持续很久,这个根据网速来决定。重启之后,我们,我们还得禁用nouveau驱动。首先修改lacklist.conf配置文件的权限,命令如下:
代码语言:javascript复制sudo chmod 777 /etc/modprobe.d/blacklist.conf
之后打开该配置文件:
代码语言:javascript复制sudo gedit /etc/modprobe.d/blacklist.conf
在文件末尾加入如下命令:
代码语言:javascript复制blacklist rivafb
blacklist vga16fb
blacklist nouveau
blacklist nvidiafb
blacklist rivatv
**可能安装过程中会出现如图中不支持设置属性的警告,不要紧,无视就可。后面我们也有类似的情况,依旧是无视即可。**之后输入如下命令:
代码语言:javascript复制sudo update-initramfs -u #禁用nouveau驱动
完成后启动电脑。重启电脑后输入如下命令:
代码语言:javascript复制lsmod | grep nouveau
若结果如上图所示,未出现相应结果则说明nouveau驱动禁用成功。接下来输入如下命令:
代码语言:javascript复制sudo nvidia-smi
若出现上图中的结果则说明英伟达驱动安装驱动成功。
3 安装Cuda10.0
在进行安装Cuda10.0之前,我们首先进行相关准备工作。首先确认自己电脑的GPU兼容CUDA,只要电脑是N卡应该就支持,A卡应该是不支持的。在终端中输入以下命令即可查看自己的显卡是否兼容。
代码语言:javascript复制lspci | grep -i nvidia
我的电脑是NVIDIA RTX 2060,显示 compatible兼容
之后要做的是确定自己的Ubuntu16.04是否支持CUDA。输入命令如下。
代码语言:javascript复制uname -m && cat /etc/*release
接着确定自己的Ubuntu16.04系统安装了gcc,基本上是安装Ubuntu成功的基本都带有gcc,但是为了确保gcc是否安装,我们利用如下命令进行确认:
代码语言:javascript复制gcc --version
j接下来确定系统是否已经安装了正确的Kernel Headers和开发包。首先查看系统正在运行的kernel版本:
代码语言:javascript复制uname -r
如果不是最新版本,先更新对应的kernels header和开发包:
代码语言:javascript复制sudo apt-get install linux-headers-$(uname -r)
接下来进入Cuda官网下载最新的Cuda10.0的安装包。
下载完成之后,利用cd命令进入安装所在的文件夹,这个按照自己的电脑的情况而定。之后依次执行如下命令:
代码语言:javascript复制sudo chmod 777 cuda_10.1.105_418.39_linux.run
sudo ./cuda_10.1.105_418.39_linux.run
**首先不停按住回车见,使100%出现阅读完手册,出现选项基本选yes,但是对于出现安装英伟达驱动的选项选择no,因为我们之前已经安装过,选yes会让安装流程失败。**之后,打开/usr/local文件夹,我们会发现多了cuda和cuda10.1这两个文件夹,如下所示。
接下是配置相关环境变量。首先打开~/.bashrc文件:
代码语言:javascript复制sudo gedit ~/.bashrc
将以下内容写入到~/.bashrc尾部,并保存成功
代码语言:javascript复制export PATH=/usr/local/cuda-10.0/bin${PATH: :${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-10.0/lib64${LD_LIBRARY_PATH: :${LD_LIBRARY_PATH}}
然后让~/.bashrc生效:
代码语言:javascript复制source ~/.bashrc
之后利用gedit命令打开在/etc/profile文件中,添加CUDA环境变量:
代码语言:javascript复制sudo gedit /etc/profile
打开文档都在文档结尾加上下面两句:
代码语言:javascript复制PATH=/usr/local/cuda/bin:$PATH
export PATH
保存后, 执行下列命令, 使环境变量立即生效:
代码语言:javascript复制source /etc/profile
同时添加lib库路径,在 /etc/ld.so.conf.d/新建文件 cuda.conf,命令如下:
代码语言:javascript复制sudo gedit /etc/ld.so.conf.d/cuda.conf
在文中加入下面内容:
代码语言:javascript复制/usr/local/cuda/lib64
执行下列命令使之立刻生效:
代码语言:javascript复制sudo ldconfig
最后我们利用测试CUDA的samples来测试cuda安装是否成功:
代码语言:javascript复制cd /usr/local/cuda-10.0/samples/1_Utilities/deviceQuery
sudo make
sudo ./deviceQuery
如果显示如下一些关于GPU的信息与PASS,则说明安装成功。
最后如下命令来查看驱动版本:
在这里插入代码片
代码语言:javascript复制nvcc -V
–
4 安装Cudnn
进入Cudnn官网进行下载cudnn,如下:
点击Join利用qq进行登录。
之后选择和cuda版本对应的cudnn版本进行下载。
在安装包下载完成之后,我们利用cd命令进入安装包所在的文件夹对安装包进行解压,命令如下:
代码语言:javascript复制sudo tar -zxvf ./cudnn-10.1-linux-x64-v7.5.0.56.tgz
之后我们讲图片中的文件依次复制到/usr/local/cuda中对应的文件夹下。
代码语言:javascript复制sudo chmod 777 ./cuda #可能出现cuda文件权限不够的情况,如果cuda文件夹下的文件也有这个问题请一一对权限进行修改
cd cuda/include
sudo cp cudnn.h /usr/local/cuda/include #复制头文件
cd ..
cd lib64
sudo cp lib* /usr/local/cuda/lib64/ #复制动态链接库
cd /usr/local/cuda/lib64/
sudo chmod r libcudnn.so.7.5.0
sudo ln -sf libcudnn.so.7.5.0 libcudnn.so.7
sudo ln -sf libcudnn.so.7 libcudnn.so
sudo ldconfig
5 安装Opencv3
虽然当前已经opencv已经更新到4.1版本,但是考虑到opencv4.1版本只出来较短的时间,可能不是很稳定,因此在这里还是稳妥起见,安装opencv3.4.6。进入opencv官网下载opencv3.4.6版本,点击下图中红色框进行下载,并等待安装包下载完成。
在等待安装包下载完成的同时,我们也安装opencv相关依赖库,命令如下:
代码语言:javascript复制 # 移除先前安装的x264</h3>
sudo apt-get remove x264 libx264-dev
#安装依赖项
sudo apt-get install build-essential checkinstall cmake pkg-config yasm
sudo apt-get install git gfortran
sudo apt-get install libjpeg8-dev libjasper-dev libpng12-dev
sudo apt-get install libtiff5-dev
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libdc1394-22-dev
sudo apt-get install libxine2-dev libv4l-dev
sudo apt-get install libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev
sudo apt-get install libqt5-dev libgtk2.0-dev libtbb-dev
sudo apt-get install libatlas-base-dev
sudo apt-get install libfaac-dev libmp3lame-dev libtheora-dev
sudo apt-get install libvorbis-dev libxvidcore-dev
sudo apt-get install libopencore-amrnb-dev libopencore-amrwb-dev
sudo apt-get install x264 v4l-utils
# 可选依赖项,一般DL都需要
sudo apt-get install libprotobuf-dev protobuf-compiler
sudo apt-get install libgoogle-glog-dev libgflags-dev
sudo apt-get install libgphoto2-dev libeigen3-dev libhdf5-dev doxygen
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 apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev liblapacke-dev
sudo apt-get install libxvidcore-dev libx264-dev # 处理视频所需的包
sudo apt-get install libatlas-base-dev gfortran # 优化opencv功能
sudo apt-get install ffmpeg
在opencv3.4.6安装包下载之后,讲其移动到/home/xxx文件夹下(xxx代表你当前系统的用户名)。之后对安装包进行解压,命令如下:
代码语言:javascript复制unzip opencv-3.4.6.zip
等待压缩完成。之后利用cd命令进入解压之后的文件夹,执行以下命令:
代码语言:javascript复制cd opencv-3.4.6
sudo mkdir build # 创建build文件夹
sudo chmod 777 * -R # 修改build文件夹权限,防止之后的编译失败
进入build文件夹进行编译。命令如下:
代码语言:javascript复制**接下来我们利用cmake来opencv的源代码进行编译,在这里我需要配置各种参数来使用cuda,并将python的解释路径更换成Anaconda中的python3.6路径,不然opencv会安装到Ubuntu16.04自带的Python3.5路径下。**
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..
之后进行编译,命令如下:
代码语言:javascript复制sudo make all -j12
-j12代表并行运算,我的电脑是6核12线程,所以选择-j12,这个根据自己电脑配置进行选择。
等待100%出现,这个过程需要较长的时间。在编译结束之后,进行opencv安装,需要运行下面指令进行安装:
代码语言:javascript复制sudo make install
之后检测opencv是否安装成功,首先创建opencv测试文件夹:
代码语言:javascript复制mkdir ~/opencv-test
cd ~/opencv-test
sudo gedit DisplayImage.cpp
之后在DisplayImage.cpp文件中写入如下代码:
代码语言:javascript复制#include <stdio.h>
#include <opencv2/opencv.hpp>
using namespace cv;
int main(int argc, char** argv )
{
if ( argc != 2 )
{
printf("usage: DisplayImage.out <Image_Path>n");
return -1;
}
Mat image;
image = imread( argv[1], 1 );
if ( !image.data )
{
printf("No image data n");
return -1;
}
namedWindow("Display Image", WINDOW_AUTOSIZE );
imshow("Display Image", image);
waitKey(0);
return 0;
}
之后创建CMake编译文件:
代码语言:javascript复制sudo gedit CMakeLists.txt
写入如下内容:
代码语言:javascript复制cmake_minimum_required(VERSION 2.8)
project( DisplayImage )
find_package( OpenCV REQUIRED )
add_executable( DisplayImage DisplayImage.cpp )
target_link_libraries( DisplayImage ${OpenCV_LIBS} )
最后进行编译:
代码语言:javascript复制cd ~/opencv-test
cmake .
make
随便下载一张图片命名为1.jpg,放入open-test文件夹中,执行程序:
代码语言:javascript复制./DisplayImage 1.jpg
如果出现如下图像则索命opencv安装成功:
使用Ubuntu16.04默认的Python则利用如下命令安装opencv:
代码语言:javascript复制sudo apt-get install python-opencv
sudo apt-get install python-numpy
输入python导入cv2库,验opencv3库是否安装成功:
如上图所示,opencv3库安装成功。
6 安装Caffe
首先声明下,对于python的建议用Ubuntu自带的Python环境,我也试过安装Anaconda,并将Python的环境变量进行修改,但是这种条件下caffe的编译都没成功。 caffe安装流程如下:首先利用git命令下载caffe:
代码语言:javascript复制git clone https://github.com/BVLC/caffe.git
等待下载完成后,进入caffe文件夹,把Makefile.config.example复制更名为Makefile.config
代码语言:javascript复制cd caffe
sudo cp Makefile.config.example Makefile.config
接着修改这个相当于caffe编译的配置文件,不过可能出现Makefile.config文件权限不够的情况,因此不管有没权限问题,首先修改权限
代码语言:javascript复制sudo chmod 777 Makefile.config
sudo gedit Makefile.config
第一个是使用cudnn
代码语言:javascript复制#USE_CUDNN := 1
修改成:
USE_CUDNN := 1
第二是补充.opencv 版本(如果使用opencv3的话)
代码语言:javascript复制#OPENCV_VERSION := 3
修改为:
OPENCV_VERSION := 3
第一个和第二个修改如下图所示:
第三个更改如下:
代码语言:javascript复制#WITH_PYTHON_LAYER := 1
修改成:
WITH_PYTHON_LAYER := 1
第四个是修改 python 路径
代码语言:javascript复制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
如下图所示:
保存退出。接下来修改 caffe 目录下的 Makefile 文件(这两个不改都会报错,编译类型错误等等。)
代码语言:javascript复制sudo gedit Makefile
接下在Makefile文件中我们进行如下两个修改:
代码语言:javascript复制将181行:
LIBRARIES = glog gflags protobuf boost_system boost_filesystem m
改为:
LIBRARIES = glog gflags protobuf boost_system boost_filesystem m hdf5_serial_hl hdf5_serial
将425行:
NVCCFLAGS =-ccbin=$(CXX) -Xcompiler-fPIC $(COMMON_FLAGS)
替换为:
NVCCFLAGS = -D_FORCE_INLINES -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)
保存退出后我们开始编译caffe:
代码语言:javascript复制sudo make all -j12
但是会发现如下错误
这个问题在于CUDA在CUDA architecture setting有版本兼容问题,因此我们再次打开Makefile.config文件进行修改:
代码语言:javascript复制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_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
之后再次进行编译,但在此之前,我们必须讲之前的编译文件清除:
代码语言:javascript复制sudo make clean
sudo make all -j12
等待编译完成。之后继续运行如下指令:
代码语言:javascript复制sudo make test
sudo make runtest -j8
出现上图中的结果,说明编译成功。接下来添加caffe到环境变量,利用gedit命令打开~/.bashrc文件夹,执行以下命令:
代码语言:javascript复制sudo gedit ~/.bashrc
export PATHONPATH=/home/xxx/caffe/python/caffe:$PATHONPATH
source ~/.bashrc
之后来编译caffe的python接口,在caffe文件下执行以下命令:
代码语言:javascript复制sudo make pycaffe -j8
若出现以下错误:
请安装numpy,命令如下:
代码语言:javascript复制sudo apt-get install python-numpy
再次运行,可能还会出现缺少skimage库。
执行如下命令:
代码语言:javascript复制sudo apt install python-pip
pip install --upgrade pip
pip install -U scikit-image
也可能出现以下问题
输入pip命令报错:
代码语言:javascript复制from pip import main ImportError: cannot import name 'main'
修改/usr/bin/pip文件:
代码语言:javascript复制sudo gedit /usr/bin/pip
修改内容如下:
代码语言:javascript复制//修改前
from pip import main
if __name__ == '__main__':
sys.exit(main())
修改后
from pip import __main__ //这行也要修改
if __name__ == '__main__':
sys.exit(__main__._main()) //增加__main__._
在#!/usr/bin/python下面一行天际如下命令来防止编码问题:
# -*- coding: utf-8 -*-
之后继续运行
代码语言:javascript复制sudo pip install -U scikit-image
之后再次import caffe 出现又一个error
代码语言:javascript复制ImportError: No module named google.protobuf.internal
解决方法如下:
代码语言:javascript复制sudo apt-get install python-protobuf
之后进入python,导入caffe发现成功了。