
將神經(jīng)網(wǎng)絡(luò)部署到邊緣硬件上聽起來簡單,但實際操作起來卻并非如此。您在 PyTorch 中訓(xùn)練了一個模型,獲得了很好的精度,然后卻面臨著一系列陌生的問題:如何在不影響精度的前提下降低精度位寬?如何面向特定的自適應(yīng) SoC 進行部署?如何以盡可能低的開發(fā)工作量,將推理無縫集成到實時視頻流水線中?其中每一步,本身都可能需要數(shù)周的工程投入。AMD Vitis AI 和 Vitis 視頻分析 SDK( Vitis Video Analytics SDK,VVAS )正是為彌合這些缺口而設(shè)計。
為了理解這些工具的作用,首先需要從端到端的角度,想象一個完整的 AI 視頻分析應(yīng)用是什么樣的。視頻數(shù)據(jù)來自一個或多個來源,例如文件、IP 攝像頭或 IoT 傳感器,并依次經(jīng)過多個階段:采集與解碼、預(yù)處理、推理、后處理與渲染,最終進入存儲、顯示或流媒體輸出端點。每個階段都需要高效執(zhí)行,同時各階段之間需要協(xié)同工作,避免引入不必要的數(shù)據(jù)拷貝或 CPU 瓶頸。圖 1 展示了一個典型流水線,其中 Vitis AI 負責(zé)加速機器學(xué)習(xí)推理階段,而 VVAS(基于 GStreamer )則負責(zé)連接并編排圍繞該階段的各個流水線元素。

圖 1:典型視頻分析流水線——Vitis AI 為運行在 AMD Versal NPU 上的機器學(xué)習(xí)推理階段提供支持;VVAS(基于 GStreamer 構(gòu)建)連接并編排從源到輸出的整體流程。
從訓(xùn)練到部署:復(fù)雜性從何而來
圖 1 中的流水線看起來非常清晰。但在實際構(gòu)建中,如果沒有合適的工具,項目進度就會放緩。下面具體來看,真正的痛點在哪里。

從訓(xùn)練到推理缺乏清晰路徑。
大多數(shù)開發(fā)者都熟悉 PyTorch 或 TensorFlow,但這些框架并不會直接為 AMD NPU(Neural Processing Unit,神經(jīng)處理單元;在第二代 AMD Versal AI Edge 系列器件中作為基于 AI 引擎構(gòu)建的 AI 推理加速器)提供二進制文件。

