“目前CV-CUDA 已经开源,Github网址为:GitHub – CVCUDA/CV-CUDA: CV-CUDA™ is an open-source, GPU accelerated library for cloud-scale image processing and computer vision.”
随着短视频 APP、视频会议平台以及 VR/AR 等技术的发展,视频与图像已逐渐成为全球互联网流量的主要组成部分。包含我们平时接触到的这些视频图像,也有很多是被 AI 和计算机视觉(CV)算法处理并增强过的。然而,随着社交媒体和视频分享服务的快速增长,作为 AI 图像算法基础的视频图像处理部分,也早已成为计算流程中不可忽视的成本和瓶颈。
1. CV-CUDA 应用场景
我们先带大家简单回顾一下图像处理的一些常见的例子,以更好地理解 CV-CUDA(Computer Vision – Compute Unified Device Architecture)应用场景。
(1)AI 算法图像背景模糊化
图 1. AI 背景模糊(CPU 前后处理方案)
图像背景模糊化通常会被应用于视频会议,美图修图等场景。在这些场景中,我们通常希望 AI 算法可以把主体之外的背景部分模糊化,这样可以保护用户隐私,美化图像等。图像背景模糊化的流程大体可以分为 3 个过程:前处理,DNN 网络以及后处理过程。前处理过程,通常包含了对图像做 Resize、Padding、Image2Tensor 等操作;DNN 网络可以是一些常见 segmentation network,比如 Unet 等;后处理过程,通常包括 Tensor2Mask、Crop、Resize、Denoise 等操作。
在传统的图像处理流程中,前处理和后处理部分通常都是使用 CPU 进行操作,这导致整个图像背景模糊化流程中,有 90% 的工作时间消耗在前后处理部分,因而成为了整个算法流水线的瓶颈。若能把前后处理妥善利用 GPU 加速,这将能大幅提升整体的计算性能。
图 2. AI背景模糊(GPU前后处理方案)
当我们把前后处理部分都放到 GPU 上后,我们就可以对整个 pipeline 进行端到端的 GPU 加速。经过测试,在单个 GP U上,相比于传统图像处理方式,把整个 pipeline 移植到 GPU 后,可以获得 20 倍以上的吞吐率提升。这无疑会大大的节省计算成本。
(2)AI 算法图像分类
图 3. AI 图像分类
图像分类是最常见的 AI 图像算法之一,通常可以用于物体识别,以图搜图等场景,几乎是所有 AI 图像算法的基础。图像分类的 pipeline 大体可以分为 2 个部分:前处理部分和 DNN 部分。其中前处理部分,在训练和推理过程中最常见的 4 种操作包括:图片解码、Resize、Padding、Normalize。DNN 部分已经有了 GPU 的加速,而前处理部分通常都会使用 CPU 上的库函数进行处理。如果能够把前处理部分也移植到 GPU 上,那么一方面可以释放 CPU 资源,另一方面也可以进一步提升 GPU 利用率,从而可以对整个 pipeline 进行加速。
2. 当前图像处理主流方案
针对前后处理部分,我们总结一下目前已有的一些主流应用方案:
(1)目前应用最广泛的图像处理库是 OpenCV。前后处理中的操作,往往是依赖于任务类型的,这导致了前后处理相关的操作种类繁多,数量庞杂。利用 OpenCV 确实可以实现大部分的图像处理操作,不过,这些操作大部分是用 CPU 实现的,缺少对应的 GPU 加速版本。而部分 CPU 操作虽然存在对应的 GPU 版本,但是这些 GPU 版本的实现可能存在一些问题,包括:
a. 部分算子的 CPU 和 GPU 结果无法对齐。在某些场景下,我们的算法团队使用了 CPU 的算子进行训练,而在推理阶段负责部署的同学考虑到性能问题,决定使用 GPU 算子,然而在测试过程中,发现 CPU 和 GPU 算子结果无法对齐,这可能会导致端到端的处理结果出现精度异常。
b. 部分算子 GPU 性能比 CPU 性能还弱。除了某些算法本身就不太适合 GPU 化之外,我们还发现部分 GPU 实现并不是很高效。比如,有些算子会在运行过程中,临时申请显存空间,导致增加了额外的耗时。
c. 在真实的部署 pipeline 中,