基于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.
图5显示了这种回归的一个例子,在这个例子中,我们观察到语义分割输出有轻微的回归。我们对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车辆实时推理优化的更多相关文章
- 基于TensorRT 3的自动驾驶快速INT8推理
基于TensorRT 3的自动驾驶快速INT8推理 Fast INT8 Inference for Autonomous Vehicles with TensorRT 3 自主驾驶需要安全性,需要一种 ...
- 基于TensorRT的BERT实时自然语言理解(下)
基于TensorRT的BERT实时自然语言理解(下) BERT Inference with TensorRT 请参阅Python脚本bert_inference.py还有详细的Jupyter not ...
- 基于TensorRT的BERT实时自然语言理解(上)
基于TensorRT的BERT实时自然语言理解(上) 大规模语言模型(LSLMs)如BERT.GPT-2和XL-Net为许多自然语言理解(NLU)任务带来了最先进的精准飞跃.自2018年10月发布以来 ...
- 基于TensorRT优化的Machine Translation
基于TensorRT优化的Machine Translation 机器翻译系统用于将文本从一种语言翻译成另一种语言.递归神经网络(RNN)是机器翻译中最流行的深度学习解决方案之一. TensorRT机 ...
- 天猫精灵业务如何使用机器学习PAI进行模型推理优化
引言 天猫精灵(TmallGenie)是阿里巴巴人工智能实验室(Alibaba A.I.Labs)于2017年7月5日发布的AI智能语音终端设备.天猫精灵目前是全球销量第三.中国销量第一的智能音箱品牌 ...
- 【翻译】借助 NeoCPU 在 CPU 上进行 CNN 模型推理优化
本文翻译自 Yizhi Liu, Yao Wang, Ruofei Yu.. 的 "Optimizing CNN Model Inference on CPUs" 原文链接: h ...
- 性能优化之永恒之道(实时sql优化vs业务字段冗余vs离线计算)
在项目中,随着时间的推移,数据量越来越大,程序的某些功能性能也可能会随之下降,那么此时我们不得不需要对之前的功能进行性能优化.如果优化方案不得当,或者说不优雅,那可能将对整个系统产生不可逆的严重影响. ...
- 基于Kafka的实时计算引擎如何选择?Flink or Spark?
1.前言 目前实时计算的业务场景越来越多,实时计算引擎技术及生态也越来越成熟.以Flink和Spark为首的实时计算引擎,成为实时计算场景的重点考虑对象.那么,今天就来聊一聊基于Kafka的实时计算引 ...
- 基于Kafka的实时计算引擎如何选择?(转载)
1.前言 目前实时计算的业务场景越来越多,实时计算引擎技术及生态也越来越成熟.以Flink和Spark为首的实时计算引擎,成为实时计算场景的重点考虑对象.那么,今天就来聊一聊基于Kafka的实时计算引 ...
随机推荐
- hdu3986 spfa + 枚举最短路上的边
题意: 删除一条边后,求最短路中最长的那个(敌人搞破坏). 思路: 如果你是敌人你肯定删除最短路上的边,删除别的边最短路的值是不会变的,所以直接枚举最短路上的边去删除,取得最大的就行了... #inc ...
- hdu2594 简单KMP
题意: 给你两个串,问你s1的前缀和s2的后缀最长公共部分是多少. 思路: 根据KMP的匹配形式,我们求出s1的next,然后用s1去匹配s2,输出当匹配到s2的最后一个的时候的匹 ...
- The 2014 ACM-ICPC Asia Mudanjiang Regional First Round C
题意: 这个是The 2014 ACM-ICPC Asia Mudanjiang Regional First Round 的C题,这个题目当时自己想的很复杂,想的是优先队列广搜,然后再在 ...
- 分子动力学模拟软件VMD的安装与使用
技术背景 在分子动力学模拟过程中会遇到一些拓扑结构非常复杂的分子模型,所谓的复杂不仅仅是包含众多的原子,还有各种原子之间的成键关系与成键类型等.这时候就非常能够体现一个好的可视化软件的重要性了,这里我 ...
- FileItem的部分方法解释
FileItem的部分方法: boolean isFormField() isFormField() 方法用来判断FileItem对象里面封装的数据是一个普通文本表单字段,还是一个文件表单字段.如果是 ...
- java.lang.NoSuchMethodError: org.springframework.util.Assert.state(ZLjava/util/function/Supplier;)V
更多精彩见微信公众号 at org.springframework.test.context.support.AbstractTestContextBootstrapper.buildMergedCo ...
- lombok,Invalid byte tag in constant pool: 19
今天偶到一个奇怪的问题: 三台生产服务器部署同样的代码,同样的tomcat ,jdk等环境. 其中有一台服务器启动时报lombok-1.18.6.jar! Invalid byte tag in ...
- 使用C#进行数据库增删改查ADO.NET(一)
这节讲一下如何使用C#进行数据库的增删改查操作,本节以SQL Server数据库为例. .NET 平台,使用ADO.NET 作为与数据库服务器的桥梁,我们通过ADO.NET就可以使用C#语言操作数据库 ...
- 【Mybatis源码解析】- 整体架构及原理
整体架构 version-3.5.5 在深入了解Mybatis的源码之前,我们先了解一下Mybatis的整体架构和工作原理,这样有助于我们在阅读源码过程中了解思路和流程. 核心流程 在上一遍的入门程序 ...
- OO_Unit3_JML规格模式
---恢复内容开始--- [CSDN博客链接](https://blog.csdn.net/weixin_43387647/article/details/90451173) @[toc] ## 一. ...