量化是一大挑戰(zhàn)。
如果只是簡單地將 FP32 權(quán)重轉(zhuǎn)換為 INT8,而沒有進行適當(dāng)?shù)男驶蛘{(diào)優(yōu),可能會導(dǎo)致明顯的精度損失。找到合適的校準策略、處理混合精度需求(例如,在 YOLO 后處理中保留更高精度,以避免尺度不匹配)以及驗證結(jié)果,都需要專業(yè)知識和工具。

視頻流水線集成是一個獨立的工程問題。
即使推理已經(jīng)可以運行,將其與實時視頻流集成起來,包括硬件加速預(yù)處理、元數(shù)據(jù)傳遞、邊界框疊加以及多路視頻流管理,仍然需要對 GStreamer 和自適應(yīng) SoC 或 FPGA 具備深入了解。大多數(shù) AI 開發(fā)人員并不具備這樣的背景。

性能分析和調(diào)試并不容易。
當(dāng)時延較高時,很難確定瓶頸究竟來自 NPU、CPU 回退、預(yù)處理還是后處理。如果缺乏良好的可觀測性工具,優(yōu)化就只能依靠猜測。
上述每一種缺口都與 Vitis AI 或 VVAS 的某項功能直接對應(yīng)。讓我們從模型側(cè)開始,逐步了解工具鏈是如何解決這些問題的。
Vitis AI:彌合模型到 NPU 的缺口
Vitis AI 提供了一套完整的集成工具鏈,可將 ONNX 模型轉(zhuǎn)換為經(jīng)過優(yōu)化、在第二代 Versal AI Edge 系列器件上運行的 NPU 可執(zhí)行文件。在深入了解各個階段之前,有必要先了解軟件棧各層之間的關(guān)系。在最上層,開發(fā)者可以使用熟悉的機器學(xué)習(xí)框架,例如 PyTorch 和 TensorFlow。標準的開源模型可以從這些框架導(dǎo)出為 ONNX 格式。Vitis AI 工具( AMD Quark 用于量化,Vitis AI Compiler ( Vitis AI 編譯器)用于面向特定硬件的優(yōu)化)位于中間層,負責(zé)將這些模型轉(zhuǎn)換為高效的 NPU 二進制文件。在運行時,兩條 API 路徑(即帶有 Vitis AI Execution Provider 的 ONNX Runtime,以及原生 VART 運行時)會通過靈活運行時( XRT )層調(diào)用硬件。下圖展示了這一完整軟件棧:

圖 2:Vitis AI 軟件棧——AMD Quark Quantizer 和 Vitis AI 編譯器位于 ONNX 與 VART 運行時之上,通過 AMD Versal 平臺上的靈活運行時( XRT )驅(qū)動神經(jīng)處理單元( NPU )。
借助 AMD Quark 進行量化
AMD Quark 是 Vitis AI 中包含的量化工具包。Vitis AI 編譯器支持三種精度模式,以適配不同的性能與精度權(quán)衡。對于 FP16 和 INT8,Vitis AI 使用 AMD Quark 作為量化工具包。
BF16(自動):Vitis AI 編譯器會在編譯過程中自動將 FP32 模型轉(zhuǎn)換為 BF16,無需校準。這是推薦的起步方案。
FP16:通過 Quark 進行顯式轉(zhuǎn)換,適用于視覺 Transformer 架構(gòu),因為在這類架構(gòu)中,BF16 可能帶來過大的精度損失。
INT8(高性能):使用小規(guī)模校準數(shù)據(jù)集進行訓(xùn)練后量化。相比 FP16 或 BF16,它能提供更高的吞吐量和更低的時延,但會犧牲一定精度。
對于像 YOLO 這樣的模型,INT8 會因后處理中的尺度不匹配而導(dǎo)致精度受影響,Vitis AI 可通過混合精度應(yīng)對:將計算密集型核心量化為 INT8,同時將精度敏感的后處理保留為 FP32,編譯器會自動將這些 FP32 子圖轉(zhuǎn)換為 BF16,從而使整個模型仍能在 NPU 上執(zhí)行。
編譯
Vitis AI 編譯器接收 ONNX 模型,并生成針對 NPU 優(yōu)化的二進制文件。它會自動處理算子融合、內(nèi)存調(diào)度以及 CPU/NPU 分區(qū)。您只需通過一個 JSON 文件對其進行配置,在文件中指明目標設(shè)備和優(yōu)化偏好。
Vitis AI 編譯器支持兩種并行化策略,即數(shù)據(jù)并行和張量并行,以優(yōu)化模型在 NPU 硬件上的性能。數(shù)據(jù)并行(批處理)會在多個 NPU 計算塊上復(fù)制完整模型,使多個獨立推理請求可以并發(fā)運行。因此,它非常適合多攝像頭視頻流這類高吞吐量場景。張量并行會將單個推理請求劃分到多個 NPU 計算單元上,以并行方式執(zhí)行,從而降低每個請求的時延,并支持超出單個 NPU 計算塊內(nèi)存容量的模型。選擇哪種策略取決于您的應(yīng)用需求:數(shù)據(jù)并行更適合面向吞吐量的工作負載,而張量并行更適合對時延敏感或內(nèi)存受限的用例。Vitis AI 能夠?qū)⒐ぷ髫撦d物理分區(qū)到專用 AI 引擎上(后文稱為“空間分區(qū)”),這是一項重要能力,有助于設(shè)計人員降低功耗并提升時延確定性。
編譯完成后,AI Analyzer( AI 分析器)會提供可視化的分析結(jié)果,顯示哪些算子運行在 NPU 上,哪些算子回退到 CPU 上,從而幫助您確定需要優(yōu)化的位置。下面的 AI Analyzer 示例圖展示了算子如何在 NPU 和 CPU 之間進行分區(qū)。

