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

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

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

在如今信息化时代中,图像或者说视觉内容早已成为日常生活中承载信息最主要的载体,深度学习模型凭借着对视觉内容强大的理解能力,能对其进行各种处理与优化。

然而在以往的视觉模型开发与应用中,我们更关注模型本身的优化,提升其速度与效果。相反,对于图像的预处理与后处理阶段,很少认真思考如何去优化它们。所以,当模型计算效率越来越高,反观图像的预处理与后处理,没想到它们竟成了整个图像任务的瓶颈。

为了解决这样的瓶颈,NVIDIA 携手字节跳动机器学习团队开源众多图像预处理算子库CV-CUDA,它们能高效地运行在 GPU 上,算子速度能达到 OpenCV(运行在 CPU)的百倍左右。如果我们使用 CV-CUDA 作为后端替换OpenCV 和 TorchVision,整个推理的吞吐量能达到原来的二十多倍。此外,不仅是速度的提升,同时在效果上 CV-CUDA 在计算精度上已经对齐了OpenCV,因此训练推理能无缝衔接,大大降低工程师的工作量。

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

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

很多涉及到工程与产品的算法工程师都知道,虽然我们常常只讨论模型结构和训练任务这类「前沿研究」,但实际要做成一个可靠的产品,中间会遇到很多工程问题,反而模型训练是最轻松的一环了。

图像预处理就是这样的工程难题,我们也许在实验或者训练中只是简单地调用一些API 对图像进行几何变换、滤波、色彩变换等等,很可能并不是特别在意。但是当我们重新思考整个推理流程时会发现,图像预处理已经成为了性能瓶颈,尤其是对于预处理过程复杂的视觉任务。

这样的性能瓶颈,主要体现在 CPU 上。一般而言,对于常规的图像处理流程,我们都会先在CPU 上进行预处理,再放到 GPU 运行模型,最后又会回到 CPU,并可能需要做一些后处理。


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

因此对于视频应用,或者 3D 图像建模等复杂场景,因为图像帧的数量或者图像信息足够大,预处理过程足够复杂,并且延迟要求足够低,优化预/后处理算子就已经迫在眉睫了。一个更好地做法,当然是替换掉 OpenCV,使用更快的解决方案。

为什么 OpenCV 仍不够好?

在 CV 中,应用最广泛的图像处理库当然就是长久维护的OpenCV 了,它拥有非常广泛的图像处理操作,基本能满足各种视觉任务的预/后处理所需。但是随着图像任务负载的加大,它的速度已经有点慢慢跟不上了,因为OpenCV 绝大多数图像操作都是 CPU 实现,缺少 GPU 实现,或者 GPU 实现本来就存在一些问题。

在NVIDIA与字节跳动算法同学的研发经验中,他们发现OpenCV 中那些少数有 GPU 实现的算子存在三大问题:

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

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

同时存在各种CPU算子与各种 GPU 算子,当处理流程需要同时使用两种,就额外增加了内存与显存中的空间申请与数据迁移/数据拷贝;
比如说第一个问题结果精度无法对齐,NVIDIA与字节跳动算法同学会发现,当我们在训练时OpenCV 某个算子使用了 CPU,但是推理阶段考虑到性能问题,换而使用OpenCV对应的GPU 算子,也许CPU 和 GPU 结果精度无法对齐,导致整个推理过程出现精度上的异常。当出现这样的问题,要么换回 CPU 实现,要么需要费很多精力才有可能重新对齐精度,是个不好处理的难题。

既然 OpenCV 仍不够好,可能有读者会问,那Torchvision 呢?它其实会面临和 OpenCV 一样的问题,除此之外,工程师部署模型为了效率更可能使用 C++实现推理过程,因此将没办法使用Torchvision而需要转向 OpenCV 这样的 C++ 视觉库,这不就带来了另一个难题:对齐Torchvision与OpenCV的精度。

总的来说,目前视觉任务在 CPU 上的预/后处理已经成为了...

点击查看剩余70%

{{collectdata}}

网友评论