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

December 17, 2023
测试
测试
测试
测试
2 分钟阅读

完整内容主要介绍使用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)的维度,以及能观察网络图每层的具体操作的名称和类型。

继续阅读

更多来自我们博客的帖子

如何安装 BuddyPress
由 测试 December 17, 2023
经过差不多一年的开发,BuddyPress 这个基于 WordPress Mu 的 SNS 插件正式版终于发布了。BuddyPress...
阅读更多
Filter如何工作
由 测试 December 17, 2023
在 web.xml...
阅读更多
如何理解CGAffineTransform
由 测试 December 17, 2023
CGAffineTransform A structure for holding an affine transformation matrix. ...
阅读更多