1. 程式人生 > >ubuntu 14.04 從零開始安裝caffe

ubuntu 14.04 從零開始安裝caffe

一、前言

很多人不太喜歡看官方教程,但其實 caffe 的官方安裝指導做的非常好。我在看到 2) 之前,曾根據官方指導在 OSX 10.9, 10.10, Ubuntu 12.04, 14.04 下安裝過 10 多次不同版本的 caffe,都成功了。

本文有不少內容參考了 1)和 2),但又有一些內容與二者不同。例如,2)中對 gcc 進行了降級,而我卻對 gcc 進行了升級;與 2)的安裝順序也有些不同。我按照下面的順序在一臺新買的電腦上安裝 caffe:

安裝 win7/10(略) –> 安裝 ubuntu 14.04(略) –> 升級 gcc 4.9 -> 安裝 nvidia 顯示卡驅動 -> 安裝 cuda

cudnn –> 安裝 anaconda –> 安裝 Opencv 2.4.11 –> 安裝 Matlab –> 安裝 Caffe

我之所以要在裝完系統的第一時間升級 gcc 4.9,是因為 nvidia 的驅動和 cuda 都需要 gcc 進行編譯。如果先安裝驅動和 cuda,再升級 gcc ,那麼有時候會出現問題(我就遇到了)。當然,ubuntu 14.04 自帶的 gcc-4.8 已經夠用了。但我比較喜歡用最新的穩定版,所以就選擇了升級 gcc 4.9

後文將按照上述安裝順序來寫。上述安裝順序還需要做一些調整,以後再慢慢改吧。

二、升級 gcc 4.9

如果只用 ubuntu 14.04 自帶的 gcc-4.8 則本節可以跳過。

sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update
sudo apt-get install gcc-4.9
sudo apt-get install g++-4.9

此時,系統預設使用的還是 gcc 4.8。如果想把 gcc 4.9 設為預設, 必須要重新做一下軟連線

sudo ln -sf /usr/bin/gcc-4.9 /usr/bin/gcc
sudo ln -sf /usr/bin/gcc-ar-4.9 /usr/bin/gcc-ar
sudo ln -sf /usr/bin/gcc-ranlib-4.9 /usr/bin/gcc-ranlib

然後,可以用 gcc -v 來檢視 gcc 的版本。

...
Thread model: posix
gcc version 4.9.2 (Ubuntu 4.9.2-0ubuntu1~14.04) 

注意: 在編譯 matcaffe 介面時,可能會出現警告:

$ make matcaffe -j 8
MEX matlab/+caffe/private/caffe_.cpp
Building with 'g++'.

Warning: You are using gcc version '4.9.2-0ubuntu1~14.04)'. The version of gcc is not supported. The version currently supported with MEX is '4.7.x'. For a list of currently supported compilers see: http://www.mathworks.com/support/compilers/current_release.
MEX completed successfully.

暫且忽略它, 後面我會做一些配置。反正我目前在 ubuntu 14.04 OSX 10.10 兩個系統裡用 gcc-4.9 RCNN 實驗沒遇到問題。

三、安裝 nvidia 顯示卡驅動

如果電腦沒有 nvidia 的顯示卡,此步跳過。

網上的許多教程都指出要進入 tty,然後把 lightdm 關了。但我發現直接用 apt-get 安裝的話,無需關閉 lightdm

sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt-get update
sudo apt-get install nvidia-352 nvidia-settings nvidia-prime

注意:之前的第三方源 xorg-edgers 已經被 ubuntu 和 nvidia 合作的官方源graphics-drivers 代替。現在已經無法通過 xorg-edgers 源來安裝新驅動。見連結: [1], [2]

重啟電腦。

若要安裝其他版本的驅動,則輸入:

# 331 driver
sudo apt-get install nvidia-331

# 334 driver
sudo apt-get install nvidia-334

# install the latest version
sudo apt-get install nvidia-current

安裝完後,輸入 prime-select query 檢視當前正在使用的顯示卡。

$ prime-select query
nvidia

輸入 cat /proc/driver/nvidia/version 檢視正在使用的 nvidia 驅動版本和編譯時採用的 gcc 版本

$ cat /proc/driver/nvidia/version 
NVRM version: NVIDIA UNIX x86_64 Kernel Module  352.30  Tue Jul 21 18:53:45 PDT 2015
GCC version:  gcc version 4.9.2 (Ubuntu 4.9.2-0ubuntu1~14.04) 

雖然 cuda 裡已經包含了 nvidia 驅動,但是根據 caffe 官方指導,cuda 與顯示卡驅動最好分開安裝。

