计算机视觉/视频分析

使用 CV-CUDA 提高基于人工智能的计算机视觉的吞吐量并降低成本

 

涉及基于人工智能的实时云规模应用程序计算机视觉正在迅速增长。用例包括图像理解、内容创建、内容审核、映射、推荐系统和视频会议。

然而,由于对处理复杂性的需求增加,这些工作负载的计算成本也在增长。从静止图像到视频的转变现在也正在成为消费者互联网流量的主要组成部分。鉴于这些趋势,迫切需要构建高性能但具有成本效益的计算机视觉工作负载。

基于人工智能的计算机视觉管道通常涉及围绕人工智能推理模型的数据预处理和后处理步骤,这可能占整个工作负载的 50-80% 。这些步骤中常见的运算符包括以下内容:

  • 调整大小
  • 裁剪
  • 正火
  • 去噪
  • 张量转换

虽然开发人员可能会使用 NVIDIA GPU 来显著加速他们管道中的人工智能模型推理,但预处理和后处理仍然通常使用基于 CPU 的库来实现。这导致整个人工智能管道的性能出现瓶颈。通常是人工智能图像或视频处理管道一部分的解码和编码过程也可能在 CPU 上受到瓶颈,影响整体性能。

Workflow diagram for an AI background blur shows preprocessing and post-processing steps on CPU and segmentation inference on GPU. 
图 1 。人工智能计算机视觉管道的常规工作流程

CV-CUDA 优化

CV-CUDA是一个开源库,使您能够构建高效的云级人工智能计算机视觉管道。该库提供了一组专门的 GPU 加速计算机视觉和图像处理内核,作为独立的操作员,可以轻松实现人工智能管道的高效预处理和后处理步骤。

CV-CUDA 可以用于各种常见的计算机视觉管道,如图像分类、对象检测、分割和图像生成。有关详细信息,请参阅NVIDIA GTC Fall 2022 的主题发布

在这篇文章中,我们展示了使用 CV- CUDA 为典型的人工智能计算机视觉工作负载实现端到端 GPU 加速的好处,实现了约 5 倍至 50 倍的总吞吐量加速。这可以每年节省数亿 USD 的云成本,并在数据中心每年节省数百 GWh 的能源消耗。

CPU 加速解决的瓶颈

CV- CUDA 提供高度优化的 GPU 加速内核,作为计算机视觉处理的独立操作符。这些内核可以有效地实现预处理和后处理流水线,从而显著提高吞吐量。

编码和解码操作也可能是管道中的潜在瓶颈。通过优化NVIDIA 视频处理框架( VPF ),您也可以有效地优化和运行它们。 VPF 是 NVIDIA 的一个开源库,与 Python 绑定到 C ++库。它为 GPU 上的视频解码和编码提供了全硬件加速。

为了加速 GPU 上的整个端到端 AI 流水线(图 2 ),请使用 CV- CUDA ,以及用于解码/编码加速的 VPF 和用于进一步推理优化的 TensorRT 。您可以通过四个端口实现高达 50 倍的端到端吞吐量改进NVIDIA L4 GPUs,与典型管道中基于 CPU 的实现相比。

改进程度取决于推理 DNN 的复杂性、所需的预处理和后处理步骤以及硬件等因素。对于多个 GPU 节点,对于给定的管道,加速因子可以线性缩放。

Diagram shows a CV-CUDA-enabled workflow for AI background blur with pre– and post-processing steps optimized with CV-CUDA and the decode, segmentation inference, and encode steps on GPU.
图 2 : GPU – 带有 CV- CUDA 的加速 AI 管道,用于预处理和后处理操作。

CV-CUDA 如何实现高性能

CV-CUDA 使用 GPU 的功率来实现高性能:

  • 预先分配的内存池,以避免在推理阶段重复分配 GPU 内存
  • 异步操作
  • 内核融合实现使用一个 GPU 内核的运算符组合,以最大限度地减少不必要的数据传输和内核启动延迟
  • 通过矢量化全局内存访问和使用快速共享内存提高内存访问效率
  • 计算效率、快速数学、减少扭曲/块

案例研究:视频分割流水线的端到端加速

基于视频的分割是一种常见的人工智能技术,它根据像素的属性对视频帧中的像素进行分割。例如,在视频会议中的虚拟背景或背景模糊应用程序中,它对前景人物或对象和背景进行分割。

