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矩阵变换 对于坐标点的变换,我们通…

sed 简明教程

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

[深度][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! – – …

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

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

从零Makefile落地算法大项目,完整案例教程

从零Makefile落地算法大项目,完整案例教程 转自:从零Makefile落地算法大项目,完整案例教程 作者:手写AI 前言 在这里,你能学到基于Makefile的正式大项目的使用方式和考虑,相信我,其实可以很简单…

PyTorch扩展自定义PyThonC++(CUDA)算子的若干方法总结

PyTorch扩展自定义PyThon/C(CUDA)算子的若干方法总结 转自:https://zhuanlan.zhihu.com/p/158643792 作者:奔腾的黑猫 在做毕设的时候需要实现一个PyTorch原生代码中没有的并行算子,所以用到了这部分的知识,再不总结就要忘光了 &a…

给 Python 算法插上性能的翅膀——pybind11 落地实践

给 Python 算法插上性能的翅膀——pybind11 落地实践 转自:https://zhuanlan.zhihu.com/p/444805518 作者:jesonxiang(向乾彪),腾讯 TEG 后台开发工程师 1. 背景 目前 AI 算法开发特别是训练基本都以 Python 为主&…

chrome自动提交文件_收集文档及提交名单统计

知乎文章若有排版问题请见谅,原文放在个人博客中【欢迎互踩!】文叔叔文档收集使用动机在我们的学习工作中,少不了要让大家集体提交文件的情况,举个最简单的例子:收作业。 传统的文件收集流程大致是:群内发出…

惠普800g1支持什么内存_惠普黑白激光打印机哪种好 惠普黑白激光打印机推荐【图文详解】...

打印机的出现让我们在生活和日常工作中变得越来越方便,不过随着科技的发展,打印机的类型也变得非常多,其中就有黑白激光打印机,而黑白激光打印机的品牌也有很多,比如我们的惠普黑白激光打印机,今天小编就给…

控制台输出颜色控制

控制台输出颜色控制 转自:https://cloud.tencent.com/developer/article/1142372 前端时间,写了一篇 PHP 在 Console 模式下的进度显示 ,正好最近的一个数据合并项目需要用到控制台颜色输出,所以就把相关的信息整理下,…

idea连接跳板机_跳板机服务(jumpserver)

一、跳板机服务作用介绍1、有效管理用户权限信息2、有效记录用户登录情况3、有效记录用户操作行为二、跳板机服务架构原理三、跳板机服务安装过程第一步:安装跳板机依赖软件yum -y install git python-pip mariadb-devel gcc automake autoconf python-devel readl…

【详细图解】再次理解im2col

【详细图解】再次理解im2col 转自:https://mp.weixin.qq.com/s/GPDYKQlIOq6Su0Ta9ipzig 一句话:im2col是将一个[C,H,W]矩阵变成一个[H,W]矩阵的一个方法,其原理是利用了行列式进行等价转换。 为什么要做im2col? 减少调用gemm的次数。 重要…

反思 大班 快乐的机器人_幼儿园大班教案《快乐的桌椅》含反思

大班教案《快乐的桌椅》含反思适用于大班的体育主题教学活动当中,让幼儿提高协调性和灵敏性,创新桌椅的玩法,正确爬的方法,学会匍匐前进,快来看看幼儿园大班《快乐的桌椅》含反思教案吧。幼儿园大班教案《快乐的桌椅》…

DCN可形变卷积实现1:Python实现

DCN可形变卷积实现1:Python实现 我们会先用纯 Python 实现一个 Pytorch 版本的 DCN ,然后实现其 C/CUDA 版本。 本文主要关注 DCN 可形变卷积的代码实现,不会过多的介绍其思想,如有兴趣,请参考论文原文: …

蓝牙耳机声音一顿一顿的_线控耳机党阵地转移成功,OPPO这款TWS耳机体验满分...

“你看到我手机里3.5mm的耳机孔了吗”,这可能是许多线控耳机党最想说的话了。确实,如今手机在做“减法”,而厂商们首先就拿3.5mm耳机孔“开刀”,我们也丧失了半夜边充电边戴耳机打游戏的乐趣。竟然如此,那如何在耳机、…

AI移动端优化之Im2Col+Pack+Sgemm

AI移动端优化之Im2ColPackSgemm 转自:https://blog.csdn.net/just_sort/article/details/108412760 这篇文章是基于NCNN的Sgemm卷积为大家介绍Im2ColPackSgemm的原理以及算法实现,希望对算法优化感兴趣或者做深度学习模型部署的读者带来帮助。 1. 前言 …

elementui的upload组件怎么获取上传的文本流、_抖音feed流直播间引流你还不会玩?实操讲解...

本文由艾奇在线明星优化师写作计划出品在这个全民惊恐多灾多难且带有魔幻的2020,一场突如其来的疫情改变了人们很多消费习惯,同时加速了直播电商的发展,现在直播已经成为商家必争的营销之地,直播虽然很火,但如果没有流…