[保留版本]在Anaconda环境中安装带有CUDA的OpenCV Python的方法


通常通过执行大规模矩阵运算来执行图像处理。因此,我一直认为,如果可以在GPU上执行OpenCV,则可以加快处理大图像的速度。稍后,我将尝试这种假设检验,但是首先,我在Anaconda上安装了OpenCV,可以在GPU上执行它。这个过程是艰巨的过程,因此我将其作为备忘录。 (感谢@ jun0_0的合作)

施工环境

  • Docker上的Jupyter Notebook服务器(带有Anaconda的Python3.8)

    • 基本图像:jupyter / tensorflow-notebook
  • 容器上的来宾操作系统:Ubuntu 20.04 LTS
  • 容器上的CUDA版本:CUDA 10.1
  • 容器上cuDNN的版本:cuDNN 8.0.5
  • 主机规格

    • 作业系统:Ubuntu 18.04 LTS
    • CPU:酷睿i9 10900K
    • 内存:32GB
    • GPU:NVIDIA Geforce RTX 2080 SUPER

(参考)安装普通版

作为参考,描述了OpenCV Python普通版的安装方法和安装版本。

1
pip install opencv-python
1
2
$ pip list | grep opencv
opencv-python                 4.4.0.46

2020/12/12后记:如何安装cuDNN 8.0.5

作为参考,发布了使用apt安装cuDNN的方法,但如果使用该方法,则CUDA11的版本将安装在Ubuntu 20.04上,并且OpenCV构建将无法正常工作。这有点费力,但是我想描述一下如何在CUDA 10.1中安装cuDNN 8.0.5。 (假定在主机上针对显示GUI图像的部分执行以下过程)

登录到NVIDIA的cuDNN下载页面

由于某些原因,必须在NVIDIA注册为免费用户后才能使用cuDNN。注册后登录下载页面。如果可以登录,请检查I Agree To the Terms of the cuDNN Software License Agreement。然后单击用于CUDA 10.1的cuDNN版本,然后单击用于Linux的cuDNN库。下载将开始,但是您将取消下载。

download cudnn

cancel

show all

url copy

在容器上下载cuDNN源@

根据您先前复制的URL在容器上执行以下命令。显然,根据我的实验,我发现每次下载cuDNN的网址都是临时生成的。因此,它每次执行时都会更改。以下是从该实验中获得的示例。

命令示例

1
$ wget https://developer.download.nvidia.com/compute/machine-learning/cudnn/secure/8.0.5/10.1_20201106/cudnn-10.1-linux-x64-v8.0.5.39.tgz?aETIwrQU2RxM4D_RJoUh5zjSiyOAY2-mOJHEHPYOUXEaHcRx-hfW3aT2yZVZeES5BP_xDT8WvHE8BPlYcfzhgKjyguMS55LYmVnTUbbRy-_uxiyNaLzfzyzE52wmfoyc7rR5z6mbNma5B5jSYS1zg_4XInwSc5tuqdsqxHqPI8I2axdqbdw5iqYLMiCl9SuNftkG-vrNbUNxLMk -O cudnn-10.1-linux-x64-v8.0.5.39.tgz

解压缩并存储源

解压缩

tgz文件并将其存储在指定目录中。解压缩后,将创建cuda目录。

1
tar xvf cudnn-10.1-linux-x64-v8.0.5.39.tgz

<详细信息>

