Tensorrt7踩坑记录
- 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踩坑记录相关推荐
- 为Jupyter notebook配置R kernel过程及踩坑记录
为Jupyter notebook配置R kernel过程及踩坑记录 注意:本文为作者安装过程及折腾的过程,内容比较冗杂,如果读者想直接创建一个属于自己的子环境则参考: 如下文章: anaconda下 ...
- Python打包工具Pyintealler打包py文件为windows exe文件过程及踩坑记录+实战例子
Python打包工具Pyintealler打包py文件为windows exe文件过程及踩坑记录+实战例子 目录 Python打包工具Pyintealler打包py文件为windows exe文件过程 ...
- TVM: Deep Learning模型的优化编译器(强烈推荐, 附踩坑记录)
本文作者是阿莱克西斯,原载于知乎,雷锋网(公众号:雷锋网)获得授权转载. (前排提醒,本文的人文内容部分稍稍带有艺术加工,请保持一定的幽默感进行阅读) 关注我最近想法的同学应该知道我最近都在把玩 TV ...
- 使用Java读取 “Python写入redis” 的数据踩坑记录
https://my.oschina.net/u/2338224/blog/3061507 使用Java读取 "Python写入redis" 的数据踩坑记录 https://seg ...
- osx php7 imagick,[PHP] MacOS 自带php环境安装imagick扩展踩坑记录 | 码农部落
前言 最近学习yii2,在搭建环境后,发现在访问contact页面时报错,如下: "Either GD PHP extension with FreeType support or Imag ...
- vue-i18n使用及踩坑记录
使用步骤 1. 安装 npm i vue-i18n 2. vue-cli下使用 //1. 引入 vue-i18n import Vue from 'vue' import VueI18n from ' ...
- SpringBoot踩坑记录 Invalid bound statement (not found)引发的一些列问题
SpringBoot踩坑记录 Invalid bound statement (not found)引发的一些列问题 当你开开心心搭建了一个SpringBoot项目,用插件生成了entity.dao. ...
- mysql 使用sum limit_mysql踩坑记录之limit和sum函数混合使用问题
问题复盘 本次复盘会用一个很简单的订单表作为示例. 数据准备 订单表建表语句如下(这里偷懒了,使用了自增ID,实际开发中不建议使用自增ID作为订单ID) CREATE TABLE `order` ( ...
- 【踩坑记录】Tensorflow在Windows下使用
[踩坑记录]Tensorflow在Windows下使用 TensorFlow 是一个端到端开源机器学习平台 安装 pip3 install tensorflow 使用时报错如下 2021-04-21 ...
- 【踩坑记录】mybatis-plus的insert方法,默认会生成一个uuid作为主键,导致类型不一致,存入数据库报错
[踩坑记录]mybatis-plus的insert方法,默认会生成一个uuid作为主键,导致类型不一致,存入数据库报错 报错记录 解决方案 推荐方案 使用uuid作为主键,修改id的类型为bigint ...
最新文章
- Spring 4 + Reactor Integration Example--转
- java 右键卡死_为什么右键单击不适用于Java应用程序?
- 贪吃蛇系列之一——引入
- linq 解决winForm中控件CheckedListBox操作的问题。(转载)
- oneuijs/You-Dont-Need-jQuery
- Typora+PicGo+SMMS、github、gitee实现Typora图片上传到图床
- 计算机断电后会丢失的是什么,计算机突然停电,什么数据会丢失?
- Mysql整库导出导入
- phpstudy thinkphp5 mysql5.5+存储emoji
- 你赚不到钱的原因,是你把自己放错了地方
- 唯大英雄能真本色——leo推荐程序员小说《敏捷无敌》
- win10安装mysql报错——无法项识别为 cmdlet、函数、脚 本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。
- 最新版Java零基础入门阶段学习教程汇总(无比全面,我收藏了!!!)
- 你专属的程序员春节“大礼包”
- html掷骰子游戏的代码,掷骰子的小程序 HTML5
- IOS个人开发者账号和wp公司开发者帐号申请注意点
- 对于程序员而言,是否金三银四才是最佳跳槽季
- mysql大翻页limt 1700,100慢优化方案
- Vue 移动端调用相机和相册实现图片上传
- 如何制作自己的网页字体图标
热门文章
- android 微信浮窗实现_Android 悬浮窗功能的实现
- win10滑动关机代码bat_IT之家学院:十秒学会Win10滑动关机教程 - IT之家
- 携程机器学习开发部署一体化平台实践之路
- 测试网速_怎样测试两台电脑之间的网速
- 紫书刷题记录 UVa1593 代码对齐
- linux pulseaudio卸载,解决Ubuntu 9.04 下 PulseAudio声音故障
- Java获取 [a,b] 范围的随机数公式
- 【学习强化学习】五、PPO算法原理及实现
- 外包档案管理员轻松吗_如何轻松优化任务管理
- VI设计手册制作全流程