概要
對於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即可。
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對於庫之間的依賴性太強了。接下來依次輸入以下命令進行安裝英偉達驅動:
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
若出現上圖中的結果則說明英偉達驅動安裝驅動成功。
3 安裝Cuda10.0
在進行安裝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)
接下來進入Cuda官網下載最新的Cuda10.0的安裝包。
下載完成之後,利用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
–
4 安裝Cudnn
進入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
5 安裝Opencv3
雖然當前已經opencv已經更新到4.1版本,但是考慮到opencv4.1版本只出來較短的時間,可能不是很穩定,因此在這裏還是穩妥起見,安裝opencv3.4.6。進入opencv官網下載opencv3.4.6版本,點擊下圖中紅色框進行下載,並等待安裝包下載完成。
在等待安裝包下載完成的同時,我們也安裝opencv相關依賴庫,命令如下:
# 移除先前安裝的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代表你當前系統的用戶名)。之後對安裝包進行解壓,命令如下:
unzip opencv-3.4.6.zip
等待壓縮完成。之後利用cd命令進入解壓之後的文件夾,執行以下命令:
cd opencv-3.4.6
sudo mkdir build # 創建build文件夾
sudo chmod 777 * -R # 修改build文件夾權限,防止之後的編譯失敗
進入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 <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編譯文件:
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庫安裝成功。
6 安裝Caffe
首先聲明下,對於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
若出現以下錯誤:
請安裝numpy,命令如下:
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
之後進入python,導入caffe發現成功了。