四、安裝 cuda 7.0

如果電腦沒有 nvidia 的顯示卡,此步跳過。有人說即使電腦上沒有 nvidia 顯示卡也必須裝 cuda, 否則會出問題。但我親自實驗過,完全可以不裝 cuda。但必須在 makefile 檔案中把 CPU_ONLY := 1 開啟。並且不能使用 cuda 相關函式。如果使用 cuda 相關函式,則會報錯。

cuda 官方網站 下載對應的 deb包。然後雙擊,在軟體中心裡安裝。此時並沒有完成安裝,deb 包只是告訴系統去哪裡下載 cuda 而已。

Why doesn’t the cuda-repo package install the CUDA Toolkit and Drivers?

When using RPM or Deb, the downloaded package is a repository package. Sucha package only informs the package manager where to find the actual installationpackages, but will not install them.

CUDA_Getting_Started_Linux.pdf

接下來輸入下列命令安裝 cuda:

sudo apt-get update
sudo apt-get install cuda

安裝完成後,再配置環境

export PATH=/usr/local/cuda-7.0/bin:$PATH    
export LD_LIBRARY_PATH=/usr/local/cuda-7.0/lib64:$LD_LIBRARY_PATH    

另外,我發現上面的 export 操作在我電腦上不起作用。所以我直接把 lib64 裡的庫檔案軟連線到了 /usr/local/lib/

PS: 安裝 cuda 後,或許之前安裝的顯示卡驅動會被 cuda 裡的驅動覆蓋掉一部分。此時不妨再次執行顯示卡驅動安裝命令來檢查一下是不是有需要重新安裝的部分:

sudo apt-get install nvidia-352
nvidia-352 is already the newest version.
The following packages were automatically installed and are no longer required:
  account-plugin-windows-live cuda-command-line-tools-7-0 cuda-core-7-0
  cuda-cublas-7-0 cuda-cublas-dev-7-0 cuda-cudart-7-0 cuda-cudart-dev-7-0
  cuda-cufft-7-0 cuda-cufft-dev-7-0 cuda-curand-7-0 cuda-curand-dev-7-0
  cuda-cusolver-7-0 cuda-cusolver-dev-7-0 cuda-cusparse-7-0
  cuda-cusparse-dev-7-0 cuda-documentation-7-0 cuda-driver-dev-7-0
  cuda-license-7-0 cuda-misc-headers-7-0 cuda-npp-7-0 cuda-npp-dev-7-0
  cuda-nvrtc-7-0 cuda-nvrtc-dev-7-0 cuda-samples-7-0 cuda-toolkit-7-0
  cuda-visual-tools-7-0 freeglut3 freeglut3-dev libepoxy0 libevdev2 libllvm3.5
  libxmu-dev libxmu-headers libxt-dev libxvmc1 nvidia-modprobe
Use 'apt-get autoremove' to remove them.
0 upgraded, 0 newly installed, 0 to remove and 313 not upgraded.

五、安裝 cudnn

如果電腦沒有 nvidia 的顯示卡,此步跳過。從官方網站下載 cudnn 後解壓。得到的檔案是 .h .so 檔案。所以,直接把他們拷貝到 /usr/local/include/usr/local/lib/ 下就好了。

sudo cp cudnn.h /usr/local/include
sudo cp libcudnn.so.6.5.48 /usr/local/lib

sudo ln -s /usr/local/lib/libcudnn.so.6.5.48 /usr/local/lib/libcudnn.so.6.5
sudo ln -s /usr/local/lib/libcudnn.so.6.5 /usr/local/lib/libcudnn.so

sudo ldconfig

注意: 檢查一下剛剛拷貝到 /usr/local/lib 下的 libcudnn.so.6.5.48 的檔案許可權。

$ ls -l *cudnn*

lrwxrwxrwx 1 root root       33  8月  4 22:05 libcudnn.so -> /usr/local/lib/libcudnn.so.6.5.48
lrwxrwxrwx 1 root root       18  8月  4 22:09 libcudnn.so.6.5 -> libcudnn.so.6.5.48
-rw------- 1 root root 11172416  8月  2 23:18 libcudnn.so.6.5.48
-rw------- 1 root root 11623922  8月  2 23:19 libcudnn_static.a

從上面的顯示結果可以看到,libcudnn.so.6.5.48 對於 others 使用者是沒有讀取許可權的,這會導致編譯 caffe時出現下列錯誤:

AR -o .build_release/lib/libcaffe.a
LD -o .build_release/lib/libcaffe.so
/usr/bin/ld: cannot find -lcudnn
collect2: error: ld returned 1 exit status
make: *** [.build_release/lib/libcaffe.so] Error 1

解決方法很簡單,只要賦予 others 可讀(寫)許可權即可:

sudo chmod 755 libcudnn.so.6.5.48

六、安裝 anaconda

強烈推薦使用 anaconda python。它裡面集成了很多包,ipython, mkl, numpy等都預裝了, 省去了很多麻煩。如果有 edu 郵箱的話,還可以獲得 anaconda accelerate,在矩陣運算的時候,可以啟用平行計算,速度快很多。

安裝 anaconda:
./Anaconda-2.3.0-Linux-x86_64.sh

安裝 accelerate:
conda update conda
conda install accelerate
conda install iopro

接下來拷貝 anaconda 的許可檔案到使用者主目錄

mv license_academic_20150611072013.txt ~/.continuum

然後升級 ipython, 如果不用 ipython,那就跳過下面這一步:

conda update ipython
conda update ipython-notebook
conda update ipython-qtconsole

下面測試一下 anaconda python 的功能,首先在終端下啟用 ipython-notebook

$ ipython notebook

然後新建一個 ipynb 檔案。在 cell 中輸入

In [1]:  import mkl
         mkl.set_num_threads(4) # 設定最大執行緒數
         mkl.get_max_threads()  # 檢視當前執行緒數

Out[1]:  4

可見 anaconda 已經預裝了 MKL。測一下速度:

In [23]: a = np.random.random((4096, 4096))
         %timeit np.dot(a,a)

         1 loops, best of 3: 6.44 s per loop

七、安裝 Opencv 2.4.11

echo "compiling $1"
if [[ $1 == *.c ]]
then
    gcc -g `pkg-config --cflags opencv`  -o `dirname $1`/`basename $1 .c` $1 `pkg-config --libs opencv`;
elif [[ $1 == *.cpp ]]
then
    g++ -g `pkg-config --cflags opencv` -std=c++11 -std=gnu++11 -o `dirname $1`/`basename $1 .cpp` $1 `pkg-config --libs opencv`;
else
    echo "Please compile only .c or .cpp files"
fi
echo "Output file => ${1%.*}"

將上述程式碼儲存為一個 xxx.sh 檔案,名字自己起。然後在終端裡給該檔案開啟可執行許可權:

sudo chmod 777 xxx.sh

接下來在 .bashrc 中建立一個 alias 來指向 xxx.sh

subl ~/.bashrc

.bashrc 中鍵入

alias opencv="/path/to/xxx.sh"

以後要編譯 opencv 程式的時候,只需要在終端裡輸入 opencv xxx.cpp 即可。無需敲入繁瑣的 pkg-config 前後綴。例如, 直接在終端裡鍵入 opencv 命令,會提示

$ opencv

compiling 
Please compile only .c or .cpp files
Output file => 

其他可選教程:https://nusharex.wordpress.com/2015/06/01/18/快捷安裝指令碼:https://gist.github.com/Coldmooon/c2e146bb7e960556e055

八、安裝 Matlab

安裝 matlab 的過程這裡不贅述,重點說下安裝後做的事:提供兩種方法實現在 terminal 中啟動 matlab:

1) 將 matlab 的可執行程式加入到系統的環境變數中

export PATH="/path/to/matlab:$PATH"

2) 與 opencv 相同,在 .bashrc 中建立一個 matlab alias:

alias matlab='/path/to/matlab'

方法 2) 的優勢是,matlab 在啟動時可以呼叫一些指定的庫檔案。因為,matlab 在啟動時,會優先讀取自帶的 opencv 庫,而不讀取系統中安裝好的 opencv 2.4.11 庫。在這種情況下做 RCNN 的實驗,就可能報錯。

所以我在 Mac OSX 10.10 下,做了如下 alias:

alias rcnn="DYLD_INSERT_LIBRARIES=/usr/local/lib/libopencv_highgui.2.4.dylib:/usr/local/lib/libtiff.5.dylib /Applications/MATLAB_R2014b.app/bin/matlab"

以後要做 Rcnn 實驗的時候,只需要在終端裡輸入 rcnn 就可以啟動 matlab 並優先讀取自己安裝的 opencv 2.4.11 庫。

而在 Ubuntu 14.04 裡,我先建立了一個 matlab 指令碼,用來啟動 matlab:

$ vim matlab.sh

鍵入下面的內容,使用者名稱改成自己的:

export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libstdc++.so.6
/home/your_username/MATLAB/R2014b/bin/matlab

