TensorRT ONNX 基础(续)

TensorRT ONNX 基础(续)

PyTorch正确导出ONNX

几条推荐的原则,可以减少潜在的错误:

  1. 对于任何使用到 shape、size 返回值的参数时,例如 tensor.view(tensor.size(0), -1) 这类操作,避免直接使用 tensor.size() 的返回值,而是用 int 强转以下,断开跟踪,即:tensor.view(int(tensor.view(0)), -1)
  2. 对于 nn.Unsamplenn.functional.interpolate 函数,使用 scale_factor 指定倍率,而不是使用 size 参数指定大小。
  3. 关于 batch 动态 shape 还是宽高动态 shape
    • 对于 reshapeview 操作时,-1 的指定请放到 batch 维度,其他维度手动计算出来填上即可。batch 维度尽量不要指定为大于 -1 的明确数字。
    • torch.nn.export 指定 dynamic_axes 参数,并且只指定 batch 维度,尽量不要把其他指定为动态
  4. 使用 opset_version = 11 ,尽量不要使用 11 以下的版本
  5. 避免使用 inplace 操作,例如 y[..., 0: 2] = y[..., 0: 2] * 2 -0.5
  6. 尽量少地出现 5 各维度,例如在 ShuffleNet Module 中,会出现 5 个维度,在导出时可以考虑合并 wh 避免 5 维
  7. 尽量把后处理部分放在 ONNX 模型中实现,这也可以让推理引擎顺带给加速了
    • 就是用我们之前提到的在 ONNX 模型中添加节点(如前后处理等)的方法:先将前后处理写成 PyTorch 模型,单独导出为一个 ONNX 模型,再加到原模型中

这些做法的必要性体现在简化过程的复杂度,去掉 gather、shape 之类的节点,有些时候,看似不这么该也是可以跑通的,但是需求复杂后总是会出现这样那样的问题,而这样遵守这些原则,可以尽可能地较少潜在的错误。做了这些,基本就不用 onnx-simplifier 了。

原则一(不规范)原则一(规范)
在这里插入图片描述在这里插入图片描述

使用ONNX解析器来读取ONNX文件

onnx 解析器的使用有两个选项:

  • libnvonnxparser.so (共享库)
  • https://github.com/onnx/onnx-tensorrt (源代码)

对应的头文件是:NvOnnxParser.h

其实源代码编译后就是共享库,我们推荐使用源代码,这样可以更好地进行自定义封装,简化插件开发或者模型编译的过程,更加容易实现定制化需求,遇到问题可以调试。

源代码中主要关注的是 builtin_op_importers.cpp 文件,这个文件中定义了各个算子是怎样从 ONNX 算子解析成 TensorRT 算子的,如果我们后续有新的算子,也可以自己修改该源文件来支持新算子。

从下载onnx-tensorrt到配置好再到成功运行

TODO:自己试一下

插件实现

插件实现重点:

  1. 如何在 PyTorch 里面导出一个插件
  2. 插件解析时如何对应,在 onnx parser 中如何处理
  3. 插件的 creator 实现,除了插件,还要实现插件的 creator ,TensorRT 就是通过 creator 来创建插件的
  4. 插件的具体实现,继承自 IPluginV2DynamicExt
  5. 插件的序列化与反序列化

TODO:看代码,自己写

插件实现的封装

课程老师将上述复杂的 plugin 实现做了通用的、默认的封装,大部分情况下使用默认的封装即可,少数有需要自己改动的地方按照上面介绍的内容再去改,极大地减少代码量。

TODO:看代码,自己写

int8量化

int8量化简介

int8 量化是利用 int8 乘法替换 float32 乘法实现性能加速的一种方法

  • 对于常规模型:y=kx+by=kx+by=kx+b ,其中 x,k,bx, k, bx,k,b 都是 float32,对于 kxkxkx 的计算使用的当然也是 float32 乘法
  • 对于 int8 模型:y=tofp32(toint8(k)×toint8(x))+by=tofp32(toint8(k)\times toint8(x))+by=tofp32(toint8(k)×toint8(x))+b ,其中 kxkxkx 的计算是两个 int8 相乘,得到 int16

经过 int8 量化的模型无疑精度会降低,各种 int8 模型量化算法解决的问题就是如何合理地将 fp32 转换为 int8,从而尽可能减小精度损失

