tensorrt轻松部署高性能dnn推理_基于TensorRT车辆实时推理优化
基于TensorRT車輛實(shí)時(shí)推理優(yōu)化
Optimizing NVIDIA TensorRT Conversion for Real-time Inference on Autonomous Vehicles
自動(dòng)駕駛系統(tǒng)使用各種神經(jīng)網(wǎng)絡(luò)模型,這些模型要求在GPU上進(jìn)行極其精確和高效的計(jì)算。Zoox是一家全新開發(fā)robotaxis的初創(chuàng)公司,充分利用了NVIDIA硬盤的高性能、節(jié)能計(jì)算功能。最近,Zoox在舊金山發(fā)布了一個(gè)一小時(shí)的全自動(dòng)駕駛,詳細(xì)展示了他們的AI堆棧。
與TensorFlow相比,NVIDIA TensorRT提供了顯著的加速(fp32為2-6x,Zoox網(wǎng)絡(luò)為9-19x),支持使用CUDA流的異步和并發(fā)推理能力。Zoox視覺/激光雷達(dá)/雷達(dá)/預(yù)測(cè)算法嚴(yán)重依賴于深部神經(jīng)網(wǎng)絡(luò),這些神經(jīng)網(wǎng)絡(luò)在我們的車輛上都運(yùn)行在NVIDIA gpu上,并且大多使用TensorRT部署。
TensorRT是一個(gè)用于高性能深度學(xué)習(xí)推理的SDK,它為深度學(xué)習(xí)推理應(yīng)用程序提供低延遲和高吞吐量。
可以使用各種轉(zhuǎn)換管道將模型轉(zhuǎn)換為TensorRT引擎。例如,使用Caffe訓(xùn)練的模型可以使用Caffe解析器輕松地轉(zhuǎn)換為TensorRT運(yùn)行時(shí)。
但是,TensorFlow模型需要使用ONNX(開放式神經(jīng)網(wǎng)絡(luò)交換)轉(zhuǎn)換為TensorRT引擎。本文中介紹的工具是針對(duì)TensorFlow的,但是這些原則也可以應(yīng)用到其他的訓(xùn)練框架中。 在為所有這些深層神經(jīng)網(wǎng)絡(luò)部署和維護(hù)TensorRT引擎的過程中,我們發(fā)現(xiàn)了以下痛點(diǎn): ONNX和TensorRT只支持有限的TensorFlow操作集。
內(nèi)核大小和步幅的某些組合可能會(huì)對(duì)TensorRT造成副作用。
遷移到精度降低的推理或TensorRT升級(jí)可能導(dǎo)致性能回歸。
在Zoox,我們開發(fā)了一組工具來促進(jìn)TensorRT引擎的部署、驗(yàn)證和維護(hù),如圖2所示。在下面的部分中,我們將詳細(xì)介紹這些模塊。
TensorRT conversion checker
TensorRT轉(zhuǎn)換檢查器的目標(biāo)是幫助您在訓(xùn)練網(wǎng)絡(luò)之前識(shí)別可能的轉(zhuǎn)換失敗。checker是輕量級(jí)的,按設(shè)計(jì)是最小的(在本文后面的代碼示例中突出顯示)。在訓(xùn)練之前,它會(huì)在所構(gòu)建的網(wǎng)絡(luò)上觸發(fā)一個(gè)TensorRT轉(zhuǎn)換過程。我們只有在轉(zhuǎn)換成功后才開始訓(xùn)練。
Figure 2. Zoox TensorRT conversion pipeline overview.
下面的代碼示例顯示了TensorRT轉(zhuǎn)換檢查器。要使用插件,用戶只需要導(dǎo)入數(shù)據(jù)包,在網(wǎng)絡(luò)構(gòu)建期間注冊(cè)輸入/輸出節(jié)點(diǎn),然后在訓(xùn)練開始之前觸發(fā)轉(zhuǎn)換檢查。
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
此插件的目標(biāo)是在運(yùn)行整個(gè)特定于模型的計(jì)算之前,報(bào)告轉(zhuǎn)換的TensorRT引擎的潛在精度回歸。這個(gè)插件在轉(zhuǎn)換后的TensorRT引擎和原始TensorFlow圖上運(yùn)行推理,輸入完全相同(由用戶隨機(jī)生成或指定)。然后報(bào)告輸出偏差的分布,給開發(fā)人員一個(gè)潛在精度回歸的預(yù)警。此模塊是逐層檢查模塊的構(gòu)建塊。
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引擎中的哪個(gè)層或操作對(duì)回歸有顯著貢獻(xiàn)。這促使我們開發(fā)了逐層檢測(cè)模塊。調(diào)用時(shí),模塊為每個(gè)中間操作運(yùn)行一個(gè)轉(zhuǎn)換作業(yè),并報(bào)告此特定操作生成的中值/最大錯(cuò)誤(如圖4所示)。當(dāng)研究在不同版本的TensorRT中觀察到的不同行為時(shí),此模塊非常有用。
Figure 4. Example regression observed in semantic segmentation when upgrading from TensorRT 5.1.5 to TensorRT 7.0.
圖4顯示了這種回歸的一個(gè)例子,在這個(gè)例子中,我們觀察到語義分割輸出有輕微的回歸。我們對(duì)TensorRT 5.1引擎和TensorRT 7.0引擎進(jìn)行了逐層檢查,然后繪制了每層的中間誤差。 圖5顯示了每一層產(chǎn)生的中值誤差。我們可以看到在這個(gè)特定網(wǎng)絡(luò)的上采樣層中可能存在一個(gè)bug。基于這些信息,我們能夠在一個(gè)較小的網(wǎng)絡(luò)上重現(xiàn)這種回歸,并將此錯(cuò)誤報(bào)告給NVIDIA。此錯(cuò)誤現(xiàn)在已在TensorRT 7.1中修復(fù)。
圖5. 圖4中使用的兩臺(tái)TensorRT發(fā)動(dòng)機(jī)的逐層檢查結(jié)果。橙色線顯示了TensorRT 7.0推理輸出與TensorFlow推理輸出相比的中間誤差。藍(lán)線顯示了TensorRT 5.0引擎生成的結(jié)果。上采樣層的誤差分布有顯著差異。
Latency flame graph
為了可視化推理中的瓶頸并找出可能的優(yōu)化操作,我們將TensorRT剖面儀生成的逐層計(jì)時(shí)信息繪制成火焰圖。計(jì)時(shí)詳細(xì)信息根據(jù)每個(gè)層的名稱范圍分組,如圖6所示。這使我們能夠看到網(wǎng)絡(luò)的哪個(gè)部分花費(fèi)的時(shí)間比預(yù)期的要長(zhǎng)。
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,我們維護(hù)一個(gè)自動(dòng)轉(zhuǎn)換管道,跟蹤每個(gè)模型使用的轉(zhuǎn)換選項(xiàng)。當(dāng)觸發(fā)時(shí),自動(dòng)轉(zhuǎn)換管道將所有記錄的模型轉(zhuǎn)換為TensorRT引擎,并將它們上載到云中進(jìn)行部署。它還為新轉(zhuǎn)換的TensorRT引擎運(yùn)行驗(yàn)證作業(yè)以驗(yàn)證準(zhǔn)確性。這個(gè)管道幫助我們只用一個(gè)命令就可以將所有現(xiàn)有的模型升級(jí)到TensorRT的新版本。
Incompatible graph test suite
Zoox維護(hù)一個(gè)TensorFlow到TensorRT的轉(zhuǎn)換測(cè)試套件。它測(cè)試了從TensorFlow圖到tensort引擎的轉(zhuǎn)換失敗案例,以及報(bào)告的NVIDIA錯(cuò)誤識(shí)別。
每個(gè)測(cè)試構(gòu)建一個(gè)TensorFlow圖,將其轉(zhuǎn)換為TensorRT,并將輸出偏差與TensorFlow圖進(jìn)行比較。使用此測(cè)試套件,我們不僅可以向Zoox工程師演示哪些圖形結(jié)構(gòu)或操作可能不適用于TensorRT,而且還可以檢測(cè)升級(jí)到TensorRT的新版本時(shí)修復(fù)了哪些回歸。
Summary
在這篇文章中,我們介紹了Zoox-TensorRT轉(zhuǎn)換管道中的幾個(gè)特性。TensorRT轉(zhuǎn)換檢查器參與神經(jīng)網(wǎng)絡(luò)訓(xùn)練的早期階段,以確保在您浪費(fèi)時(shí)間和資源進(jìn)行全面訓(xùn)練之前發(fā)現(xiàn)不兼容的操作。可以在每一層調(diào)用推理精度驗(yàn)證來識(shí)別不利于降低精度計(jì)算的操作。詳細(xì)的分析揭示了不必要的計(jì)算,這些計(jì)算不是在TensorRT內(nèi)部?jī)?yōu)化的,但是可以通過在圖構(gòu)建期間簡(jiǎn)單的代碼更改來優(yōu)化。
自動(dòng)轉(zhuǎn)換管道幫助您驗(yàn)證每個(gè)TensorRT升級(jí)或模型重新轉(zhuǎn)換。利用該流水線,我們成功地為神經(jīng)網(wǎng)絡(luò)在Zoox自主駕駛平臺(tái)上執(zhí)行各種流線型感知任務(wù)提供了TensorRT轉(zhuǎn)換支持。
總結(jié)
以上是生活随笔為你收集整理的tensorrt轻松部署高性能dnn推理_基于TensorRT车辆实时推理优化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python编程制作_一种Python编
- 下一篇: IDEA——Git 的设置与使用