基于自动驾驶车辆的NVIDIA-TensorRT推理实时优化
基于自動駕駛車輛的NVIDIA-TensorRT推理實(shí)時(shí)優(yōu)化
Optimizing NVIDIA TensorRT Conversion for Real-time Inference on Autonomous Vehicles
自動駕駛系統(tǒng)使用各種神經(jīng)網(wǎng)絡(luò)模型,這些模型需要在gpu上進(jìn)行非常精確和高效的計(jì)算。Zoox是一家全新開發(fā)robotaxis的初創(chuàng)公司,利用NVIDIA DRIVE的高性能、節(jié)能計(jì)算。最近,Zoox在舊金山發(fā)布了一個(gè)小時(shí)的完全自主的游戲,詳細(xì)展示了他們的人工智能堆棧。
與TensorFlow相比,NVIDIA TensorRT提供了顯著的加速(fp32為2-6倍,Zoox網(wǎng)絡(luò)為int8中為9-19倍),支持使用CUDA流的異步和并發(fā)推理能力Zooxvision/lidar/radar/prediction 算法嚴(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引擎。TensorFlow也可用于其他培訓(xùn)工具。
在為所有這些深層神經(jīng)網(wǎng)絡(luò)部署和維護(hù)TensorRT引擎的過程中,我們發(fā)現(xiàn)了以下痛點(diǎn):
ONNX和TensorRT只支持一組有限的TensorFlow操作。
內(nèi)核大小和步幅的某些組合可能會對TensorRT產(chǎn)生副作用。
遷移到低精度推理或TensorRT升級可能會導(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ò)之前識別可能的轉(zhuǎn)換失敗。checker是輕量級的,設(shè)計(jì)上是最小的(在本文后面的代碼示例中重點(diǎn)介紹)。在訓(xùn)練前,它在所構(gòu)建的網(wǎng)絡(luò)上觸發(fā)一個(gè)TensorRT轉(zhuǎn)換過程。我們只有在轉(zhuǎn)換成功后才開始訓(xùn)練。
下面的代碼示例顯示了TensorRT轉(zhuǎn)換檢查器。要使用該插件,用戶只需導(dǎo)入包,在網(wǎng)絡(luò)構(gòu)建期間注冊輸入/輸出節(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è)特定于模型的評估之前,報(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
The following code example shows the
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引擎中的哪一層或操作對回歸有顯著貢獻(xiàn)。這促使我們開發(fā)了逐層檢測模塊。當(dāng)被調(diào)用時(shí),模塊為每個(gè)中間操作運(yùn)行一個(gè)轉(zhuǎn)換作業(yè),并報(bào)告由這個(gè)特定操作生成的中間值/最大值錯(cuò)誤(如圖4所示)。本模塊在研究不同版本的TensorRT中觀察到的不同行為時(shí)非常有用。
Latency flame graph
Figure 4. Example regression observed in semantic
segmentation when upgrading from TensorRT 5.1.5 to TensorRT 7.0.
圖4顯示了這種回歸的一個(gè)例子,在這個(gè)例子中,我們觀察到語義分段輸出有輕微的回歸。我們對TensorRT 5.1引擎和TensorRT 7.0引擎進(jìn)行了逐層檢查,然后繪制了每層的中值誤差。
圖6顯示了為每個(gè)層生成的中值誤差。我們可以看到,在這個(gè)特定網(wǎng)絡(luò)的上采樣層中有一個(gè)潛在的缺陷。基于這些信息,我們能夠在一個(gè)較小的網(wǎng)絡(luò)上復(fù)制這個(gè)回歸,并將這個(gè)錯(cuò)誤報(bào)告給NVIDIA。這個(gè)錯(cuò)誤現(xiàn)在已在TensorRT 7.1中修復(fù)。
Figure 5. Layer-by-layer inspection results on the two
TensorRT engines used in Figure 4. The orange line shows the median error of the TensorRT 7.0 inference outputs compared to the TensorFlow inference outputs. The blue line shows the results generated by the TensorRT 5.0 engine. There is a significant difference in the error distributions on the upsampling layers.
Latency flame graph
為了可視化推理中的瓶頸并找出可能的優(yōu)化操作,我們將TensorRT profiler生成的分層計(jì)時(shí)信息繪制成火焰圖。計(jì)時(shí)細(xì)節(jié)根據(jù)每個(gè)層的名稱范圍分組,如圖6所示。這使我們能夠看到網(wǎng)絡(luò)的哪個(gè)部分比預(yù)期的時(shí)間要長。
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è)自動轉(zhuǎn)換管道,跟蹤每個(gè)模型使用的轉(zhuǎn)換選項(xiàng)。當(dāng)觸發(fā)時(shí),自動轉(zhuǎn)換管道將所有記錄的模型轉(zhuǎn)換為TensorRT引擎,并將它們上載到云中進(jìn)行部署。它還為新轉(zhuǎn)換的TensorRT引擎運(yùn)行驗(yàn)證作業(yè),以驗(yàn)證準(zhǔn)確性。這個(gè)管道只需一個(gè)命令就可以幫助我們將所有現(xiàn)有模型升級到TensorRT的更新版本。
Incompatible graph test suite
Zoox維護(hù)一個(gè)TensorFlow到TensorRT的轉(zhuǎn)換測試套件。它測試從TensorFlow圖形到TensorRT引擎的轉(zhuǎn)換失敗案例,以及報(bào)告的NVIDIA錯(cuò)誤識別。
每個(gè)測試構(gòu)建一個(gè)TensorFlow圖,將其轉(zhuǎn)換為TensorRT,并將輸出偏差與TensorFlow圖進(jìn)行比較。使用這個(gè)測試套件,我們不僅可以向Zoox工程師演示哪些圖形結(jié)構(gòu)或操作可能無法使用TensorRT,而且還可以檢測到在升級到較新版本的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)不兼容的操作。您可以在每個(gè)層調(diào)用推理精度驗(yàn)證,以識別不利于降低精度計(jì)算的操作。詳細(xì)的分析揭示了不必要的計(jì)算,這些計(jì)算在TensorRT內(nèi)部沒有得到優(yōu)化,但是可以通過在圖構(gòu)造期間進(jìn)行簡單的代碼更改來優(yōu)化這些計(jì)算。
自動轉(zhuǎn)換管道幫助您驗(yàn)證每個(gè)TensorRT升級或模型重新轉(zhuǎn)換。利用這條管道,我們成功地為在Zoox自主駕駛平臺上執(zhí)行各種流線型感知任務(wù)的神經(jīng)網(wǎng)絡(luò)提供了TensorRT轉(zhuǎn)換支持。
總結(jié)
以上是生活随笔為你收集整理的基于自动驾驶车辆的NVIDIA-TensorRT推理实时优化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用NVIDIA NGC的TensorR
- 下一篇: Yolov4性能分析(上)