图像预处理库CV-CUDA开源了,打破预处理瓶颈,提升推理吞吐量20多倍

关注并星标

从此不迷路

计算机视觉研究院

08e934a891a46fd52bf99352db98d747.gif

公众号ID|ComputerVisionGzq

学习群|扫码在主页获取加入方式

计算机视觉研究院专栏

作者:Edison_G

当 CPU 图像预处理成为视觉任务的瓶颈,最新开源的CV-CUDA,将为图像预处理算子提速百倍。

转自《机器之心》

图像预处理库CV-CUDA开源了,打破预处理瓶颈,提升推理吞吐量20多倍_第1张图片

图像预处理库CV-CUDA开源了,打破预处理瓶颈,提升推理吞吐量20多倍_第2张图片

以图像背景模糊算法为例,将CV-CUDA替换 OpenCV作为图像预/后处理的后端,整个推理过程吞吐量能加20 多倍。

如果小伙伴们想试试更快、更好用的视觉预处理库,可以试试这一开源工具。

开源地址:https://github.com/CVCUDA/CV-CUDA

图像预/后处理已成为 CV 瓶颈

图像预处理库CV-CUDA开源了,打破预处理瓶颈,提升推理吞吐量20多倍_第3张图片

图像预处理库CV-CUDA开源了,打破预处理瓶颈,提升推理吞吐量20多倍_第4张图片

以图像背景模糊算法为例,常规的图像处理流程中预\后处理主要在 CPU 完成,占据整体 90% 的工作负载,其已经成为该任务的瓶颈。

图像预处理库CV-CUDA开源了,打破预处理瓶颈,提升推理吞吐量20多倍_第5张图片

  1. 部分算子的 CPU GPU 结果精度无法对齐;

  2. 部分算子 GPU 性能比 CPU 性能还弱;

  3. 同时存在各种CPU算子与各种 GPU 算子,当处理流程需要同时使用两种,就额外增加了内存与显存中的空间申请与数据迁移/数据拷贝;

图像预处理库CV-CUDA开源了,打破预处理瓶颈,提升推理吞吐量20多倍_第6张图片

图像预处理库CV-CUDA开源了,打破预处理瓶颈,提升推理吞吐量20多倍_第7张图片

完全在 GPU 上进行预处理与后处理,将大大降低图像处理部分的CPU 瓶颈。

图像预处理库CV-CUDA开源了,打破预处理瓶颈,提升推理吞吐量20多倍_第8张图片

正如前文的背景模糊吞吐量加速比图,如果采用CV-CUDA 替代 OpenCV TorchVision 的前后处理后,整个推理流程的吞吐率提升20 多倍。其中预处理对图像做 ResizePaddingImage2Tensor 等操作,后处理对预测结果做的Tensor2MaskCropResizeDenoise 等操作。

图像预处理库CV-CUDA开源了,打破预处理瓶颈,提升推理吞吐量20多倍_第9张图片

在同一个计算节点上(2x Intel Xeon Platinum 8168 CPUs1x NVIDIA A100 GPU),以 30fps 的帧率处理 1080p 视频,采用不同 CV 库所能支持的最大的并行流数。测试采用了 4 个进程,每个进程 batchSize 64

对于单个算子的性能,NVIDIA和字节跳动的小伙伴也做了性能测试,很多算子在GPU 上的吞吐量能达到 CPU 的百倍。

图像预处理库CV-CUDA开源了,打破预处理瓶颈,提升推理吞吐量20多倍_第10张图片

图片大小为 480*360,CPU 选择为 Intel(R) Core(TM) i9-7900X,BatchSize 大小为 1,进程数为 1

图像预处理库CV-CUDA开源了,打破预处理瓶颈,提升推理吞吐量20多倍_第11张图片

图像预处理库CV-CUDA开源了,打破预处理瓶颈,提升推理吞吐量20多倍_第12张图片


此外,因为CV-CUDA同时拥有 C++接口与 Python 接口,它能同时用于训练与服务部署场景,在训练时用Python 接口跟快速地验证模型能力,在部署时利用C++接口进行更高效地预测。CV-CUDA免于繁琐的预处理结果对齐过程,提高了整体流程的效率。

图像预处理库CV-CUDA开源了,打破预处理瓶颈,提升推理吞吐量20多倍_第13张图片

CV-CUDA进行 Resize C++接口

实战,CV-CUDA怎么用

图像预处理库CV-CUDA开源了,打破预处理瓶颈,提升推理吞吐量20多倍_第14张图片

图像预处理库CV-CUDA开源了,打破预处理瓶颈,提升推理吞吐量20多倍_第15张图片

常规图像识别的预处理流程,使用CV-CUDA将会把预处理过程与模型计算都统一放在GPU 上运行。


