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

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

本文详细解析了OnnxSimplifier中的FoldConstant功能和FixedPointFn迭代优化函数,强调了OnnxSimplifier在简化复杂Onnx模型中的作用,尽管OnnxOptimizer是主要工具,但OnnxSimplifier因其接口简洁和高效优化而不可或缺。,

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

简介

OnnxSimplifier是一个用于简化onnx模型的工具,主要工具就是:拥有折叠常量(FoldConstant)的功能、自动调度OnnxOptimizer,最为重要而且核心的是FixedPointFn这个简化调度算法。

OnnxOptimizer是一个onnx官方的一个onnx模型优化库,内部包含很多模型简化/优化的功能。用户也可直接通过python/c++/c api执行调用,但是需要比较了解内部的opt优化手段,才能够得到理想的结果。
  • 依赖情况
40% 24% 24% 12% OnnxSimplifier OnnxOptimizer Onnx OnnxRuntime pybind11

目的

从上述的描述来看,似乎OnnxSimplifier也没有干什么事情,因为OnnxOptimizer才是干简化模型的主要工具。但是OnnxSimplifier主要有以下的几点主要优点和必要性让其比较突出:

  • OnnxSimplifier接口参数较为简单,不需要了过多了解OnnxOptimizer的内部参数和优化手段
  • FixedPointFn简化调度算法让模型能够尽可能优化到最简的模型结果上,这主要因为这个迭代算法在交替使用FoldConstant和OnnxOptimizer进行优化。

OnnxSimplifier基本原理

FoldConstant功能

  • 目的:去除掉模型中那些跟输入数据流无关的叶子节点,也就是constant_node。通过单独运行constant_node,可以得到常量的output tensor,这些output tensor将被加入到模型中作为常量数据而存在,而该constant_node也将会从模型中移除。
  • constant_node条件:
    • node的domain应该属于以下的一种:[✔]
      • ai.onnx
      • ai.onnx.ml
      • 空
    • node的op_type不属于以下的任何一种:[✖]
      • RandomUniform
      • RandomNormal
      • RandomUniformLike
      • RandomNormalLike
      • Multinomial
    • node不应该是以下的节点: [✖]
      • QuantizeLinear
      • DequantizeLinear
    • node不存在子图 [✖]
    • node不会产生超过threshold大小的tensor [✖]
    • node的所有输入应该都在model.graph.initializer中 [✔]

FixedPointFn迭代优化函数

  • 基本原理:就是通过两个优化函数,反复迭代优化中得到了最终无法继续优化的最终模型。

  • FixedPointFn的原始代码如下:

    template <typename T>
     std::function<T(const T&)> FixedPointFn(const std::function<T(const T&)>& f1,
                                             const std::function<T(const T&)>& f2,
                                             size_t max_iters, bool* converged) {
     return [f1, f2, max_iters, converged](const T& x) {
         size_t _max_iters = max_iters;
         T tmp1 = f1(x);
         T tmp2 = f2(tmp1);
         T& y1 = tmp1;
         T& y2 = tmp2;
         while (_max_iters-- > 0) {
         // 超出迭代次数则跳出
         if (google::protobuf::util::MessageDifferencer::Equals(y1, y2)) {
             // f1(x) == f2(f1(x))时,则无法继续优化,直接返回f2(f1(x))
             if (converged) {
             *converged = true;
             }
             return y2;
         }
         y1 = f1(y2);
         if (google::protobuf::util::MessageDifferencer::Equals(y1, y2)) {
             if (converged) {
             *converged = true;
             }
             return y1;
         }
         y2 = f2(y1);
         }
    
         if (converged) {
         *converged = false;
         }
         return y2;
     };
     }
    
  • FixedPointFn的流程图如下所示:

ONNX构建并运行模型 ONNX是开放式神经网络(Open Neural Network Exchange)的简称,主要由微软和合作伙伴社区创建和维护。很多深度学习训练框架(如Tensorflow, PyTorch, Scikit-learn, MXNet等)的模型都可以导出或转换为标准的ONNX格式,采用ONNX格式作为统一的界面,各种嵌入式平台就可以只需要解析ONNX格式的模型而不用支持多种多样的训练框架,本文主要介绍如何通过代码或JSON文件的形式来构造一个ONNX单算子模型或者整个graph,以及使用ONN... 阅读详情

相关推荐

记录 | onnx-simplifier安装、使用

记录 | onnx-simplifier安装、使用

极智视界 4361

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 ,

optimizer:积极维护的ONNX Optimizer

