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='...' 库文件和头文件生成在哪里,其他参数不细说了
OPENCV_GENERATE_PKGCONFIG=ON 是不是生成opencv4.pc,这个原本默认是自动生成的,但是,我发现opencv4.1.1不会默认生成pc文件,pkg-config就用不了,强烈建议一定要带这个参数
##编译完了,装吧 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++比较有操控感,可能是项目还是太小吧