Ubuntu20.04安装cuda10.1和opencv3.2.0

Ubuntu20.04安装cuda10.1和opencv3.2.0

我的电脑用的是RTX 2080 Ti的显卡,系统用的是今年最新的ubuntu20.04的系统,在新的系统上安装cuda和opncv。

以前ubuntu18上也安装过,但是这次在安装的过程中遇到了很多新问题,其实基本上都是版本过新导致的,可能是cuda版本新,可能是opencv版本新,每次遇到这种问题,网上的说可以降低版本。这都是扯淡,怎么不说把gpu拿出来呢,都不用配环境了。所以我整理了一下自己遇到的问题,都是直接解决版本问题的,以供参考。

这篇文章的主要解决问题是解决版本问题,所以只是简单介绍安装流程,不详细,但是我会留出借鉴的文章,里面都很详细。

安装nvidia驱动

一般新系统的nvidia驱动都是旧版本的,需要更新驱动的版本。使用指令

nvidia-smi

如果报错,证明nvidia驱动版本不对,需要更新驱动。如果不报错,证明驱动可用。

ubuntu20系统提供了驱动更新的功能,系统里面有一个additional drivers,用这个更新最新驱动就行了,避免上nvidia的官网(贼慢)。

安装cuda

接下来安装cuda,我安装的版本是cuda10.1,由于cuda10.1不支持gcc-9,但是ubuntu默认的是gcc-9,所以gcc要降级。
首先安装

sudo apt-get install gcc-7 g++-7

设置默认的gcc

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 100
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 50

这时gcc降级就已经完成了,可以输入一下指令查看

sudo update-alternatives --config gcc

下面这个是我借鉴的文章
Ubuntu 20.04 CUDA&cuDNN安装方法

接下来上nvidia的官网,下载cuda,选择自己安装的版本下载。
nvidia的官网下载速度不慢,就是页面加载太慢,可能有用,后用chrome,不行就只能等等了,趁这个时间,可以注册或登录nvidia的帐号,因为接下来下载cuDNN要用。

下载好以后,输入指令

sudo sh cuda_10.2.89_440.33.01_linux.run

接下来的安装不难,不赘述。

配置环境变量

输入gedit ~/.bashrc命令打开文件,在文件结尾加入:

export PATH=/usr/local/cuda-10.1/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-10.1/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}

保存后输入

source ~/.bashrc

更新环境

安装cuDNN

在官网上下载cuDNN,需要登录。
按照自己的cuda版本选择cuDNN。
解压之后,复制文件:
cuda/include/cudnn.h文件复制到/usr/local/cuda/include文件夹
cuda/lib64/下所有文件复制到/usr/local/cuda/lib64文件夹
由于需要复制权限,所以需要使用指令。
详情可以看这篇文章Ubuntu20.04安装cuda10.1。

安装opencv

主要的版本问题都是在安装opencv是出现的。以下通过问题说明修改。
具体的安装流程可以看文章ubuntu安装opencv的正确方法

  1. 报错
-- ICV: Downloading ippicv_linux_20151201.tgz...
CMake Error at 3rdparty/ippicv/downloader.cmake:73 (file):
  file DOWNLOAD HASH mismatch

    for file: [/home/danalelixin/Desktop/opencv-3.2.0/3rdparty/ippicv/downloads/linux-808b791a6eac9ed78d32a7666804320e/ippicv_linux_20151201.tgz]
      expected hash: [808b791a6eac9ed78d32a7666804320e]
        actual hash: [d41d8cd98f00b204e9800998ecf8427e]
             status: [7;"Couldn't connect to server"]

就是这个ippicv_linux_20151201的问题,有的时候是下载不了,被墙了,有的时候,就算连接上了,文件的MD5也不对,所以我们就自己到网上找资源,修改文件中的MD5。

将下载好的ippicv_linux_20151201.tgz文件放在opencv文件夹下。
修改3rdparty/ippicv/downloader.cmake文件,将22行的数字改成报错信息中的actual hash,我的就是将808b791a6eac9ed78d32a7666804320e改成d41d8cd98f00b204e9800998ecf8427e。

  1. 报错
CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
Please set them or make sure they are set and tested correctly in the CMake files:
CUDA_nppi_LIBRARY (ADVANCED)

这个就是版本问题,cuda9开始就已经不再支持2.0架构了,所以必须要改代码:

  1. 打开文件FindCUDA.cmake
    找到行
find_cuda_helper_libs(nppi)

