zoukankan      html  css  js  c++  java
  • 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++比较有操控感,可能是项目还是太小吧

  • 相关阅读:
    锋利的jQuery第2版学习笔记4、5章
    锋利的jQuery第2版学习笔记1~3章
    关于盒模型的理解
    CSS3秘笈第三版涵盖HTML5学习笔记13~17章
    CSS3秘笈第三版涵盖HTML5学习笔记9~12章
    CSS3秘笈第三版涵盖HTML5学习笔记6~8章
    CSS3秘笈第三版涵盖HTML5学习笔记1~5章
    锁(1):spin_lock & mutex_lock的区别? .
    休眠(1):sleep和wait的区别
    C++(1):error: invalid conversion from ‘void (*)()’ to ‘void (*)(int)
  • 原文地址:https://www.cnblogs.com/0-lingdu/p/11778455.html
Copyright © 2011-2022 走看看