除了 fp32 和 int8,很多时候会用 fp16 模型,精度损失会比 int8 少很多,并且速度也很快。但是需要注意 fp16 仅在对 fp16 的显卡上有很好的性能,在对 fp16 无优化的显卡甚至可能速度还不如 fp32,总之 int8、fp16、fp32 要看业务对精度和速度的要求,还有部署的显卡设备来综合决定。

TensorRT int8量化步骤

  1. 配置 setFlag nvinfer1::BuilderFlag::kINT8
  2. 实现 Int8EntropyCalibrator 类,其继承自 IInt8EntropyCalibrator2
  3. 实例化一个 Int8EntropyCalibrator 并设置到 config.setInt8Calibrator
  4. Int8EntropyCalibrator 的作用是:读取并预处理图像数据作为输入

标定过程的理解

  • 对于输入图像 A,使用 fp32 推理之后得到 P1,再用 int8 推理之后得到 P2,调整 int8 权重使得 P1 和 P2 足够接近
  • 因此标定时需要使用到一些图像,通常 100 张左右即可

Int8EntropyCalibrator类主要关注

  1. getBatchSize ,告诉引擎,这次标定的 batch 是多少
  2. getBatch ,告诉迎请,这次标定的数据是什么,将指针赋值给 bindings 即可,返回 false 即表示没有数据了
  3. readCalibrationCache ,若从缓存文件加载标定信息,则可避免读取文件和预处理,若该函数返回空指针则表示没有缓存,程序会通过 getBatch 重新计算
  4. writeCalibrationCache ,当标定结束后,会调用该函数,我们可以储存标定后的缓存结果,多次标定可以使用该缓存实现加速

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

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

相关文章

frp实现内网穿透极简教程

frp实现内网穿透极简教程 本文是内网穿透极简教程,为求简洁,我们不介绍为什么内网穿透也不介绍其原理,这里假设各位读者都已经明确的知道自己的目的,本文仅介绍如何安装配置 frp 实现内网穿透。 简单来说,内网穿透就…

图像预处理之warpaffine与双线性插值及其高性能实现

图像预处理之warpaffine与双线性插值及其高性能实现 视频讲解:https://www.bilibili.com/video/BV1ZU4y1A7EG 代码Repo:https://github.com/shouxieai/tensorRT_Pro 本文为视频讲解的个人笔记。 warpaffine矩阵变换 对于坐标点的变换,我们通…

LeetCode-10 正则表达式匹配

LeetCode-10 正则表达式匹配 动态规划 10. 正则表达式匹配 dp数组含义:dp[i][j]dp[i][j]dp[i][j] 表示 s[0:i−1]s[0:i-1]s[0:i−1] 能否被 p[0:j−1]p[0:j-1]p[0:j−1] 成功匹配。 状态转移方程 : 如果 s[i−1]p[j−1]s[i-1]p[j-1]s[i−1]p[j−1] …

shell if判断和for循环常见写法

shell if判断和for循环常见写法 转自: Shell中for循环的几个常用写法 Shell中if 条件判断总结 if常见写法 一、if的基本语法: if [ command ];then符合该条件执行的语句 elif [ command ];then符合该条件执行的语句 else符合该条件执行的语句 fibash shell会按顺序…

关于pytorch使用多个dataloader并使用zip和cycle来进行循环时出现的显存泄漏的问题

关于pytorch使用多个dataloader并使用zip和cycle来进行循环时出现的显存泄漏的问题 如果我们想要在 Pytorch 中同时迭代两个 dataloader 来处理数据,会有两种情况:一是我们按照较短的 dataloader 来迭代,长的 dataloader 超过的部分就丢弃掉…

neovim及coc.nvim自动补全初探

neovim及coc.nvim自动补全初探 安装 # mac # 安装 brew install neovim # 查看neovim安装路径 brew list nvim# ubuntu apt install neovim习惯了打开 vi/vim 的方式,可以用个 alias 在 ~/.zshrc 中设置一下: alias vi"nvim"插件 vim-plug…

sed 简明教程

sed 简明教程 转自:https://coolshell.cn/articles/9104.html awk于1977年出生,今年36岁本命年,sed比awk大2-3岁,awk就像林妹妹,sed就是宝玉哥哥了。所以 林妹妹跳了个Topless,他的哥哥sed坐不住了&#xf…

awk 简明教程

