Ubuntu16.04 Caffe 安裝步驟記錄(超詳盡)

2021-04-03 08:00:04

歷時一週終於在 ubuntu16.04 系統成功安裝 caffe 並編譯,網上有很多教學,但是某些步驟並沒有講解詳盡,導致設定過程總是出現各種各樣匪夷所思的問題,尤其對於新手而言更是欲哭無淚,在我飽受折磨後決定把安裝步驟記錄下來,儘量詳盡清楚明白,避免後來小白重蹈覆轍。

安裝硬體: intel i5 + NVIDIA 740 M

安裝流程細分為如下10個步驟,細化步驟粒度更易避免出錯:

1、安裝依賴包
2、禁用 nouveau
3、設定環境變數
4、下載 CUDA 8.0
5、安裝 CUDA 8.0
6、驗證 CUDA 8.0 是否安裝成功
7、安裝 cudnn
8、安裝 opencv3.1
9、安裝 caffe
10、安裝 pycaffe notebook 介面環境

第1步 安裝依賴包

安裝後續步驟或環境必需的依賴包,依次輸入以下命令:

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

有一定機率安裝失敗而導致後續步驟出現問題,所以要確保以上依賴包都已安裝成功,驗證方法就是重新執行安裝命令,如驗證 git cmake build-essential是否安裝成功共則再次執行以下命令:

 sudo apt-get install git cmake build-essential 

介面提示如下則說明已成功安裝依賴包,否則繼續安裝直到安裝成功。

yhao@yhao-X550VB:~$ sudo apt-get install git cmake build-essential
正在讀取軟體包列表... 完成
正在分析軟體包的依賴關係樹       
正在讀取狀態資訊... 完成       
build-essential 已經是最新版 (12.1ubuntu2)。
cmake 已經是最新版 (3.5.1-1ubuntu3)。
git 已經是最新版 (1:2.7.4-0ubuntu1.1)。
下列軟體包是自動安裝的並且現在不需要了:
  lib32gcc1 libc6-i386
使用'sudo apt autoremove'來解除安裝它(它們)。
升級了 0 個軟體包,新安裝了 0 個軟體包,要解除安裝 0 個軟體包,有 94 個軟體包未被升級。

第2步 禁用 nouveau

安裝好依賴包後需要禁用 nouveau,只有在禁用掉 nouveau 後才能順利安裝 NVIDIA 顯示卡驅動,禁用方法就是在 /etc/modprobe.d/blacklist-nouveau.conf 檔案中新增一條禁用命令,首先需要開啟該檔案,通過以下命令開啟:

sudo gedit /etc/modprobe.d/blacklist-nouveau.conf

開啟後發現該檔案中沒有任何內容,寫入:

blacklist nouveau option nouveau modeset=0 

儲存時命令視窗可能會出現以下提示:

** (gedit:4243): WARNING **: Set document metadata failed: 不支援設定屬性 metadata::gedit-position

無視此提示~,儲存後關閉檔案,注意此時還需執行以下命令使禁用 nouveau 真正生效:

sudo update-initramfs -u

第3步 設定環境變數

同樣使用 gedit 命令開啟組態檔:

sudo gedit ~/.bashrc

開啟後在檔案最後加入以下兩行內容:

export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH

export LD_LIBRARY_PATH=/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH 

儲存退出。

第4步 下載 CUDA 8.0

進入 https://developer.nvidia.com/cuda-downloads ,依次選擇 CUDA 型別然後下載即可。
這裡寫圖片描述

第5步 安裝 CUDA 8.0

第四步下載的1.4G的 CUDA中包含有 nvidia 顯示卡驅動,故此步驟 CUDA 的安裝包括了 nvidia 顯示卡驅動的安裝,此時注意你是否已經安裝過 nvidia 顯示卡驅動,若無法保證已安裝的 nvidia 顯示卡驅動一定正確,那就解除安裝掉之前安裝的 nvidia 顯示卡驅動(解除安裝方法連結),然後開始安裝 CUDA 8.0;若可以保證已安裝正確的 nvidia 顯示卡驅動,則直接開始安裝 CUDA 8.0,在安裝過程中選擇不再安裝 nvidia 顯示卡驅動。

為了方便開始安裝過程的路徑查詢,把下載的 CUDA 安裝檔案移動到 HOME 路徑下,然後通過 Ctrl + Alt + F1 進入文字模式,輸入帳號密碼登入,通過 Ctrl + Alt + F7 可返回圖形化模式,在文字模式登入後首先關閉桌面服務:

sudo service lightdm stop

