前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >边缘计算笔记(二): 从tensorflow生成tensorRT引擎的方法

边缘计算笔记(二): 从tensorflow生成tensorRT引擎的方法

作者头像
GPUS Lady
发布2019-06-21 21:14:41
4K0
发布2019-06-21 21:14:41
举报
文章被收录于专栏:GPUS开发者

完整内容主要介绍使用TensorFlow开发的深度神经网络如何部署在NVIDIA Jetson上,并利用TensorRT加速到5倍。

您将了解到:

1.TensorFlow性能如何与使用流行模型(如Inception和MobileNet)的TensorRT进行比较

2在Jetson上运行TensorFlow和TensorRT的系统设置

3 如何检查TensorFlow graph 以获得TensorRT兼容性

4.将TensorFlow图像分类模型转换为TensorRT的工作流程

5. 如何在Jetson TX2上执行TensorRT图像分类模型

由于这是一个大约1个小时的视频,篇幅有限,所以我们将利用三天的时间重现整个笔记内容。

今天是第二部分

還有最後一部分,大家堅持住

TensorRT开发人员指南介绍了几种从tensorflow生成tensorRT引擎的方法,但重要的是要注意并非所有工作流都与jetson一起工作,例如使用TensorRT lite,我们可以生成一个带有单个Python调用的tensorRT引擎,这个引擎可以 用另一行代码保存到硬盘里,但是这个方法取决于tensorRT python api,而目前不适用于jentson的。 另一种方法是使用C ++ API手动构建神经网络,这种方法我们通过进行C ++ API调用逐层创建网络,这种方法的缺点是我们必须手动确保我们 已正确复制原始网络的功能,此外我们必须确保所有参数都正确格式化和加载,这种低级方法非常稳定,灵活,但工作量大。

这里我们展示了tensorRT开发人员指南中记录的另一个工作流程,这是我们在github项目中使用的工作流程。在此工作流程中,我们首先将tensorflow graph导出为可移植的中间文件,这个导出过程可以在Jetson或主机上完成,一旦我们成功导出Tensorflow,我们在jetson上运行一个C ++程序,解析中间文件以构建网络,然后执行优化以生成 tensorRT引擎。这种方法的优点是转换过程是自动化的,且这个工作流程是Jetson支持的。

在上一张幻灯片中,我们在github项目中提供了一个脚本,它包含了导出tensorflow模型,构建和构建tensorRT引擎,以及序列化和保存引擎到硬盘的步骤。这个脚本可能不适用于所有张量流模型,但适用于那些记录的 在github项目中的模型。接下来,我们将讨论如何在jetson上使用tensorRT优化和执行tensorflow模型。我们将假设您正在使用github存储库中提供的包装脚本。尽管许多信息与其他工作流程相关 同样,首先我们可以在生成tensorRT引擎之前,必须首先生成一个代表我们模型的Forzen grah。但在深入了解Forzen grah的细节以及如何创建它之前,我们将首先讨论如何在Tensorflow中序列化gragh。

TensorFlow中使用谷歌的protocol buffer来进行对网络结构图的序列化。具体则是TensorFlow中集成的GraphDef这个Python类来完成序列化和反序列化(Parse)功能的。该类的一个实例,可以通过调用graph的as_graph_def()方法获得(也就是图中的SerializaToString()和ParseFromString()这两个方法,每个方法只需要一行代码就可以搞定哦)。GraphDef类完整的定义了一个神经网络的结构,但是它不包含网络中的变量的值。

具体的某个GraphDef所定义的网络中的变量的值,是保存在运行中的TensorFlow任务的内存中的,或者保存在磁盘上的checkpoint文件里。我们必须要将这些变量转成为常量,才能添加给GraphDef,从而得到只用GraphDef结构表示的模型。这样做能让我们以后推理的时候,只需要使用单一的串行化后的二进制文件数据表示的,可移植的模型即可。

将变量转换成常量从而能添加到GraphDef里面的过程,叫做图冻结(Freezing Graph)。TensorFlow提供了一个Python模块来为我们完成冻结过程。 在本页幻灯片的最下面,我们给你展示了就用一行Python代码,就完成对图的冻结,即给它存储变量值为常数的过程。 当将冻结的图序列化后的二进制输出,保存到磁盘上的时候,通常我们叫这个为冻结图文件,或者其他的类似叫法。这个文件将用作后续的转换脚本输入用。

当我们生成了冻结图文件后,下一步就是确定要用TensorRT去优化的子图(sub graph),这通过输入名称、输入维度和输出名称来决定。在转换为tensorRT时,我们必须指定输出节点的名称,定义我们想要优化的图形(graph)部分。

因为TensorRT会默认使用图中的placeholder nodes,所以有时候也可以不指定输入节点的名字。 但有时候我们必须手工确定输入名称和维度信息:因为可能你并不想使用整个图,或者因为TensorFlow的placeholder nodes可能含有可变长度的输入,而TensorRT只能支持固定长度的输入。在这些情况下,你需要手工自己定义需要被优化的神经网络部分。有时候确定这些信息信息很简单,因为TensorFlow允许你显式地在创建网络图的时候定义操作层的名字。 然而当使用不是你自己定义的网络的时候,确定这些信息就变得具有挑战性了。

幸运的是,TensorFlow自带了一个名叫TensorBoard的可视化工具,可以用来轻松观察网络图的结构。 TensorBoard是一个应用程序,读取TensorFlow导出的记录文件作为其输入。对网络图结构的观察是它功能一部分,还支持对训练时候的数据进行可视化观察。 不过我们用不到那么多功能,要转换为TensorRT的时候,唯一需要关心的只是查看一下网络结构图的定义而已。 将记录文件导出,在TensorBoard里使用,只需要一行Python代码哦。我们导出含有网络图定义的记录文件,然后启动TensorFlow的服务器端 ,然后指定导出的记录文件,然后就可以从浏览器中打开TensorBoard了,从而能可视化的观察一些信息。 我们可以观察网络图的连接结构),能观察图中的每个张量(Tensor)的维度,以及能观察网络图每层的具体操作的名称和类型。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-06-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 GPUS开发者 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档