awk 简明教程 转自:https://coolshell.cn/articles/9070.html 有一些网友看了前两天的《Linux下应该知道的技巧》希望我能教教他们用awk和sed,所以,出现了这篇文章。我估计这些80后的年轻朋友可能对awk/sed这类上古神器有点陌生了&#xff0c…

应该知道的LINUX技巧

应该知道的LINUX技巧 转自:https://coolshell.cn/articles/8883.html 这篇文章来源于Quroa的一个问答《What are some time-saving tips that every Linux user should know?》—— Linux用户有哪些应该知道的提高效率的技巧。我觉得挺好的,总结得比较好…

[深度][PyTorch] DDP系列第一篇:入门教程

[深度][PyTorch] DDP系列第一篇:入门教程 转自:[原创][深度][PyTorch] DDP系列第一篇:入门教程 概览 想要让你的PyTorch神经网络在多卡环境上跑得又快又好?那你definitely需要这一篇! No one knows DDP better than I…

[深度][PyTorch] DDP系列第二篇:实现原理与源代码解析

[深度][PyTorch] DDP系列第二篇:实现原理与源代码解析 转自:https://zhuanlan.zhihu.com/p/187610959 概览 想要让你的PyTorch神经网络在多卡环境上跑得又快又好?那你definitely需要这一篇! No one knows DDP better than I do! …

[深度][PyTorch] DDP系列第三篇:实战与技巧

[深度][PyTorch] DDP系列第三篇:实战与技巧 转自:https://zhuanlan.zhihu.com/p/250471767 零. 概览 想要让你的PyTorch神经网络在多卡环境上跑得又快又好?那你definitely需要这一篇! No one knows DDP better than I do! – – …

PIL、OpenCV中resize算子实现不同的问题

PIL、OpenCV中resize算子实现不同的问题 测试图像:https://raw.githubusercontent.com/TropComplique/ssd-pytorch/master/images/dogs-and-cats.jpg (直接 wget 可获得) 测试版本: opencv-python 4.4.0.46Pillow 8.0.1 测试代…

mac X11 XQuartz的安装与使用

mac X11 XQuartz的安装与使用 本地系统:MacOS 12.4 远程主机系统:Ubuntu 18.04 命令说明 ssh命令 ssh 命令大家很熟悉了,这里仅介绍与 X11 forwarding 相关的几个选项。 本部分译自 ssh 命令手册,可见 man ssh -X &#xf…

机器学习:系统设计与实现 分布式训练

机器学习系统:设计与实现 分布式训练 转自:https://openmlsys.github.io/chapter_distributed_training/index.html 随着机器学习的进一步发展,科学家们设计出更大型,更多功能的机器学习模型(例如说,GPT-3)…

Linux命令行及各常用工具代理设置

Linux命令行及各常用工具代理设置 命令行代理设置 1 通过命令行指定 直接为当前命令行设置代理 对当前终端的全部工具(apt、curl、wget、git 等全都有效)以下仅以 http 代理为例,如果是其他协议(如 socks 等)自行改…

VimScript 五分钟入门(翻译)

VimScript 五分钟入门(翻译) 转自:https://zhuanlan.zhihu.com/p/37352209 译注:折腾 Vim 当然要能看懂和改写相关脚本,而中文资料匮乏,缺一个提纲挈领的教程。本文翻译自 Andrew Scala 的 《Five Minute V…

C++多线程推理、生产者消费者模式封装

C多线程推理、生产者消费者模式封装 tensorRT从零起步迈向高性能工业级部署(就业导向) 课程笔记,讲师讲的不错,可以去看原视频支持下。 深度学习推理中的多线程知识概览 本章介绍的多线程主要是指算法部署时所涉及的多线程内容&a…

在Python中调用C/C++:cython及pybind11

在Python中调用C/C:cython及pybind11 转自:https://zhuanlan.zhihu.com/p/442935082 Python写起来非常方便, 但面对大量for循环的时候, 执行速度有些捉急. 原因在于, python是一种动态类型语言, 在运行期间才去做数据类型检查, 这样效率就很低(尤其是大规…

Pytorch导出onnx模型,C++转化为TensorRT并实现推理过程

Pytorch导出onnx模型,C转化为TensorRT并实现推理过程 前言 本文为旨在实现整个Python导出PyTorch模型,C转化为TensorRT并实现推理过程过程,只与模型推理,模型部署相关,不涉及模型训练。为突出整个部署过程而非具体模…