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 為視覺搜索等應用提供支持。多模態 AI 應用需要融合文本、照片、音頻和視頻等不同的數據模式,以便彼此無縫交互。用于聯合圖像 – 文本理解的一種熱門模型是 CLIP(對比語言 – 圖像預訓練)。CLIP 模型采用雙編碼器架構,一個用于圖像,一個用于文本,會消耗數億個圖像字幕對。
每個編碼器的輸出在共享的高維空間中對齊,以生成單個高維向量或嵌入,該向量或嵌入表示對輸入文本和圖像對的聯合語義理解。這些多模態嵌入用于支持各種基于 AI 的視覺任務,例如基于文本的視覺搜索和檢索、零樣本圖像分類、圖像字幕和標注、基于文本輸入的內容創建/編輯、文本輔助內容審核等。
Microsoft Bing 視覺搜索?
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 上的深度學習推理提供更高的性能和效率。它非常適合對性能、吞吐量和低延時至關重要的部署場景。

優化視覺嵌入模型管道?
我們與 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 設備,從而實現更優化、更快速的處理,同時還能提高端到端任務的能效。

結果?
獲得的結果表明,優化利用 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 |

工作流的圖像處理組件對端到端推理請求造成了相當大的延遲。由于此類推理任務中使用的圖像大小不同,解碼和調整圖像大小的時間與圖像分辨率成正比,因此延遲數字也會發生變化。加速此過程可以顯著提高性能,使用 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 倍 |
結束語?
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 。
?