0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

星星科技指导员 来源:NVIDIA 作者:Houman,Yu-Te Cheng, 2022-04-01 15:45 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

TensorRT 7.0 开始, Universal Framework Format( UFF )被弃用。在本文中,您将学习如何使用新的 TensorFlow -ONNX- TensorRT 工作流部署经过 TensorFlow 培训的深度学习模型。图 1 显示了 TensorRT 的高级工作流。

pYYBAGJGrYaAOHdwAADOhwG6fXc468.png

图 1 。 TensorRT 是一种推理加速器。

首先,使用任何框架训练网络。网络训练后,批量大小和精度是固定的(精度为 FP32 、 FP16 或 INT8 )。训练好的模型被传递给 TensorRT 优化器,优化器输出一个优化的运行时(也称为计划)。。 plan 文件是 TensorRT 引擎的序列化文件格式。计划文件需要反序列化才能使用 TensorRT 运行时运行推断。

要优化在 TensorFlow 中实现的模型,只需将模型转换为 ONNX 格式,并使用 TensorRT 中的 ONNX 解析器解析模型并构建 TensorRT 引擎。图 2 显示了高级 ONNX 工作流。

pYYBAGJGrYyAFfa6AAAwQkoylqI526.jpg

图 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 文件:

pYYBAGJGroSAHXTkAAA3M58TYgE971.png

poYBAGJGro6Aas16AAA1y0oqBWA160.png

除了 Keras ,您还可以从以下位置下载 ResNet-50 :

深度学习示例 GitHub 存储库:提供最新的深度学习示例网络。您还可以看到 ResNet-50 分支,它包含一个脚本和方法来训练 ResNet-50v1 。 5 模型。

NVIDIA NGC 型号 :它有预训练模型的检查点列表。例如,在 ResNet-50v1 。 5 上搜索 TensorFlow ,并从 Download 页面获取最新的检查点。

将。 pb 文件转换为 ONNX

第二步是将。 pb 模型转换为 ONNX 格式。为此,首先安装 tf2onnx 。

安装 tf2onnx 后,有两种方法可以将模型从。 pb 文件转换为 ONNX 格式。第二种方法是使用命令行。运行以下命令:

poYBAGJGrp6AauNjAAAJUsSVoZg886.png

从 ONNX 创建 TensorRT 引擎

要从 ONNX 文件创建 TensorRT 引擎,请运行以下命令:

poYBAGJGrsCAchTgAAA9Ld7RNrs608.png

pYYBAGJGrsqAO8PKAAAC-dmKx7E317.png

此代码应保存在引擎。 py 文件,稍后在文章中使用。

此代码示例包含以下变量:

最大工作区大小: 在执行时 ICudaEngine 可以使用的最大 GPU 临时内存。

构建器创建一个空网络( builder.create_network() ), ONNX 解析器将 ONNX 文件解析到网络( parser.parse(model.read()) )。您可以为网络( network.get_input(0).shape = shape )设置输入形状,然后生成器将创建引擎( engine = builder.build_cuda_engine(network) )。要创建引擎,请运行以下代码示例:

pYYBAGJGruGAMPXuAAAtUQcqcpk628.png

在这个代码示例中,首先从 ONNX 模型获取输入形状。接下来,创建引擎,然后将引擎保存在。 plan 文件中。

运行来自 TensorRT 引擎的推理:

TensorRT 引擎在以下工作流中运行推理:

为 GPU 中的输入和输出分配缓冲区。

将数据从主机复制到 GPU 中分配的输入缓冲区。

在 GPU 中运行推理。

将结果从 GPU 复制到主机。

根据需要重塑结果。

下面的代码示例详细解释了这些步骤。此代码应保存在推理。 py 文件,稍后将在本文中使用。

poYBAGJGrviAfprXAAA-GEWQnbE980.png

pYYBAGJGrv-AK8KsAABG5Zo7Tiw771.png

pYYBAGJGrweAehrVAAA6DPqzQCU341.png

