计算机视觉/视频分析

NVIDIA 加速库助力 Microsoft Bing 视觉搜索性能优化

Microsoft Bing 视觉搜索使全球用户能够使用照片作为查询来查找内容。该功能的核心是 Microsoft 的 TuringMM 视觉嵌入模型,该模型可将图像和文本映射到共享的高维空间中。在对网上数十亿张图像进行操作时,性能至关重要。

本文详细介绍了使用 NVIDIA TensorRT 和 NVIDIA 加速库 (如 CV-CUDA 和 nvImageCodec) 优化 TuringMM 工作流的工作。这些工作将速度提高了 5.13 倍,并显著降低了总体拥有成本(TCO)。我们分享了我们如何与 Microsoft Bing 团队合作,解决其核心嵌入工作流的优化问题,从而为互联网规模的视觉搜索提供支持。

Microsoft Bing 多媒体的博士生、高级数据和应用科学家 Andrew Stewart 表示:“Bing 视觉搜索团队使用 NVIDIA 加速技术(包括 TensorRT、CV-CUDA 和 nvImageCodec)将离线索引管道的端到端吞吐量提高了 5.13 倍,从而大幅节省了能源和成本。对于在线系统,如 Bing 的 Visual Intent,这样的改进意味着用户可以更快地获得结果,或者能够在预期的延迟预算内整合其他功能。”

多模态 AI 为视觉搜索等应用提供支持。多模态 AI 应用需要融合文本、照片、音频和视频等不同的数据模式,以便彼此无缝交互。用于联合图像 – 文本理解的一种热门模型是 CLIP(对比语言 – 图像预训练)。CLIP 模型采用双编码器架构,一个用于图像,一个用于文本,会消耗数亿个图像字幕对。

每个编码器的输出在共享的高维空间中对齐,以生成单个高维向量或嵌入,该向量或嵌入表示对输入文本和图像对的联合语义理解。这些多模态嵌入用于支持各种基于 AI 的视觉任务,例如基于文本的视觉搜索和检索、零样本图像分类、图像字幕和标注、基于文本输入的内容创建/编辑、文本辅助内容审核等。

Microsoft Bing Visual Search 需要为数十亿张图像计算大规模向量嵌入。在云或数据中心运行此类离线系统可能需要数周甚至数月才能填充嵌入数据库。在这种情况下,如果共享集群上可能运行多个工作负载,且存在资源限制,则有效利用计算资源并减少完成每个工作负载所需的时间变得至关重要。

另一方面,对于视觉搜索或图像字幕等在线任务,通过降低每个请求的端到端延迟来实现实时响应是高优先级的要求

优化前的建模和工作流 

与 Bing 基础架构中的许多其他模型一样,视觉嵌入模型在 GPU 服务器集群上运行,该集群专用于为各种 Microsoft 的深度学习服务执行推理任务。在此集群中,模型在每个实例的推理服务器解决方案中执行。推理服务器从集中式作业调度器接收一批图像以进行处理,并预期将每个图像的预测嵌入结果发回。

工作负载包括定期处理自上次索引以来发布到万维网上的所有新图像。待处理的图像按请求批量组合,每个批量由 32 张图像组成,然后将这些批量发送到 GPU 推理服务器进行处理。由于这些图像是从互联网上从各种来源收集的,因此它们的大小和文件格式会有所不同。因此,推理任务需要将每个批量的图像重新格式化为同构数据布局,以便模型能够并行处理这些图像。

这种规模的图像处理是一个计算成本高昂的过程。这项工作始于读取和解码图像。图像在很大程度上是 JPEG 格式,但也可能包括各种其他常见文件格式。此外,图像大小范围从小缩略图到大型专业图形和高分辨率智能手机照片不等。然后,必须将请求批量中的图像全部调整大小,使其达到与模型预期输入形状 224×224 相匹配的通用分辨率。

此外,我们还对图像应用了一些基本的图像预处理,包括裁剪、归一化和通道和张量布局的重新排序。为了应对各种图像规格的复杂性,我们最初选择 OpenCV 来加载和处理这些图像。

主要推理任务包括在此预处理的输入批量上执行视觉嵌入模型。模型导出为 ONNX 图形, ONNXRuntime 用作模型执行后端。ONNXRuntime 框架提供了一套统一的操作,可为任何可使用标准 ONNX 运算集表示的模型提供执行兼容性。该框架提供了多个执行提供程序,这些执行提供程序基本上是特定硬件平台或加速器中每个操作的实现。默认执行提供程序用于 CPU 执行。

