1. 程式人生 > 實用技巧 >ubuntu16安裝cuda,cudnn,gpu版opencv

ubuntu16安裝cuda,cudnn,gpu版opencv

1,安裝預操作

1,有木有顯示卡

##檢視有沒有顯示卡
lspci | grep -i nvidia

返回:看不大懂,大意是有的

01:00.0 VGA compatible controller: NVIDIA Corporation Device 1c82 (rev a1)
01:00.1 Audio device: NVIDIA Corporation Device 0fb9 (rev a1)

2,檢視是不是受到支援的系統

uname -m && cat / etc / * release
##返回:x86_64...大約是沒問題

3,檢視是否有gcc

gcc --version
#c語言編譯器,我理解的

4,檢視核心標頭

uname -r    ##返回:4.15.0-54-generic

話說,核心的標頭檔案和開發包好像還可以安裝,命令如下:

sudo apt-get install linux-headers  - $(uname -r)

我自己執行的時候返回的資訊是這樣的,估計是沒裝,原版沒問題

返回:
正在讀取軟體包列表... 完成
正在分析軟體包的依賴關係樹       
正在讀取狀態資訊... 完成       
注意,根據正則表示式 '4.15.0-54-generic' 選中了 'linux-modules-extra-4.15.0-54-generic'
注意,根據正則表示式 
'4.15.0-54-generic' 選中了 'linux-image-unsigned-4.15.0-54-generic' 注意,根據正則表示式 '4.15.0-54-generic' 選中了 'linux-modules-4.15.0-54-generic' 注意,根據正則表示式 '4.15.0-54-generic' 選中了 'linux-headers-4.15.0-54-generic' 注意,根據正則表示式 '4.15.0-54-generic' 選中了 'linux-image-4.15.0-54-generic' 虛擬軟體包 linux-headers 由下面的軟體包提供: linux
-headers-4.15.0-29-generic 4.15.0-29.31~16.04.1 linux-headers-4.15.0-54-generic 4.15.0-54.58~16.04.1 linux-headers-4.4.0-21-lowlatency 4.4.0-21.37 linux-headers-4.4.0-21-generic 4.4.0-21.37 請您明確地選擇安裝其中一個。 E: 軟體包 linux-headers 沒有可安裝候選

2,開始安裝cuda

安裝新的之前,要徹底解除安裝原版,我自己新裝的16.04的系統第一次裝cuda,所以不知道咋解除安裝,有需求的小夥伴們自己想辦法解除安裝吧

裝驅動:

sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install nvidia-410    
#本人在裝其中一個的時候有報錯,後經過修改原始檔以後,安裝成功了,修改原始檔請先備份。自己找找教程吧。我的教程連結失效了
sudo reboot
nvidia-settings
##返回:nvidia英偉達驅動介面
##以上程式碼的意思是:加入英偉達官方ppa源,重新整理軟體庫並且更新驅動,安裝本地下載的410驅動,檢視是否安裝成功,重啟

裝cuda,軟體包自己下吧:

sudo dpkg -i cuda-repo-ubuntu1604-10-0-local-10.0.130-410.48_1.0-1_amd64.deb
#安裝deb包
sudo apt-key add /var/cuda-repo-10-0-local-10.0.130-410.48/7fa2af80.pub
#選擇本地倉庫進行安裝時安裝gpg的金鑰,返回ok
sudo apt-get update
sudo apt-get install cuda

cuda新增到環境變數:參考教程

vim .bashrc  ##編輯.bashrc檔案,在最後一行添上:export PATH=$PATH:/usr/local/cuda-10.0/bin 等號兩邊沒空格,儲存
##重啟終端,輸入echo $PATH得到想要的環境變數
##後來又在bashrc中加入了兩行:
##總之bashrc的最後三行現在是這樣的:
export PATH=$PATH:/usr/local/cuda-10.0/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-10.0/lib64
export CUDA_HOME=$CUDA_HOME:/usr/local/cuda-10.0

如何證明cuda安裝成功:

nvcc --version
#返回:
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2018 NVIDIA Corporation
Built on Sat_Aug_25_21:08:01_CDT_2018
Cuda compilation tools, release 10.0, V10.0.130

3,安裝cudnn

