专栏名称: 小白学视觉
本公众号主要介绍机器视觉基础知识和新闻,以及在学习机器视觉时遇到的各种纠结和坑的心路历程。
目录
相关文章推荐
上海书评  ·  高峰枫|金庸的译笔和憨直的恶棍 ·  昨天  
班主任家园  ·  那年,刚上初一的我,弄丢了爸爸的1000元。 ... ·  14 小时前  
书单来了  ·  作为公司的首席卫生官,我主要打扫! ·  2 天前  
单向街书店  ·  三打白骨精|皮影戏体验工作坊 ·  3 天前  
漳视新闻  ·  晚上9点半停止写作业!福建一地最新通知 ·  2 天前  
51好读  ›  专栏  ›  小白学视觉

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

小白学视觉  · 公众号  ·  · 2024-03-28 21:33

正文

点击上方 小白学视觉 ”,选择加" 星标 "或“ 置顶

重磅干货,第一时间送达作者:Edison_G
当 CPU 图像预处理成为视觉任务的瓶颈,最新开源的CV-CUDA,将为图像预处理算子提速百倍。

转自《机器之心》


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


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

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


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



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


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

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

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


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


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


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

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

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



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


CV-CUDA 进行 Resize C++ 接口


实战, CV-CUDA 怎么用


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


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



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

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


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



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


CV-CUDA 对实际业务的提升


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

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







请到「今天看啥」查看全文