如何使用框架训练网络加速深度学习推理

从 tensorrt 7.0 开始, universal framework format( uff )被弃用。在本文中,您将学习如何使用新的 tensorflow -onnx- tensorrt 工作流部署经过 tensorflow 培训的深度学习模型。图 1 显示了 tensorrt 的高级工作流。
图 1 。 tensorrt 是一种推理加速器。
首先,使用任何框架训练网络。网络训练后,批量大小和精度是固定的(精度为 fp32 、 fp16 或 int8 )。训练好的模型被传递给 tensorrt 优化器,优化器输出一个优化的运行时(也称为计划)。。 plan 文件是 tensorrt 引擎的序列化文件格式。计划文件需要反序列化才能使用 tensorrt 运行时运行推断。
要优化在 tensorflow 中实现的模型,只需将模型转换为 onnx 格式,并使用 tensorrt 中的 onnx 解析器解析模型并构建 tensorrt 引擎。图 2 显示了高级 onnx 工作流。
图 2 。 onnx 工作流。
在本文中,我们将讨论如何使用 onnx 工作流创建一个 tensorrt 引擎,以及如何从 tensorrt 引擎运行推理。更具体地说,我们演示了从 keras 或 tensorflow 中的模型到 onnx 的端到端推理,以及使用 resnet-50 、语义分段和 u-net 网络的 tensorrt 引擎。最后,我们将解释如何在其他网络上使用此工作流。
下载 tensorflow -onnx- tensorrt 后 – 代码 tar 。 gz 文件,您还应该从 cityscapes dataset scripts repo 下载 labels.py ,并将其与其他脚本放在同一个文件夹中。
onnx 概述
onnx 是机器学习和深度学习模型的开放格式。它允许您将不同框架(如 tensorflow 、 pytorch 、 matlab 、 caffe 和 keras )的深度学习和机器学习模型转换为单一格式。
它定义了一组通用的运算符、深入学习的通用构建块集和通用文件格式。它提供计算图的定义以及内置运算符。可能有一个或多个输入或输出的 onnx 节点列表形成一个无环图。
resnet onnx 工作流示例
在这个例子中,我们展示了如何在两个不同的网络上使用 onnx 工作流并创建一个 tensorrt 引擎。第一个网络是 resnet-50 。
工作流包括以下步骤:
将 tensorflow / keras 模型转换为。 pb 文件。
将。 pb 文件转换为 onnx 格式。
创建 tensorrt 引擎。
从 tensorrt 引擎运行推断。
将模型转换为。 pb
第一步是将模型转换为。 pb 文件。以下代码示例将 resnet-50 模型转换为。 pb 文件:
除了 keras ,您还可以从以下位置下载 resnet-50 :
深度学习示例 github 存储库:提供最新的深度学习示例网络。您还可以看到 resnet-50 分支,它包含一个脚本和方法来训练 resnet-50v1 。 5 模型。
nvidia ngc 型号 :它有预训练模型的检查点列表。例如,在 resnet-50v1 。 5 上搜索 tensorflow ,并从 download 页面获取最新的检查点。
将。 pb 文件转换为 onnx
第二步是将。 pb 模型转换为 onnx 格式。为此,首先安装 tf2onnx 。
安装 tf2onnx 后,有两种方法可以将模型从。 pb 文件转换为 onnx 格式。第二种方法是使用命令行。运行以下命令:
从 onnx 创建 tensorrt 引擎
要从 onnx 文件创建 tensorrt 引擎,请运行以下命令:
此代码应保存在引擎。 py 文件,稍后在文章中使用。
此代码示例包含以下变量:
最大工作区大小: 在执行时 icudaengine 可以使用的最大 gpu 临时内存。
构建器创建一个空网络( builder.create_network() ), onnx 解析器将 onnx 文件解析到网络( parser.parse(model.read()) )。您可以为网络( network.get_input(0).shape = shape )设置输入形状,然后生成器将创建引擎( engine = builder.build_cuda_engine(network) )。要创建引擎,请运行以下代码示例:
在这个代码示例中,首先从 onnx 模型获取输入形状。接下来,创建引擎,然后将引擎保存在。 plan 文件中。
运行来自 tensorrt 引擎的推理:
tensorrt 引擎在以下工作流中运行推理:
为 gpu 中的输入和输出分配缓冲区。
将数据从主机复制到 gpu 中分配的输入缓冲区。
在 gpu 中运行推理。
将结果从 gpu 复制到主机。
根据需要重塑结果。
下面的代码示例详细解释了这些步骤。此代码应保存在推理。 py 文件,稍后将在本文中使用。
为第一个输入行和输出行确定两个维度。您可以在主机( h_input_1 、 h_output )中创建页锁定内存缓冲区。然后,为输入和输出分配与主机输入和输出相同大小的设备内存( d_input_1 , d_output )。下一步是创建 cuda 流,用于在设备和主机分配的内存之间复制数据。
在这个代码示例中,在 do_inference 函数中,第一步是使用 load_images_to_buffer 函数将图像加载到主机中的缓冲区。然后将输入数据传输到 gpu ( cuda.memcpy_htod_async(d_input_1, h_input_1, stream) ),并使用 context.execute 运行推理。最后将结果从 gpu 复制到主机( cuda.memcpy_dtoh_async(h_output, d_output, stream) )。
onnx 工作流语义分割实例
在本文 基于 tensorrt 3 的自主车辆快速 int8 推理 中,作者介绍了一个语义分割模型的 uff 工作流过程。
在本文中,您将使用类似的网络来运行 onnx 工作流来进行语义分段。该网络由一个基于 vgg16 的编码器和三个使用反褶积层实现的上采样层组成。网络在 城市景观数据集 上经过大约 40000 次迭代训练
有多种方法可以将 tensorflow 模型转换为 onnx 文件。一种方法是 resnet50 部分中解释的方法。 keras 也有自己的 keras 到 onnx 文件转换器。有时, tensorflow -to-onnx 不支持某些层,但 keras-to-onnx 转换器支持这些层。根据 keras 框架和使用的层类型,您可能需要在转换器之间进行选择。
在下面的代码示例中,使用 keras-to-onnx 转换器将 keras 模型直接转换为 onnx 。下载预先训练的语义分段文件 semantic_segmentation.hdf5 。
图 3 显示了网络的体系结构。
图 3 。基于 vgg16 的语义分割模型。
与前面的示例一样,使用下面的代码示例创建语义分段引擎。
要测试模型的输出,请使用 城市景观数据集 。要使用城市景观,必须具有以下功能: sub_mean_chw 和 color_map 。这些函数也用于 post , 基于 tensorrt 3 的自主车辆快速 int8 推理 。
在下面的代码示例中, sub_mean_chw 用于从图像中减去平均值作为预处理步骤, color_map 是从类 id 到颜色的映射。后者用于可视化。
下面的代码示例是上一个示例的其余代码。必须先运行上一个块,因为需要定义的函数。使用这个例子比较 keras 模型和 tensorrt 引擎 semantic 。 plan 文件的输出,然后可视化这两个输出。根据需要替换占位符 /path/to/semantic_segmentation.hdf5 和 input_file_path 。
图 4 显示了实际图像和实际情况,以及 keras 的输出与 tensorrt 引擎的输出的对比。如您所见, tensorrt 发动机的输出与 keras 的类似。
图 4a 原始图像 。
图 4b 地面真相标签。
图 4c 。 tensorrt 的输出。
图 4d : keras 的输出。
在其他网络上试试
现在您可以在其他网络上尝试 onnx 工作流。有关分段网络的好例子的更多信息,请参阅 github 上的 具有预训练主干的分割模型 。
作为一个例子,我们用一个 onnx 网络来说明如何使用。本例中的网络是来自 segmentation_models 库的 u-net 。在这里,我们只加载模型,而没有对其进行训练。您可能需要在首选数据集上训练这些模型。
关于这些网络的一个重要点是,当您加载这些网络时,它们的输入层大小如下所示:( none , none , none , 3 )。要创建一个 tensorrt 引擎,您需要一个输入大小已知的 onnx 文件。在将此模型转换为 onnx 之前,请通过为其输入指定大小来更改网络,然后将其转换为 onnx 格式。
例如,从这个库( segmentation _ models )加载 u-net 网络并为其输入指定大小( 244 、 244 、 3 )。在为推理创建了 tensorrt 引擎之后,做一个与语义分段类似的转换。根据应用程序和数据集的不同,可能需要使用不同的颜色映射。
我们之前提到的另一种下载方式是从 vz6 下载。它有一个预先训练模型的检查点列表。例如,您可以在 tensorflow 中搜索 unet ,然后转到 download 页面以获取最新的检查点。
总结
在这篇文章中,我们解释了如何使用 tensorflow-to-onnx-to-tensorrt 工作流来部署深度学习应用程序,并给出了几个示例。第一个例子是 resnet-50 上的 onnx- tensorrt ,第二个例子是在 cityscapes 数据集上训练的基于 英伟达数据中心深度学习产品性能 的语义分割。
关于作者
houman 是 nvidia 的高级深度学习软件工程师。他一直致力于开发和生产 nvidia 在自动驾驶车辆中的深度学习解决方案,提高 dnn 的推理速度、精度和功耗,并实施和试验改进 nvidia 汽车 dnn 的新思想。他在渥太华大学获得计算机科学博士学位,专注于机器学习
about yu-te cheng
yu-te cheng 是 nvidia 自主驾驶组高级深度学习软件工程师,从事自驾领域的各种感知任务的神经结构搜索和 dnn 模型训练、压缩和部署,包括目标检测、分割、路径轨迹生成等。他于 2016 年获得卡内基梅隆大学机器人学硕士学位。
about josh park
josh park 是 nvidia 的汽车解决方案架构师经理。到目前为止,他一直在研究使用 dl 框架的深度学习解决方案,例如在 multi-gpus /多节点服务器和嵌入式系统上的 tensorflow 。此外,他一直在评估和改进各种 gpus + x86 _ 64 / aarch64 的训练和推理性能。他在韩国大学获得理学学士和硕士学位,并在德克萨斯农工大学获得计算机科学博士学位


一种单极倍频电压型SPWM软开关DC/AC逆变器的设计
基于FPGA的SOC设计技术的硬核与软核处理器的区别和联系
Vishay推出两款新型固定增益红外传感器模块
热点 | 专注单细胞测序临床应用,新格元获近亿人民币Pre-A轮融资
一种界面捕获效应打印策略
如何使用框架训练网络加速深度学习推理
PI-MAX4 ICCD:钙钛矿薄膜中载流子扩散的瞬态荧光成像
2021年款Moto G Stylus现身亚马逊
基于FPGA的实时视频图像采集处理系统
ADI技术文章:负电压线性稳压器
2nm量产面临哪些问题
物联网的未来将可以看到在背后无缝运行的平台
变频器应用常见的问题与必备应对措施
电信iPhone4S今日预约登记
苹果iPhone12出现开机Logo闪现问题?
ROHM开发出充电控制IC“BD71631QWZ”,支持新型二次电池等低电压充电
破局与进阶,科大讯飞的新武器“讯飞阅读”
电脑防盗系统的组成、功能及应用方案
真空断路器的安装规定_真空断路器安装后的验收检查要求
苏宁全渠道加持引领彩电高端市场消费者品质升级