对于caffe的安装过程,可以说是让我终身难忘。两个星期就为了一个caffe,这其中的心路历程只有自己懂。从实验室的低配置显卡开始装Ubuntu,到编译caffe,解决各种报错,这个过程花费了一周的时间。把cuda版本和N卡驱动版本一降再降,仍然不管用。因此手剁了一台8000的高配置主机。之后为了平衡实验室项目,首先花了半天时间将win10下的相关和其他杂七杂八的软件配置。只有以为只需Ubuntu安装好,caffe编译成功即可,不想安装完Ubuntu之后,却电脑没有引导启动项,把网上的方法试了个遍,却仍无法解决。因此听到一种说法是,win10的启动路径覆盖了Ubuntu启动路径。因此,决定重新再来,将自己的固态和机械全部初始化,首先在固态上安装Ubuntu16.04,在机械上安装Win10,对于双系统的安装请参照我的另一篇博客:Win10与Ubuntu16.04双系统安装教程。在这种情况下参加那个caffe安装成功。请注意,对于双系统建议先安装Ubuntu,并将caffe编译成功之后在去机械上安装Win10。Caffe的安装教程请参照如下安装教程。
第一步是安装caffe的相关依赖库。依次在ubuntu的终端中输入以下命令。我们对第一条命令进行过程进行展示。遇见输入Yes/No时,请输入y即可。
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
可能部分读者安装Ubuntu之后未安装Nividia驱动,因此我们在安装Cuda10.1之前必须安装安装Nividia驱动。首先进入英伟达中国驱动官网输入显卡型号查看支持显卡驱动的版本,这个过程可能会有一定的延迟,请耐心等待。我的显卡是Nvidia RTX2060,支持的驱动版本为418。
虽然英伟达官网给的是418版本的驱动,但是为了保守起见,我在这里安装410的版本驱动。没办法,caffe对于库之间的依赖性太强了。接下来依次输入以下命令进行安装英伟达驱动:
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配置文件的权限,命令如下:
sudo chmod 777 /etc/modprobe.d/blacklist.conf
之后打开该配置文件:
sudo gedit /etc/modprobe.d/blacklist.conf
在文件末尾加入如下命令:
blacklist rivafb
blacklist vga16fb
blacklist nouveau
blacklist nvidiafb
blacklist rivatv
**可能安装过程中会出现如图中不支持设置属性的警告,不要紧,无视就可。后面我们也有类似的情况,依旧是无视即可。**之后输入如下命令:
sudo update-initramfs -u #禁用nouveau驱动
完成后启动电脑。重启电脑后输入如下命令:
lsmod | grep nouveau
若结果如上图所示,未出现相应结果则说明nouveau驱动禁用成功。接下来输入如下命令:
sudo nvidia-smi
在进行安装Cuda10.0之前,我们首先进行相关准备工作。首先确认自己电脑的GPU兼容CUDA,只要电脑是N卡应该就支持,A卡应该是不支持的。在终端中输入以下命令即可查看自己的显卡是否兼容。
lspci | grep -i nvidia
我的电脑是NVIDIA RTX 2060,显示 compatible兼容
之后要做的是确定自己的Ubuntu16.04是否支持CUDA。输入命令如下。
uname -m && cat /etc/*release
接着确定自己的Ubuntu16.04系统安装了gcc,基本上是安装Ubuntu成功的基本都带有gcc,但是为了确保gcc是否安装,我们利用如下命令进行确认:
gcc --version
j接下来确定系统是否已经安装了正确的Kernel Headers和开发包。首先查看系统正在运行的kernel版本:
uname -r
如果不是最新版本,先更新对应的kernels header和开发包:
sudo apt-get install linux-headers-$(uname -r)
下载完成之后,利用cd命令进入安装所在的文件夹,这个按照自己的电脑的情况而定。之后依次执行如下命令:
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文件:
sudo gedit ~/.bashrc
将以下内容写入到~/.bashrc尾部,并保存成功
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生效:
source ~/.bashrc
之后利用gedit命令打开在/etc/profile文件中,添加CUDA环境变量:
sudo gedit /etc/profile
打开文档都在文档结尾加上下面两句:
PATH=/usr/local/cuda/bin:$PATH
export PATH
保存后, 执行下列命令, 使环境变量立即生效:
source /etc/profile
同时添加lib库路径,在 /etc/ld.so.conf.d/新建文件 cuda.conf,命令如下:
sudo gedit /etc/ld.so.conf.d/cuda.conf
在文中加入下面内容:
/usr/local/cuda/lib64
执行下列命令使之立刻生效:
sudo ldconfig
最后我们利用测试CUDA的samples来测试cuda安装是否成功:
cd /usr/local/cuda-10.0/samples/1_Utilities/deviceQuery
sudo make
sudo ./deviceQuery
如果显示如下一些关于GPU的信息与PASS,则说明安装成功。
最后如下命令来查看驱动版本:
在这里插入代码片
nvcc -V
–
进入Cudnn官网进行下载cudnn,如下:
点击Join利用qq进行登录。
之后选择和cuda版本对应的cudnn版本进行下载。
在安装包下载完成之后,我们利用cd命令进入安装包所在的文件夹对安装包进行解压,命令如下:
sudo tar -zxvf ./cudnn-10.1-linux-x64-v7.5.0.56.tgz
之后我们讲图片中的文件依次复制到/usr/local/cuda中对应的文件夹下。
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
虽然当前已经opencv已经更新到4.1版本,但是考虑到opencv4.1版本只出来较短的时间,可能不是很稳定,因此在这里还是稳妥起见,安装opencv3.4.6。进入opencv官网下载opencv3.4.6版本,点击下图中红色框进行下载,并等待安装包下载完成。
在等待安装包下载完成的同时,我们也安装opencv相关依赖库,命令如下:
# 移除先前安装的x264
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代表你当前系统的用户名)。之后对安装包进行解压,命令如下:
unzip opencv-3.4.6.zip
等待压缩完成。之后利用cd命令进入解压之后的文件夹,执行以下命令:
cd opencv-3.4.6
sudo mkdir build # 创建build文件夹
sudo chmod 777 * -R # 修改build文件夹权限,防止之后的编译失败
**接下来我们利用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 ..
sudo make all -j12
-j12代表并行运算,我的电脑是6核12线程,所以选择-j12,这个根据自己电脑配置进行选择。
等待100%出现,这个过程需要较长的时间。在编译结束之后,进行opencv安装,需要运行下面指令进行安装:
sudo make install
之后检测opencv是否安装成功,首先创建opencv测试文件夹:
mkdir ~/opencv-test
cd ~/opencv-test
sudo gedit DisplayImage.cpp
之后在DisplayImage.cpp文件中写入如下代码:
#include
#include
using namespace cv;
int main(int argc, char** argv )
{
if ( argc != 2 )
{
printf("usage: DisplayImage.out \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编译文件:
sudo gedit CMakeLists.txt
写入如下内容:
cmake_minimum_required(VERSION 2.8)
project( DisplayImage )
find_package( OpenCV REQUIRED )
add_executable( DisplayImage DisplayImage.cpp )
target_link_libraries( DisplayImage ${OpenCV_LIBS} )
最后进行编译:
cd ~/opencv-test
cmake .
make
随便下载一张图片命名为1.jpg,放入open-test文件夹中,执行程序:
./DisplayImage 1.jpg
如果出现如下图像则索命opencv安装成功:
使用Ubuntu16.04默认的Python则利用如下命令安装opencv:
sudo apt-get install python-opencv
sudo apt-get install python-numpy
输入python导入cv2库,验opencv3库是否安装成功:
如上图所示,opencv3库安装成功。
首先声明下,对于python的建议用Ubuntu自带的Python环境,我也试过安装Anaconda,并将Python的环境变量进行修改,但是这种条件下caffe的编译都没成功。 caffe安装流程如下:首先利用git命令下载caffe:
git clone https://github.com/BVLC/caffe.git
等待下载完成后,进入caffe文件夹,把Makefile.config.example复制更名为Makefile.config
cd caffe
sudo cp Makefile.config.example Makefile.config
接着修改这个相当于caffe编译的配置文件,不过可能出现Makefile.config文件权限不够的情况,因此不管有没权限问题,首先修改权限
sudo chmod 777 Makefile.config
sudo gedit Makefile.config
第一个是使用cudnn
#USE_CUDNN := 1
修改成:
USE_CUDNN := 1
第二是补充.opencv 版本(如果使用opencv3的话)
#OPENCV_VERSION := 3
修改为:
OPENCV_VERSION := 3
#WITH_PYTHON_LAYER := 1
修改成:
WITH_PYTHON_LAYER := 1
第四个是修改 python 路径
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 文件(这两个不改都会报错,编译类型错误等等。)
sudo gedit Makefile
接下在Makefile文件中我们进行如下两个修改:
将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:
sudo make all -j12
但是会发现如下错误
这个问题在于CUDA在CUDA architecture setting有版本兼容问题,因此我们再次打开Makefile.config文件进行修改:
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
之后再次进行编译,但在此之前,我们必须讲之前的编译文件清除:
sudo make clean
sudo make all -j12
sudo make test
sudo make runtest -j8
出现上图中的结果,说明编译成功。接下来添加caffe到环境变量,利用gedit命令打开~/.bashrc文件夹,执行以下命令:
sudo gedit ~/.bashrc
export PATHONPATH=/home/xxx/caffe/python/caffe:$PATHONPATH
source ~/.bashrc
之后来编译caffe的python接口,在caffe文件下执行以下命令:
sudo make pycaffe -j8
若出现以下错误:
sudo apt-get install python-numpy
再次运行,可能还会出现缺少skimage库。
执行如下命令:
sudo apt install python-pip
pip install --upgrade pip
pip install -U scikit-image
也可能出现以下问题
输入pip命令报错:
from pip import main ImportError: cannot import name 'main'
修改/usr/bin/pip文件:
sudo gedit /usr/bin/pip
修改内容如下:
//修改前
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 -*-
之后继续运行
sudo pip install -U scikit-image
之后再次import caffe 出现又一个error
ImportError: No module named google.protobuf.internal
解决方法如下:
sudo apt-get install python-protobuf