在这项研究中,我们讨论了使用NVIDIA T4AWS 上的张量核心 GPU 实例,特别关注计算成本优化。连接到实例的 CPU 是 Intel Xeon Platinum 8362 。

当整个端到端 AI 管道在 GPU 上执行时,您可以预期显著的成本节约。然后,我们讨论了相同工作负载的吞吐量性能加速对数据中心能耗的影响。

为了进行实验,我们将 GPU 与 CV-CUDA AI 管道与同一管道的 CPU 与 OpenCV 实现进行了比较,假设两种情况下的推理工作负载都在 GPU 上运行。具体而言,我们部署了 ResNet-101 视频分割模型管道(图 2 ),以执行 AI 背景模糊。

Frame of cat video passing through the video segmentation pipeline outputs the blurred background leaving the cat in the original video.
图 3 。常见的端到端视频分割流水线的示例。使用 AI 在输入帧中分割前景对象,然后将其与原始输入帧和模糊版本合成以进行背景模糊。

在这种情况下,我们测量了不同阶段的延迟和整个端到端管道的最大吞吐量。该管道包括多个阶段(图 4 ):

  • 视频解码
  • 使用“缩小”、“规格化”和“重新格式化”等操作进行预处理
  • 使用 PyTorch 进行推断
  • 使用 Reformat 、 Upscale 、 BilateralFilter 、 Composition 和 Blur 等操作进行后处理
  • 视频编码

对于 CPU 和 GPU 管道,我们假设推理工作负载分别使用 PyTorch 和 TensorRT 在 GPU ‘上运行。

End-to-end pipeline for video blurring use case. The pipeline starts with compressed video input and moves through decode, downscale, normalize, reformat to tensor, segmentation, upscale, joint bilateral filter, composite, and encode steps before producing compressed video output.
图 4 。 带有 CV-CUDA 运算符的 AI 背景模糊流水线,用于预处理和后处理。

传统的管道是用 OpenCV 和 PyTorch ( GPU )构建的,在 Python 中实现,因为这是客户的典型模式。输入视频的分辨率为 1080p ,由 474 帧组成,批量大小为 1 。在这个管道中,由于 PyTorch , GPU 仅用于推理,而过程的其余部分是基于 CPU 的:

  • 使用 OpenCV / ffmpeg 对帧进行解码。
  • 解码后的图像使用 OpenCV 进行预处理,并输入 PyTorch 供电的 DNN ,以检测哪些像素属于猫,从而生成掩码。
  • 在后处理阶段,前一阶段的输出掩码与原始图像及其模糊版本合成,导致前景中的猫和背景模糊。

对于基于 GPU 的管道(图 4 ),我们使用 CV-CUDA 库中的优化运算符实现了预处理和后处理阶段,并使用 NVIDIA TensorRT 库进行了推理。我们还使用 VPF 加速了 GPU 上流水线的解码和编码部分。