cuda目录结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
cuda
├── include
│&nbsp;&nbsp; ├── cudnn_adv_infer.h
│&nbsp;&nbsp; ├── cudnn_adv_train.h
│&nbsp;&nbsp; ├── cudnn_backend.h
│&nbsp;&nbsp; ├── cudnn_cnn_infer.h
│&nbsp;&nbsp; ├── cudnn_cnn_train.h
│&nbsp;&nbsp; ├── cudnn.h
│&nbsp;&nbsp; ├── cudnn_ops_infer.h
│&nbsp;&nbsp; ├── cudnn_ops_train.h
│&nbsp;&nbsp; └── cudnn_version.h
├── lib64
│&nbsp;&nbsp; ├── libcudnn_adv_infer.so -> libcudnn_adv_infer.so.8
│&nbsp;&nbsp; ├── libcudnn_adv_infer.so.8 -> libcudnn_adv_infer.so.8.0.5
│&nbsp;&nbsp; ├── libcudnn_adv_infer.so.8.0.5
│&nbsp;&nbsp; ├── libcudnn_adv_train.so -> libcudnn_adv_train.so.8
│&nbsp;&nbsp; ├── libcudnn_adv_train.so.8 -> libcudnn_adv_train.so.8.0.5
│&nbsp;&nbsp; ├── libcudnn_adv_train.so.8.0.5
│&nbsp;&nbsp; ├── libcudnn_cnn_infer.so -> libcudnn_cnn_infer.so.8
│&nbsp;&nbsp; ├── libcudnn_cnn_infer.so.8 -> libcudnn_cnn_infer.so.8.0.5
│&nbsp;&nbsp; ├── libcudnn_cnn_infer.so.8.0.5
│&nbsp;&nbsp; ├── libcudnn_cnn_train.so -> libcudnn_cnn_train.so.8
│&nbsp;&nbsp; ├── libcudnn_cnn_train.so.8 -> libcudnn_cnn_train.so.8.0.5
│&nbsp;&nbsp; ├── libcudnn_cnn_train.so.8.0.5
│&nbsp;&nbsp; ├── libcudnn_ops_infer.so -> libcudnn_ops_infer.so.8
│&nbsp;&nbsp; ├── libcudnn_ops_infer.so.8 -> libcudnn_ops_infer.so.8.0.5
│&nbsp;&nbsp; ├── libcudnn_ops_infer.so.8.0.5
│&nbsp;&nbsp; ├── libcudnn_ops_train.so -> libcudnn_ops_train.so.8
│&nbsp;&nbsp; ├── libcudnn_ops_train.so.8 -> libcudnn_ops_train.so.8.0.5
│&nbsp;&nbsp; ├── libcudnn_ops_train.so.8.0.5
│&nbsp;&nbsp; ├── libcudnn.so -> libcudnn.so.8
│&nbsp;&nbsp; ├── libcudnn.so.8 -> libcudnn.so.8.0.5
│&nbsp;&nbsp; ├── libcudnn.so.8.0.5
│&nbsp;&nbsp; └── libcudnn_static.a
└── NVIDIA_SLA_cuDNN_Support.txt

2 directories, 32 files

将cuDNN的源复制到指定目录。