圖 3:AI Analyzer 展示 NPU 與 CPU 之間的算子分區(qū)情況。
部署運行時
Vitis AI 提供兩種運行時,以適配您的部署階段。具體應(yīng)選擇哪種運行時,取決于您的應(yīng)用對執(zhí)行細節(jié)控制程度的需求。


總結(jié)來說:ONNX Runtime 提供了一條熟悉的集成路徑,可以快速啟動并運行;而當(dāng)您需要對執(zhí)行過程進行更直接的控制并追求盡可能低的時延時,VART 是更合適的選擇。
易用性與開箱即用體驗
上手過程快捷且直接。預(yù)構(gòu)建 Docker 鏡像包含了所有量化和編譯工具。面向第二代 AMD Versal AI Edge 系列 VEK385 評估板的預(yù)構(gòu)建啟動鏡像,讓您在首次上電后幾分鐘內(nèi)即可運行 ResNet50 推理。Python? API 可實現(xiàn)快速原型開發(fā);C++ API 可擴展至量產(chǎn)環(huán)境。這種開箱即用體驗意味著,您可以將時間投入到應(yīng)用開發(fā),而非環(huán)境搭建上。
當(dāng)模型已經(jīng)完成量化、編譯并可在 NPU 上運行后,您仍需解決另一項挑戰(zhàn):將實際應(yīng)用中圍繞推理的組件集成起來,包括視頻解碼、預(yù)處理、元數(shù)據(jù)傳遞以及多接收端輸出路由。這正是 VVAS 的用武之地。
VVAS:彌合流水線集成缺口
當(dāng) Vitis AI 負責(zé)模型量化、編譯和 NPU 執(zhí)行之后,下一個問題是:是什么將圖 1 中所示的所有流水線階段連接起來?解決方案就是 VVAS。如果沒有 VVAS,流水線中的每一次交接,包括將幀解碼為正確的緩沖區(qū)格式、將其送入可編程邏輯( PL )預(yù)處理內(nèi)核、將結(jié)果傳遞給 NPU 推理、向疊加階段傳遞元數(shù)據(jù)以及將輸出路由到多個接收端,都需要單獨的自定義集成項目,并且需要對 GStreamer 以及自適應(yīng) SoC 或 FPGA 具備深厚的專業(yè)知識。
VVAS 借助開源 GStreamer 技術(shù),通過一個簡潔的插件式 SDK 處理所有這些復(fù)雜工作。如下架構(gòu)圖所示,您的應(yīng)用位于最上層,直接使用 VVAS 插件;而 VVAS 則負責(zé)管理底層各層,包括 GStreamer、Vitis AI、XRT 和 NPU。