如下在使用 torchvision API 加载图片到 GPU之后,Torch Tensor 类型能直接通过 as_tensor 转化为CV-CUDA 对象 nvcvInputTensor,这样就能直接调用CV-CUDA 预处理操作的 API,在 GPU 中完成对图像的各种变换。

图像预处理库CV-CUDA开源了,打破预处理瓶颈,提升推理吞吐量20多倍_第16张图片

如下几行代码将借助 CV-CUDA GPU 中完成图像识别的预处理过程:裁剪图像并对像素进行归一化。其中resize() 将图像张量转化为模型的输入张量尺寸;convertto()将像素值转化为单精度浮点值;normalize()将归一化像素值,以令取值范围更适合模型进行训练。

CV-CUDA
各种预处理操作的使用与 OpenCV 或 Torchvision中的不会有太大区别,只不过简单调个方法,其背后就已经在 GPU 上完成运算了。

图像预处理库CV-CUDA开源了,打破预处理瓶颈,提升推理吞吐量20多倍_第17张图片

现在借助借助 CV-CUDA 的各种 API,图像分类任务的预处理已经都做完了,其能高效地在GPU 上完成并行计算,并很方便地融合到PyTorch 这类主流深度学习框架的建模流程中。剩下的,只需要将CV-CUDA对象nvcvPreprocessedTensor 转化为Torch Tensor 类型就能馈送到模型了,这一步同样很简单,转换只需一行代码:

图像预处理库CV-CUDA开源了,打破预处理瓶颈,提升推理吞吐量20多倍_第18张图片


通过这个简单的例子,很容易发现CV-CUDA 确实很容易就嵌入到正常的模型训练逻辑中。如果读者希望了解更多的使用细节,还是可以查阅前文CV-CUDA的开源地址。

CV-CUDA对实际业务的提升


CV-CUDA
实际上已经经过了实际业务上的检验。在视觉任务,尤其是图像有比较复杂的预处理过程的任务,利用 GPU 庞大的算力进行预处理,能有效提神模型训练与推理的效率。CV-CUDA 目前在抖音集团内部的多个线上线下场景得到了应用,比如搜索多模态,图片分类等。

字节跳动机器学习团队表示,CV-CUDA 在内部的使用能显著提升训练与推理的性能。例如在训练方面,字节跳动一个视频相关的多模态任务,其预处理部分既有多帧视频的解码,也有很多的数据增强,导致这部分逻辑很复杂。复杂的预处理逻辑导致 CPU 多核性能在训练时仍然跟不上,因此采用CV-CUDA将所有 CPU 上的预处理逻辑迁移到 GPU,整体训练速度上获得了 90%的加速。注意这可是整体训练速度上的提升,而不只是预处理部分的提速。

图像预处理库CV-CUDA开源了,打破预处理瓶颈,提升推理吞吐量20多倍_第19张图片

在字节跳动 OCR 与视频多模态任务上,通过使用CV-CUDA,整体训练速度能提升 1 2 倍(注意:是模型整体训练速度的提升)


在推理过程也一样,字节跳动机器学习团队表示,在一个搜索多模态任务中使用 CV-CUDA 后,整体的上线吞吐量相比于用 CPU 做预处理时有了 2 倍多的提升。值得注意的是,这里的 CPU基线结果本来就经过多核高度优化,并且该任务涉及到的预处理逻辑较简单,但使用 CV-CUDA 之后加速效果依然非常明显。

速度上足够高效以打破视觉任务中的预处理瓶颈,再加上使用也简单灵活,CV-CUDA 已经证明了在实际应用场景中能很大程度地提升模型推理与训练效果,所以要是读者们的视觉任务同样受限于预处理效率,那就试试最新开源的CV-CUDA吧。

END

转载请联系本公众号获得授权

计算机视觉研究院学习群等你加入!

ABOUT

计算机视觉研究院

计算机视觉研究院主要涉及深度学习领域,主要致力于目标检测、图像分割、模型量化、模型部署等研究方向。研究院接下来会不断分享最新的论文算法新框架,我们这次改革不同点就是,我们要着重”研究“。之后我们会针对相应领域分享实践过程,让大家真正体会摆脱理论的真实场景,培养爱动手编程爱动脑思考的习惯!

VX:2311123606

图像预处理库CV-CUDA开源了,打破预处理瓶颈,提升推理吞吐量20多倍_第20张图片

YoloV:目标实时检测效果依然很棒(附源代码下载)

细粒度特征提取和定位用于目标检测(附论文下载)

深度框架训练 | 不是所有数据增强都可以提升最终精度

Yolo系列的高效更精确的目标检测框架(附源代码)

你可能感兴趣的:(计算机视觉,opencv,人工智能,图像处理,python)