基于自动驾驶车辆的NVIDIA-TensorRT推理实时优化

Optimizing NVIDIA TensorRT Conversion for Real-time Inference on Autonomous Vehicles

自动驾驶系统使用各种神经网络模型,这些模型需要在gpu上进行非常精确和高效的计算。Zoox是一家全新开发robotaxis的初创公司,利用NVIDIA DRIVE的高性能、节能计算。最近,Zoox在旧金山发布了一个小时的完全自主的游戏,详细展示了他们的人工智能堆栈。

与TensorFlow相比,NVIDIA TensorRT提供了显著的加速(fp32为2-6倍,Zoox网络为int8中为9-19倍),支持使用CUDA流的异步和并发推理能力。Zoox vision/lidar/radar/prediction算法严重依赖于深度神经网络,这些神经网络都运行在我们的车辆上的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转换过程。我们只有在转换成功后才开始训练。

下面的代码示例显示了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

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引擎中的哪一层或操作对回归有显著贡献。这促使我们开发了逐层检测模块。当被调用时,模块为每个中间操作运行一个转换作业,并报告由这个特定操作生成的中间值/最大值错误(如图4所示)。本模块在研究不同版本的TensorRT中观察到的不同行为时非常有用。

Latency flame graph

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显示了为每个层生成的中值误差。我们可以看到,在这个特定网络的上采样层中有一个潜在的缺陷。基于这些信息,我们能够在一个较小的网络上复制这个回归,并将这个错误报告给NVIDIA。这个错误现在已在TensorRT 7.1中修复。

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

为了可视化推理中的瓶颈并找出可能的优化操作,我们将TensorRT profiler生成的分层计时信息绘制成火焰图。计时细节根据每个层的名称范围分组,如图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图形到TensorRT引擎的转换失败案例,以及报告的NVIDIA错误识别。

每个测试构建一个TensorFlow图,将其转换为TensorRT,并将输出偏差与TensorFlow图进行比较。使用这个测试套件,我们不仅可以向Zoox工程师演示哪些图形结构或操作可能无法使用TensorRT,而且还可以检测到在升级到较新版本的TensorRT时修复了哪些回归。Summary

本文介绍了Zoox-TensorRT转换管道中的几个特性。TensorRT转换检查器参与神经网络训练的早期阶段,以确保在您浪费时间和资源进行全面训练之前发现不兼容的操作。您可以在每个层调用推理精度验证,以识别不利于降低精度计算的操作。详细的分析揭示了不必要的计算,这些计算在TensorRT内部没有得到优化,但是可以通过在图构造期间进行简单的代码更改来优化这些计算。

自动转换管道帮助您验证每个TensorRT升级或模型重新转换。利用这条管道,我们成功地为在Zoox自主驾驶平台上执行各种流线型感知任务的神经网络提供了TensorRT转换支持。

基于自动驾驶车辆的NVIDIA-TensorRT推理实时优化的更多相关文章

  1. zz“老司机”成长之路:自动驾驶车辆调试实践

    随着自动驾驶技术的发展,一辆新车从被改装到上路需要经过的调试流程也有了许多提升.今天,我希望结合自己之前的调车经验来跟大家分享一下我们是如何将系统的各个模块逐步上车.调试.集成,进而将一辆“新手”车培 ...

  2. NVIDIA TensorRT高性能深度学习推理

    NVIDIA TensorRT高性能深度学习推理 NVIDIA TensorRT 是用于高性能深度学习推理的 SDK.此 SDK 包含深度学习推理优化器和运行时环境,可为深度学习推理应用提供低延迟和高 ...

  3. zz自动驾驶多传感器感知的探索1

    Pony.ai 在多传感器感知上积累了很多的经验,尤其是今年年初在卡车上开始了新的尝试.我们有不同的传感器配置,以及不同的场景,对多传感器融合的一些新的挑战,有了更深刻的认识,今天把这些经验,总结一下 ...

  4. zz高精地图和定位在自动驾驶的应用

    本次分享聚焦于高精地图在自动驾驶中的应用,主要分为以下两部分: 1. 高精地图 High Definition Map 拓扑地图 Topological Map / Road Graph 3D栅格地图 ...

  5. zz自动驾驶多传感器感知的探索

    案例教学,把“问题”讲清楚了,赞 Pony.ai 在多传感器感知上积累了很多的经验,尤其是今年年初在卡车上开始了新的尝试.我们有不同的传感器配置,以及不同的场景,对多传感器融合的一些新的挑战,有了更深 ...

  6. Mobileye 自动驾驶策略(一)

    Mobileye 自动驾驶策略(一) 详解 Mobileye 自动驾驶解决方案 Mobileye的自动驾驶解决方案.总得来说,分为四种: Visual perception and sensor fu ...

  7. zzL4自动驾驶中感知系统遇到的挑战及解决方案

    本次分享的大纲: Perception Introduction Sensor Setup & Sensor Fusion Perception Onboard System Percepti ...

  8. 自动驾驶定位算法-直方图滤波(Histogram Filter)定位

    1.直方图滤波(Histogram Filter)的算法思想 直方图滤波的算法思想在于:它把整个状态空间dom(x(t))切分为互不相交的部分\(b_1.b_2....,b_{n-1}\),使得: 然 ...

  9. Google Waymo 2017自动驾驶安全技术报告(一)

    2017年10月Google Waymo向美国交通部提交了一份43页的安全报告,报告中详细说明了Waymo如何装备和训练自动驾驶车辆,从而避免驾驶中的一般和意外情况发生.这份报告对Waymo的自动驾驶 ...

