CUDA(GPU) 作为 OpenCV 后端

Posted

技术标签:

【中文标题】CUDA(GPU) 作为 OpenCV 后端【英文标题】:CUDA(GPU) as OpenCV backend 【发布时间】:2019-12-17 08:32:45 【问题描述】:

我正在尝试使用 CUDA 作为 opencv-4.1.1 中提供的 dnn 模块的后端,我已经构建了启用 CUDA 的 opencv,nvidia 驱动程序和 CUDA 已正确放置在系统上,这里使用 manjaro 作为开发平台。

我正在尝试使用 cv2.dnn 模块加载预训练的 YOLOv3 权重,

net = cv2.dnn.readNetFromDarknet('yolov3.cfg', 'yolov3.weights')

但它使用 CPU 作为默认推理引擎,但我试图使用 GPU 作为后端 IE,来自官方 opencv 文档,我发现以下

DNN_TARGET_CPU  
DNN_TARGET_OPENCL   
DNN_TARGET_OPENCL_FP16  
DNN_TARGET_MYRIAD       
DNN_TARGET_FPGA 

作为目标后端,但不支持直接GPU推理,如果不使用GPU作为底层推理引擎,那么用CUDA编译opencv有什么意义,

为了确保进程在 GPU 上运行,我发布了 nvidia-smi,

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 430.26       Driver Version: 430.26       CUDA Version: 10.2     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GT 710      Off  | 00000000:01:00.0 N/A |                  N/A |
| 40%   40C    P0    N/A /  N/A |    598MiB /  1998MiB |     N/A      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0                    Not Supported                                       |
+-----------------------------------------------------------------------------+

GPU 利用率的进程 ID 为 0,显然意味着没有进程使用 GPU,任何指导将不胜感激。

【问题讨论】:

OpenCV 还可以利用 DNN 模块之外的 GPU,即透明 API。因此,有理由使用 cuda 支持进行编译。另外,如果你使用 OpenCL 作为后端会发生什么?这也应该使用 GPU。 @Timo 但这不能用于生产推理,因为需要以更高的 fps 运行模型,CUDA 比 opencl 做得更好,所以你能详细说明一下透明 API。跨度> 我明白了。我不习惯 DNN 模块,所以在这方面我无法为您提供帮助。透明 API 是大多数 OpenCV 函数的透明包装器(因此得名),允许它们在 GPU 上执行。我刚才说的是要指出 OpenCV 中有 cuda 的用途。但这与 DNN 模块无关。 目前,没有对 DNN 推理的 CUDA 支持。如果您需要在 GPU 上获得良好的性能,只需使用您首选的 DL 库(Tensorflow、PyTorch、MxNet、Chainer 等)。 @Timo OpenCL 后端在 CUDA GPU 上速度非常慢。 OpenCL 后端不支持所有层,因此,推理过程涉及在 OpenCL 和 CPU 后端之间切换(作为后备)。如果您使用集成显卡,这非常有用,但对于不共享主内存的设备来说会非常慢。 CUDA 设备和 CPU 之间的内存传输成本抵消了大多数可能获得的潜在加速。 【参考方案1】:

目前 CUDA 对 DNN 模块的支持正在 GSOC 任务下进行,因此还没有正式发布。你可以查看它的 repo here 来查看进度。

编辑:看起来CUDA后端集成已完成并包含在发布版本4.2.0中,您可以查看更改日志here。

【讨论】:

以上是关于CUDA(GPU) 作为 OpenCV 后端的主要内容,如果未能解决你的问题,请参考以下文章

将 Auth0 连接到我的后端后,如何将其连接到我的 NextJS 前端?

为啥即使使用 Colab Pro 帐户也无法连接到 GPU 后端?

[CUDA OpenCV]GPU加速的计算机视觉学习资源下载

NVIDIA GPU / CUDA 中使用 OpenCV 深度神经网络模块

为啥 OpenCV GPU CUDA 模板匹配比 CPU 慢很多?

nvcc 致命:安装 cuda 9.1+caffe+openCV 3.4.0 时不支持 gpu 架构“compute_20”