CUDA與TensorRT模型部署優化:關鍵考慮與實踐策略
本文經自動駕駛之心公眾號授權轉載,轉載請聯系出處。
筆者的一點個人理解
模型部署與優化是當前許多自動駕駛公司投入人力物力去做的模塊,如何將模型高效部署在特定的芯片上至關重要。深度學習模型的部署與優化是一個綜合性的過程,涉及多個關鍵考慮因素。雖然工具如TensorRT為模型提供了強大的優化,但其應用并非無限,有時需要開發者手動調整或補充。此外,選擇CUDA Cores還是Tensor Cores、考慮前后處理的效率,以及進一步的性能分析和基準測試,都是確保模型在特定硬件上達到最佳性能的關鍵步驟。今天我將會為大家分享下模型部署的關鍵考慮與實踐策略。
所有內容出自:全搞定!基于TensorRT的CNN/Transformer/檢測/BEV模型四大部署代碼+CUDA加速教程!
1. FLOPS TOPS
首先,我們來解釋FLOPS和TOPS的含義:
FLOPS:是Floating Point Operations Per Second的縮寫,意思是每秒浮點運算次數。它是衡量計算機或計算設備在每秒內執行的浮點運算次數的指標。通常用于表示處理器的計算性能。例如,1 TFLOPS表示每秒執行1萬億次浮點運算。
TOPS:是Tera Operations Per Second的縮寫,意思是每秒運算次數。它與FLOPS類似,但通常用于衡量整數運算或混合型的運算能力,而不僅僅是浮點運算。
下面列出一個關于NVIDIA A100(基于發布時的公開資料)的性能參數表格。請注意,這些性能數字代表了理論上的峰值計算能力,實際應用中的性能可能會因為各種因素而有所不同。
參數 | 性能值 |
Peak FP64 (雙精度浮點性能) | 9.7 TFLOPS |
Peak FP32 (單精度浮點性能) | 19.5 TFLOPS |
Peak FP16 (半精度浮點性能) | 312 TFLOPS |
Tensor Performance (FP16) | 624 TOPS |
INT8 Performance | 1248 TOPS |
INT4 Performance | 2496 TOPS |
下面是Jetson Xavier AGX Volta的參數
參數 | Jetson Xavier AGX (Volta) |
Core種類與數量 | |
CUDA cores | 512 |
Tensor cores | 64 |
SMs | 8 |
計算峰值 | |
FP32 | 1.4 TFLOPS |
FP16 | 11 TFLOPS |
INT8 | 22 TOPS |
帶寬 | 137 GB/s |
頻率 | 900MHz |
Tensor Performance (FP16): Tensor Core的半精度浮點性能,特別針對深度學習和AI應用進行了優化。
INT8 Performance: 8位整數性能,常用于某些深度學習工作負載。
INT4 Performance: 4位整數性能,適用于需要更高吞吐量但可以接受較低精度的應用。
這些數據提供了一個全面的視圖,顯示了A100在不同精度和數據類型下的性能。不同的應用和任務可能會根據其對計算精度和速度的需求來選擇最適合的數據類型和運算模式。
2. FLOPs
這個容易弄混淆,這個只是衡量模型大小的指標,下面展示YOLOV5跟Swin Transformer的FLOPs
參數/模型 | YOLOv5 (640x640) | Swin Transformer (224x224) |
Tiny/Small | YOLOv5s: ~3.5 GFLOPs | Swin Tiny: ~4.5 GFLOPs |
Medium | YOLOv5m: ~6.9 GFLOPs | Swin Small: ~8.7 GFLOPs |
Large | YOLOv5l: ~12.7 GFLOPs | Swin Base: ~17.3 GFLOPs |
Extra Large | YOLOv5x: ~17.4 GFLOPs | Swin Large: ~34.5 GFLOPs |
- 模型的規模與計算復雜性的關系:
- 對于每個模型系列(不論是YOLOv5還是Swin Transformer),當模型規模增加(從Tiny到Extra Large)時,計算復雜性(FLOPs)也相應增加。這很容易理解,因為更大的模型通常具有更多的層和參數,因此需要更多的計算。
- 模型輸入尺寸的影響:
YOLOv5的輸入尺寸為640x640,而Swin Transformer的為224x224。即使如此,較小的Swin Transformer模型仍然具有相似或更高的FLOPs。這突顯了Transformer結構相較于傳統的卷積網絡結構在計算上的密集性。
模型類型的不同:
正如前面提到的,YOLOv5是一個目標檢測模型,而Swin Transformer主要設計用于圖像分類。將這兩者進行對比可能不完全公平,因為它們是為不同的任務優化的。不過,這個對比提供了一個關于不同模型和結構計算復雜性的大致感覺。
FLOPs與性能的關系:
雖然FLOPs提供了關于模型計算復雜性的信息,但它并不直接等同于模型的實際運行速度或效率。其他因素,如內存訪問、優化技術、硬件特性等,都會影響實際性能。
同樣,FLOPs也不直接等同于模型的準確性。有時,較小的模型經過適當的訓練和優化可能會表現得相當好。
總的來說,這個表格提供了一個視覺上的對比,展示了兩種不同模型結構在不同規模下的計算復雜性。但解釋這些數據時,要考慮到模型的具體用途、設計目標和其他相關因素。
3. CUDA Core and Tensor Core
CUDA Core:
- 定義: CUDA Core 是 NVIDIA GPU 中用于執行浮點和整數運算的基本計算單元。
- 用途: CUDA Cores 主要用于通用的圖形和計算任務,比如圖形渲染、物理模擬和其他數值計算等。
Tensor Core:
- 定義: Tensor Core 是 NVIDIA 的一些新架構(如 Volta、Turing 和 Ampere)中引入的專門硬件單元,用于高效地執行深度學習中的矩陣運算。
- 用途: Tensor Cores 專門設計用于深度學習計算,尤其是進行大規模的矩陣乘法和加法操作,這些操作是神經網絡訓練和推理的核心。
簡而言之,CUDA Core 是 GPU 的通用計算工作馬,處理各種圖形和計算任務,而 Tensor Core 則是為深度學習任務特別設計的高效計算單元。
A100 有 6912 個 CUDA Core,而只有 432 個 Tensor Core。盡管 Tensor Cores 的數量較少,但它們在處理特定的深度學習任務時非常高效。
設計目的:
CUDA Cores 是通用的計算單元,能夠處理各種任務,包括圖形、物理模擬和通用數值計算等。Tensor Cores 則專門設計用于深度學習計算,尤其是矩陣乘法和累加操作。性能:
單一的 CUDA Core 能夠執行基本的浮點和整數運算。每個 Tensor Core 能夠在一個周期內處理一小塊矩陣的乘法和累加操作(例如 4x4 或 8x8)。這使得它們在處理深度學習操作時非常高效。使用場景:
當執行圖形渲染或通用計算任務時,主要使用 CUDA Core。當執行深度學習訓練和推理任務時,尤其是使用庫如 cuDNN 或 TensorRT 時,Tensor Cores 會被積極利用,以實現最大的計算效率。使用 A100 作為例子,我們可以清楚地看到 NVIDIA 是如何通過結合 CUDA Cores 和 Tensor Cores 來提供高效的深度學習和通用計算性能的。
4. Roofline model
Roofline Model 是一個可視化工具,用于表征計算密集型應用的性能。它提供了一個框架,通過該框架,開發者可以理解應用的性能瓶頸,并與某個特定硬件的理論峰值性能進行對比。Roofline 模型的主要目標是提供對算法和硬件交互的深入了解,從而為優化提供指導。
Roofline模型基本上是一個圖,其中:
- x軸: 計算與數據移動的比率,通常用“浮點運算次數/字節”表示。
- y軸: 性能,通常以“FLOPS”為單位。
在此圖上有兩個主要部分:
- Roof: 這代表了硬件的性能上限。這是兩部分組成的:
- 計算上限:這通常是以FLOPS為單位的峰值計算性能。
- 帶寬上限:這是數據從主存儲器移動到計算單元的最大速率。
- Line:這表示應用或算法的性能。它的斜率由內存訪問和浮點計算的比率決定。
通過觀察算法在Roofline模型上的位置,開發者可以判斷算法是受計算能力限制還是受帶寬限制,并據此決定優化策略。
案例一: RTX 3080
案例二: Jetson Xavier AGX Volta
參數 | Jetson Xavier AGX (Volta) |
Core種類與數量 | |
CUDA cores | 512 |
Tensor cores | 64 |
SMs | 8 |
計算峰值 | |
FP32 | 1.4 TFLOPS |
FP16 | 11 TFLOPS |
INT8 | 22 TOPS |
帶寬 | 137 GB/s |
頻率 | 900MHz |
也可以從這兩個案例的對比看出來邊緣端跟服務器端的區別,所以TensorRT CUDA的掌握就很重要, 能夠使用這些SDK滿足客戶的需求也是我們求職的一個機會
5. 模型部署的一些誤區
模型性能與FLOPs
FLOPs, 即浮點運算次數, 通常被用來衡量模型的計算復雜性。然而,它并不足以完全描述模型的性能。盡管FLOPs反映了模型的計算負荷,但實際的推理速度和效率還受到其他因素影響。例如,訪問內存、數據的轉換和重塑,以及其他與計算無關但與深度神經網絡操作相關的部分。此外,像前后處理這樣的步驟,也可能占據顯著的時間,尤其是在一些輕量級模型中。
TensorRT的局限性
TensorRT是NVIDIA提供的一個強大的工具,可以對深度學習模型進行優化以獲得更好的推理性能。然而,它的優化能力并非沒有局限。例如,某些低計算密度的操作,如1x1的conv,depthwise conv, 可能不會被TensorRT重構。有些操作,如果GPU不能優化,TensorRT可能會選擇在CPU上執行。但開發者可以手動調整代碼,使某些CPU操作轉移到GPU。此外,如果遇到TensorRT尚不支持的算子,可以通過編寫自定義插件來補充。
1x1 conv, depthwise conv 這些算子出現在mobileNet上面,Transformer的優化也是把最后的FC層用這兩個算子去替換,他們雖然降低了參數量,但是減少了計算的密度。
CUDA Core與Tensor Core的選擇考量
NVIDIA的最新GPU通常配備了CUDA Cores和Tensor Cores。雖然Tensor Cores專門為深度學習操作優化,但TensorRT不一定總是使用它們。實際上,TensorRT通過內核自動調優選擇最優的內核執行方式,這可能意味著某些情況下INT8的性能比FP16還差。要有效利用Tensor Cores,有時需要確保tensor的尺寸為8或16的倍數。
前后處理的時間開銷
在深度學習的應用中,前處理(如圖像調整和歸一化)和后處理(如結果解釋)是不可或缺的步驟。然而,對于輕量級的模型,這些處理步驟可能比實際的DNN推理還要耗時。部分前后處理步驟由于其復雜邏輯不適合GPU并行化。但解決方案是將這些邏輯中的并行部分移至GPU或在CPU上使用優化庫如Halide,這樣可以提高某些任務,如模糊、縮放的效率。
很多時候在做YOLO的后處理的時候我們會喜歡把它放在GPU上面去做,這樣會給人一種很快的感覺,但是這種并不是必要的,第一,GPU沒有排序的功能,第二,YOLO系列我們使用閾值先過濾掉一大部分的時候剩下來的bbox已經是很少的了,也不見得說會快很多。
并不是TRT跑通了就結束了
創建并使用TensorRT推理引擎僅僅是優化流程的開始。為了確保模型達到最佳性能,開發者需要進一步對其進行基準測試和性能分析。NVIDIA提供了如nsys, nvprof, dlprof, Nsight等工具,這些工具可以幫助開發者精確地確定性能瓶頸、尋找進一步的優化機會以及識別不必要的內存訪問。
原文鏈接:https://mp.weixin.qq.com/s/OikQ9BUZi6_be8ul6L0F6g