##cuda和cudnn是對應起來的,別的不知,cuda10對應的是cudnn7.5
tar xvf cudnn-10.0-linux-x64-v7.5.0.56.tar
sudo cp cuda/include/cudnn.h /usr/local/cuda-10.0/include/
sudo cp cuda/lib64/* /usr/local/cuda-10.0/lib64/
#基本內容是解壓cudnn的tar包。然後把需要的標頭檔案,庫檔案等複製到該有的地方去

安裝成功:

cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2
##返回:
#define CUDNN_MAJOR 7
#define CUDNN_MINOR 5
#define CUDNN_PATCHLEVEL 0
--
#define CUDNN_VERSION (CUDNN_MAJOR * 1000 + CUDNN_MINOR * 100 + CUDNN_PATCHLEVEL)

4,安裝opencv4.1(注意,先下載好opencv4.1和opencv4.1_contrib,這倆是嚴格對應的)

opencv依賴:

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  
#一通裝以後沒報錯

安裝opencv:

cd ~/daqing_opencv/opencv-4.1.0/build
##如果沒有build就建一個,執行:
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local .. 

不好意思,這個不行,因為我想裝的是支援gpu的opencv,而cmake的過程中沒有:NVIDIA CUDA: YES 的字樣,而且gpu支援的opencv需要contrib模組,所以我們必需要指定。

rm -rf *    #情空剛剛編譯的資料,重灌
##執行: cmake
-D CMAKE_BUILD_TYPE=RELEASE -D INSTALL_C_EXAMPLES=ON -D INSTALL_PYTHON_EXAMPLES=ON -D OPENCV_EXTRA_MODULES_PATH=/home/center/daqing_opencv/opencv_contrib-4.1.0/modules -D BUILD_EXAMPLES=ON -D BUILD_opencv_python2=OFF -D BUILD_opencv_python3=ON -D WITH_FFMPEG=ON -D WITH_LIBV4L=ON -D WITH_GTK=ON -D WITH_OPENGL=ON -D WITH_ZLIB=ON -D BUILD_PNG=ON -D BUILD_JPEG=ON -D BUILD_TIFF=ON -D WITH_CUDA=ON -D WITH_OPENCL=ON -D ENABLE_FAST_MATH=1 -D CUDA_FAST_MATH=1 -D WITH_CUBLAS=1 -D WITH_LAPACK=OFF -DCMAKE_INSTALL_PREFIX=/usr/local -DPYTHON3_EXECUTABLE=$(which python) -DPYTHON3_INCLUDE_DIR=$(python -c "from distutils.sysconfig import get_python_inc; print(get_python_inc())") -DPYTHON3_PACKAGES_PATH=$(python -c "from distutils.sysconfig import get_python_lib; print(get_python_lib())") ..

返回結果中,有一段是這樣的:

這次返回的結果中有一段是這樣的:

--   NVIDIA CUDA:                   YES (ver 10.0, CUFFT CUBLAS FAST_MATH)
--     NVIDIA GPU arch:             30 35 37 50 52 60 61 70 75
--     NVIDIA PTX archs:
-- 
--   OpenCL:                        YES (no extra features)
--     Include path:                /home/center/daqing_opencv/opencv-4.1.0/3rdparty/include/opencl/1.2
--     Link libraries:              Dynamic load
-- 
--   Python 3:
--     Interpreter:                 /usr/bin/python (ver 3.5.2)
--     Libraries:                   /usr/lib/x86_64-linux-gnu/libpython3.5m.so (ver 3.5.2)

很明顯這就基本看起來沒問題了,注意編譯的時候的幾個引數:

OPENCV_EXTRA_MODULES_PATH=‘...’ 指定contrib模組位置

BUILD_opencv_python3=ON 想要python3可以import cv2的話就選它

CMAKE_INSTALL_PREFIX='...' 庫檔案和標頭檔案生成在哪裡,其他引數不細說了

##編譯完了,裝吧
make -j8    #8個程序一塊裝100%,貌似成功
sudo make install
##如何證明成功了
python3中可以 import cv2並且列印版本,估計是可以了

5,開發自己的專案去了

g++ test.cpp -o test `pkg-config --cflags --libs opencv`
這樣編譯的opencv應該是能跑起來,但是很悲催的是。這個跑得版本不是我自己安裝的版本,鬼知道這個opencv 2.4.9.1是個啥
pkg-config --cflags --libs opencv
打出來一堆庫和目錄,得,那我自己的檔案在哪裡呢?編譯的時候我寫了一個引數,-D CMAKE_INSTALL_PREFIX=/usr/local,實踐證明,它在我的/usr/local中,包括lib,share,include等。總之剛生成檔案就是opencv的。
那麼,只剩下兩個問題了,一,改pkg的配置 二,g++編譯的時候指到lib和include中,加油

首先用4.1.0執行一個最簡單的顯示圖片的程式,顯示圖片的原始碼是test1.out
系統自帶的opencv2.4編譯是這樣的:g++ test1.cpp `pkg-config --cflags --libs opencv` -o test1.out
而opencv4.1.0的編譯命令是這樣的:

g++ test1.cpp -I /usr/local/include/opencv4 -L /usr/local/lib/*.so -o test2.out -std=c++11

但是這樣並不能直接執行,因為缺少動態庫,所謂缺少倒不是真的缺少,而是不在環境變數或者說是當前資料夾下,所以我的解決方法是把opencv4的lib庫新增到環境變數中去,新增方式:

sudo vim /etc/ld.so.conf
在其中新增一句 /usr/local/lib 儲存,
使剛剛的配置生效:sudo ldconfig
(插一句,系統提示/sbin/ldconfig.real: /usr/local/cuda-10.0/targets/x86_64-linux/lib/libcudnn.so.7 不是符號連線
不明所以,故而忽略)

基本的程式能跑起來啦,耶耶耶!其實用cmake工具會更加方便,但是我總覺得g++比較有操控感,可能是專案還是太小吧