使用 GPU 加速 ONNX 图形有多种方法。首先,可以直接使用 NVIDIA TensorRT 运行 ONNX 图形。其次,ONNX Runtime 提供两种由 NVIDIA 支持的执行提供程序:

  • CUDA 执行提供程序 :提供通用型 GPU 加速解决方案,可提供良好的性能和灵活性。它适用于符合 ONNX 规范的各种模型。Bing 最初的实现使用 ONNXRuntime 和 CUDA 执行提供程序。
  • TensorRT 执行提供程序 :通过利用降低精度和层融合等高级优化,为 NVIDIA GPU 上的深度学习推理提供更高的性能和效率。它非常适合对性能、吞吐量和低延时至关重要的部署场景。
Schematic diagram showing the original implementation of Bing’s visual embedding pipeline with image decoding and processing steps running on the CPU, and ONNX-Runtime CUDA Execution Provider used for model inference on GPU.
图 1. Bing 视觉嵌入工作流的原始实现,其中 CPU 瓶颈显著。

优化视觉嵌入模型管道 

我们与 Microsoft Bing 视觉搜索团队合作,在此管道中寻找优化机会。通过更好地利用 GPU 资源提供有益的性能提升,几种可能性立即变得显而易见。

第一个也是显而易见的机会是使用 TensorRT。最近的 TensorRT 版本在 Transformer 架构中增加了对融合注意力层的不断改进的支持。这使得这些计算成本高昂的层能够更高效地执行,从而显著影响端到端推理性能。

解码 JPEG 文件格式通常不会给予太多考虑。然而,在处理大量经过大幅优化的模型时,加载和解码单张百万像素图像的时间通常会比该图像的推理任务本身更长。Bing 的视觉嵌入流程也不例外,因为我们可以测量由 OpenCV 的 imread 调用(实现图像格式解码的函数)引起的重大瓶颈。

为缓解这一问题,我们引入了管道 nvImageCodec,这是 NVIDIA 库的图像格式解码器。该库利用 GPU 来解码各种文件格式。当专用的硬件加速解码器不可用时,该库会透明地回退到传统软件 GPU 加速的解码,如果不可用,则回退到 CPU 加速的解码。

这可以保持跨格式的兼容性和无缝集成,这在处理从互联网收集的原始图像数据时至关重要。最后,nvImageCodec 还支持批量解码,可以同时解码多个图像,因此可以在解码阶段并行执行一些关键操作,从而最大限度地提高 GPU 效率。

CV-CUDA 是 NVIDIA 库,用于通过 GPU 加速实现常见的图像处理操作。这些操作已经过高度优化,可以处理图像批量:要处理的图像数量越多,这些操作的效率就越高。CV-CUDA 还加速了图像本身的预处理。

一些 CV-CUDA 操作支持可变形状的图像批量处理。这意味着,虽然图像可能并非都符合单个图像的大小,但仍然可以对它们进行批量处理,并且可以在此类集合上利用批量并行化。此外,CV-CUDA 与 nvImageCodec 的集成允许直接在 GPU 缓冲区上处理图像数据,从而避免了将数据来回复制到主机 CPU 的需要。

最终实现得益于两个库中可用的 Python 绑定而大大简化。对于可能已经熟悉 OpenCV API 的用户,nvImageCodec 和 CV-CUDA 的 Python API 遵循与 OpenCV API 相同的约定和函数名称。这些操作的代码如下:

decoder = nvimgcodec.Decoder
images = decoder.decode(batch_queries)
 
images_batch = cvcuda.ImageBatchVarShape(len(images))
for image in images:
    images_batch.pushback(cvcuda.as_image(image))
images_batch = cvcuda.resize(images_batch, [(256, 256)] * len(images), cvcuda.Interp.LINEAR)
 
stack = cvcuda.stack([cvcuda.as_tensor(image) for image in images_batch])
stack = cvcuda.customcrop(stack, cvcuda.RectI(16, 16, 224, 224))
stack = cvcuda.cvtcolor(stack, cvcuda.ColorConversion.RGB2BGR)
stack = cvcuda.convertto(stack, np.float32)
stack = cvcuda.reformat(stack, "NCHW")
stack = stack.cuda