然後通過 Ctrl + Alt + F7 發現已無法成功返回圖形化模式,說明桌面服務已成功關閉,注意此步對接下來的 nvidia 驅動安裝尤為重要,必需確保桌面服務已關閉。

Ctrl + Alt + F1 進入文字模式,然後執行 CUDA 安裝檔案進行安裝,之前我們已經把 CUDA 安裝檔案移動至 HOME,直接通過 sh 命令執行安裝檔案即可:

sudo sh cuda_8.0.61_375.26_linux.run --no-opengl-libs

其中 cuda_8.0.61_375.26_linux.run 是我的 CUDA 安裝檔名,而你需替換為自己的 CUDA 安裝檔名,若此時忘記可直接通過 ls 檔案檢視檔名,這也是我建議把 CUDA 安裝檔案移動到 HOME 下的另一個原因。

執行此命令約1分鐘後會出現 0%資訊,此時長按確認鍵讓此百分比增長,直到100%,然後按照提示操作即可,先輸入 accept ,然後讓選擇是否安裝 nvidia 驅動,這裡的選擇對應第5步開頭,若未安裝則輸入 「y」,若確保已安裝正確驅動則輸入「n」。

剩下的選擇則都輸入「y」確認安裝或確認預設路徑安裝,開始安裝,此時若出現安裝失敗提示則可能為未關閉桌面服務或在已安裝 nvidia 驅動的情況下重複再次安裝 nvidia 驅動,安裝完成後輸入重新啟動命令重新啟動:

reboot

重新啟動後登入進入系統,設定 CUDA 環境變數,與第3步相同,使用 gedit 命令開啟組態檔:

sudo gedit ~/.bashrc

在該檔案最後加入以下兩行並儲存:

export PATH=/usr/local/cuda-8.0/bin:$PATH

export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH

使該設定生效:

source ~/.bashrc

第6步 驗證 CUDA 8.0 是否安裝成功

分別執行以下命令:

cd /usr/local/cuda-8.0/samples/1_Utilities/deviceQuery

sudo make

./deviceQuery

若看到類似以下資訊則說明 cuda 已安裝成功:

./deviceQuery Starting...

 CUDA Device Query (Runtime API) version (CUDART static linking)

Detected 1 CUDA Capable device(s)

Device 0: "GeForce GT 740M"
  CUDA Driver Version / Runtime Version          8.0 / 8.0
  CUDA Capability Major/Minor version number:    3.5
  Total amount of global memory:                 2004 MBytes (2100953088 bytes)
  ( 2) Multiprocessors, (192) CUDA Cores/MP:     384 CUDA Cores
  GPU Max Clock rate:                            1032 MHz (1.03 GHz)
  Memory Clock rate:                             800 Mhz
  Memory Bus Width:                              64-bit
  L2 Cache Size:                                 524288 bytes
  Maximum Texture Dimension Size (x,y,z)         1D=(65536), 2D=(65536, 65536), 3D=(4096, 4096, 4096)
  Maximum Layered 1D Texture Size, (num) layers  1D=(16384), 2048 layers
  Maximum Layered 2D Texture Size, (num) layers  2D=(16384, 16384), 2048 layers
  Total amount of constant memory:               65536 bytes
  Total amount of shared memory per block:       49152 bytes
  Total number of registers available per block: 65536
  Warp size:                                     32
  Maximum number of threads per multiprocessor:  2048
  Maximum number of threads per block:           1024
  Max dimension size of a thread block (x,y,z): (1024, 1024, 64)
  Max dimension size of a grid size    (x,y,z): (2147483647, 65535, 65535)
  Maximum memory pitch:                          2147483647 bytes
  Texture alignment:                             512 bytes
  Concurrent copy and kernel execution:          Yes with 1 copy engine(s)
  Run time limit on kernels:                     No
  Integrated GPU sharing Host Memory:            No
  Support host page-locked memory mapping:       Yes
  Alignment requirement for Surfaces:            Yes
  Device has ECC support:                        Disabled
  Device supports Unified Addressing (UVA):      Yes
  Device PCI Domain ID / Bus ID / location ID:   0 / 1 / 0
  Compute Mode:
     < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) >

deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 8.0, CUDA Runtime Version = 8.0, NumDevs = 1, Device0 = GeForce GT 740M
Result = PASS

第7步 安裝 cudnn

登入官網:https://developer.nvidia.com/rdp/cudnn-download ,下載對應 cuda 版本且 linux 系統的 cudnn 壓縮包,注意官網下載 cudnn 需要註冊帳號並登入,不想註冊的可從我的網路硬碟下載:https://pan.baidu.com/s/1c2xPVzy

這裡寫圖片描述

下載完成後解壓,得到一個 cudn 資料夾,該資料夾下include 和 lib64 兩個資料夾,命令列進入 cudn/include 路徑下,然後進行以下操作:

sudo cp cudnn.h /usr/local/cuda/include/ #複製標頭檔案

然後命令列進入 cudn/lib64 路徑下,執行以下命令:

sudo cp lib* /usr/local/cuda/lib64/ #複製動態連結庫
cd /usr/local/cuda/lib64/sudo rm -rf libcudnn.so libcudnn.so.5 #刪除原有動態檔案
sudo ln -s libcudnn.so.5.1.10 libcudnn.so.5 #生成軟銜接
sudo ln -s libcudnn.so.5 libcudnn.so #生成軟連結

這裡需要注意第三行命令,網上有人的第三行命令為:

sudo ln -s libcudnn.so.5.1.5 libcudnn.so.5 #生成軟銜接

起初我執行的也是上條連結 libcudnn.so.5.1.5 的命令,但是後面編譯caffe時出錯,報錯內容為 /usr/bin/ld: 找不到 -lcudnn,所以這裡需要先檢視一下自己應該連結的是 libcudnn.so.5.1.10 還是 libcudnn.so.5.1.5 ,檢視方法為下:

locate libcudnn.so

我執行完後顯示如下:

yhao@yhao-X550VB:~$ locate libcudnn.so
/home/yhao/.local/share/Trash/files/libcudnn.so
/home/yhao/.local/share/Trash/files/libcudnn.so.5
/home/yhao/.local/share/Trash/files/libcudnn.so.5.1.10
/home/yhao/.local/share/Trash/files/cuda/lib64/libcudnn.so
/home/yhao/.local/share/Trash/files/cuda/lib64/libcudnn.so.5
/home/yhao/.local/share/Trash/files/cuda/lib64/libcudnn.so.5.1.10
/home/yhao/.local/share/Trash/info/libcudnn.so.5.1.10.trashinfo
/home/yhao/.local/share/Trash/info/libcudnn.so.5.trashinfo
/home/yhao/.local/share/Trash/info/libcudnn.so.trashinfo
/home/yhao/cuda/lib64/libcudnn.so
/home/yhao/cuda/lib64/libcudnn.so.5
/home/yhao/cuda/lib64/libcudnn.so.5.1.10
/usr/local/lib/libcudnn.so
/usr/local/lib/libcudnn.so.5

可以看到我的檔案是 libcudnn.so.5.1.10 ,並沒有 libcudnn.so.5.1.5,所以第三行命令我連結的是 libcudnn.so.5.1.10 ,這裡第三行連結命令視你的檢視結果而定。

安裝完成後可用 nvcc -V 命令驗證是否安裝成功,若出現以下資訊則表示安裝成功:

yhao@yhao-X550VB:~$ nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2016 NVIDIA Corporation
Built on Tue_Jan_10_13:22:03_CST_2017
Cuda compilation tools, release 8.0, V8.0.61

第8步 安裝 opencv3.1

進入官網 : http://opencv.org/releases.html , 選擇 3.1.0 版本的 source , 下載 opencv-3.1.0.zip
這裡寫圖片描述

解壓到你要安裝的位置,命令列進入已解壓的資料夾 opencv-3.1.0 目錄下,執行:

mkdir build # 建立編譯的檔案目錄

cd build

cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..

make -j8  #編譯

在執行 make -j8 命令編譯到 92% 時可能會出現以下錯誤:

modules/cudalegacy/src/graphcuts.cpp:120:54: error: 
‘NppiGraphcutState’ has not been declared
typedef NppStatus (*init_func_t)(NppiSize oSize, 
NppiGraphcutState** ppState, Npp8u* pDeviceMem);

這是由於opecv3.1與cuda8.0不相容導致的。解決辦法:

修改 /opencv-3.1.0/modules/cudalegacy/src/graphcuts.cpp 檔案內容,如圖:
這裡寫圖片描述

編譯成功後安裝:

sudo make install #安裝

安裝完成後通過檢視 opencv 版本驗證是否安裝成功:

pkg-config --modversion opencv  

第9步 安裝 caffe

首先在你要安裝的路徑下 clone :

git clone https://github.com/BVLC/caffe.git

進入 caffe ,將 Makefile.config.example 檔案複製一份並更名為 Makefile.config ,也可以在 caffe 目錄下直接呼叫以下命令完成複製操作 :

sudo cp Makefile.config.example Makefile.config

複製一份的原因是編譯 caffe 時需要的是 Makefile.config 檔案,而Makefile.config.example 只是caffe 給出的組態檔例子,不能用來編譯 caffe。

然後修改 Makefile.config 檔案,在 caffe 目錄下開啟該檔案:

sudo gedit Makefile.config

修改 Makefile.config 檔案內容:

1.應用 cudnn

將
#USE_CUDNN := 1
修改成: 
USE_CUDNN := 1

2.應用 opencv 版本

將
#OPENCV_VERSION := 3 
修改為: 
OPENCV_VERSION := 3

3.使用 python 介面

將
#WITH_PYTHON_LAYER := 1 
修改為 
WITH_PYTHON_LAYER := 1

4.修改 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       

這裡貼出 我的Makefile.config檔案 方便大家參考

然後修改 caffe 目錄下的 Makefile 檔案:

將:
NVCCFLAGS +=-ccbin=$(CXX) -Xcompiler-fPIC $(COMMON_FLAGS)
替換為:
NVCCFLAGS += -D_FORCE_INLINES -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)
將:
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

然後修改 /usr/local/cuda/include/host_config.h 檔案 :

將
#error-- unsupported GNU version! gcc versions later than 4.9 are not supported!
改為
//#error-- unsupported GNU version! gcc versions later than 4.9 are not supported!

OK ,可以開始編譯了,在 caffe 目錄下執行 :

make all -j8

這是如果之前的設定或安裝出錯,那麼編譯就會出現各種各樣的問題,所以前面的步驟一定要細心。

編譯成功後可執行測試:

sudo make runtest -j8

這裡寫圖片描述

如果顯示結果為上圖所示,則表示 caffe 已經成功安裝。

10、安裝 pycaffe notebook 介面環境

在上一步成功安裝 caffe 之後,就可以通過 caffe 去做訓練資料集或者預測各種相關的事了,只不過需要在命令列下通過 caffe 命令進行操作,而這一步 pycaffe 的安裝以及 notebook 環境設定只是為了更方便的去使用 caffe ,實際上大多數都是通過 python 來操作 caffe 的,而 notebook 使用瀏覽器作為介面,可以更方便的編寫和執行 python 程式碼。

首先編譯 pycaffe :

cd caffe

sudo make pycaffe -j8

以下是我編譯 pycaffe 時出現的錯誤:

python/caffe/_caffe.cpp:10:31: fatal error: numpy/arrayobject.h: 沒有那個檔案或目錄

解決方法:

sudo apt-get install python-numpy

此外也可能是由於 Makefile.config 檔案中 python 路徑設定錯誤出現的錯誤,可根據上一步檢查一下,也可能出現別的錯誤,百度谷歌之~

編譯 pycaffe 成功後,驗證一下是否可以在 python 中匯入 caffe 包,首先進入 python 環境:

python

然後匯入 caffe :

>>> import caffe

若不報錯則表示 caffe 的 python 介面已正確編譯,但是應該不會那麼順利,以下是我匯入 caffe 時出現的錯誤:

錯誤1:

File "<stdin>", line 1, in <module>   ImportError: No module named caffe

解決方法:

sudo echo export PYTHONPATH="~/caffe/python" >> ~/.bashrc

source ~/.bashrc

錯誤2:

ImportError: No module named skimage.io

解決方法:

pip install -U scikit-image #若沒有安裝pip: sudo apt install python-pip

ok,最後一步,設定notebook環境

首先要安裝python介面依賴庫,在caffe根目錄的python資料夾下,有一個requirements.txt的清單檔案,上面列出了需要的依賴庫,按照這個清單安裝就可以了。

在安裝scipy庫的時候,需要fortran編譯器(gfortran),如果沒有這個編譯器就會報錯,因此,我們可以先安裝一下。

首先進入 caffe/python 目錄下,執行安裝程式碼:

sudo apt-get install gfortran

for req in $(cat requirements.txt); do sudo pip install $req; done

安裝完成以後執行:

sudo pip install -r requirements.txt

就會看到,安裝成功的,都會顯示Requirement already satisfied, 沒有安裝成功的,會繼續安裝。

然後安裝 jupyter :

sudo pip install jupyter

安裝完成後執行 notebook :

jupyter notebook

或

ipython notebook

就會在瀏覽器中開啟notebook, 點選右上角的New-python2, 就可以新建一個網頁一樣的檔案,擴充套件名為ipynb。在這個網頁上,我們就可以像在命令列下面一樣執行python程式碼了。輸入程式碼後,按shift+enter執行,更多的快捷鍵,可點選上方的help-Keyboard shortcuts檢視,或者先按esc退出編輯狀態,再按h鍵檢視。

這裡寫圖片描述

為心儀公司折騰DL許久然而並無緣~

加油。

參考文章:

http://www.cnblogs.com/denny402/p/5088399.html

http://blog.csdn.net/sunpeng19960715/article/details/54835148