为第一个输入行和输出行确定两个维度。您可以在主机( 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 。

pYYBAGJGrxuAAvmEAAAd4F0DPHw247.png

图 3 显示了网络的体系结构。

poYBAGJGrY2AE4CrAABfgyFbT7k214.png

图 3 。基于 VGG16 的语义分割模型。

与前面的示例一样,使用下面的代码示例创建语义分段引擎。

pYYBAGJGryaARbkjAAAq9e7lxJY387.png

要测试模型的输出,请使用 城市景观数据集 。要使用城市景观,必须具有以下功能: sub_mean_chw 和 color_map 。这些函数也用于 post , 基于 TensorRT 3 的自主车辆快速 INT8 推理 。

在下面的代码示例中, sub_mean_chw 用于从图像中减去平均值作为预处理步骤, color_map 是从类 ID 到颜色的映射。后者用于可视化。

pYYBAGJGrzqAQX-AAAA3KOHqUOg723.png

poYBAGJGr0OABoXYAAAbHaod2Dw526.png

下面的代码示例是上一个示例的其余代码。必须先运行上一个块,因为需要定义的函数。使用这个例子比较 Keras 模型和 TensorRT 引擎 semantic 。 plan 文件的输出,然后可视化这两个输出。根据需要替换占位符 /path/to/semantic_segmentation.hdf5 和 input_file_path 。

poYBAGJGr16AQnJHAABCiJPN_VU162.png

poYBAGJGr2WAZGszAAAPXrDEFdc349.png

图 4 显示了实际图像和实际情况,以及 Keras 的输出与 TensorRT 引擎的输出的对比。如您所见, TensorRT 发动机的输出与 Keras 的类似。

pYYBAGJGrZSACUPPAAQTP3OFMbU453.png

图 4a 原始图像 。

poYBAGJGrZaAGb1ZAAB8Qxy0v4k876.png

图 4b 地面真相标签

poYBAGJGrZeADUl3AABv5WMB6Sk459.png

图 4c 。 TensorRT 的输出。

pYYBAGJGrZyAZI-mAABv5WMB6Sk593.png

图 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 引擎之后,做一个与语义分段类似的转换。根据应用程序和数据集的不同,可能需要使用不同的颜色映射。

poYBAGJGr3qARsYkAAAr2J6FKGE279.png

我们之前提到的另一种下载方式是从 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 的训练和推理性能。他在韩国大学获得理学学士和硕士学位,并在德克萨斯农工大学获得计算机科学博士学位

审核编辑:郭婷

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 代码
    +关注

    关注

    30

    文章

    4941

    浏览量

    73154
  • 深度学习
    +关注

    关注

    73

    文章

    5591

    浏览量

    123914
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    在Ubuntu20.04系统中训练神经网络模型的一些经验

    本帖欲分享在Ubuntu20.04系统中训练神经网络模型的一些经验。我们采用jupyter notebook作为开发IDE,以TensorFlow2为训练框架,目标是
    发表于 10-22 07:03

    NVIDIA TensorRT LLM 1.0推理框架正式上线

    TensorRT LLM 作为 NVIDIA 为大规模 LLM 推理打造的推理框架,核心目标是突破 NVIDIA 平台上的推理性能瓶颈。为实现这一目标,其构建了多维度的核心实现路径:一
    的头像 发表于 10-21 11:04 770次阅读

    如何在机器视觉中部署深度学习神经网络

    图 1:基于深度学习的目标检测可定位已训练的目标类别,并通过矩形框(边界框)对其进行标识。 在讨论人工智能(AI)或深度学习时,经常会出现“
    的头像 发表于 09-10 17:38 698次阅读
    如何在机器视觉中部署<b class='flag-5'>深度</b><b class='flag-5'>学习</b>神经<b class='flag-5'>网络</b>

    如何在RK3576开发板上运行TinyMaix :超轻量级推理框架--基于米尔MYD-LR3576开发板

    本文将介绍基于米尔电子MYD-LR3576开发平台部署超轻量级推理框架方案:TinyMaix摘自优秀创作者-短笛君TinyMaix是面向单片机的超轻量级的神经网络推理库,即TinyML
    的头像 发表于 07-25 08:03 4004次阅读
    如何在RK3576开发板上运行TinyMaix :超轻量级<b class='flag-5'>推理</b><b class='flag-5'>框架</b>--基于米尔MYD-LR3576开发板

    信而泰×DeepSeek:AI推理引擎驱动网络智能诊断迈向 “自愈”时代

    模态的技术特性,DeepSeek正加速推动AI在金融、政务、科研及网络智能化等关键领域的深度应用。 信而泰:AI推理引擎赋能网络智能诊断新范
    发表于 07-16 15:29

    大模型推理显存和计算量估计方法研究

    ,如乘法、加法等; (2)根据各层计算操作的类型和复杂度,确定每层所需的计算量; (3)将各层计算量相加,得到模型总的计算量。 基于硬件加速的算力估计 随着硬件加速技术的发展,许多深度学习
    发表于 07-03 19:43

    百度飞桨框架3.0正式版发布

    大模型训练成本高?推理效率低?硬件适配难? 4月1日,百度发布 飞桨框架3.0正式版 !五大特性专为大模型设计。 作为大模型时代的Infra“基础设施”,深度
    的头像 发表于 04-02 19:03 1043次阅读
    百度飞桨<b class='flag-5'>框架</b>3.0正式版发布

    壁仞科技支持DeepSeek-V3满血版训练推理

    DeepSeek-V3满血版在国产GPU平台的高效全栈式训练推理,实现国产大模型与国产GPU的深度融合优化,开启国产算力新篇章。
    的头像 发表于 03-04 14:01 1925次阅读

    DeepSeek推出NSA机制,加速长上下文训练推理

    的特性,专为超快速的长上下文训练推理而设计。 NSA通过针对现代硬件的优化设计,显著加快了推理速度,并大幅度降低了预训练成本,同时保持了卓越的性能表现。这一机制在确保效率的同时,并未
    的头像 发表于 02-19 14:01 927次阅读

    BP神经网络深度学习的关系

    ),是一种多层前馈神经网络,它通过反向传播算法进行训练。BP神经网络由输入层、一个或多个隐藏层和输出层组成,通过逐层递减的方式调整网络权重,目的是最小化
    的头像 发表于 02-12 15:15 1358次阅读

    昆仑芯率先完成Deepseek训练推理全版本适配

    本文是昆仑芯适配DeepSeek系列推文第一篇,将于近期分别推出在昆仑芯P800上进行DeepSeek-V3/R1推理训练深度文章,干货满满、持续关注!
    的头像 发表于 02-06 15:13 2276次阅读
    昆仑芯率先完成Deepseek<b class='flag-5'>训练</b><b class='flag-5'>推理</b>全版本适配

    大模型训练框架(五)之Accelerate

    Hugging Face 的 Accelerate1是一个用于简化和加速深度学习模型训练的库,它支持在多种硬件配置上进行分布式训练,包括 C
    的头像 发表于 01-14 14:24 1775次阅读

    智谱推出深度推理模型GLM-Zero预览版

    近日,智谱公司正式发布了其深度推理模型GLM-Zero的预览版——GLM-Zero-Preview。这款模型标志着智谱在扩展强化学习技术训练推理
    的头像 发表于 01-03 10:42 768次阅读

    智谱GLM-Zero深度推理模型预览版正式上线

    近日,智谱公司宣布其深度推理模型GLM-Zero的初代版本——GLM-Zero-Preview已正式上线。这款模型是智谱首个基于扩展强化学习技术训练
    的头像 发表于 01-02 10:55 801次阅读

    Triton编译器在机器学习中的应用

    多种深度学习框架,如TensorFlow、PyTorch、ONNX等,使得开发者能够轻松地将不同框架训练的模型部署到GPU上。 2. Tr
    的头像 发表于 12-24 18:13 1634次阅读