基于自动驾驶车辆的NVIDIA-TensorRT推理实时优化
基于自动驾驶车辆的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推理实时优化的更多相关文章
- zz“老司机”成长之路:自动驾驶车辆调试实践
随着自动驾驶技术的发展,一辆新车从被改装到上路需要经过的调试流程也有了许多提升.今天,我希望结合自己之前的调车经验来跟大家分享一下我们是如何将系统的各个模块逐步上车.调试.集成,进而将一辆“新手”车培 ...
- NVIDIA TensorRT高性能深度学习推理
NVIDIA TensorRT高性能深度学习推理 NVIDIA TensorRT 是用于高性能深度学习推理的 SDK.此 SDK 包含深度学习推理优化器和运行时环境,可为深度学习推理应用提供低延迟和高 ...
- zz自动驾驶多传感器感知的探索1
Pony.ai 在多传感器感知上积累了很多的经验,尤其是今年年初在卡车上开始了新的尝试.我们有不同的传感器配置,以及不同的场景,对多传感器融合的一些新的挑战,有了更深刻的认识,今天把这些经验,总结一下 ...
- zz高精地图和定位在自动驾驶的应用
本次分享聚焦于高精地图在自动驾驶中的应用,主要分为以下两部分: 1. 高精地图 High Definition Map 拓扑地图 Topological Map / Road Graph 3D栅格地图 ...
- zz自动驾驶多传感器感知的探索
案例教学,把“问题”讲清楚了,赞 Pony.ai 在多传感器感知上积累了很多的经验,尤其是今年年初在卡车上开始了新的尝试.我们有不同的传感器配置,以及不同的场景,对多传感器融合的一些新的挑战,有了更深 ...
- Mobileye 自动驾驶策略(一)
Mobileye 自动驾驶策略(一) 详解 Mobileye 自动驾驶解决方案 Mobileye的自动驾驶解决方案.总得来说,分为四种: Visual perception and sensor fu ...
- zzL4自动驾驶中感知系统遇到的挑战及解决方案
本次分享的大纲: Perception Introduction Sensor Setup & Sensor Fusion Perception Onboard System Percepti ...
- 自动驾驶定位算法-直方图滤波(Histogram Filter)定位
1.直方图滤波(Histogram Filter)的算法思想 直方图滤波的算法思想在于:它把整个状态空间dom(x(t))切分为互不相交的部分\(b_1.b_2....,b_{n-1}\),使得: 然 ...
- Google Waymo 2017自动驾驶安全技术报告(一)
2017年10月Google Waymo向美国交通部提交了一份43页的安全报告,报告中详细说明了Waymo如何装备和训练自动驾驶车辆,从而避免驾驶中的一般和意外情况发生.这份报告对Waymo的自动驾驶 ...
随机推荐
- IDAPython类库---idaapi.py的源码
#ThisfilewasautomaticallygeneratedbySWIG(http://www.swig.org).#Version2.0.12##Donotmakechangestothis ...
- Python脚本写端口扫描器(socket,python-nmap)
目录 Socket模块编写 扫描给定主机是否开放了指定的端口 python-nmap模块编写 扫描给定ip或给定网段内指定端口是否开放 一个用python写的简单的端口扫描器,python环境为 3. ...
- 内核模式下的线程同步的分析(Windows核心编程)
内核模式下的线程同步 内核模式下的线程同步是用户模式下的线程同步的扩展,因为用户模式下的线程同步有一定的局限性.但用户模式下线程同步的好处是速度快,不需要切换到内核模式(需要额外的 CPU 时间).通 ...
- Hexo 博客Next 搭建与美化主题
========================================================================================将页面部署到GitHub ...
- PhpStorm 配置本地文件自动上传至服务器
目的:本地文件夹下的文件实时同步至指定服务器的文件夹,减少代码移植的成本和风险 添加一个SFTP连接 Tools - Deployment - Browse Remote Host 配置连接参数 Co ...
- JDK库rt包中常用包说明
日常开发中的api都在rt包中,具体路径为:/jdk1.8.0_162/jre/lib中,注意是在jre中. 每个包中大致包含以下几个部分: 接口 类 枚举 异常 错误 注解 J2EE开发中常用的包 ...
- 【报错】org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'webSocketHandlerMapping' defined in class path resource
环境:maven+eclipse+jdk1.8 [tomcat使用的是maven自带的插件,实质原因就是出在tomcat版本问题] 背景:在进行SSM集成WebSocket的时候,项目启动报org.s ...
- 10个 解放双手的 IDEA 插件,这些代码都不用写(第二弹)
本文案例收录在 https://github.com/chengxy-nds/Springboot-Notebook 大家好,我是小富~ 鸽了很久没发文,不写文章的日子真的好惬意,每天也不用愁着写点什 ...
- FreeSWITCH的安装与使用
FreeSWITCH
- python 键盘中断子线程及graceful exiting方案
最近需要实现一个服务程序的graceful exiting,保证在退出前关闭所有已创建的子线程 python借助KeyboardInterrupted异常响应键盘中断,因此首先尝试在子线程中try-c ...