1
sudo cp -R cuda/lib64/* /usr/local/cuda/lib64/
1
sudo cp cuda/include/* /usr/local/cuda/include/

带有CUDA构建的OpenCV Python

然后,构建OpenCV源代码,以便可以在Anaconda环境中的Python中使用带有CUDA的主要主题OpenCV Python,并生成可在GPU上使用的可执行文件。

安装版本

所需的应用程序

首先,安装构建所需的应用程序。

1
2
3
4
sudo apt update && sudo apt upgrade -y && \
sudo apt install -y wget git build-essential zlib1g-dev libcurl4-gnutls-dev \
make ccache qt5-qmake gcc-8 g++-8 libavcodec-dev libavformat-dev \
libavutil-dev libswscale-dev libjpeg-turbo8-dev libwebp-dev libtiff-dev

将gcc-8,g -8设置为默认的C编译器

在Ubuntu 20.04上,默认安装gcc和g的版本9。但是,此后要构建的某些源仅与版本8兼容,因此我们将降级。

<详细信息> <摘要>检查默认版本

默认情况下安装版本9

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/9/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none:hsa
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 9.3.0-17ubuntu1~20.04' --with-bugurl=file:///usr/share/doc/gcc-9/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++,gm2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-9 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-9-HskZEa/gcc-9-9.3.0/debian/tmp-nvptx/usr,hsa --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04)

$ g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/9/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none:hsa
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 9.3.0-17ubuntu1~20.04' --with-bugurl=file:///usr/share/doc/gcc-9/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++,gm2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-9 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-9-HskZEa/gcc-9-9.3.0/debian/tmp-nvptx/usr,hsa --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04)

1
sudo ln -fs /usr/bin/g++-8 /usr/bin/g++

1
sudo ln -fs /usr/bin/gcc-8 /usr/bin/gcc

<详细信息> <摘要>设置后确认

确认变更

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/8/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 8.4.0-3ubuntu2' --with-bugurl=file:///usr/share/doc/gcc-8/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-8 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 8.4.0 (Ubuntu 8.4.0-3ubuntu2)

$ g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/8/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 8.4.0-3ubuntu2' --with-bugurl=file:///usr/share/doc/gcc-8/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-8 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 8.4.0 (Ubuntu 8.4.0-3ubuntu2)

卸载安装在Anaconda

上的libtiff

在构建时发生冲突?它以错误结束。 (有关详细信息,请参见参考资料)

1
conda uninstall libtiff

CMake

的源代码构建和安装

CMake从源代码构建最新版本。看来,如果它是可以从apt安装的稳定版本,则可能会以错误结尾。 (有关详细信息,请参见参考资料)

1
git clone --depth 1 https://github.com/Kitware/CMake.git
1
cd CMake

1
./configure --system-curl --system-zlib

<详细信息> <摘要>(参考)执行结果(部分摘录)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ ./configure --system-curl --system-zlib
---------------------------------------------
CMake 3.19.20201128, Copyright 2000-2020 Kitware, Inc. and Contributors
Found GNU toolchain
C compiler on this system is: gcc  
C++ compiler on this system is: g++    
Makefile processor on this system is: make
g++ has setenv
g++ has unsetenv
g++ does not have environ in stdlib.h
g++ has stl wstring
g++ has <ext/stdio_filebuf.h>
---------------------------------------------
...
...
...
---------------------------------------------
CMake has bootstrapped.  Now run make.

1
make

<详细信息> <摘要>(参考)执行结果(部分摘录)

1
2
3
4
5
6
7
8
9
10
11
12
$ make
...
...
...
Scanning dependencies of target pseudo_iwyu
[ 99%] Building C object Tests/RunCMake/CMakeFiles/pseudo_iwyu.dir/pseudo_iwyu.c.o
[100%] Linking C executable pseudo_iwyu
[100%] Built target pseudo_iwyu
Scanning dependencies of target foo
[100%] Building CXX object Tests/FindPackageModeMakefileTest/CMakeFiles/foo.dir/foo.cpp.o
[100%] Linking CXX static library libfoo.a
[100%] Built target foo

1
sudo make install

<详细信息> <摘要>(参考)执行结果(部分摘录)

1
2
3
4
5
$ sudo make install
...
-- Installing: /usr/local/share/bash-completion/completions/cmake
-- Installing: /usr/local/share/bash-completion/completions/cpack
-- Installing: /usr/local/share/bash-completion/completions/ctest

安装Intel MKL,IPP,TBB,DAAL,MPI

还要安装Intel库以加快速度。

返回主目录

1
cd
1
wget -O - https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS-2019.PUB | sudo apt-key add -

<详细信息>

执行结果

1
2
3
4
5
6
7
8
9
10
11
12
13
$ wget -O - https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS-2019.PUB | sudo apt-key add -
--2020-11-28 14:43:52--  https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS-2019.PUB
Resolving apt.repos.intel.com (apt.repos.intel.com)... 23.33.53.192
Connecting to apt.repos.intel.com (apt.repos.intel.com)|23.33.53.192|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1914 (1.9K) [binary/octet-stream]
Saving to: ‘STDOUT’

-                                       100%[=============================================================================>]   1.87K  --.-KB/s    in 0s      

2020-11-28 14:43:52 (183 MB/s) - written to stdout [1914/1914]

OK

1
sudo wget https://apt.repos.intel.com/setup/intelproducts.list -O /etc/apt/sources.list.d/intelproducts.list

<详细信息>

执行结果

1
2
3
4
5
6
7
8
9
10
11
$ sudo wget https://apt.repos.intel.com/setup/intelproducts.list -O /etc/apt/sources.list.d/intelproducts.list
--2020-11-28 14:45:36--  https://apt.repos.intel.com/setup/intelproducts.list
Resolving apt.repos.intel.com (apt.repos.intel.com)... 23.33.53.192
Connecting to apt.repos.intel.com (apt.repos.intel.com)|23.33.53.192|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 278 [binary/octet-stream]
Saving to: ‘/etc/apt/sources.list.d/intelproducts.list’

/etc/apt/sources.list.d/intelproducts.l 100%[=============================================================================>]     278  --.-KB/s    in 0s      

2020-11-28 14:45:37 (27.7 MB/s) - ‘/etc/apt/sources.list.d/intelproducts.list’ saved [278/278]

1
sudo apt update

2020/12/12后记:出现冲突警告时

如果出现以下警告(这次假定将不使用英特尔Python,因此没有问题)

1
W: Conflicting distribution: https://apt.repos.intel.com/intelpython binary/ InRelease (expected binary/ but got )
1
sudo vim /etc/apt/sources.list.d/intelproducts.list

注释掉并保存为以下内容

1
# deb https://apt.repos.intel.com/intelpython binary/

检查可以安装的最新版本

1
sudo apt install intel-mkl-64bit intel-ipp-64bit intel-tbb intel-daal-64bit intel-mpi

<详细信息> <摘要>(参考)执行结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
$ sudo apt install intel-mkl-64bit intel-ipp-64bit intel-tbb intel-daal-64bit intel-mpi
Reading package lists... Done
Building dependency tree      
Reading state information... Done
Package intel-mkl-64bit is a virtual package provided by:
  intel-mkl-64bit-2020.4-912 2020.4-912
  intel-mkl-64bit-2020.3-111 2020.3-111
  intel-mkl-64bit-2020.2-108 2020.2-108
  intel-mkl-64bit-2020.1-102 2020.1-102
  intel-mkl-64bit-2020.0-088 2020.0-088
  intel-mkl-64bit-2019.5-075 2019.5-075
  intel-mkl-64bit-2019.4-070 2019.4-070
  intel-mkl-64bit-2019.3-062 2019.3-062
  intel-mkl-64bit-2019.2-057 2019.2-057
  intel-mkl-64bit-2019.1-053 2019.1-053
  intel-mkl-64bit-2019.0-045 2019.0-045
  intel-mkl-64bit-2018.4-057 2018.4-057
  intel-mkl-64bit-2018.3-051 2018.3-051
  intel-mkl-64bit-2018.2-046 2018.2-046
  intel-mkl-64bit-2018.1-038 2018.1-038
  intel-mkl-64bit-2018.0-033 2018.0-033
You should explicitly select one to install.

Package intel-ipp-64bit is a virtual package provided by:
  intel-ipp-64bit-2020.3-912 2020.3-912
  intel-ipp-64bit-2020.2-108 2020.2-108
  intel-ipp-64bit-2020.1-102 2020.1-102
  intel-ipp-64bit-2020.0-088 2020.0-088
  intel-ipp-64bit-2019.5-075 2019.5-075
  intel-ipp-64bit-2019.4-070 2019.4-070
  intel-ipp-64bit-2019.3-062 2019.3-062
  intel-ipp-64bit-2019.2-057 2019.2-057
  intel-ipp-64bit-2019.1-053 2019.1-053
  intel-ipp-64bit-2019.0-045 2019.0-045
  intel-ipp-64bit-2018.4-057 2018.4-057
  intel-ipp-64bit-2018.3-051 2018.3-051
  intel-ipp-64bit-2018.2-046 2018.2-046
  intel-ipp-64bit-2018.1-038 2018.1-038
  intel-ipp-64bit-2018.0-033 2018.0-033
You should explicitly select one to install.

Package intel-tbb is a virtual package provided by:
  intel-tbb-2020.3-912 2020.3-912
  intel-tbb-2020.3-108 2020.3-108
  intel-tbb-2020.2-102 2020.2-102
  intel-tbb-2020.0-088 2020.0-088
  intel-tbb-2019.8-075 2019.8-075
  intel-tbb-2019.6-070 2019.6-070
  intel-tbb-2019.4-062 2019.4-062
  intel-tbb-2019.2-057 2019.2-057
  intel-tbb-2019.2-053 2019.2-053
  intel-tbb-2019.0-045 2019.0-045
  intel-tbb-2018.6-057 2018.6-057
  intel-tbb-2018.4-051 2018.4-051
  intel-tbb-2018.2-046 2018.2-046
  intel-tbb-2018.0-033 2018.0-033
You should explicitly select one to install.

Package intel-daal-64bit is a virtual package provided by:
  intel-daal-64bit-2020.3-912 2020.3-912
  intel-daal-64bit-2020.2-108 2020.2-108
  intel-daal-64bit-2020.1-102 2020.1-102
  intel-daal-64bit-2020.0-088 2020.0-088
  intel-daal-64bit-2019.5-075 2019.5-075
  intel-daal-64bit-2019.4-070 2019.4-070
  intel-daal-64bit-2019.3-062 2019.3-062
  intel-daal-64bit-2019.2-057 2019.2-057
  intel-daal-64bit-2019.1-053 2019.1-053
  intel-daal-64bit-2019.0-045 2019.0-045
  intel-daal-64bit-2018.3-051 2018.3-051
  intel-daal-64bit-2018.2-046 2018.2-046
  intel-daal-64bit-2018.1-038 2018.1-038
  intel-daal-64bit-2018.0-033 2018.0-033
You should explicitly select one to install.

Package intel-mpi is a virtual package provided by:
  intel-mpi-2019.9-912 2019.9-912
  intel-mpi-2019.8-108 2019.8-108
  intel-mpi-2019.7-102 2019.7-102
  intel-mpi-2019.6-088 2019.6-088
  intel-mpi-2019.6-085 2019.6-085
  intel-mpi-2019.5-075 2019.5-075
  intel-mpi-2019.4-070 2019.4-070
  intel-mpi-2019.3-062 2019.3-062
  intel-mpi-2019.2-057 2019.2-057
  intel-mpi-2019.1-053 2019.1-053
  intel-mpi-2019.0-045 2019.0-045
  intel-mpi-2018.4-057 2018.4-057
  intel-mpi-2018.3-051 2018.3-051
  intel-mpi-2018.2-046 2018.2-046
You should explicitly select one to install.

E: Package 'intel-mkl-64bit' has no installation candidate
E: Package 'intel-ipp-64bit' has no installation candidate
E: Package 'intel-tbb' has no installation candidate
E: Package 'intel-daal-64bit' has no installation candidate
E: Package 'intel-mpi' has no installation candidate

1
sudo apt install -y intel-mkl-64bit-2020.4-912 intel-ipp-64bit-2020.3-912 intel-tbb-2020.3-912 intel-daal-64bit-2020.3-912 intel-mpi-2019.9-912
1
sudo vim /etc/ld.so.conf

添加以下内容

1
2
3
4
5
/opt/intel/daal/lib/intel64
/opt/intel/ipp/lib/intel64
/opt/intel/lib/intel64
/opt/intel/mkl/lib/intel64
/opt/intel/tbb/lib/intel64/gcc4.8
1
sudo /sbin/ldconfig

OpenCV源代码构建

从GitHub克隆OpenCV源代码并执行构建。您可以使用--depth选项减少克隆所需的时间。 (参考)

1
git clone --depth 1 https://github.com/opencv/opencv.git
1
git clone --depth 1 https://github.com/opencv/opencv_contrib.git
1
cd opencv
1
mkdir build
1
cd build/

声明以下环境变量。 (这些是您这次构建的环境中的值。请根据您实际构建的环境进行修改。您可以使用ls /usr/local检查CUDA目录。)

1
2
3
export CUDA_PATH="/usr/local/cuda-10.1" \
export CFLAGS="-I/usr/local/cuda-10.1/include -I/opt/intel/compilers_and_libraries_2020.4.304/linux/mkl/include" \
export LDFLAGS="-L/usr/local/cuda-10.1/lib64"

执行以下操作:这将生成构建所需的Makefile。 (这些选项只是您这次构建的环境的值。-D CUDA_ARCH_PTX=7.5是RTX2000系列的值。参考)

  • 2020年12月12日可选的小修改
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/opt/conda/lib \
-D OPENCV_EXTRA_MODULES_PATH=/home/jovyan/opencv_contrib/modules \
-D OpenBLAS_INCLUDE_DIR=/usr/include/x86_64-linux-gnu \
-D OpenBLAS_LIB=/usr/lib/x86_64-linux-gnu/libopenblas.so \
-D INSTALL_TESTS=ON \
-D INSTALL_C_EXAMPLES=ON \
-D WITH_PYTHON=ON \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D BUILD_opencv_python2=OFF \
-D BUILD_opencv_python3=ON \
-D PYTHON_DEFAULT_EXECUTABLE=/opt/conda/bin/python3 \
-D PYTHON_LIBRARY=/opt/conda/lib \
-D PYTHON_INCLUDE_DIR=/opt/conda/include \
-D PYTHON_PACKAGES_PATH=/opt/conda/lib/python3.8/site-packages \
-D PYTHON_NUMPY_INCLUDE_DIR=/opt/conda/pkgs/numpy-1.19.4-py38hf0fd68c_1/lib/python3.8/site-packages/numpy/core/include/ \
-D WITH_MKL=ON \
-D WITH_CUDA=ON \
-D CUDA_FAST_MATH=ON \
-D WITH_CUBLAS=ON \
-D WITH_CUDNN=ON \
-D WITH_NVCUVID=ON \
-D OPENCV_DNN_CUDA=ON \
-D BUILD_opencv_cudaimgproc=ON \
-D BUILD_EXAMPLES=ON .. \
-D CUDA_ARCH_PTX=7.5

<详细信息> <摘要>(参考)执行结果(部分摘录)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
...
...
...
--     Disabled:                    cudaimgproc world
--     Disabled by dependency:      cudaoptflow
--     Unavailable:                 alphamat cnn_3dobj cvv freetype hdf java js julia matlab ovis python2 sfm viz
--     Applications:                tests perf_tests examples apps
--     Documentation:               NO
--     Non-free algorithms:         NO
--
--   GUI:
--     GTK+:                        NO
--     VTK support:                 NO
--
--   Media I/O:
--     ZLib:                        /usr/lib/x86_64-linux-gnu/libz.so (ver 1.2.11)
--     JPEG:                        /usr/lib/x86_64-linux-gnu/libjpeg.so (ver 80)
--     WEBP:                        /usr/lib/x86_64-linux-gnu/libwebp.so (ver encoder: 0x020e)
--     PNG:                         build (ver 1.6.37)
--     TIFF:                        /usr/lib/x86_64-linux-gnu/libtiff.so (ver 42 / 4.1.0)
--     JPEG 2000:                   build (ver 2.3.1)
--     OpenEXR:                     build (ver 2.3.0)
--     HDR:                         YES
--     SUNRASTER:                   YES
--     PXM:                         YES
--     PFM:                         YES
--
--   Video I/O:
--     DC1394:                      NO
--     FFMPEG:                      YES
--       avcodec:                   YES (58.54.100)
--       avformat:                  YES (58.29.100)
--       avutil:                    YES (56.31.100)
--       swscale:                   YES (5.5.100)
--       avresample:                NO
--     GStreamer:                   NO
--     v4l/v4l2:                    YES (linux/videodev2.h)
--
--   Parallel framework:            pthreads
--
--   Trace:                         YES (with Intel ITT)
--
--   Other third-party libraries:
--     Intel IPP:                   2020.0.0 Gold [2020.0.0]
--            at:                   /home/jovyan/opencv/build/3rdparty/ippicv/ippicv_lnx/icv
--     Intel IPP IW:                sources (2020.0.0)
--               at:                /home/jovyan/opencv/build/3rdparty/ippicv/ippicv_lnx/iw
--     Lapack:                      YES (/opt/intel/mkl/lib/intel64/libmkl_intel_lp64.so /opt/intel/mkl/lib/intel64/libmkl_sequential.so /opt/intel/mkl/lib/intel64/libmkl_core.so /opt/intel/mkl/lib/intel64/libmkl_intel_lp64.so /opt/intel/mkl/lib/intel64/libmkl_sequential.so /opt/intel/mkl/lib/intel64/libmkl_core.so /opt/intel/mkl/lib/intel64/libmkl_intel_lp64.so /opt/intel/mkl/lib/intel64/libmkl_sequential.so /opt/intel/mkl/lib/intel64/libmkl_core.so -lpthread -lm -ldl)
--     Eigen:                       NO
--     Custom HAL:                  NO
--     Protobuf:                    build (3.5.1)
--
--   NVIDIA CUDA:                   YES (ver 10.1, CUFFT CUBLAS FAST_MATH)
--     NVIDIA GPU arch:             30 35 37 50 52 60 61 70 75
--     NVIDIA PTX archs:            75
--
--   cuDNN:                         NO
--
--   OpenCL:                        YES (no extra features)
--     Include path:                /home/jovyan/opencv/3rdparty/include/opencl/1.2
--     Link libraries:              Dynamic load
--
--   Python 3:
--     Interpreter:                 /opt/conda/bin/python3 (ver 3.8.6)
--     Libraries:                   /opt/conda/lib/libpython3.8.so (ver 3.8.6)
--     numpy:                       /opt/conda/lib/python3.8/site-packages/numpy/core/include (ver 1.19.4)
--     install path:                lib/python3.8/site-packages/cv2/python-3.8
--
--   Python (for build):            /opt/conda/bin/python3
--
--   Java:                          
--     ant:                         NO
--     JNI:                         NO
--     Java wrappers:               NO
--     Java tests:                  NO
--
--   Install to:                    /opt/conda/lib
-- -----------------------------------------------------------------
--
-- Configuring done
-- Generating done
-- Build files have been written to: /home/jovyan/opencv/build

运行构建。您可以根据CPU内核数来增加线程数。由于这次使用的机器的CPU(Core i9 10900K)是10Core20Thread,因此我们将使用一半的10个线程执行构建。您可以使用lscpu命令检查CPU内核/线程数。

1
2
3
4
5
6
7
8
9
10
11
12
$ lscpu
Architecture:                    x86_64
CPU op-mode(s):                  32-bit, 64-bit
Byte Order:                      Little Endian
Address sizes:                   39 bits physical, 48 bits virtual
CPU(s):                          20
On-line CPU(s) list:             0-19
Thread(s) per core:              2
Core(s) per socket:              10
...
...
...
1
make -j10

<详细信息> <摘要>(参考)执行结果

1
2
3
4
5
$ make -j10
...
...
...
[100%] Built target opencv_python3

最后安装。使用-E选项执行sudo命令,以便即使具有root特权也可以继承设置的环境变量。

1
sudo -E make install

<详细信息> <摘要>(参考)执行结果(部分摘录)

1
2
3
4
5
6
7
$ sudo -E make install
...
...
...
-- Installing: /opt/conda/lib/share/opencv4/samples/python/video_threaded.py
-- Installing: /opt/conda/lib/share/opencv4/samples/python/video_v4l2.py
-- Installing: /opt/conda/lib/share/opencv4/samples/python/watershed.py

1
sudo /sbin/ldconfig

最后,在Anaconda的默认site-packages目录上创建一个符号链接。现在,您可以在Python上使用import cv2进行导入(因为由于某些原因目录结构被重复)。

1
sudo ln -s /opt/conda/lib/lib/python3.8/site-packages/cv2 /opt/conda/lib/python3.8/site-packages/cv2

使用Python确认安装完成

执行以下命令,并确认已成功安装带有CUDA的OpenCV Python。 (已安装比正常安装更高的版本)

1
python -c "import cv2; print( cv2.__version__ )"

执行结果

1
2
$ python -c "import cv2; print( cv2.__version__ )"
4.5.1-pre

概要

带有CUDA的OpenCV Python已构建/安装,因此可以在Anaconda环境中使用GPU进行图像处理。我将尝试验证将来可以达到多少速度。

参考

  • 编译并安装OpenCV 4.3.0(最新版本),兼容CUDA(使用源代码)(在Ubuntu上)
  • 安装Intel MKL,IPP,TBB,DALL,MPI(性能库)(在Ubuntu上)
  • 在pyenv环境中安装OpenCV
  • 在Ubuntu上启用CUDA的情况下构建OpenCV
  • OpenCV安装(CUDA)(Ubuntu)
  • 在Fedora上安装OpenCV-Python
  • 如何使用find命令
  • 让我们使用cudacodec模块