【深度教程】Ubuntu16.04 安裝環境配置 (CUDA+cuDNN+OpenCV+Caffe)

Overview

服務器環境:Ubuntu 16.04 Linux media50 4.10.0-30-generic Wed Aug 2 02:13:56 UTC 2017 x86_64 GNU/Linux

所用版本:CUDA 8.0 + cuDNN 6.0 + OpenCV 3.3.0 + Caffe 1.0


CUDA

CUDA Toolkit 8.0 GA2:https://developer.nvidia.com/cuda-80-ga2-download-archive

根據OS和CPU架構選擇對應版本的.run file並下載

安裝NVIDIA顯卡驅動

卸載原有舊版本驅動:(可選)

sudo apt-get remove nvidia* # 需要sudo權限

賦予.run安裝文件執行權限:

sudo chmod a+x NVIDIA-Linux-${***}.run

帶參數運行,以避免出現循環登錄的問題:Ref[5]

sudo ./NVIDIA-Linux-x86_64-375.20.run –no-x-check –no-nouveau-check –no-opengl-files
# –no-x-check 安裝驅動時關閉X服務
# –no-nouveau-check 安裝驅動時禁用nouveau
# –no-opengl-files 只安裝驅動文件,不安裝OpenGL文件

驗證NVIDIA驅動是否安裝成功:

nvidia-smi

安裝CUDA

運行.run file文件:

sudo sh cuda8.0_${***}_linux.run # 需要sudo權限

一直按空格到100%後,輸入accept接受條款;

輸入no不安裝NVIDIA驅動,因爲已經安裝過了;

輸入y安裝cuda8.0工具,回車使用默認路徑安裝cuda8.0工具;

輸入y使用sudo命令,接着輸入密碼;

輸入n不安裝指向/usr/local/cuda的符號連接(也可選擇y安裝符號連接);

輸入y安裝cuda8.0的實例,可以用此來檢驗cuda是否安裝成功,回車選擇默認路徑安裝;

等待cuda安裝成功… Ref[4]

安裝完成後,打開profile文件:

sudo gedit /etc/profile # 需要sudo權限

在末尾處添加(注意不要有空格):

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

測試CUDA安裝

cd /usr/local/cuda-8.0/samples
sudo make all -j8 # 需要sudo權限
cd bin/x86_64/linux/release
./deviceQuery

或者

cd /usr/local/cuda-8.0/samples/1_Utilities/deviceQuery
sudo make -j8 # 需要sudo權限
./deviceQuery

如果顯示一些關於GPU的信息,則說明安裝成功了

查看已安裝CUDA版本

cat /usr/local/cuda/version.txt

cuDNN

免註冊直接下載:http://developer.download.nvidia.com/compute/redist/cudnn/v6.0/cudnn-8.0-linux-x64-v6.0.tgz (v6.0 for CUDA 8.0)

安裝cuDNN

解壓縮:

tar zxvf cudnn-8.0-linux-x64-v${*}.tgz

複製文件至系統目錄:

# 複製頭文件cudnn.h到/usr/local/cuda-8.0/include/目錄下
sudo cp cuda/include/cudnn.h /usr/local/cuda-8.0/include/
# 複製庫文件lib*到/usr/local/cuda-8.0/lib64/目錄下
sudo cp cuda/lib/lib* /usr/local/cuda-8.0/lib64/
# 均需要sudo權限

如果發現文件上有鎖:Ref[4]

sudo chmod 777 ${file} # 賦予文件夾及子文件夾777權限,去掉鎖後再複製

重置讀寫權限:Ref[6]

sudo chmod a+r /usr/local/cuda-8.0/include/cudnn.h

建立符號鏈接

創建並編輯鏈接文件:

sudo gedit /etc/ld.so.conf.d/cuda.conf # 需要sudo權限

增加下面一行:Ref[4]

/usr/local/cuda-8.0/lib64 

最後更新動態鏈接庫:

ldconfig -v

關聯環境變量

