六. 部署分类器-trt-engine-explorer

news2025/1/11 8:08:56

目录

    • 前言
    • 0. 简述
    • 1. 案例运行
    • 2. 补充说明
    • 3. engine分析
    • 结语
    • 下载链接
    • 参考

前言

自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》,链接。记录下个人学习笔记,仅供自己参考

本次课程我们来学习课程第六章—部署分类器,一起来学习 trt-engine-explorer 工具的使用

课程大纲可以看下面的思维导图

在这里插入图片描述

0. 简述

本小节目标:学习如何使用 trt-engine-explorer 工具

这个小节的案例代码与 C++ 没有多大的关系,它更多的是对我们生成的 trt-engine 模型的分析,用 python 脚本把 engine 的模型架构进行可视化

下面我们开始本次课程的学习🤗

1. 案例运行

在正式开始课程之前,博主先带大家跑通 6.4-trt-engine-inspector 这个小节的案例🤗

源代码获取地址:https://github.com/kalfazed/tensorrt_starter

首先大家需要把 tensorrt_starter 这个项目给 clone 下来,指令如下:

git clone https://github.com/kalfazed/tensorrt_starter.git

也可手动点击下载,点击右上角的 Code 按键,将代码下载下来。至此整个项目就已经准备好了。也可以点击 here 下载博主准备好的源代码(注意代码下载于 2024/7/14 日,若有改动请参考最新

整个项目后续需要使用的软件主要有 CUDA、cuDNN、TensorRT、OpenCV,大家可以参考 Ubuntu20.04软件安装大全 进行相应软件的安装,博主这里不再赘述

下面我们要创建一个虚拟环境来安装 trt-engine-explorer 工具,博主这里准备了一个可以运行本小节案例代码的虚拟环境,大家可以按照这个环境来,也可以参考 trt-engine-explorer 官方文档 进行安装,指令如下:

conda create -n env_trex python=3.9
conda activate env_trex
git clone https://github.com/NVIDIA/TensorRT.git
cd TensorRT/tools/experimental/trt-engine-explorer
python3 -m pip install -e.
pip install werkzeug==3.0.0 Flask==3.0.0
sudo apt-get --yes install graphviz

安装完成后大家可以通过 pip 指令查看安装好的 trex 工具,如下图所示:

在这里插入图片描述

假设你的项目、环境准备完成,下面我们一起来运行下 6.4-trt-engine-inspector 小节案例代码

首先我们需要准备一个 engine 模型文件供 trt-engine-explorer 工具分析,这里我们直接拿上个小节生成的 resnet50-int8.engine 过来

下面我们需要利用脚本文件生成分析文件,指令如下:

# 将已有的分析文件全部删除
cd tensorrt_starter/chapter6-deploy-classification-and-inference-design/6.4-trt-engine-inspector/
rm -rf result/resnet50/*
# 将上小节创建好的 engine 拷贝过来
cp ../6.3-in8-calibration/models/engine/resnet50-int8.engine ./result/resnet50/
cd src/python
conda env_trex
python process_engine.py ../../result/resnet50/resnet50-int8.engine ../../result/resnet50 --profile-engine

输出如下图所示:

在这里插入图片描述

同时在 results/resnet50 目录下生成了一系列的文件,如下图所示:

在这里插入图片描述

我们主要关注 resnet50-int8.engine.graph.json 文件,它将 engine 各个 layer 的详细信息都保存下来了,包括 layer 的 name、dimensions、format 以及 data type 等等,其他的文件例如 profile.json、timing.json 则是一些 layer 执行时间的信息,profile.log 则是 trtexec 执行输出的日志信息

我们生成 resnet50-int8.engine.graph.json 文件后可以绘制出其网络结构,执行指令如下:

python draw_engine.py ../../result/resnet50/resnet50-int8.engine.graph.json

你可能会遇到如下的问题:

在这里插入图片描述

这个问题主要是因为 TensorRT 前段时间 10.0 版本发布时相关代码进行了修改,所以这里韩军老师提供的 draw_engine.py 脚本文件的 API 发生了变化

我们直接从目前 TensorRT 官网下的 draw_engine.py 替换当前的内容,如下所示:

#!/usr/bin/env python3
#
# SPDX-FileCopyrightText: Copyright (c) 1993-2024 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#


"""
This script generates an SVG diagram of the input engine graph SVG file.

Note: this script requires graphviz which can be installed manually:
    $ sudo apt-get --yes install graphviz
    $ python3 -m pip install graphviz
"""


import warnings
import argparse
import shutil
import trex.graphing
import trex.engine_plan


def draw_engine(engine_json_fname: str, profiling_json_fname: str=None, **kwargs):
    graphviz_is_installed = shutil.which("dot") is not None
    if not graphviz_is_installed:
        print("graphviz is required but it is not installed.\n")
        print("To install on Ubuntu:")
        print("sudo apt --yes install graphviz")
        exit()

    try:
        if kwargs["display_constants"] and not kwargs["display_regions"]:
            warnings.warn("Ignoring argument --display_constants because it requires --display_regions.")
    except KeyError:
        pass

    plan = trex.engine_plan.EnginePlan(engine_json_fname, profiling_file=profiling_json_fname)
    layer_node_formatter = trex.graphing.layer_type_formatter
    graph = trex.graphing.to_dot(plan, layer_node_formatter, **kwargs)
    trex.graphing.render_dot(graph, engine_json_fname, "svg")


def make_subcmd_parser(subparsers):
    draw = lambda args: draw_engine(
        engine_json_fname=args.input,
        profiling_json_fname=args.profiling_json,
        display_regions=args.display_regions,
        display_layer_names=not args.no_layer_names,
        display_constants=args.display_constant,
    )
    draw_parser = subparsers.add_parser("draw", help="Draw a TensorRT engine.")
    draw_parser.set_defaults(func=draw)
    _make_parser(draw_parser)


def _make_parser(parser):
    parser.add_argument("input", help="name of engine JSON file to draw.")
    parser.add_argument("--profiling_json", "-pj",
        default=None, help="name of engine JSON file to draw")
    parser.add_argument("--display_regions", "-dr",
        action='store_true', help="render memory regions as graph nodes.")
    parser.add_argument("--display_constant", "-dc",
        action='store_true', help="render constant input tensors.")
    parser.add_argument("--no_layer_names", "-no_ln",
        action='store_true', help="render constants.")


if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    args = parser.parse_args(_make_parser(parser))

    draw_engine(
        engine_json_fname=args.input,
        profiling_json_fname=args.profiling_json,
        display_regions=True,
        expand_layer_details=False,
        display_latency=True,
    )

再次执行该脚本,输出如下:

在这里插入图片描述

执行成功后会生成一个 .svg 的图片格式文件,我们可以在浏览器中打开 .svg 的结构图,如下图所示:

在这里插入图片描述

如果大家能够看到上述输出结果,那就说明本小节案例已经跑通,下面我们就来看看具体的 engine 结构变化

2. 补充说明

在分析具体结构变化之前我们先来看下韩君老师在这小节中写的 README 文档

trt-engine-explorer 是 NVIDIA 官方提供的分析 TensorRT 优化后的推理引擎架构的工具包,可以在 TensorRT 官方的 git repository 中找打,具体细节大家可以参考:trt-engine-explorer

在这里插入图片描述

大家参考官方提供的 README.md 把环境搭建起来之后,我们可以尝试分析下我们的 engine 模型。为了方便,在 6.4 小节案例代码中的 src/python 目录下放置了一些官方提供的案例文件可以使用,比如:

通过 TensorRT 优化的推理引擎获取各个 layer 的信息,以 json 形式保存

python process_engine.py ../../result/resnet50/resnet50.engine ../../result/resnet50/resnet50.engine --profile-engine

通过保存得到的 json 信息,绘制出 TensorRT 优化后的网络模型架构,以 SVG 格式保存成图片

python draw_engine.py ../../result/resnet50/resnet50.engine.graph.json

通过 jupyter 在浏览器里打开 SVG 模式下的结构图

jupyter-notebook --ip=0.0.0.0 --no-browser

大家这里可以仔细比较一下各个模型的 .onnx 架构和 .engine 架构的不同,以及同一个模型的不同精度的 .engine 的不同。观察 TensorRT 优化后哪些层被融合了,哪些层是新添加的,大家感兴趣的还可以了解下 reformatter 节点是什么,其实 reformatter 非常重要,因为它涉及到了 TensorRT 的各个 layer 所支持的 data layout,如果想要把部署优化做到极致,理解 data layout 是必须要做的。

3. engine分析

我们对比着看下 resnet50.onnx 模型和 resnet50-int8.engine 引擎的结构变化

在这里插入图片描述

上图中左边是 onnx 右边是 engine,首先在 engine 中 input0 后面的 Reformat 是新添加的节点,接着有一个虚线框,这个代表着之前 onnx 中存在的节点但是现在经过 tensorRT 优化后不存在了。我们可以清晰的看到 onnx 模型中的 Conv、Relu 和 MaxPool 在 engine 中变成了一个 ConvActPool 节点,这个就是 TensorRT 做的层融合后的效果

Note:Engine 中的 Reformat 节点是什么呢?我们是不是应该尽量避免它的产生?

在 TensorRT 的引擎中,Reformat 节点用于在不同层之间处理数据格式的转换。这些节点通常出现在需要更改数据布局(例如从 NCHW 到 NHWC)或调整数据类型(如 FP32、FP16 和 INT8 之间的转换)时,这些转换是必要的,因为引擎中的不同层或操作可能偏好活需要不同的数据格式或精度,以实现性能优化。

通常来说,Reformat 节点越少越好,因为每次格式转换操作都会引入额外的开销,影响引擎的性能。过多的 Reformat 操作会减慢推理速度,因为这需要额外的内存操作

在进行 INT8 量化时,我们最好确保校准过程在各层之间是一致的,一致的量化可以减少在具有不同量化参数的层之间进行 Reformat 的需求

在这里插入图片描述

我们往后看可以发现 ONNX 中的 Relu 节点都不存在了,都变成了虚线框,resnet50 模型比较简单,所以整个 engine 架构还是比较好看的,没有添加什么冗余的东西

在这里插入图片描述

我们在生成 engine 的时候指定的精度是 INT8,那是不是意味着我们所有的节点都是 INT8 的呢,那当然不是,像 Convolution 这种密集型的计算大部分都是 INT8 精度的,但是像上图中的 SoftMax 节点的输入输出都是 FP32 精度

在这里插入图片描述

还有一个点大家需要注意,大家可以看到我们前面的数据都是 NCHW 这种格式,这个大家比较熟悉,但是经过 ConvActPool 之后就变成了 NC/32HW32 这种格式,那这个其实是 TensorRT 内部自定义的一种数据格式,更多细节大家可以看官方文档:data-format-desc

resnet 相对来说比较简单,这里大家可以再看看其他的模型例如 MobileNet 模型 engine 等等,像我们下一个章节要讲的 YOLO 模型,它的 INT8 engine 可能就没有这么好看,它的模型结构相对比较复杂,量化后会存在很多的 reformat 节点

在 tools 文件夹中有一个 build.sh 脚本文件,通过 trtexec 生成 engine,我们可以利用它来生成 mobilenet 的 int8 engine 模型,在此之前我们需要在该脚本文件中添加 --int8 参数,如下图所示:

在这里插入图片描述

接着执行如下指令:

bash tools/build.sh result/mobilnet/mobilenetV2.onnx int8

输出如下:

在这里插入图片描述

同时在当前目录会生成 .engine 和一系列日志文件,如下图所示:

在这里插入图片描述

那大家可能有所疑问为什么可以直接生成 INT8 的 engine 呢?难道不需要 calibration 吗?那其实 trtexec 提供了 --int8 参数运行我们生成 INT8 量化的 engine,如果你不提供 calibration_table,不提供各个 layer 的 dynamic range,那它量化出来的效果非常差,但是我们这里只是查看 mobilenet 的 engine 的结构,所以没有问题

下面我们就如法炮制,跟 resnet50 一样利用 trt-engine-explorer 去生成 engine 的 .svg 图片,这里博主就不再展示了,mobilenetV2-int8.engine 的结构如下图所示:

在这里插入图片描述

结语

本次课程我们学习了 trt-engine-explore 工具的使用,将 TensorRT 优化好的 engine 的结构绘制成 .svg 图片可视化出来。这个工具在做 QAT 量化时可能使用得更多,因为在 QAT 的过程中,模型的各个层之间经常会出现数据格式和精度不匹配的情况,导致 TensorRT 在构建引擎时插入 Reformat 节点。另外可以查看 QAT 模型中哪些层并没有按照我们期望的做 INT8,利用该工具可以有助我们优化模型结构,减少额外的转换操作,检查关键层的量化精度等等

OK,以上就是 6.4 小节案例的全部内容了,下节开始我们进入第七章节的学习,敬请期待😄

下载链接

  • tensorrt_starter源码
  • 6.4-trt-engine-inspector案例文件

参考

  • Ubuntu20.04软件安装大全
  • https://github.com/kalfazed/tensorrt_starter
  • https://github.com/NVIDIA/TensorRT/tools/trt-engine-explorer
  • https://docs.nvidia.com/deeplearning/tensorrt/developer-guide/index.html#data-format-desc

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2095576.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux日志-secure日志

作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注作者,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 Linux进阶部分又分了很多小的部分,我们刚讲完了Linux基础软件,下面是Linux日志。Linux 系统中的日志是记录系统活…

18041 分期还款(加强版)

### 自查思路 1. 检查输入数据的处理是否正确。 2. 检查判断条件 p < d * r 是否正确。 3. 确认公式计算和输出格式是否正确。 ### 伪代码 1. 读取输入的贷款金额、每月还款额和月利率。 2. 判断是否可以还清贷款&#xff1a; - 如果每月还款额小于贷款金额乘以月利率&a…

深度学习与大模型第2课:机器学习实战

文章目录 深度学习与大模型第2课&#xff1a;机器学习实战1. Iris鸢尾花数据集分类1.1 数据预处理1.2 模型训练与评估 2. 美国加州房价预测2.1 数据预处理2.2 模型训练与调优 3. 房价数据的回归分析3.1 数据预处理与建模 4. 时尚衣物识别:MNIST 数据集分类4.1 数据读取与可视化…

跑Boundary-Aware Feature Propagation遇到的问题

跑Boundary-Aware Feature Propagation遇到的坑 1、运行不报错&#xff0c;也不显示结果 从train.py代码第一行import开始添加&#xff0c;print&#xff08;“check1”&#xff09;&#xff0c;发现问题torch.encoding无法导入&#xff0c;反复地参考github源代码https://gith…

Axure RP9安装教程(Pro版)

[Axure RP 9.0下载链接]: https://ga90eobypbb.feishu.cn/docx/WKvldvZkMoKPnIx3Yl2cJhOBnqe 1.找到下载好的安装包&#xff0c;右键解压到“Axure RP 9.0”文件夹 2.双击打开解压出来的文件夹&#xff0c;选中”AxureRP-安装程序.exe“右键以管理员身份运行 3.点击"Nex…

测试小白入门-03测试理论知识看这一篇就够了

文章目录 前言一、软件开发过程模型瀑布开发模型&#xff08;熟悉&#xff09;快速原型模型&#xff08;理解&#xff09;螺旋模型(了解) 二、测试模型测试V模型&#xff08;代表性&#xff09;测试W模型&#xff08;中大型企业&#xff09;测试H模型&#xff08;了解&#xff…

38集 ESP32 离线刷机教程

38集 ESP32 离线刷机教程 打开离线刷机工具 e:\technology\ESP32\esp32s3Qorvo\esp32-s3_rtc\ESP离线刷机\flash_download_tool_3.9.7_1\flash_download_tool_3.9.7\flash_download_tool_3.9.7.exe 设置如下&#xff1a; 要知道如何设置&#xff0c;需要知道esp32s3 工程的me…

【C++ Primer Plus习题】8.5

问题: 解答: #include <iostream> using namespace std;template <typename T> T max5(T arr[5]) {T max 0;for (int i 0; i < 5; i){if (arr[i] > max){max arr[i];}}return max; }int main() {int max 0;double max1 0.0;int a1[5] { 21,34,12,42,9…

【综合小项目】—— 爬取数据、数据处理、建立模型训练、自定义数据进行测试

文章目录 一、项目内容二、各步骤的代码实现1、爬取数据2、数据处理3、建立模型训练4、自定义数据进行预测 一、项目内容 1、爬取数据 本次项目的数据是某购物平台中某个产品的优质评价内容和差评内容采用爬虫的 selenium 方法进行爬取数据内容&#xff0c;并将爬取的内容分别…

C_11_位段,共同体,枚举

位段 位段也称 位域 ​ 1 字节 8 位域 概述&#xff1a; 特殊的结构体 大小按位分配 示例1&#xff1a; struct packed_data {unsigned int a : 2; // 占2 位unsigned int a : 4; // 占4 位unsigned int a : 6; // 占6 位unsigned int i; // 占4字节 32位 1b8位 } data…

打字练习神器与基础打字指法

先奉上链接&#xff1a;Learn Touch Typing Free - TypingClub 最近观察到一位计算机的学长打字哒哒哒哒停不下来&#xff0c;研究了一下发现是自己的指法有问题&#xff0c;只能从头开始学起啦。如果刚学打字的朋友们一定要学习指法&#xff0c;打好基础&#xff01; 基础指法…

基于微信小程序的挂号管理系统-小程序端

微信小程序端系统功能实现 登录功能 系统登录功能中&#xff0c;用户只需在登录界面输入正确的用户名和密码&#xff0c;即可快速进入系统。登录功能还采用了先进的加密技术&#xff0c;保障用户信息的安全性&#xff0c;让用户能够放心使用。 注册功能 系统注册功中&#xf…

js数据类型转换-----统一转成字符串String()

String&#xff08;&#xff09; 所有类型都可以转成字符串 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"…

告别无序 10款科研项目管理工具为您的科研之路加速

国内外主流的10 款科研单位科研项目管理系统对比&#xff1a;PingCode、Worktile、Wizard、ShowDoc、Asana、ClickUp、Notion、Wrike、Basecamp、智方科研管理系统。 在选择科研项目管理系统时&#xff0c;许多科研单位都面临着如何找到能够真正满足特定需求的系统这一挑战。市…

HALCON 深度学习异常检测实例

首先你需要下载软件&#xff0c;halcon 20的版本和 Deep Learning Tool 工具 注意了&#xff0c;下载的halcon 必须要专业版的电脑系统&#xff0c;win10或者win11 都可以但是版本必须是专业版的不能是家庭版的 详情可看我另一篇文章 halcon 深度学习软件工具安装以及用法…

《高等代数》行(列)和相等行列式

说明&#xff1a;此文章用于本人复习巩固&#xff0c;如果也能帮助到大家那就更加有意义了。 注&#xff1a;1&#xff09;行&#xff08;列&#xff09;和相等行列式的求解方法是将其于行都加到第一行&#xff08;列&#xff09;&#xff0c;然后再提取第一行 …

Xilinx系ZYNQ学习笔记(一)Vivado使用说明

系列文章目录 文章目录 系列文章目录前言启示界面介绍新建工程主界面RTL分析与描述设计与综合引脚分配约束设计实现比特流文件的下载固化程序 添加源文件 前言 最近买了块xilinx的FPGA进行学习 启示界面介绍 新建工程 主界面 鼠标放在选项上时会出现中文翻译 RTL分析与描述…

基于STM32心电模块学习笔记

一、项目简介 技术原理和优势:通过医疗电子单片机高级开发系统,读取人体生理参数监测系统发送过来的心率和心电导联信息数据包,并对这两个数据包进行解包,最后,将解包之后的心率值和心电导联信息显示在OLED显示屏上,如下图所示。该实验的数据源是人体生理参数监测系统,该…

牛牛替换(c语言)

1.//描述 //牛牛有一个长度为 n 的字符数组&#xff0c;他尝试把字符数组中其中一些字符替换成另一些字符。 //输入描述&#xff1a; //第一行输入一个正整数 n 表示字符数组的长度&#xff0c;四个个字符分别 a1 和 a2 &#xff0c; a3 和 a4&#xff0c; // 表示把字符数组中…

【Unity实战】Visual Studio Debug失败

Visual Studio&#xff0c;就像以前Eclipse在Java领域中的地位一样&#xff0c;至少在Jetbrains人人皆爱之前&#xff0c;它是主流。可能对于当下来说显得臃肿&#xff0c;而且没有Jetbrains智能准确的代码分析提示&#xff0c;但是依旧能用。而且开大工程来说&#xff0c;至少…