A comparison of preprocessing, inference, and post-processing latency showing lower latency for GPU-based CV-CUDA compared to OpenCV CPU. Results include 0.096 ms compared to 87.2 ms for post-processing latency and 9.7 ms compared to 132.5 ms for end-to-end latency.
图 5 。 基于 CPU 和 GPU 的管道之间的延迟( ms )比较。(GPU =环境变量 T4 ; CPU =英特尔至强白金 8362 ;批量大小= 1 ;#进程= 1)

图 5 显示,一帧批次的端到端时间从 132 毫秒减少到大约 10 毫秒,这表明 GPU 管道实现了令人印象深刻的延迟减少。通过使用单个 NVIDIA T4 GPU ,与 CPU 管道相比, CV-CUDA 管道的速度快了约 13 倍。

这一结果是通过对单个视频进行处理的单个过程获得的。通过部署多个进程来同时处理多个视频,这些优化可以在相同的硬件下实现更高的吞吐量,从而显著节省成本和能源。

为了更好地展示 CV-CUDA 所带来的好处,我们在不同的实例(一个 T4 GPU 、一个 L4 GPU 、四个 T4 GPU 和四个 L4 GPU )上执行了 z1K 管道。

A comparison of throughput, annual energy consumption, and annual cost for deploying end-to-end AI pipeline on OpenCV vs. CV-CUDA. Throughput was 1590 fps on four L4 GPUs vs. 32.5 fps on CPU; cost was $30M on four T4 GPUs vs. $317M on CPU; and energy consumption was 4.5 GWh on four L4 GPUs vs. 157.6 GWh on CPU.
图 6 。在不同的单台和多台 GPU 服务器上执行的 GPU ‘管道与 CPU 服务器上的 CPU ‘管道的端到端吞吐量性能、年度计算成本和能耗的相对比较

新引入的NVIDIA L4 Tensor Core GPU,由NVIDIA Ada Lovelace 架构,为视频、人工智能、视觉计算、图形和虚拟化提供了低成本、高能效的加速。

在图 6 中,与 CPU 基线相比,单个 T4 GPU 上的端到端吞吐量加速约为 5 倍,而新 L4 GPU 上的加速进一步提高至约 12 倍。在多个 GPU 实例的情况下,性能几乎呈线性扩展,例如,在四个 T4 GPU 和四个 L4 GPU 上分别为~ 19x 和~ 48x 。

为了计算每年的云成本和能耗,我们假设每分钟上传 500 个视频小时到视频流平台的典型视频工作负载。对于年度云成本,我们只考虑了 T4 GPU ( L4 GPU ‘将在未来可用),并假设Amazon EC2 G4 Instances.

考虑到这一点,单个 T4 GPU 视频工作负载的年成本约为 CPU 管道的 1 / 5 。这预测了对于这样的工作负载,典型的云成本节约估计约为数亿 USD 。

对于数据中心来说,除了处理如此巨大的工作负载所需的硬件成本外,能源效率对于降低能源成本和环境影响至关重要。

在图 6 (右)中,根据服务器上的平均每小时功耗,计算了具有相应硬件的相同视频工作负载的年能耗(以 GWh 为单位)。单个 L4 系统的能耗约为 CPU 服务器的 1 / 12 。对于像示例视频这样的工作量(每分钟 500 小时的视频),每年的节能估计约为数百 GWh 。

这些能源节约意义重大,因为这相当于避免了每年行驶约 11000 英里的数万辆乘用车的温室气体排放。

CV- CUDA Beta v0 . 3 . 0 功能

既然您已经看到了使用 CV- CUDA 加速人工智能计算机视觉工作负载的好处,以下是一些关键功能:

  • 开源: Apache 2.0GitHub 上的授权开源软件。
  • 支持的运算符:CV- CUDA 提供了 30 多名专业操作员,通常用于人工智能计算机视觉工作负载的前处理和后处理步骤。这些无状态、独立的操作符可以很容易地插入到现有的自定义处理框架中。常见的操作符包括 ConvertTo 、 Custom crop 、 Normalize 、 PadStack 、 Reformat 和 Resize 。有关详细信息,请参阅CV-CUDA Developer Guide.
  • 新操作员:CV- CUDA Beta v0 . 3 . 0 提供了新的操作符,如重映射、查找轮廓、非最大值抑制、阈值和自适应阈值。
  • 的自定义后端 NVIDIA Triton:现在,您可以在使用示例应用程序构建计算机视觉管道时,将 CV- CUDA 集成到自定义后端中。
  • 多语言 API :CV- CUDA 包括 C / C ++和 Python 的 API 。
  • 框架接口:到现有 DL 框架(如 PyTorch 和 TensorFlow )的易于使用和零拷贝接口。
  • 批量支持:支持所有 CV- CUDA 运算符,因此可以实现更高的 GPU 利用率和更好的性能。
  • 统一和可变形状批量支持:CV- CUDA 接受具有相同或不同维度的张量。
  • 示例应用程序:端到端加速图像分类、对象检测和视频分割示例应用程序。
  • 单线 PIP 安装。
  • 安装、入门和 API 参考指南。

CV-CUDA 可供下载

的公测版( v0 . 3 . 0 )CV-CUDA is now available on GitHub.

CV-CUDA 能够使用优化的图像和视频处理内核在云中加速复杂的人工智能计算机视觉工作负载。 Python 友好的库可以很容易地集成到现有的管道中,具有与 PyTorch 和 TensorFlow 等常见深度学习框架的零拷贝接口。

CV-CUDA ,以及 VPF 和TensorRT,进一步优化了终端人工智能工作负载,以实现显著的成本和能源节约。这使得它适用于云规模的用例:

有关更多信息,请参阅以下资源:

使用或考虑 CV-CUDA ?Engage the product team for support。我们很想听听你的意见。

 

Tags