替换成

  find_cuda_helper_libs(nppial)
  find_cuda_helper_libs(nppicc)
  find_cuda_helper_libs(nppicom)
  find_cuda_helper_libs(nppidei)
  find_cuda_helper_libs(nppif)
  find_cuda_helper_libs(nppig)
  find_cuda_helper_libs(nppim)
  find_cuda_helper_libs(nppist)
  find_cuda_helper_libs(nppisu)
  find_cuda_helper_libs(nppitc)

找到行

set(CUDA_npp_LIBRARY "${CUDA_nppc_LIBRARY};${CUDA_nppi_LIBRARY};${CUDA_npps_LIBRARY}")

改成

set(CUDA_npp_LIBRARY "${CUDA_nppc_LIBRARY};${CUDA_nppial_LIBRARY};${CUDA_nppicc_LIBRARY};${CUDA_nppicom_LIBRARY};${CUDA_nppidei_LIBRARY};${CUDA_nppif_LIBRARY};${CUDA_nppig_LIBRARY};${CUDA_nppim_LIBRARY};${CUDA_nppist_LIBRARY};${CUDA_nppisu_LIBRARY};${CUDA_nppitc_LIBRARY};${CUDA_npps_LIBRARY}")

找到行

unset(CUDA_nppi_LIBRARY CACHE)

替换成

unset(CUDA_nppial_LIBRARY CACHE)
unset(CUDA_nppicc_LIBRARY CACHE)
unset(CUDA_nppicom_LIBRARY CACHE)
unset(CUDA_nppidei_LIBRARY CACHE)
unset(CUDA_nppif_LIBRARY CACHE)
unset(CUDA_nppig_LIBRARY CACHE)
unset(CUDA_nppim_LIBRARY CACHE)
unset(CUDA_nppist_LIBRARY CACHE)
unset(CUDA_nppisu_LIBRARY CACHE)
unset(CUDA_nppitc_LIBRARY CACHE)
  1. 打开文件OpenCVDetectCUDA.cmake
    找到下面几行
  set(__cuda_arch_ptx "")
  if(CUDA_GENERATION STREQUAL "Fermi")
    set(__cuda_arch_bin "2.0")
  elseif(CUDA_GENERATION STREQUAL "Kepler")
    set(__cuda_arch_bin "3.0 3.5 3.7")

改成

  set(__cuda_arch_ptx "")
  if(CUDA_GENERATION STREQUAL "Kepler")
    set(__cuda_arch_bin "3.0 3.5 3.7")
  elseif(CUDA_GENERATION STREQUAL "Maxwell")
    set(__cuda_arch_bin "5.0 5.2")
  1. 打开opencv\modules\cudev\include\opencv2\cudev\common.hpp
    添加
#include 
  1. 报错
nvcc fatal   : Unsupported gpu architecture 'compute_20'
CMake Error at cuda_compile_generated_gpu_mat.cu.o.cmake:206 (message):
  Error generating
  /home/danalelixin/Desktop/opencv-3.2.0/build/modules/core/CMakeFiles/cuda_compile.dir/src/cuda/./cuda_compile_generated_gpu_mat.cu.o

老毛病,还是cuda9不支持2.0架构了。
使用以下make指令,重新make

sudo cmake -D CMAKE_BUILD_TYPE=Release -D CUDA_nppi_LIBRARY=true -D CMAKE_INSTALL_PREFIX=/usr/local -D CUDA_GENERATION=Kepler ..

  1. 报错
opencv-3.1.0/modules/videoio/src/cap_ffmpeg_impl.hpp:1313:21: error: ‘CODEC_FLAG_GLOBAL_HEADER’ was not declared in this scope
         c->flags |= CODEC_FLAG_GLOBAL_HEADER;

opencv-3.1.0/modules/videoio/src/cap_ffmpeg_impl.hpp:1525:35: error: ‘AVFMT_RAWPICTURE’ was not declared in this scope

就是ffmpeg新版本对老版本中的一些关键字的支持变了。
打开文件opencv/modules/videoio/src/cap_ffmpeg_impl.hpp ,在里面添加

#define AV_CODEC_FLAG_GLOBAL_HEADER (1 << 22)
#define CODEC_FLAG_GLOBAL_HEADER AV_CODEC_FLAG_GLOBAL_HEADER
#define AVFMT_RAWPICTURE 0x0020

重新make,有的时候添加语句后,还是没用,可能是添加在文件中的位置不对,换一个位置就好了。

你可能感兴趣的:(深度学习,机器学习,神经网络)