[Onnx简化库深度剖析] OnnxSimplifier和OnnxOptimizer解读-(3)

转换onnx_ONNX简化节点和修改教程 在训练完深度学习的pytorch或者tensorflow模型后,有时候需要把模型转成 onnx,但是很多时候,很多节点比如cast节点,Identity 这些节点可能都不需要,我们需要进行简化,这样会方便我们把模型转成ncnn或者mnn等这些端侧部署的模型格式或者通过tensorRT进行部署。方法1:使用 onnx-simplifier 进行精简一个方法是使用 [onnx-simplif... 阅读详情

[Onnx简化库深度剖析] OnnxSimplifier和OnnxOptimizer解读-(3)

简介

补充剩下的所有Pass的特性

具体的Pass实现和细节罗列(补充

PassPassNamePassTypePassEfficiencyPassOptimizationType描述
EliminateNopMonotoneArgmaxeliminate_nop_monotone_argmaxNopPartialCompute消除掉那些正相关的激活函数到argmax函数上,减少计算
EliminateNopPadeliminate_nop_padNopCompleteCompute消除pads=0的Pad算子
EliminateNopConcateliminate_nop_concatNopCompleteMemory消除输入个数为1的Concat算子
EliminateNopSpliteliminate_nop_splitNopCompleteMemory消除输出个数为1、input_dim[axis]=split[0]的Split算子
EliminateNopExpandeliminate_nop_expandNopCompleteCompute消除expand_dim可以广播到input_dim的Expand算子
EliminateShapeGathereliminate_shape_gatherFuseCompleteCompute融合掉indices=[indices_val,]、前面的节点是Shape的Gather算子
EliminateSliceAfterShapeeliminate_slice_after_shapeFuseCompleteCompute融合掉前面的节点是Shape的Slice算子
EliminateNopTransposeeliminate_nop_transposeNopCompleteCompute消除掉不起作用的transpose算子
FuseAddBiasIntoConvfuse_add_bias_into_convFuseCompleteCompute融合掉前面的节点是Conv2d、且input[1]是常量可配合dim的Add算子
FuseBNIntoConvfuse_bn_into_convFuseCompleteCompute融合BN算子到Conv2d上,同时修改Conv2d的权重
FuseConsecutiveConcatsfuse_consecutive_concatsFusePartialCompute融合前面的axis相同的Concat到该Concat节点上
FuseConsecutiveLogSoftmaxfuse_consecutive_log_softmaxFuseCompleteCompute融合softmax+log成为LogSoftmax算子
FuseConsecutiveReduceUnsqueezefuse_consecutive_reduce_unsqueezeFuseCompleteCompute当前面的Reduce算子的axes=Unsqueeze_axes、keepdims=0时,融合Unsqueeze算子到Reduce算子上
FuseConsecutiveSqueezesfuse_consecutive_squeezesFuseCompleteCompute合并多个连续的Squeeze算子成为一个Squeeze算子
FuseConsecutiveTransposesfuse_consecutive_transposesFuseCompleteCompute合并多个连续的Transpose算子成为一个Transpose算子
FuseMatMulAddBiasIntoGemmfuse_matmul_add_bias_into_gemmFuseCompleteCompute合并MatMul+Add成为一个Gemm算子
FusePadIntoConvfuse_pad_into_convFuseCompleteCompute合并Pad+Conv成为一个Conv算子,Pad操作合并到了Conv上
FusePadIntoPoolfuse_pad_into_poolFuseCompleteCompute合并Pad+AveragePool/MaxPool成为一个Pool算子
FuseTransposeIntoGemmfuse_transpose_into_gemmFuseCompleteCompute融合前面的Transpose操作反转Gemm的transA/transB参数,从而融合掉transpose算子
ReplaceEinsumWithMatmulreplace_einsum_with_matmulReplaceCompleteCompute满足条件的einsum变成matmul操作:"bhij,bhjd->bhid"变成matmul; "bhid,bhjd->bhij"变成transpose+matmul操作
LiftLexicalReferenceslift_lexical_referencesSeparateCompleteMemory待说明
SplitInitsplit_initSeparateCompleteMemory待说明
SplitPredictsplit_predictSeparateCompleteMemory待说明
FuseConcatIntoReshapefuse_concat_into_reshapeFuseCompleteCompute融合reshape的shape输入的concat/cast算子,变成constant shape输入
EliminateNopReshapeeliminate_nop_reshapeNopCompleteCompute消除掉reshape dim == input_dim的reshape算子
EliminateOpWithUniteliminate_nop_with_unitNopCompleteCompute消除掉同0并的And、同1乘的Mul、同0或的Or、同0加的Add、减0的Sub、除1的Div、方1的Pow、 无效的Concat
EliminateCommonSubexpressioneliminate_common_subexpressionNopCompleteCompute消除掉那些属性/输入一致的节点,也就是公共子表达式
FuseQKVfuse_qkvFuseCompleteCompute合并qkv计算的三个matmul为只有一个matmul: A = matmul(X, Q), B = matmul(X, K), C = matmul(X, V) ==> A,B,C = split(matmul(X, concat(Q,K,V)))
FuseConsecutiveUnsqueezesfuse_consecutive_unsqueezesFuseCompleteCompute融合连续的Unsqueezes算子
EliminateDeadEndeliminate_deadendNopCompleteCompute移除掉output没有连接到其他节点的node
EliminateIdentityeliminate_identityNopCompleteCompute移除掉Identity node
EliminateShapeOpeliminate_shape_opFuseCompleteCompute融合掉可以直接获取input_shape的Shape算子
FuseConsecutiveSlicesfuse_consecutive_slicesFuseCompleteMemory融合掉axes没有交集的连续的slice算子,合并为一个Slice
EliminateUnusedInitializereliminate_unused_initializerNopCompleteMemory移除掉不被使用的initializer
EliminateDuplicateInitializereliminate_duplicate_initializerNopCompleteMemory移除掉重复的initializer
AdjustSliceAndMatmuladjust_slice_and_matmulReplaceCompleteCompute调整slice和matmul之间的顺序,以便优化:Y = Matmul(Slice(data, start, end, axes) ,rhs) ==> Y = Slice(Matmul(data, rhs), start, end, axes)
RewriteInputDtyperewrite_input_dtypeOtherCompleteNone重写input的类型从int64变成int32,从A=node1(INT64_INPUT) ==> A=node1(Cast(INT32_INPUT, INT64))

…

总结

基本上目前所有的Pass已经被罗列出来了,后续会用实际的效果去加深大家的印象
[Onnx简化库深度剖析] OnnxSimplifier和OnnxOptimizer解读-(1) 这次主要是介绍了OnnxSimplifier简化原理,重点介绍了FoldConstant功能和FixedPointFn迭代优化函数,这是该简化包的核心部分了。但是对于其他的OptimizeFixed,也就是OnnxOptimizer函数库的内部简化细节却没有具体的说明。后续将会具体介绍OnnxOptimizer的模型优化细节。 阅读详情

相关推荐

用PyTorch导出ONNX,以及onnxsimplify的使用 - 学习记录

学习记录

点云算法工程师 1334

ONNX笔记

ONNX文件格式介绍

lyyiangang的博客 3143

记录 | onnx-simplifier安装、使用

记录 | onnx-simplifier安装、使用

极智视界 4361

onnx2pytorch和onnx-simplifer新版介绍

【GiantPandaCV导语】本文是ONNX2Pytorch思路分享以及onnx-simplifier新版简要介绍。ONNX2Pytorch工具已经测试了onnx model zoo中的大量分类模型并转换正确,欢迎使用,github地址:https://github.com/BBuf/onnx2nn。GiantPandaCV几个月前遭受恶意举报,今天终于解除封印了。感谢众多粉丝们的长期等待和支持,我们会在此继续分享学习经验。 0x0. 背景 ONNX作为微软的神经网络模型的开放格式被各个框架广泛应用,包括

I good vegetable a! 5515

onnx-simplifier:简化您的Onnx模型

ONNX简化器 ONNX很棒,但有时太复杂了。 背景 有一天,我想将以下简单的重塑操作导出到ONNX: import torch class JustReshape ( torch . nn . Module ): def __init__ ( self ): super ( JustReshape , self ). __init__ () def forward ( self , x ): return x . view (( x . shape [ 0 ], x . shape [ 1 ], x . shape [ 3 ], x . shape [ 2 ])) net = JustReshape () model_name = 'just_reshape.onnx' dummy_input = torch . randn ( 2 ,

onnx-simplifier-onnx简化代码

把要简化的onnx模型放入onnxsim文件夹里,直接运行sim文件。改一下要简化的模型名和简化后的模型名就可以了。

[Onnx简化库深度剖析] OnnxSimplifier和OnnxOptimizer解读-(4)

结束了,已经搞定了onnx官方的简化库的基本细节了。后面再续其他有趣的东东。

Pengcode的博客 2587

VConsole动态加载

// 移动端真机调试工具 vconsole import VConsole from "vconsole"; import Vue from "vue"; // 动态使用VConsole if(process.env.NODE_ENV==='production'){ if(process.env.VUE_APP_BASEURL.includes('test')||process.env.VUE_APP_BASEURL.includes('pre')){ Vue.prototype

aliven1的博客 1041

[Onnx简化库深度剖析] OnnxSimplifier和OnnxOptimizer解读-(2)

上述的Pass只是其中的一小部分,还有将近二十来个Pass没有说明清楚,因此这个留到后续的文章继续说明。

Pengcode的博客 1431

1991-2020年气候背景数据集

2011 年,国家气象信息中心对 1951-2010 年 2400 余个地面站气温、气压、降水、湿度、日照等 19 大要素项的定时观测资料和日极值资料中由数字化过程中引起的系统性问题(例如数字化遗漏、整段拷贝等问题)进行质量检测、质量控制和错误数据的更正,形成较高质量的地面基础资料集。1991-2020年中国地面气候值数据集提供了中国2438个站点的气温、降水、气压、风向风速、相对湿度、水汽压、云、天气现象、能见度、蒸发、积雪、地温、冻土、日照共14个要素的气候背景信息。数据时间:30年平均。

地球资源数据云的官方博客 1597

UOS的ARM机编译QT5.14.2记录

我需要的qt版本是Qt5.14.2,所以选择编译Qt5.14.2源码;几个月前尝试了编译一次,当时编译过程中出现了报错,当时时间很紧最后安装的默认版本来使用,最近有时间重新进行了一次编译,历经3个星期(4G的内存)终于解决了各种坑,编译成功了,现在将编译过程中遇见的一些坑记录一下,方便日后能记得这一次可恶的编译过程,如有描述欠缺的地方,还希望各位大佬给点意见指导指导🙏。

NiF693zzz的博客 1617

onnx-simplifier原理探究

onnx-simpilfier原理探究

FfarFat的博客 3638

ptrade量化策略之ST股弱转强,回测年化115%

本策略的核心是精选ST股票,国九条过滤,防止直接暴雷退市,只做ST股票的弱转强

qq_29301281的博客 1785

ONNX 简化器 (onnx-simplifier) 教程

ONNX 简化器(onnx-simplifier)是一个Python库,用于简化ONNX模型,减少冗余运算符,提高模型的可读性和效率。项目的主要目录结构如下: ``` . ├── README.md # 主页文档 ├── examples # 示例代码 │ ├── example1.py # 基础示例 │ └── ... ...

gitblog_00668的博客 1764

海康工业相机排雷笔记02-像素格式解析

工业相机使用过程记录 02-像素格式解析 通过将相机输出图像裸数据raw格式直接存图查看 一、黑白/Mono 直接使用相机测试图像存图: 图像中各部分灰度分别为:0、36、73、109、146、182、219、255,以灰度73列为例 (1)Mono 8 该列图像数据为十六进制49,十进制为73,那么Mono 8就是每个像素点占8bit,依次排列。 (2)Mono 10 该列图像数据为十六进制2401,由于相机均为小端数据,实际数据应解析为0124,十进制为292=73*4,那么Mono 10格式为每

yonghuming_66的博客 8357

智驾系统分层架构:从传感器到执行器的全链路解析

本文深入解析了智能驾驶系统的分层架构,从传感器数据采集融合、应用层决策到车辆管理层执行,完整呈现了从感知到控制的全链路工作流程。文章重点阐述了架构设计的核心优势在于接口标准化与模块解耦,以ACC和LKA协同场景为例,说明了各层级如何通过清晰分工与高效协作,实现复杂系统的可靠、灵活与易于升级。

weixin_29219189的博客 399

【亲测免费】 ONNX Simplifier 使用教程

ONNX Simplifier 是一个用于简化 ONNX(Open Neural Network Exchange)模型的工具。它通过推理整个计算图并替换冗余的运算符为它们的常量输出(即常量折叠)来简化模型。这使得模型更小、更易于理解和部署。 ## 项目快速启动 ### 安装 首先,确保你已经安装了 Python 和 pip。然后,通过以下命令安装 ONNX Simplifier: ```...

gitblog_00581的博客 2525

案例:无人船测量点位数据+ArcGIS 10.6软件生成三维水下地形的两种方法

通常情况下,采用无人船进行水下地形测量,得到的是离散的,具有点号、日期、时间、东坐标(E)、北坐标(N)、水面高程、水下高程和水深等信息的点位数据,该数据一般由航带点位数据加水岸线组成,如下图所示: 原始点位数据格式如下: 下面讲解在ArcGIS软件中生成三维水下地形的两种常用方法。 一、构建不规则三角网(Tin) 1、创建Tin 生成的Tin: 2、Tin转栅格 Tin to Raster: 三维展示: 二、空间插值 栅格插值常用的方法有:克里...

智慧空间实验室 6749

ONNX Simplifier: 简化深度学习模型,加速推理与部署

是一个开源工具,用于优化和简化ONNX(开放神经网络交换)模型,它能够帮助开发者更有效地管理和部署深度学习模型。通过去除冗余操作和优化模型结构,ONNX Simplifier 可以让模型在推理阶段更加轻量、快速。 ## **项目简介** ONNX是一种标准的跨框架格式,允许开发人员在不同的深度学习库(如TensorFlow, PyTorch等)之间自由地转换和运行模型。然而,转换过程可能会引入...

gitblog_00041的博客 2679

16、树莓派Pico W:蓝牙与Wi-Fi应用指南

本文介绍了树莓派Pico W在蓝牙与Wi-Fi通信方面的应用,涵盖蓝牙配对原理、使用HC-06模块实现手机远程控制LED和传输内部温度,以及通过Wi-Fi进行网络连接、扫描和UDP协议下的设备控制。文章包含详细电路连接、代码实现与测试步骤,并提供拓展建议、常见问题解决方法及开发注意事项,帮助读者快速掌握基于Pico W的无线通信项目开发,适用于物联网入门与实践场景。

sun99的博客 289

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【亲测免费】 ONNX Simplifier 安装与配置完全指南

--- ## 项目基础介绍及主要编程语言 ONNX Simplifier 是一款由 Python 编写的开源工具,目标是简化 ONNX 模型。ONNX(Open Neural Network Exchange)作为一种标准的模型交换格式,使得不同深度学习框架之间的模型交流成为可能。而此项目则专注于减少模型中的冗余运算,提升模型的简洁性和效率。作者采用的主要编程语言为 Python,并且依赖于 ...

gitblog_07175的博客 3589

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

onnx simplifier过程

onnx simplifier过程

sduati的专栏 1054

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

onnx | onnx-simplifier安装和使用

onnx | onnx-simplifier安装和使用

Ddddddd_158的博客 1780

查看深度学习ONNX模型拓扑图

模型结构和参数查看

BelievIamthebest的博客 3739

onnx simplify

onnx simplify

jacke121的专栏 345

【亲测免费】 ONNX Simplifier 常见问题解决方案

ONNX Simplifier 是一个用于简化 ONNX(Open Neural Network Exchange)模型的开源工具。它通过推理整个计算图并替换冗余操作来简化模型,从而使模型更加精简和易于查看。该项目主要使用 Python 语言编写,适合深度学习模型的开发者和研究人员使用。 ## 新手使用注意事项及解决方案 ### 1. 安装问题 **问题描述**:新手在安装 ONNX Sim...

gitblog_07179的博客 2139
上一篇: [Onnx简化库深度剖析] OnnxSimplifier和OnnxOptimizer解读-(2)
下一篇: [Onnx简化库深度剖析] OnnxSimplifier和OnnxOptimizer解读-(4)
慷仔
博客等级 码龄9年 88粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值