tensorrt轻松部署高性能dnn推理_基于TensorRT车辆实时推理优化
基于TensorRT車輛實時推理優化
Optimizing NVIDIA TensorRT Conversion for Real-time Inference on Autonomous Vehicles
自動駕駛系統使用各種神經網絡模型,這些模型要求在GPU上進行極其精確和高效的計算。Zoox是一家全新開發robotaxis的初創公司,充分利用了NVIDIA硬盤的高性能、節能計算功能。最近,Zoox在舊金山發布了一個一小時的全自動駕駛,詳細展示了他們的AI堆棧。
與TensorFlow相比,NVIDIA TensorRT提供了顯著的加速(fp32為2-6x,Zoox網絡為9-19x),支持使用CUDA流的異步和并發推理能力。Zoox視覺/激光雷達/雷達/預測算法嚴重依賴于深部神經網絡,這些神經網絡在我們的車輛上都運行在NVIDIA gpu上,并且大多使用TensorRT部署。
TensorRT是一個用于高性能深度學習推理的SDK,它為深度學習推理應用程序提供低延遲和高吞吐量。
可以使用各種轉換管道將模型轉換為TensorRT引擎。例如,使用Caffe訓練的模型可以使用Caffe解析器輕松地轉換為TensorRT運行時。
但是,TensorFlow模型需要使用ONNX(開放式神經網絡交換)轉換為TensorRT引擎。本文中介紹的工具是針對TensorFlow的,但是這些原則也可以應用到其他的訓練框架中。 在為所有這些深層神經網絡部署和維護TensorRT引擎的過程中,我們發現了以下痛點: ONNX和TensorRT只支持有限的TensorFlow操作集。
內核大小和步幅的某些組合可能會對TensorRT造成副作用。
遷移到精度降低的推理或TensorRT升級可能導致性能回歸。
在Zoox,我們開發了一組工具來促進TensorRT引擎的部署、驗證和維護,如圖2所示。在下面的部分中,我們將詳細介紹這些模塊。
TensorRT conversion checker
TensorRT轉換檢查器的目標是幫助您在訓練網絡之前識別可能的轉換失敗。checker是輕量級的,按設計是最小的(在本文后面的代碼示例中突出顯示)。在訓練之前,它會在所構建的網絡上觸發一個TensorRT轉換過程。我們只有在轉換成功后才開始訓練。
Figure 2. Zoox TensorRT conversion pipeline overview.
下面的代碼示例顯示了TensorRT轉換檢查器。要使用插件,用戶只需要導入數據包,在網絡構建期間注冊輸入/輸出節點,然后在訓練開始之前觸發轉換檢查。
import trt_checker
class Lenet5():
def network(self, X):
input = tf.identity(X, name = "input")
# Registers the input in the conversion checker.
trt_checker.register_input(input)
# Network definition.
...
# Output node.
output = tf.identity(logits, name="output")
# Registers the output node in the conversion checker.
trt_checker.register_output(output)
return output
def main():
...
# Checks if the model can be converted to trt.
conversion_result = trt_checker.check_conversion()
# Only train when trt conversion is successful.
if conversion_result:
accuracy = lenet_network.train()
Output deviation inspection
此插件的目標是在運行整個特定于模型的計算之前,報告轉換的TensorRT引擎的潛在精度回歸。這個插件在轉換后的TensorRT引擎和原始TensorFlow圖上運行推理,輸入完全相同(由用戶隨機生成或指定)。然后報告輸出偏差的分布,給開發人員一個潛在精度回歸的預警。此模塊是逐層檢查模塊的構建塊。
Figure 3. Output deviation inspection
Layer-by-layer inspection
下面的代碼示例顯示逐層檢查:
def layer_by_layer_analysis(graph, input_layer):
median_error = []
for layer in graph.layers():
errors = convert(graph, input=input_layer, output=layer)
median_error.append(median(errors))
plot(median_error)
如果觀察到精度回歸,我們希望找出TensorRT引擎中的哪個層或操作對回歸有顯著貢獻。這促使我們開發了逐層檢測模塊。調用時,模塊為每個中間操作運行一個轉換作業,并報告此特定操作生成的中值/最大錯誤(如圖4所示)。當研究在不同版本的TensorRT中觀察到的不同行為時,此模塊非常有用。
Figure 4. Example regression observed in semantic segmentation when upgrading from TensorRT 5.1.5 to TensorRT 7.0.
圖4顯示了這種回歸的一個例子,在這個例子中,我們觀察到語義分割輸出有輕微的回歸。我們對TensorRT 5.1引擎和TensorRT 7.0引擎進行了逐層檢查,然后繪制了每層的中間誤差。 圖5顯示了每一層產生的中值誤差。我們可以看到在這個特定網絡的上采樣層中可能存在一個bug。基于這些信息,我們能夠在一個較小的網絡上重現這種回歸,并將此錯誤報告給NVIDIA。此錯誤現在已在TensorRT 7.1中修復。
圖5. 圖4中使用的兩臺TensorRT發動機的逐層檢查結果。橙色線顯示了TensorRT 7.0推理輸出與TensorFlow推理輸出相比的中間誤差。藍線顯示了TensorRT 5.0引擎生成的結果。上采樣層的誤差分布有顯著差異。
Latency flame graph
為了可視化推理中的瓶頸并找出可能的優化操作,我們將TensorRT剖面儀生成的逐層計時信息繪制成火焰圖。計時詳細信息根據每個層的名稱范圍分組,如圖6所示。這使我們能夠看到網絡的哪個部分花費的時間比預期的要長。
Figure 6. Latency flame graph on Inception Net. The 1767 samples shown in this graph indicates that a forward pass on this network takes 1.767 ms.
Automated conversion pipeline
在Zoox,我們維護一個自動轉換管道,跟蹤每個模型使用的轉換選項。當觸發時,自動轉換管道將所有記錄的模型轉換為TensorRT引擎,并將它們上載到云中進行部署。它還為新轉換的TensorRT引擎運行驗證作業以驗證準確性。這個管道幫助我們只用一個命令就可以將所有現有的模型升級到TensorRT的新版本。
Incompatible graph test suite
Zoox維護一個TensorFlow到TensorRT的轉換測試套件。它測試了從TensorFlow圖到tensort引擎的轉換失敗案例,以及報告的NVIDIA錯誤識別。
每個測試構建一個TensorFlow圖,將其轉換為TensorRT,并將輸出偏差與TensorFlow圖進行比較。使用此測試套件,我們不僅可以向Zoox工程師演示哪些圖形結構或操作可能不適用于TensorRT,而且還可以檢測升級到TensorRT的新版本時修復了哪些回歸。
Summary
在這篇文章中,我們介紹了Zoox-TensorRT轉換管道中的幾個特性。TensorRT轉換檢查器參與神經網絡訓練的早期階段,以確保在您浪費時間和資源進行全面訓練之前發現不兼容的操作。可以在每一層調用推理精度驗證來識別不利于降低精度計算的操作。詳細的分析揭示了不必要的計算,這些計算不是在TensorRT內部優化的,但是可以通過在圖構建期間簡單的代碼更改來優化。
自動轉換管道幫助您驗證每個TensorRT升級或模型重新轉換。利用該流水線,我們成功地為神經網絡在Zoox自主駕駛平臺上執行各種流線型感知任務提供了TensorRT轉換支持。
總結
以上是生活随笔為你收集整理的tensorrt轻松部署高性能dnn推理_基于TensorRT车辆实时推理优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python编程制作_一种Python编
- 下一篇: IDEA——Git 的设置与使用