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
, 但不不妨這裡再裝一下。首先去下面的連結下載學生版 MKL
https://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。整個機箱風道的構造是,機箱前進風,後、上出風:
機箱風道:
-----------
| ⬅️ ⬆️ |
| ️ ⬅️ |
|----------