最后,ONNXRuntime 具有使用 IOBindings 的能力。这是框架中的一个功能,允许在目标加速器上预先分配和填充内存缓冲区。在 ONNXRuntime-CUDA 和 ONNXRuntime-TensorRT 的情况下,这允许将模型的输入批处理数据直接提供给预先分配的 GPU 内存缓冲区,从而再次避免 CPU 和 GPU 之间需要额外的内存拷贝。

经过优化的管道将大部分推理任务完全卸载到 GPU 设备,从而实现更优化、更快速的处理,同时还能提高端到端任务的能效。

Schematic diagram showing the GPU-optimized implementation of Bing’s visual embedding pipeline with image decoding and processing steps now running on the GPU using CV-CUDA and nvImageCodec, and ONNX-Runtime TensorRT Execution Provider used for optimized model inference on GPU.
图 2. 利用 ONNX 运行时 TRT、CV-CUDA 和 nvImageCodec 的 Bing 视觉嵌入工作流的 GPU 优化实现

结果 

获得的结果表明,优化利用 GPU 资源可以在很大程度上加速深度学习和图像处理工作负载,即使基准已使用 GPU 加速。 NVIDIA TensorRT 负责大部分性能改进,而 NVIDIA 图像解码和处理库最终实现了额外的 27% 的端到端改进。

实施 吞吐量 加速
使用 OpenCV+ONNX 运行时 CUDA 的基准 88 QPS
使用 OpenCV+ONNXRuntime-TensorRT 的工作流 356 个 QPS 4.05
使用 nvImageCodec+CV-CUDA+ONNXRuntime-TensorRT 的 Pipeline 452 QPS 5.14
表 1. 使用 NVIDIA 加速库和引擎实现的端到端吞吐量加速倍数为 5.14 倍。
Bar chart of end-to-end throughput speedup from incremental improvements due to GPU acceleration of the different stages in the pipeline.
图 3. 由于管道中不同阶段的 GPU 加速,端到端吞吐量通过增量改进实现加速

工作流的图像处理组件对端到端推理请求造成了相当大的延迟。由于此类推理任务中使用的图像大小不同,解码和调整图像大小的时间与图像分辨率成正比,因此延迟数字也会发生变化。加速此过程可以显著提高性能,使用 Bing 部署中使用的硬件规格可以将速度提高高达 6 倍。

    每批图像的平均大小
流程
(~400~400)

(800 800)
大型
(*1600*1600)
OpenCV
单线程 CPU
图像解码 28.4 毫秒 162.3 毫秒 406.2 毫秒
预处理 6.3 毫秒 14.4 毫秒 24.0 毫秒
总计 34.7 毫秒 176.7 毫秒 430.2 毫秒
nvImageCodec+CV-CUDA
GPU 加速
图像解码 5.9 毫秒 29.4 毫秒 62.7 毫秒
预处理 3.2 毫秒 5.2 毫秒 6.3 毫秒
总计 9.1 毫秒 34.6 毫秒 69.0 毫秒
GPU acceleration增速   3.8 倍 5.1 倍 6.2 倍
表 2. 使用 CV-CUDA 和 nvImageCodec 库实现的图像处理阶段最高可达 6.2 倍加速

结束语 

NVIDIA 加速库 (包括 TensorRT、CV-CUDA 和 nvImageCodec) 对 Microsoft Bing 视觉搜索进行了显著优化。该管道的初始实现使用 ONNXRuntime 和 CUDA 进行 GPU 加速,但图像解码和预处理 (通过 OpenCV) 方面的瓶颈限制了性能。引入 NVIDIA 加速库可提高图像解码和模型推理速度。

TensorRT、用于解码的 nvImageCodec 和用于图像预处理的 CV-CUDA 的引入将速度提升了 5.13 倍。在某些情况下,这些改进将图像处理时间缩短了 6.2 倍。这些优化提高了系统的吞吐量,并使 Bing 能够更高效地处理视觉搜索任务,显著减少了能源消耗和处理时间。

NV-CLIP 是 NVIDIA 商业版本的 CLIP 模型,可作为 NVIDIA NIM 微服务 提供。NIM 微服务提供模型作为优化的容器,可部署在云、数据中心、工作站、台式机和笔记本电脑中。每个 NIM 容器都包括 预训练的 AI 模型 和所有必要的运行时组件,使得可以轻松地将 AI 功能集成到应用中。 开始使用 NV-CLIP

 

Tags