随机推荐

  1. 技术面试问题汇总第003篇:猎豹移动反病毒工程师part3

    从现在开始,面试的问题渐渐深入.这次的三个问题,都是对PE格式的不断深入的提问.从最初的概念,到病毒对PE格式的利用,再到最后的壳的问题.这里需要说明的是,由于壳是一个比较复杂的概念,面试中也仅仅只能 ...

  2. (转)Amazon Aurora MySQL 数据库配置最佳实践

    转自:https://zhuanlan.zhihu.com/p/165047153 Amazon Aurora MySQL 数据库配置最佳实践 AWS云计算 ​ 已认证的官方帐号 1 人赞同了该文章 ...

  3. hdu4950 打怪(简单题目)

    题意:       打怪,一开始怪有h滴血,每回合可以让对方减少a滴血,每次打完之后怪会恢复b滴血,每连续k回合之后自己会休息一回合,这一回合怪物依然回血,问是否可以把怪打死. 思路:      比较 ...

  4. 【Git】2. Git常用命令详解、版本切换原理

    一.新增文件 1.设置用户签名 签名的作用就是为了区分不同的人,方便查看版本的时候知道操作的人是谁.首次安装好git之后必须设置一下签名,否则无法提交代码. 另外,这里设置的签名跟你登录到远程仓的账号 ...

  5. canvas绘制折线路径动画

    最近有读者加我微信咨询这个问题: 其中的效果是一个折线路径动画效果,如下图所示: 要实现以上路径动画,一般可以使用svg的动画功能.或者使用canvas绘制,结合路径数学计算来实现. 如果用canva ...

  6. 栈(Stack) --- C# 自定义和微软官方的区别

    最近在学习算法基础,本篇文章作为一个记录,也算是一次实践和总结.(顺便也深入C#运行时学习一下) 目录 1. 栈是什么 2. Stack 自定义实现 3. Stack C#官方实现 4. 区别 5. ...

  7. 使用FileStream读写数据

    这节讲一下使用FileStream读写数据,这是一个比较基础的流. FileStream类只能处理原始字节,所以它可以处理任何类型的文件. 先看一下它的构造方法: FileStream fs = ne ...

  8. [BUAA2021软工助教]个人阅读作业#2小结

    作业链接 见个人阅读作业#2 优秀作业推荐 Shaun_Yao ✍️ 道法之间--软工第2次博客作业 Potassium ✍️ 构之有道,建之有法--软工个人阅读作业#2 MarkDay ✍️ < ...

  9. CF1487 Cat Cycle

    一个规律题目要多做多积累 , 脑子不太灵活 CF1487 Cat Cycle 题目大意: 两只猫A,B, A猫从n -> n-1 -> n-2 ... -> 1 -> 2 .. ...

  10. 关于在pycharm上使用git(保姆级别教程)

    文件 → 设置 先在pycharm上面登录github账号,版本控制 → GitHub → '+' → 通过GitHub登录 会自动跳转至浏览器,然后点击"Authorize in GitH ...