• yolov5转tensorrt出现以下问题,是不是很头大,于是我对比了模型的前处理和后处理,断定我写的c++实现是没有问题的,后续通过分析onnx的结果,发现onnx是没有问题的,起初trt警告cuda版本有点不兼容,我还以为是这样的,后续我解决了这个cuda版本问题后发现,还有这样错误的结果。那么我断定,onnx2trt出错了。但是在转换过程中没有报错。

Polygraphy

废话不多少直接上神器

  • 安装Polygraphy
pip install colored polygraphy --extra-index-url https://pypi.ngc.nvidia.com
  • 逐层对比模型精度
polygraphy run yolov5.onnx  \--trt --onnxrt \--trt-outputs mark all \--onnx-outputs mark all  \--atol 1e-3 --rtol 1e-3 \--fail-fast  \--val-range [0,1]

这里对相关参数简单介绍下

(1)–trt : 采用TensorRT进行推理

(2)–onnxrt: 采用ONNX runtime进行推理

(3)–xx-outputs mark all: 将模型中的每个节点设置为输出节点,方便逐层比较,但在有些情况下由于Trt会进行算子融合可能会触发异常,导致比较失败

(4)–atol, --rtol: 绝对精度和相对精度,默认值为1e-5,因为YOLOv5把Decode部分也包含进去,所以存在稍微大些的误差也是可以容忍的,所以此处我设置为1e-3

(5)–fail-fast:在第一次出现精度异常的节点时退出比较过程,方便查看首次出现异常的节点

(4)–val-range:设置输入的数据值范围,当然你也可以设置自定义的输入数据集

等待一会儿,果然存在精度异常的节点,

         (85.1, 94.2) |         11 |
[I]         Error Metrics: 361
[I]             Minimum Required Tolerance: elemwise error | [abs=65.657] OR [rel=0.69697] (requirements may be lower if both abs/rel tolerances are set)
[I]             Absolute Difference | Stats: mean=12.918, std-dev=11.35, var=128.83, median=13.033, min=0 at (0, 0, 0, 5, 0), max=65.657 at (0, 2, 2, 6, 0), avg-magnitude=12.918
[I]                 ---- Histogram ----Bin Range    |  Num Elems | Visualization(0   , 6.57) |      13417 | ########################################(6.57, 13.1) |       5898 | #################(13.1, 19.7) |       7588 | ######################(19.7, 26.3) |       6630 | ###################(26.3, 32.8) |       3228 | #########(32.8, 39.4) |       1173 | ###(39.4, 46  ) |        335 | (46  , 52.5) |         78 | (52.5, 59.1) |         41 | (59.1, 65.7) |         12 |
[I]             Relative Difference | Stats: mean=0.34557, std-dev=0.26458, var=0.070005, median=0.40489, min=0 at (0, 0, 0, 5, 0), max=0.69697 at (0, 2, 78, 70, 0), avg-magnitude=0.34557

从这里可以看出来361编号的操作是有问题的,误差很大,最大能达到65.657。

查看TensorRT发布文档看看能不能找到说明。

发现原来在TensorRT7中elementwise算子在一个输入为常量并且维度大于4时,会融合成scale算子,导致其不支持基于元素的操作(出现异常,也不报错…脑裂)。跑了下TensorRT8,一切岁月静好,文档果然没骗我~~

tensorrt7


tensorrt8

  • 安装onnx-graphsurgeon
pip install onnx_graphsurgeon --index-url https://pypi.ngc.nvidia.com

针对TensorRT7中提到的,我们可以在contant和elementwise之间追加一个identity来防止算子融合带来的精度问题。代码展示如下:

from collections import OrderedDict
import numpy as np
import onnx
import onnx_graphsurgeon as gs
# 导入onnx模型
graph = gs.import_onnx(onnx.load("yolov5s.onnx"))# 注册Identity层
@gs.Graph.register()
def identity(self, a):return self.layer(op="Identity", inputs=[a], outputs=["identity_out_gs"])[0]# 需要修改的Mul层名称
mul_names = ["Mul_261", "Mul_227", "Mul_295"]
mul_nodes = [node for node in graph.nodes if node.name in mul_names]
for mul in mul_nodes:identity = graph.identity(mul.inputs[1])mul.inputs[1] = identity# 保存新模型
onnx.save(gs.export_onnx(graph), "yolov5s_new.onnx")
```![在这里插入图片描述](https://img-blog.csdnimg.cn/af957b4ab8b04e778684e6b7f7cde633.jpeg)

Tensorrt7踩坑记录相关推荐

  1. 为Jupyter notebook配置R kernel过程及踩坑记录

    为Jupyter notebook配置R kernel过程及踩坑记录 注意:本文为作者安装过程及折腾的过程,内容比较冗杂,如果读者想直接创建一个属于自己的子环境则参考: 如下文章: anaconda下 ...

  2. Python打包工具Pyintealler打包py文件为windows exe文件过程及踩坑记录+实战例子

    Python打包工具Pyintealler打包py文件为windows exe文件过程及踩坑记录+实战例子 目录 Python打包工具Pyintealler打包py文件为windows exe文件过程 ...

  3. TVM: Deep Learning模型的优化编译器(强烈推荐, 附踩坑记录)

    本文作者是阿莱克西斯,原载于知乎,雷锋网(公众号:雷锋网)获得授权转载. (前排提醒,本文的人文内容部分稍稍带有艺术加工,请保持一定的幽默感进行阅读) 关注我最近想法的同学应该知道我最近都在把玩 TV ...

  4. 使用Java读取 “Python写入redis” 的数据踩坑记录

    https://my.oschina.net/u/2338224/blog/3061507 使用Java读取 "Python写入redis" 的数据踩坑记录 https://seg ...

  5. osx php7 imagick,[PHP] MacOS 自带php环境安装imagick扩展踩坑记录 | 码农部落

    前言 最近学习yii2,在搭建环境后,发现在访问contact页面时报错,如下: "Either GD PHP extension with FreeType support or Imag ...

  6. vue-i18n使用及踩坑记录

    使用步骤 1. 安装 npm i vue-i18n 2. vue-cli下使用 //1. 引入 vue-i18n import Vue from 'vue' import VueI18n from ' ...

  7. SpringBoot踩坑记录 Invalid bound statement (not found)引发的一些列问题

    SpringBoot踩坑记录 Invalid bound statement (not found)引发的一些列问题 当你开开心心搭建了一个SpringBoot项目,用插件生成了entity.dao. ...

  8. mysql 使用sum limit_mysql踩坑记录之limit和sum函数混合使用问题

    问题复盘 本次复盘会用一个很简单的订单表作为示例. 数据准备 订单表建表语句如下(这里偷懒了,使用了自增ID,实际开发中不建议使用自增ID作为订单ID) CREATE TABLE `order` ( ...

  9. 【踩坑记录】Tensorflow在Windows下使用

    [踩坑记录]Tensorflow在Windows下使用 TensorFlow 是一个端到端开源机器学习平台 安装 pip3 install tensorflow 使用时报错如下 2021-04-21 ...

  10. 【踩坑记录】mybatis-plus的insert方法,默认会生成一个uuid作为主键,导致类型不一致,存入数据库报错

    [踩坑记录]mybatis-plus的insert方法,默认会生成一个uuid作为主键,导致类型不一致,存入数据库报错 报错记录 解决方案 推荐方案 使用uuid作为主键,修改id的类型为bigint ...

最新文章

  1. Spring 4 + Reactor Integration Example--转
  2. java 右键卡死_为什么右键单击不适用于Java应用程序?
  3. 贪吃蛇系列之一——引入
  4. linq 解决winForm中控件CheckedListBox操作的问题。(转载)
  5. oneuijs/You-Dont-Need-jQuery
  6. Typora+PicGo+SMMS、github、gitee实现Typora图片上传到图床
  7. 计算机断电后会丢失的是什么,计算机突然停电,什么数据会丢失?
  8. Mysql整库导出导入
  9. phpstudy thinkphp5 mysql5.5+存储emoji
  10. 你赚不到钱的原因,是你把自己放错了地方
  11. 唯大英雄能真本色——leo推荐程序员小说《敏捷无敌》
  12. win10安装mysql报错——无法项识别为 cmdlet、函数、脚 本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。
  13. 最新版Java零基础入门阶段学习教程汇总(无比全面,我收藏了!!!)
  14. 你专属的程序员春节“大礼包”
  15. html掷骰子游戏的代码,掷骰子的小程序 HTML5
  16. IOS个人开发者账号和wp公司开发者帐号申请注意点
  17. 对于程序员而言,是否金三银四才是最佳跳槽季
  18. mysql大翻页limt 1700,100慢优化方案
  19. Vue 移动端调用相机和相册实现图片上传
  20. 如何制作自己的网页字体图标

热门文章

  1. android 微信浮窗实现_Android 悬浮窗功能的实现
  2. win10滑动关机代码bat_IT之家学院:十秒学会Win10滑动关机教程 - IT之家
  3. 携程机器学习开发部署一体化平台实践之路
  4. 测试网速_怎样测试两台电脑之间的网速
  5. 紫书刷题记录 UVa1593 代码对齐
  6. linux pulseaudio卸载,解决Ubuntu 9.04 下 PulseAudio声音故障
  7. Java获取 [a,b] 范围的随机数公式
  8. 【学习强化学习】五、PPO算法原理及实现
  9. 外包档案管理员轻松吗_如何轻松优化任务管理
  10. VI设计手册制作全流程