編輯.bashrc文件:

gedit ~/.bashrc

添加一行:Ref[6]

export PATH=/usr/local/cuda-8.0/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64:$LD_LIBRARY_PATH
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

更新環境:(需要重啓終端)

source ~/.bashrc

查看已安裝cuDNN版本

cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2

OpenCV

下載對應相同版本的tar.gz源文件

解壓後將opencv_contrib存放在opencv目錄下,以便安裝

卸載舊版本OpenCV (可選)

進入源碼build文件夾uninstall卸載:

cd ${OPENCV/SOURCE/PATH}
cd build
make uninstall

cd ..
rm -r build
sudo rm -r /usr/local/include/opencv2 /usr/local/include/opencv /usr/include/opencv /usr/include/opencv2 /usr/local/share/opencv /usr/local/share/OpenCV /usr/share/opencv /usr/share/OpenCV /usr/local/bin/opencv* /usr/local/lib/libopencv* # 需要sudo權限

後續清理:

# 刪除/usr中所有opencv相關項 Ref[3]
cd /usr/
find . -name "*opencv*" | xargs sudo rm -r

# 移除Python相關
sudo apt-get remove opencv-doc opencv-data python-opencv # 需要sudo權限

安裝OpenCV

針對CUDA 8.0以上版本,修改modules/(gpu)or(cudalegacy)/src/graphcuts.cpp第45行

#if !defined (HAVE_CUDA) || defined (CUDA_DISABLER)

// Ref[1]
#if !defined (HAVE_CUDA) || defined (CUDA_DISABLER) || (CUDART_VERSION >= 8000)

源碼編譯安裝命令:

cd ${OPENCV/SOURCE/PATH}
mkdir build
cd build

# WITHOUT opencv_contrib Ref[2]
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D CUDA_GENERATION=Kepler ..
# WITH opencv_contrib Ref[7]
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D CUDA_GENERATION=Kepler -D OPENCV_EXTRA_MODULES_PATH=${OPENCV/CONTRIB/SOURCE/PATH}/modules -D WITH_EIGEN=OFF ..
# 如果提示缺少ippicv或者protobuf,則下載相應版本放入錯誤提示的目錄內

make -j8 # -jx 分配進程數x
sudo make install # 需要sudo權限

# 更新動態鏈接庫
ldconfig -v

編譯出錯解決方案

  • make 提示出錯 fatal error: opencv2/xfeatures2d/cuda.hpp或nonfree.hpp: No such file or directory

${OPENCV/CONTRIB/SOURCE/PATH}/modules/xfeatures2d/include/opencv2

下內容複製到

${OPENCV/SOURCE/PATH}/modules/features2d/include/opencv2
  • make 提示出錯 fatal error: boostdesc_*bgm_***.i或vgg_generated_***.i: No such file or directory

下載 boostdesc_*bgm_***.i ×7 Ref[8]

依據https://github.com/opencv/opencv_contrib/blob/master/modules/xfeatures2d/cmake/download_boostdesc.cmake

得到下載地址

https://raw.githubusercontent.com/opencv/opencv_3rdparty/34e4206aef44d50e6bbcd0ab06354b52e7466d26/boostdesc_bgm.i

替換末尾文件名即可逐一下載

下載 vgg_generated_***.i ×4

opencv/opencv_3rdparty:https://github.com/opencv/opencv_3rdparty/tree/contrib_xfeatures2d_vgg_20160317

或者

opencv-dlco:https://github.com/cbalint13/opencv-dlco/tree/master/workspace/opencv

下載完成後,可將所有相關文件置於

${OPENCV/SOURCE/PATH}/modules/features2d/include

而後重新make即可

查看已安裝OpenCV版本

pkg-config --modversion opencv

Caffe

git clone或下載tar.gz源文件,並解壓

修改Makefile.config

進入caffe目錄,根據Makefile.config.example複製一份Makefile.config:

cd caffe-1.0
cp Makefile.config.example Makefile.config
gedit Makefile.config

