在汽車軟件開發領域,越來越多的大規模 AI 模型被集成到自動駕駛汽車中,這些模型的范圍從視覺 AI 模型到用于自動駕駛的端到端 AI 模型。現在,汽車軟件開發領域對算力的需求正在飛速增長。導致系統負載增加,對系統穩定性和時延產生了負面影響。
為了解決這些難題,可以使用可編程視覺加速器(PVA)提高能效和整體系統性能。PVA 是 NVIDIA DRIVE SoC 上的一個低功耗、高效率的硬件引擎。通過使用 PVA,可以卸載通常由 GPU 或其他硬件引擎處理的任務到 PVA 上,從而降低它們的負載,使它們能夠更加高效地管理其他關鍵任務。
在本文中,我們簡要介紹了 DRIVE 平臺上的 PVA 硬件引擎和 SDK。我們展示了 PVA 引擎在計算機視覺(CV)流水線中的典型用例,包括預處理、后處理和其他 CV 算法,重點介紹其效果和效率。最后,我們以蔚來為例,詳細介紹了蔚來如何在其數據流水線中使用 NVIDIA PVA 引擎和優化算法來卸載 GPU 或視頻圖像合成器(VIC)任務,并提高自動駕駛汽車系統的整體性能。
PVA 硬件概述
PVA 引擎是一款先進的超長指令詞(VLIW)、單指令、多數據(SIMD)數字信號處理器,它針對圖像處理和計算機視覺算法加速任務進行了優化。PVA 具有出色的性能和極低的功耗。作為異構計算流水線的一部分,PVA 可與 NVIDIA DRIVE 平臺上的 CPU、GPU 和其他加速器異步或并行使用。
圖 1. PVA 硬件架構
NVIDIA DRIVE Orin 上的 CV 集群中有一個 PVA 實例,NVIDIA DRIVE Orin是一種高性能系統級芯片(SoC)專為先進的 AI 應用而設計,尤其是自動駕駛汽車和機器人領域。
在每個 PVA 中,有兩個向量處理子系統(VPS)。每個 VPS 包括以下內容:
1 個矢量處理器(VPU)內核
1 個解耦查找單元(DLUT)
1 個向量內存(VMEM)
1 個指令緩存(I-cache)
VPU 核是主處理單元。它是一個專為計算機視覺優化的向量 SIMD VLIW DSP。它通過指令緩存獲取指令,并通過 VMEM 訪問數據。
DLUT 是專為提高并行查找操作效率而開發的專用硬件組件。它通過與主處理器解耦的流水線中執行此類查找操作,實現了使用單個查找表副本進行并行查找。通過這種方式,DLUT 可以最大限度地減少內存占用并提高吞吐量,同時避免依賴數據的內存庫沖突,最終提高系統整體性能。
VMEM 為 VPU 提供了本地數據存儲,實現了各種圖像處理和計算機視覺算法的高效執行。它支持 VPS 以外的系統組件的訪問(比如 DMA 和 R5),從而實現與 R5 及其他系統級組件的數據交換。
VPU(I-cache)可根據要求向 VPU 提供指令數據、從系統內存中請求缺失的指令數據并維護 VPU 的臨時指令存儲。
R5 為每個 VPU 任務配置 DMA,選擇性地將 VPU 程序預取到 VPU 指令緩存中,并啟動相應 VPU-DMA 的組合來處理任務。DRIVE Orin PVA 還包含 1 個 L2 SRAM 內存供兩組 VPS 和 DMA 共享。
兩個 DMA 設備用于在外部內存、PVA L2 內存、兩個 VMEM(每個 VPS 1 個)、R5 緊密耦合內存(TCM)、DMA 描述符內存和 PVA 級配置寄存器之間移動數據。
在低負載系統中,對 DRAM 的兩個并行 DMA 訪問最高可實現 15 GB/s 的讀/寫帶寬。在高負載系統中,該帶寬最高可達到 10 GB/s。
在算力方面,INT8 GMACS(每秒十億次乘法累加運算)為 2048,不包括 DLUT。每個 PVA 實例的 FP32 GMACS 為 32。
PVA SDK 介紹
與 GPU 的 CUDA 工具包類似,NVIDIA PVA SDK 專為打造利用 PVA 硬件功能的計算機視覺算法而設計。PVA SDK 為 CV 和 DL/ML 算法的開發、部署和安全認證提供了運行時 API、工具和教程。它提供了一個從構建到部署的無縫框架,支持將代碼交叉編譯成 Tegra PVA 上的二進制可執行文件。
PVA SDK 通過多種資源支持軟件開發:
全面的入門指南。
x86 原生仿真器,可模擬真實的 VPU。支持在 x86-64 平臺上開發和調試 VPU 內核。
全套代碼生成工具,包括經過優化的 C/C++ 編譯器、調試器和集成開發環境。
分析工具,例如用于視覺性能分析的 NVIDIA Nsight 系統和用于詳細 VPU 代碼性能指標的 API。
分步教程,該教程將逐一介紹 PVA 的概念,從基本示例到 VPU、DMA 的高級優化以及與其他 Tegra 引擎的互通。
豐富的文檔和參考手冊提供了有關 VPU 內部函數的詳細信息,使用戶能夠編寫優化的代碼,同時抽象并降低 DMA 編程的復雜性。
PVA SDK 提供了大量現成的算法以支持自動駕駛和機器人領域中的常見計算機視覺用例。用戶可以在其生產環境中直接使用這些算法(可訪問源代碼)或者使用 PVA SDK 的功能自主開發定制算法。
NVIDIA 根據常見的 CV 用例,基于 PVA SDK 預先開發了許多算法。用戶可以在其產品中充分利用這些 PVA 算法并訪問代碼,也可以將各種不同的算法作為參考,自主開發有價值的算法。
典型 PVA 用例
許多自動駕駛汽車開發者都面臨著 SoC 計算資源不足的挑戰,這導致 CPU、GPU、VIC 和 DLA 負載過高。為了解決這個問題,人們正在考慮使用 PVA 硬件卸載 SoC 上使用率較高的硬件引擎的處理任務。
圖像處理:部分圖像處理和 CV 任務可以移植到 PVA 上,以卸載 GPU、CPU、VIC 甚至 DLA 的工作負載。
深度學習操作:在深度學習網絡中,可將某些層或計算密集型運算符(例如 ROI 對齊)卸載到 PVA。在特定情況下,小型深度學習網絡可以完全移植到 PVA 上。
數學計算:作為一個向量 SIMD VLIW DSP,PVA 可以高效地處理數學計算,例如矩陣計算、FFT 等。
以下詳細介紹兩個用例,以供參考:
將 AI 流水線中的預處理和后處理卸載至 PVA
將純 CV 或受計算限制的流水線遷移至 PVA
將 AI 流水線中的
預處理和后處理卸載至 PVA
圖 2. AI 推理流水線
這是 CV 流水線的典型用例。輸入圖像來自實時場景中的實時攝像頭,或來自離線場景中的解碼器。該流水線包括三個階段:
預處理
AI 推理
后處理
PVA 硬件引擎在 CV 流水線的所有階段,從預處理到后處理,都能發揮關鍵作用,確保圖像處理和計算機視覺任務得到高效且有效的處理。
預處理
預處理涉及基本的 CV 任務,以便對齊或規范化模型的輸入,其中包括重映射(去畸變)、裁剪、調整大小和顏色轉換(從 YUV 到 RGB)等操作。
在某些情況下,當圖像來自 NVDEC(Tegra SoC 上的解碼器硬件引擎)時,圖像布局為 block linear 格式。在這種情況下,在預處理階段需要執行更多的步驟,將 block linear 格式轉換為 pitch linear 格式的圖像。
PVA 硬件引擎非常適合這些任務。然而,在內存受限的情況下,應考慮合并相鄰的 PVA 操作,以充分利用 PVA 的算力。
AI 推理
AI 推理以最先進的 AI 模型為基礎,執行業務需求所需的核心 CV 任務。該步驟可在 GPU 或深度學習加速器(DLA)上執行,以獲得更好的性能。
PVA 運行時 API 同時支持 NvSciSync 和原生 CUDA 流,能夠高效執行涉及 GPU/DLA 的異構流水線,而不會產生恢復到 CPU 進行調度相關的時延。
根據具體用例,該 AI 模型可以是用于物體檢測的 YOLO 或 R-CNN,也可以是用于分類的邏輯回歸或 K-nearest neighbor(KNN),以及其他模型等。
后處理
后處理會優化檢測結果。該步驟可能涉及使用中值濾波器去除異常值,進行混合操作以融合不同的候選項或應用非最大抑制(NMS)來選擇最佳目標。PVA 硬件能夠有效處理這些任務。
將純 CV 或受計算限制的流水線遷移至 PVA
圖 3. 追蹤器流水線
這是一個更具體、更復雜的用例,所有步驟都可以在 PVA 上執行。主要涉及檢測和追蹤輸入圖像中的特征點,或在某些場景中計算稀疏光流:
圖像金字塔沿比例空間擴展圖像。
特定的檢測算法可識別圖像中的特征點或角點。
跟蹤算法逐幀追蹤這些特征點。
與之前的用例相比,這個場景在關鍵方面有所不同:
計算受限處理:數據處理的每一步都受計算限制,并涉及到處理 2D 圖像。這些算法可以很好地向量化,并在 PVA 硬件上高效執行。最重要的是,PVA 的算力得到了充分利用。
緊密耦合的步驟:有一個額外的數據循環將追蹤信息傳回之前的步驟,以完善后續的追蹤結果。這使得各步驟之間的耦合更加緊密。
純 CV 流水線:該用例是不涉及機器學習網絡的純計算機視覺流水線。每個步驟都是可預測和可解釋的,只側重于傳統的 CV 算法。
通過使用 PVA 執行這些任務,用戶可以減輕 GPU、VIC、CPU 和 DLA 的負載,提高系統的穩定性和效率。
蔚來汽車數據流水線優化
蔚來汽車是一家知名的全球化汽車制造商,致力于高端智能電動汽車的設計、開發和生產。
以下是來自蔚來的數據處理流水線,涉及使用專門的算法和技術對實時攝像頭或 H.264 視頻中的感興趣區域和對象進行去識別、遮蔽或替換。
原始數據流水線方案
圖 4. 蔚來的數據流水線
圖 4 表示蔚來數據流水線的原始版本。NVDEC 用于解碼 H.264 視頻,生成 block linear 格式的 YUV 圖像。由于 block linear 是 NVIDIA 特有的內部格式,因此外部用戶無法直接處理這些圖像。VIC 引擎被用于將 block linear 圖像轉換為 pitch linear 格式,以便進一步處理。
接下來,使用 VIC 引擎進行色彩轉換(從 YUV 轉換為 RGB)以生成 RGB 圖像。然后,AI 模型會先對這些圖像進行分析,以檢測感興趣的物體。在 AI 模型為物體生成邊界框后,使用 VIC 或 CUDA 的后處理步驟將馬賽克或蒙版應用于原始 YUV pitch linear 圖像。
最后,使用 VIC 引擎將處理過的幀從 pitch linear 格式轉換回 block linear 格式,然后使用 NVENC 將其回編成 H.264 視頻。
使用 PVA 替換 CV 運算
在蔚來的案例中,GPU 和 VIC 的負載都很重。該流水線涉及多個 CV 運算,包括以下方面:
block linear 和 pitch linear 格式之間的布局轉換
從 YUV 到 RGB 的顏色轉換
加馬賽克和加掩碼
這些運算可以卸載到 PVA,以節省 GPU 和 VIC 的資源。
布局轉換和色彩轉換是 PVA 的內存受限任務,而 DMA 帶寬是瓶頸。可以使用 PVA 中的其他計算資源進行基于邊界框和 YUV PL 圖像的加馬賽克和加掩碼。
為了進一步加快執行速度,還可以并行運行 PVA 算法,由于每個 PVA 實例都包含兩個 VPU,每個 VPU 都有一個獨立的 DMA 控制器,用于與 DRAM 交換數據。
在實施 PVA 內核時,還可以采用其他幾種技術來提高整體性能,包括 DLUT、基于硬件的循環地址生成(AGEN)、乒乓緩沖區、循環展開等。
數據流水線優化
傳統數據處理流水線中的時延可能來自兩個方面:
在不同功能模塊或硬件加速器(例如本用例中的 PVA 和 DLA)之間復制數據會產生額外開銷。
執行和同步多個算法進程所需的額外同步開銷。
使用 NVIDIA DriveOS SDK 提供的 NvStreams 框架可以減少這些開銷。而 PVA 硬件加速器可以利用 PVA SDK 中的 NvSci 互通性 API 與 NvStreams 高效配合,實現零拷貝數據轉換和異步任務提交,從而將開銷降至最低。
零拷貝接口
不同硬件組件(例如 PVA 和 CPU)和應用對內存緩沖區有各自的訪問限制或要求。為了實現零拷貝的目標,可采用統一的內存架構,使加速器能夠與不同的應用在 NVIDIA DRIVE SoC 上共享同一物理內存。
在分配內存緩沖區之前,應收集和協調詳細的需求以確保所分配的內存緩沖區可在必要的模塊之間共享。該功能是通過 NvStreams API 實現的。
在成功分配可共享的內存緩沖區后,就能以零拷貝的方式進行不同硬件模塊或應用之間的數據轉換。這種解決方案適用于涉及進程間通信(IPC)或跨虛擬機(VM)的情況。如果是芯片間的數據傳輸,可在同一個 NvStreams 框架下使用高速 PCIe。
圖 5. NVIDIA DRIVE SoC(Orin)架構
基于硬件加速器的調度
蔚來的數據流水線集成了多個硬件加速器,可以使用 NvSciSync 管理這些引擎之間的同步。NvSciSync 是 NVIDIA NvStreams 庫的一部分,通過管理同步對象來協調執行各種硬件組件的操作。
首先,在加速器上運行的任務之間插入同步點。當任務開始時,后續硬件加速器會在同步點等待,直到前面的任務完成。任務完成后,相應的硬件加速器會釋放同步點,自動觸發下一個加速器繼續執行任務。這一過程盡可能減少了 CPU 的占用,只需進行一些初始設置,并確保跨硬件引擎的高效同步。
基于 PVA 任務級別的調度
在原始流水線中,所有任務的提交和同步都由 CPU 逐個控制。這意味著 CPU 將任務提交給計算引擎,然后以同步的方式等待每個算法任務完成。
PVA 支持同時提交多個任務,并只等待最后一個任務。所有提交的 PVA 任務都將同時按照指定順序進行計算,直到所有任務完成。批量提交多個任務可減少與提交 PVA 任務相關的 CPU 負載,從而優化性能。這樣就能解放 CPU 處理其他重要的任務,并減少系統的整體時延。
借助 PVA SDK,用戶也可以為 PVA 算法指定調度策略以充分利用 PVA 實例上的兩個 VPU。例如,用戶可以指定在單顆 VPU 上執行某些算法。
同時使用兩個 VPU 時,如果任務之間有順序要求,可以在兩個 VPU 上依次設置要執行的任務。如果沒有順序要求,PVA 任務會在 VPU 空閑時立即執行。這大大降低了多任務的執行時延。
生產就緒
圖 6 顯示了蔚來使用 PVA 替換 CV 操作并將 DL 模型移植到 DLA 引擎后可用于生產的蔚來數據流水線。如需了解更多信息,請參閱《在 NVIDIA Jetson Orin 上部署 YOLOv5 與 cuDLA:量化感知訓練到推理》。
https://developer.nvidia.com/zh-cn/blog/deploying-yolov5-on-nvidia-jetson-orin-with-cudla-quantization-aware-training-to-inference/
圖 6. 用于生產的數據流水線
在這個經過優化的流水線中,PVA 和 DLA 解決方案有效地滿足了業務需求。這種方法既可行又高效。從而使整體 GPU 資源利用率降低 10%,同時釋放 VIC 引擎用于系統內的其他高優先級任務。在 block linear 和 pitch linear 格式的轉換過程中,無需為臨時變量預先分配額外的內存,從而大大節省了內存。
根據蔚來的內部評估,在系統中運行該流水線時,PVA 在 1 個 VPU 實例上的負載約為 50%。由于 1 個 PVA 包含兩個 VPU,蔚來數據流水線中的 PVA 總負載約為 25%。這表明 PVA 仍有可用的算力處理該流水線中的其他任務。
進一步優化
圖 7. 用于進一步優化的數據流水線
為了進一步優化該流水線,可以采取以下步驟:
使用 PVA 將 DLA 替換為簡單的深度學習模型,因為 PVA 目前僅有約 25% 的使用率。內部測試表明,Yolo-Fastest 網絡可以成功移植到 PVA 上,并且其檢測對象的能力符合預期。
考慮將預處理、深度學習推理和后處理階段合并到單顆 PVA 內核中,這樣就不需要在內核之間進行額外的 DMA 傳輸,從而降低 DMA 總帶寬。
結語
基于 PVA 的優化解決方案顯著提高了蔚來的性能,并被廣泛應用于蔚來的量產車型中。通過將任務卸載到 PVA,可以解放 GPU 計算資源,從而加速深度學習計算并使用戶能夠實施更加復雜的深度學習網絡。
蔚來正在積極借助 PVA SDK 在 PVA 上開發更高效的 PVA 算法,以便充分利用 NVIDIA DRIVE 平臺的額外算力,提高其產品的智能和競爭力。
總之,PVA 提供了強大的工具來解決自動駕駛汽車開發中的計算問題,從而能夠更高效、更有效地處理復雜的視覺任務,并提高整體系統性能。
-
NVIDIA
+關注
關注
14文章
4986瀏覽量
103046 -
PVA
+關注
關注
0文章
19瀏覽量
11838 -
汽車系統
+關注
關注
1文章
134瀏覽量
19747 -
SDK
+關注
關注
3文章
1036瀏覽量
45935 -
自動駕駛
+關注
關注
784文章
13812瀏覽量
166448
原文標題:使用 PVA 引擎優化自動駕駛汽車 CV 開發流水線
文章出處:【微信號:NVIDIA-Enterprise,微信公眾號:NVIDIA英偉達企業解決方案】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論