然後按 :wq 儲存。再賦予可執行許可權:

$ sudo chmod 777 matlab.sh

接下來在 .bashrc 中建立一個 alias,指向剛才建立的指令碼:

vim ~/.bashrc

增加:
alias matlab="/path/to/matlab.sh"

以後在終端裡輸入 matlab 即可啟動, 並預先讀取 libstdc++.so.6 這個庫,以防止出現 GLIBCXX_3.4.20 相關錯誤。出錯的原因分析太長了,請看上一篇文章的第 12 ,裡面有詳細記載。

當然,如果在你的電腦上不出錯的話,那就不需要這麼幹了。直接按照本節開頭的 1), 2) 操作即可。

九、安裝 MKL, Openblas or Atlas

– MKL

其實 anaconda 已經自帶了 MKL, 但不不妨這裡再裝一下。首先去下面的連結下載學生版 MKLhttps://software.intel.com/en-us/intel-mkl安裝過程不說了,基本直接下一步就可以了。接下來配置環境:

sudo vim /etc/ld.so.conf.d/intel_mkl.conf

輸入:
/opt/intel/lib/intel64
/opt/intel/mkl/lib/intel64
關閉並儲存檔案。

sudo ldconfig

– Openblas

官方網站 下載 OpenBLAS 的安裝包,解壓。進入安裝目錄,在終端輸入

$ make -j 8

安裝成功之後,繼續在終端輸入

$ make install PREFIX=your_directory

注意,如果這裡自己選擇安裝目錄,則在編譯 Caffe 的時候,會提示找不到 OpenBLAS的庫檔案,此時,需要進一步設定 LD_LIBRARY_PATH 才行。

根據具體的安裝路徑設定:
export LD_LIBRARY_PATH=/opt/OpenBLAS/lib

– Atlas

sudo apt-get install libatlas-base-dev

十、安裝 Boost

進入 Boost 的官方網站 http://www.boost.org/ 下載安裝包。按照官方指南進行安裝。最簡單的方法是直接在 ubuntu 的軟體倉庫裡搜尋 libboost。也在可以用 apt-get 安裝:

sudo apt-get install libboost-all-dev

其實這一步可以放到下一節來做。 ————————————————-

十一、其他依賴庫

按照 官方指南 進行:

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 libgflags-dev libgoogle-glog-dev liblmdb-dev

安裝過 anaconda 的話,那 libhdf5-serial-dev 可以不裝。如果編譯時提示找不到 hdf5 的庫。就把 anaconda/lib 加到 ld.so.conf 中去。

$ sudo vim /etc/ld.so.conf

新增一行,使用者名稱改為你自己的:
/home/your_username/anaconda/lib
關閉並儲存檔案。

$ sudo ldconfig

十二、編輯 Caffe makefile 檔案:

重點要改的地方,電腦有 nvidia 顯示卡的配置:

# cuDNN acceleration switch (uncomment to build with cuDNN).
USE_CUDNN := 1

# CPU-only switch (uncomment to build without GPU support).
# CPU_ONLY := 1

# To customize your choice of compiler, uncomment and set the following.
# N.B. the default for Linux is g++ and the default for OSX is clang++
# CUSTOM_CXX := g++

# CUDA directory contains bin/ and lib/ directories that we need.
CUDA_DIR := /usr/local/cuda
# On Ubuntu 14.04, if cuda tools are installed via
# "sudo apt-get install nvidia-cuda-toolkit" then use this instead:
# CUDA_DIR := /usr

# CUDA architecture setting: going with all of them.
# For CUDA < 6.0, comment the *_50 lines for compatibility.
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_50,code=compute_50

# BLAS choice:
# atlas for ATLAS (default)
# mkl for MKL
# open for OpenBlas
BLAS := mkl
# Custom (MKL/ATLAS/OpenBLAS) include and lib directories.
# Leave commented to accept the defaults for your choice of BLAS
# (which should work)!
# BLAS_INCLUDE := /path/to/your/blas
# BLAS_LIB := /path/to/your/blas

# MATLAB directory should contain the mex binary in /bin.
MATLAB_DIR := /home/your_username/MATLAB/R2014b
# MATLAB_DIR := /Applications/MATLAB_R2012b.app

# 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)/anaconda
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

# Uncomment to support layers written in Python (will link against Python libs)
# WITH_PYTHON_LAYER := 1

電腦沒有 nvidia 顯示卡的配置:

# cuDNN acceleration switch (uncomment to build with cuDNN).
# USE_CUDNN := 1

