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

[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的流程图如下所示:

y1
y2
yes
no
yes
no
yes
no
x
f1(x)
f2(y1)
max_iters-- > 0 ?
y2
y1 == y2
y1=f1(y2)
y1 == y2
y1
y2=f2(y1)
return
  • FixedPointFn的实际函数如下所示:
    • f1: OptAndShape,FixedPointFn优化
      • OptAndShape.f1:_InferShapes形状推导(可选,不使用的时候为Identity)
      • OptAndShape.f2:OptimizeFixed优化,调用了OnnxOptimizer函数库进行优化
      • OptAndShape.max_iters:默认是50(可通过ONNXSIM_FIXED_POINT_ITERS设置)
    • f2: FoldConstant函数(可选,不使用的时候为Identity)
    • max_iters:默认是50
    • 综上:因此,实际的优化函数为FixedPointFn(FixedPointFn(_InferShapes, OptimizeFixed), FoldConstant)

总结

这次主要是介绍了OnnxSimplifier简化原理,重点介绍了FoldConstant功能和FixedPointFn迭代优化函数,这是该简化包的核心部分了。但是对于其他的OptimizeFixed,也就是OnnxOptimizer函数库的内部简化细节却没有具体的说明。后续将会具体介绍OnnxOptimizer的模型优化细节。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/254511.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Springboot的旅游网站设计与实现(论文+调试+源码)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

虚幻学习笔记18—C++委托(多播)和事件

一、前言 委托分单播和多播&#xff0c;多播就是可以绑定多个回调函数&#xff0c;然后一次性执行。这样也可以理解为啥多播没有返回值&#xff0c;多个回调函数执行后返回哪一个都是问题啊。而事件呢官方官方文档说法是“对于事件而言&#xff0c;只有定义事件的类才能调用 Br…

专属配方重磅发布,蒙牛悠瑞开创中老年奶粉新征程

随着中国老龄化现象日益加剧&#xff0c;中老年人群营养需求市场不断扩容&#xff0c;蒙牛集团2024全球合作伙伴大会奶粉事业部分会成为了备受行业关注的一个焦点&#xff0c;会上蒙牛旗下高端中老年奶粉品牌悠瑞联合中山大学发布了《中国中老年人健康状况及专属营养解决方案》…

SpringCloud微服务之间如何进行调用通信的?

1.同步通信 RESTful API&#xff1a;RESTful 通信使用 HTTP 协议&#xff0c;以 JSON格式来传输数据&#xff0c;具有轻量级、高效、可扩展性等优势&#xff0c;是许多系统之间接口通信的首选方式。&#xff08;springcloud使用&#xff09; RPC&#xff1a;RPC&#xff08;远…

羊大师之冷天喝羊的好处大揭秘!

最近&#xff0c;冷天喝羊已经成为了一种趋势&#xff0c;受到了越来越多人的关注与喜爱。你可能会好奇&#xff0c;为什么冷天喝羊有那么多的好处呢&#xff1f;今天小编羊大师将带大家一起探索这个问题&#xff0c;揭秘冷天喝羊带来的种种益处。 冷天喝羊对于保持身体温暖是…

HarmonyOS--基础组件Button

Button组件 可以包含单个子组件。 Button(label?: ResourceStr, options?: { type?: ButtonType, stateEffect?: boolean }) 1&#xff1a;文字按钮 Button(‘点击’) 2&#xff1a;自定义按钮,嵌套其它组件 Button() {Image(https://) }.type(ButtonType.Circle)

LeetCode-数组-矩阵问题-中等难度

[toc]矩阵 矩阵是二维数组相关的应用题型&#xff0c;常见的有矩阵水平翻转、矩阵对角线翻转、矩阵遍历等。 1. 重塑矩阵 1.1 题目描述 leetcode跳转&#xff1a;566. 重塑矩阵 1.2 方法一&#xff1a;简单模拟 借助一个一维数组用来保持按行列遍历的结果&#xff0c;然后…

欧盟健身单车出口BS EN ISO 20957安全报告测试

固定的训练器材.第10部分:带固定轮或无自由飞轮的训练自行车.附加特定安全要求和试验方法 作为欧洲固定式健身器材&#xff08;儿童用固定式健身器材不在此范围&#xff09;通用安全要求和测试方法的标准&#xff0c;涉及固定式健身器材精度、使用场所分类定义、稳定性、安全间…

Redis设计与实现之订阅与发布

目录 一、 订阅与发布 1、 频道的订阅与信息发送 2、订阅频道 3、发送信息到频道 4、 退订频道 5、模式的订阅与信息发送 ​编辑 6、 订阅模式 7、 发送信息到模式 8、 退订模式 三、订阅消息断连 1、如果订阅者断开连接了&#xff0c;再次连接会不会丢失之前发布的消…

儿童玩具行业分析:发展态势良好,市场空间不断拓展

玩具是有利于促进幼儿体、德、智、美的全面发展;符合儿童年龄特征&#xff0c;能满足其好奇心、好动和探索活动的愿望;造型优美&#xff0c;反映事物的典型特征;活动多变&#xff0c;有助于鼓励学习。中国玩具产品包括毛绒玩具、塑胶玩具、纸质玩具、电子玩具、木制玩具、金属玩…

抖音网红的各种变现办法

抖音作为一款风靡全球的短视频平台&#xff0c;不仅为用户带来了娱乐和社交的乐趣&#xff0c;也为一些优秀的内容创作者提供了机会&#xff0c;成为了网红。而成为抖音网红不仅仅是一种荣誉&#xff0c;更是一种潜在的经济收入来源。在这篇文章中&#xff0c;我将介绍一些抖音…

气泡水机市场调研: 2023年行业消费需求及发展前景分析

气泡水机用于制作气泡水的机器&#xff0c;隶属于家电产业。在欧美等发达国家早已普遍使用&#xff0c;中国仅台湾等开放发达地方盛行。在中国大陆较为少见&#xff0c;近两年以健康环保产品形象兴起&#xff0c;市场饱和度不高。 中国气泡水机首次出现在中国市场是2012年&a…

小红书kop营销策略有哪些,达人投放总结!

从kol到koc&#xff0c;当今时代产品种草模式&#xff0c;层出不穷。品牌想要跟上市场更新迭代的洪流&#xff0c;就需要时刻了解新型的营销方式。那么对于新型的kop模式你了解多少呢?我们今天就将详细分享小红书kop营销策略有哪些&#xff0c;达人投放总结&#xff01; 一、什…

[Ray Tracing in One Weekend] 笔记

前言 本文参照自raytracing in one weekend教程&#xff0c;地址为&#xff1a;https://raytracing.github.io/books/RayTracingInOneWeekend.html 什么是光线追踪&#xff1f; 光线追踪模拟现实中的成像原理&#xff0c;通过模拟一条条直线在场景内反射折射&#xff0c;最终…

Tinymce 5 插入代码集成highlight.js(踩坑记录)

目录 官方教程 坑点一 坑点二 坑点三 坑点四 TinyMCE HighLight.js Plugin 官方教程 1. 引入 tinymce 库文件 <script src"tinymce.min.js"></script> 2. 引入 highlight js 库文件 <script src"plugins/becodesample/highlight.js-11.…

word怎么分页?学会这几招,轻松掌握分页功能!

Microsoft Word作为办公文档处理的主力工具&#xff0c;其强大的排版功能为用户提供了丰富的文档编辑体验。其中&#xff0c;分页是一个常用但可能被忽视的重要功能&#xff0c;能够使文档结构更清晰、更易读。本文将向您介绍word怎么分页的三种方法&#xff0c;帮助您更好地掌…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Text文本组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之文本组件 一、操作环境 操作系统: Windows 10 专业版 IDE:DevEco Studio 3.1 SDK:HarmonyOS 3.1 二、文本组件 Text 是显示文本的基础组件之一&#xff0c;它可以包含子组件 Span &…

软件测试面试八股文(超详细整理)

请你说一说测试用例的边界 参考回答&#xff1a; 边界值分析法就是对输入或输出的边界值进行测试的一种黑盒测试方法。通常边界值分析法是作为对等价类划分法的补充&#xff0c;这种情况下&#xff0c;其测试用例来自等价类的边界。 常见的边界值 1)对16-bit 的整数而言 32…

ArkTS-一次开发,多端部署

展示 官方代码适配解读 官方代码&#xff1a;一次开发&#xff0c;多端部署-视频应用 解读 适配多端&#xff1a;根据屏幕大小来判断不同客户端&#xff0c;BreakpointSystem.ets中引入官方API获取 ohos.mediaqueryCommonConstants.ets定义好不同屏幕范围大小&#xff0c;供需…

反爬虫介绍及其处理方法

反爬虫机制 封IP&#xff1a;监控短时间内同一地址的请求次数过大登录及验证码&#xff1a;对于监控后封IP之后短时间内继续的大量请求&#xff0c;要求登陆或验证码通过验证之后才能继续进行。健全账号体制&#xff1a;即核心数据只能通过账号登录后才能进行访问。动态加载数…
最新文章