ONNX优化器 介绍 ONNX提供了一个C ++库,可用于在ONNX模型上执行任意优化,以及越来越多的预打包优化过程列表。 主要动机是在许多ONNX后端实现之间共享工作。 并非所有可能的优化都可以直接在ONNX图上实现-有些需要附加的特定于后端的信息-但是很多可以,我们的目标是与ONNX一起提供所有此类传递,以便可以通过单个函数调用重复使用。 您可能有兴趣调用提供的通行证,或实施新的通行证(或两者都有)。 安装 您可以从PyPI安装onnxoptimizer: pip3 install onnxoptimizer 请注意,如果遇到问题,您可能需要先升级点子: pip3 install -U pip 如果要从源代码构建: git clone --recursive https://github.com/onnx/optimizer onnxoptimizer cd onnxoptim

onnx-simplifier-onnx简化代码

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

全球半导体设备氧化钇熔射服务行业规模预测:预计未来六年CAGR为7.8%

本文将对“半导体设备氧化钇熔射服务”行业进行深度分析,探讨市场趋势的演变、核心竞争者的战略布局、供应链结构的内外特点、研发创新的最新进展、法规政策环境的适应性调整以及投资机会与风险评估。这一稳健的增长趋势表明半导体设备氧化钇熔射服务在电子行业中的重要性逐渐增强。由于全球对于高效、高精度和可靠的电子解决方案的需求增加,对能够提供这些功能的半导体设备氧化钇熔射服务的需求日益增长。由于半导体设备氧化钇熔射服务主要为就地服务型,其“配送”主要依赖于专业团队和技术设备的及时调配,强调服务的时效性和高质量。

CC1239777的博客 570

C#实战:如何用HslCommunication快速搞定三菱FX5U PLC通讯(附完整代码)

本文详细介绍了如何利用HslCommunication库在C#环境中快速实现与三菱FX5U PLC的通讯。通过实战代码演示,从环境搭建、建立连接、核心数据读写到构建健壮的监控服务,系统讲解了如何高效完成数据采集与交互,大幅提升工业自动化项目的开发效率。

s4t5u6v的博客 1199

软件测试工程师笔试题

这里写目录标题全套软件测试面试笔试题(附答案)二、选折三、添空四、简答(资料是搜集整理的,感谢前辈的解题)无1.区别阶段评审的与同行评审2.什么是软件测试3. 简述集成测试的过程4 怎么做好文档测试5 白盒测试有几种方法6 系统测试计划是否需要同行审批,为什么7Alpha 测试与 beta 的区别8 比较负载测试,容量测试和强度测试的区别。性能测试从使用方便的角度来说,9 测试结束的标准是什么?10 描述软件测试活动的生命周期?11 软件的缺陷等级应如何划分? 软件测试工程师笔试题(附答案) 全套软件测试面

m0_46446002的博客 2549

Python处理高光谱数据#3 降维

基于Python的高光谱降维操作 高光谱数据:点击此处可下载 用到的库:matplotlib、scipy、spectral 主要内容:主成分分析(PCA)与线性判别(LDA) 欢迎有兴趣的朋友交流指点。最后,废话不多说直接上代码???? import matplotlib.pyplot as plt from scipy.io import loadmat import spectral as spy

qq_273058791的博客 6936

ADS8681数据手册没讲透的细节:SPI时序、量程切换与电压换算的避坑指南

本文深入解析ADS8681数据手册未提及的SPI时序优化、量程切换陷阱与电压校准技巧。针对树莓派5与ADS8681的SPI通信问题,提供CPOL/CPHA配置建议;详解量程切换的位操作玄机与寄存器配置流程;并提出三步校准法应对非理想供电环境,帮助开发者提升ADC测量精度。

weixin_29178069的博客 518

奈曼-皮尔逊准则

奈曼-皮尔逊准则 如果各个假设的先验概率P(Hi)(i=0,1)P(H_i)(i=0,1)P(Hi​)(i=0,1)已知,并且每种判决的代价函数已知,这时,可以用贝叶斯准则进行判决。 如果进一步假设正确判决不付出的代价,而错误判决代价相同,即c00=c11=0,c01=c10=1c_{00}=c_{11}=0,c_{01}=c_{10}=1c00​=c11​=0,c01​=c10​=1,这时可以用最小平均错误概率准则进行判决。 在不知道先验概率P(Hi)(i=0,1)P(H_i)(i=0,1)P(Hi​)(

little_soldier的专栏 1万+

C++,使用Qt设计一个登录窗口

使用Qt设计一个登录界面

heyu0311的博客 2991

别再瞎改网络结构了!解决YOLO小目标检测痛点,我用这招把mAP提了15%

本文基于我7年工业PCB缺陷检测、无人机航拍、安防监控项目的一线落地经验,针对YOLO小目标检测最痛的「漏检率高、特征丢失、精度难提升」三大核心问题,拆解出。本文全程配套小目标特征丢失原理图、分块训练流程图、切图前后效果对比图、mAP提升柱状图、多方案性能对比表等可视化内容,从YOLO天生不擅长小目标的底层根源、方案核心原理、可直接复制的代码实现,到工业场景实测验证、新手必踩的10个坑位避坑指南,全链路讲透。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 387

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值