# CPU-only switch (uncomment to build without GPU support).
CPU_ONLY := 1

# To customize your choice of compiler, uncomment and set the following.
# N.B. the default for Linux is g++ and the default for OSX is clang++
# CUSTOM_CXX := g++

# CUDA directory contains bin/ and lib/ directories that we need.
# CUDA_DIR := /usr/local/cuda
# On Ubuntu 14.04, if cuda tools are installed via
# "sudo apt-get install nvidia-cuda-toolkit" then use this instead:
# CUDA_DIR := /usr

# CUDA architecture setting: going with all of them.
# For CUDA < 6.0, comment the *_50 lines for compatibility.
# 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_50,code=compute_50

...

其餘部分保持不變

接下來編譯。

十三、編譯

在終端下輸入:

$ make all -j 8
$ make test -j 8
$ make runtest -j 8

接下來編譯 python 介面和 matlab 介面:

$ make pycaffe -j 8
$ make matcaffe -j 8

在編譯過程中如果遇到錯誤,可以在上一篇文章裡搜尋一下。

十四、散熱系統(建議不要跳過本節內容)

無論是做計算,還是玩遊戲,散熱都是極其重要的。CPU 或 GPU 的溫度一旦達到了設定的閾值,它們就開始自動降頻。於是 i7 變賽揚,Titan X 變集顯。。所以,如果不好好處理,散熱系統很容易成為整個電腦效能的瓶頸。

現在主流的散熱方式是風冷和水冷。水冷的效果好,靜音,但是成本高,需要一定的動手能力。風冷要便宜一些,但是噪音大,並且需要高檔點的機箱來構造風道。大部分人使用的還是風冷。所以接下來重點講一下 Nvidia GPU 的風冷。

– GPU 的風冷:大家用的一般都是 nvidia 的遊戲卡,例如 Titan X。這類顯示卡主要為遊戲優化,其 BIOS 的溫度閾值設定並不適合深度學習。所以,我們必須自己控制風扇速度。在 windows 下控制溫度閾值很簡單,一般正規的廠商,如華碩、技嘉、微星,都會配送顯示卡超頻軟體,可以自己 “畫” 溫控曲線。而在 Ubuntu 14.04 下控制風扇轉速就要稍微麻煩些:

Ubuntu 14.04 下控制顯示卡風扇轉速有兩種方法: 1. 刷修改版的 BIOS,改變溫度閾值; 2. 將 xorg.conf 檔案的 coolbits 欄位開啟。

介紹第二種方法:

首先開啟 coolbits 欄位。裝好 nvidia 顯示卡驅動後,在終端下輸入:

$ sudo nvidia-xconfig

這時,會在 /etc/X11/ 下自動生成 xorg.conf 檔案。我們要做的就是在 xorg.conf 檔案裡,給 coolbits 欄位設定一個值。於是,在終端下輸入:

$ cd /etc/X11
$ sudo nvidia-xconfig --cool-bits=28

重啟電腦。然後在終端下輸入:

$ nvidia-settings

這時會開啟顯示卡控制介面,在 Thermal Settings 選項卡中,可以通過滑塊來控制風扇的轉速。令 coolbits=28 的原因是:

4(開啟 GPU 風扇控制功能)
+
8(啟用調節時鐘頻率功能,也就是允許超頻)
+
16(`nvidia-settings` 的命令列介面可以給 GPU 增加電壓) 
= 
28(超頻太猛的話,可能會燒壞你的顯示卡)...

除了在顯示卡控制介面裡修改風扇轉速外,還可以使用命令列控制,這在用 SSH 遠端登入時非常有用:

查詢顯示卡當前狀態
nvidia-smi

僅僅讀取 GPU 溫度:
nvidia-smi --query-gpu=temperature.gpu --format=csv,noheader

查詢與 GPU 風扇相關的關鍵字,例如風扇的轉速等
nvidia-settings -q all | grep Fan

設定風扇轉速
nvidia-settings -a "[gpu:0]/GPUFanControlState=1" -a "[fan:0]/GPUTargetFanSpeed=70" 

– CPU 的風冷Haswell 架構的 CPU 能耗做的不是很好,普遍發熱都很嚴重。如果用 i7 4790k 做計算的話,一般的散熱器都壓不住溫度。不用水冷的話,可以選大霜塔或貓頭鷹等散熱器。次一點的可以選玄冰400。整個機箱風道的構造是,機箱前進風,後、上出風:

機箱風道:
-----------
| ⬅️ ⬆️    |
| ️      ⬅️ |
|----------