根據內容提示,結合具體情況修改Makefile.config,典型修改示例如下:Ref[9]

  • 應用cuDNN
# USE_CUDNN := 1
↓
USE_CUDNN := 1
  • 應用OpenCV3
# OPENCV_VERSION := 3
↓
OPENCV_VERSION := 3
  • 更改Python lib路徑
PYTHON_LIB := /usr/lib
↓
PYTHON_LIB := /usr/lib/x86_64-linux-gnu
  • 應用Python層接口
# WITH_PYTHON_LAYER := 1
↓
WITH_PYTHON_LAYER := 1
  • 修改include & lib路徑
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文件:

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

這是因爲Ubuntu16.04的文件包含位置發生了變化,尤其是需要用到的hdf5的位置,所以需要更改這一路徑

修改/usr/local/cuda/include/目錄下的host_config.h文件:

#error-- unsupported GNU version! gcc versions later than 5 are not supported!
↓
// #error-- unsupported GNU version! gcc versions later than 5 are not supported!

編譯安裝Caffe

在caffe根目錄下:Ref[11]

cd caffe-1.0
make pycaffe -j8 # 可選
make all -j8
make test -j8
make runtest -j8

各項均是RUN……OK,即表示runtest成功

驗證:MNIST數據集分類測試

具體參見Ref[12],有比較詳細的描述與解釋:

# 將終端定位到Caffe根目錄
cd $CAFFE_ROOT
# 下載MNIST數據庫並解壓縮
./data/mnist/get_mnist.sh # 亦可手動下載 http://yann.lecun.com/exdb/mnist/
# 將其轉換成Lmdb數據庫格式
./examples/mnist/create_mnist.sh
# 訓練網絡
./examples/mnist/train_lenet.sh

訓練一共迭代10000次,最終正確率能夠達到99.07%

在CAFFE_ROOT/examples/mnist/目錄下新生成了lenet_iter_10000.solverstate、lenet_iter_10000.caffemodel、lenet_iter_5000.solverstate、lenet_iter_5000.caffemodel共4個文件

  • 運行create_mnist.sh時出錯:Unable to open file data/mnist/train-images-idx3-ubyte

修改create_mnist.sh中的文件名,使與已下載的文件名保持一致(一般爲 . 與 - 的區別)


References

[1] GraphCut deprecated in CUDA 7.5 and removed in 8.0:https://github.com/opencv/opencv/pull/6510/files

[2] Unsupported gpu architecture ‘compute_11’解決方法:https://blog.csdn.net/sysuwuhongpeng/article/details/45485719

[3] Ubuntu16.04卸載opencv2.4.9並安裝opencv3.2.0+contrib:https://www.cnblogs.com/mar-q/p/7490271.html

[4] Ubuntu16.04安裝cuda及cudnn:https://blog.csdn.net/cdwxx1234/article/details/75121562

[5] 安裝NVIDIA顯卡驅動以及CUDA:https://blog.csdn.net/qq_28413479/article/details/76377184

[6] 最正確的姿勢安裝cudnn,網上大多數教程都太坑了:https://blog.csdn.net/lucifer_zzq/article/details/76675239

[7] ubuntu 下配置opencv3.10問題-Eigen/Eigenvalues: No such file or directory:https://blog.csdn.net/kekong0713/article/details/53674067

[8] fatal error: boostdesc_bgm.i: No such file or directory:https://github.com/opencv/opencv_contrib/issues/1301

[9] Ubuntu 16.04 安裝配置Caffe 圖文詳解:https://www.linuxidc.com/Linux/2016-12/138870p2.htm

[10] Ubuntu16.04 Caffe 安裝步驟記錄(超詳盡):https://blog.csdn.net/yhaolpz/article/details/71375762

[11] Caffe | Installation:http://caffe.berkeleyvision.org/installation.html

[12] Caffe | LeNet MNIST Tutorial:http://caffe.berkeleyvision.org/gathered/examples/mnist.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章