圖 4:VVAS 架構(gòu)——用戶應(yīng)用位于最上層;VVAS 插件層(基礎(chǔ)設(shè)施、預(yù)處理、推理和自定義插件)橋接 GStreamer、Vitis AI 工具、XRT 和底層的 NPU。
流水線中的每個階段都直接映射到一個專用的 VVAS 插件,通過 JSON 文件進行配置,無需自定義 C++ 或 GStreamer 樣板代碼:
vvas_xabrscaler:提供硬件加速的尺寸縮放、顏色轉(zhuǎn)換和歸一化,預(yù)處理不會帶來 CPU 開銷。
vvas_xinfer:機器學(xué)習(xí)推理插件,支持 ONNX Runtime 和 VART 后端。負責(zé)批處理、元數(shù)據(jù)生成和 NPU 執(zhí)行。
vvas_xmetaconvert / vvas_xoverlay:解析推理元數(shù)據(jù),并直接在輸出幀上繪制邊界框、標簽和形狀。
vvas_xmetaaffixer:支持在不同分辨率的視頻流之間傳遞元數(shù)據(jù)。
vvas_xmulticrop / vvas_xfunnel / vvas_xdefunnel:支持感興趣區(qū)域裁剪、視頻流合并與拆分,用于級聯(lián)式多模型流水線。
VVAS 還支持 Vitis AI 提供的高級部署配置,否則這些配置通常需要大量的自定義工程:空間分區(qū)(兩個模型在單獨的 NPU 列分區(qū)上并發(fā)運行)、時間共享(多個模型在同一 NPU 資源上進行時分復(fù)用),以及零拷貝推理( DMA-BUF 和 XRT 緩沖區(qū)對象直接傳遞給 NPU,無需中間拷貝)。
在性能分析方面,VVAS 使用標準 GStreamer tracer。您可以使用 fpsdisplaysink 測量每秒幀數(shù),使用 GST_TRACERS="latency" 測量時延,并使用 GST_TRACERS="rusage" 測量 CPU 利用率。GStreamer 流水線常用的可觀測性方法同樣適用于此。
總體而言,Vitis AI 與 VVAS 覆蓋了完整流程:從訓(xùn)練好的浮點模型,一直到經(jīng)過性能分析、可投入量產(chǎn)并運行在第二代 AMD Versal AI Edge 系列硬件上的視頻分析應(yīng)用。下面可以這樣理解二者各自帶來的價值。
AI 流水線開發(fā)并非僅限于模型本身。真正的挑戰(zhàn)在于將模型優(yōu)化、運行時執(zhí)行、媒體處理、詳細的性能分析洞察以及硬件加速整合到一個可維護的應(yīng)用中。這也正是 Vitis AI 與 VVAS 組合的吸引力所在:一個負責(zé)模型準備和 NPU 執(zhí)行,另一個則對周邊流水線進行結(jié)構(gòu)化和編排。
二者結(jié)合,可以助力您:
優(yōu)化吞吐量和時延:面向整個嵌入式 AI 流水線。
降低開發(fā)工作量:通過復(fù)用經(jīng)過驗證的模型量化、編譯和流水線基礎(chǔ)設(shè)施,而非從零開始構(gòu)建整條流水線。
最大限度減少集成工作:VVAS 和 Vitis AI 能夠處理運行時、緩沖區(qū)管理和媒體階段之間的復(fù)雜性。
加速原型開發(fā):借助可復(fù)用的插件組件、預(yù)構(gòu)建的啟動鏡像和 Python API,更快實現(xiàn)可運行的概念驗證。
縮短邁向量產(chǎn)的路徑:用于快速原型開發(fā)的同一套工具鏈,也可以借助 VART 和零拷貝推理擴展到經(jīng)過優(yōu)化的量產(chǎn)級部署。
結(jié)語
本文中的示例,從簡單的三行 ONNX Runtime 會話,到用單條命令表達的完整 YOLOX GStreamer 流水線,展示了這套工具鏈在實踐中的運行方式。這些示例也說明,邊緣 AI 部署中的難點完全可以解決;關(guān)鍵在于在合適的層級使用合適的抽象。
Vitis AI 和 VVAS 正是提供這些抽象的工具。無論您是從 PyTorch 模型起步,需要找到通往 NPU 的路徑,還是已經(jīng)完成推理、需要將其接入實時視頻流,這套工具鏈都能在您當(dāng)前所處的位置提供支持,并隨著需求增長而擴展。對于在第二代 Versal AI Edge 系列上構(gòu)建實時 AI 應(yīng)用的團隊,Vitis AI、VVAS、Quark 和 AI Analyzer 提供了必要的基礎(chǔ)設(shè)施與工具,幫助設(shè)計人員自信地實現(xiàn)、優(yōu)化并將其設(shè)計部署到量產(chǎn)環(huán)境。
準備開始了嗎?
歡迎查閱 Vitis AI 6.2 用戶指南和 VVAS 6.2 用戶指南,獲取完整文檔、快速入門教程,以及基于第二代 AMDVersal AI Edge 系列 VEK385 評估板的預(yù)構(gòu)建示例。