onnx进阶算子优化

2024-06-19 02:36
文章标签 进阶 优化 算子 onnx

本文主要是介绍onnx进阶算子优化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、定义

  1. 如何保证pytorch 模型顺利转为onnx. 前言
  2. pytorch 算子是如何与onnx 算子对齐的?
  3. Asinh 算子出现于第 9 个 ONNX 算子集。PyTorch 在 9 号版本的符号表文件中是怎样支持这个算子的?
  4. BitShift 算子出现于第11个 ONNX 算子集。PyTorch 在 11 号版本的符号表文件中是怎样支持这个算子的?
  5. 算子在pytorch 中已经实现,onnx 算子也实现,缺少映射方法,自己注册,实现转换。
  6. 自定义onnx 算子。
  7. 构造onnx 模型,并测试。
  8. onnx提取子模型

二、实现

  1. 如何保证pytorch 模型顺利转为onnx. 前言, 参考:https://zhuanlan.zhihu.com/p/513387413
    要使 PyTorch 算子顺利转换到 ONNX ,我们需要保证以下三个环节都不出错:
    算子在 PyTorch 中有实现
    有把该 PyTorch 算子映射成一个或多个 ONNX 算子的方法
    ONNX 有相应的算子
    可在实际部署中,这三部分的内容都可能有所缺失。其中最坏的情况是:我们定义了一个全新的算子,它不仅缺少 PyTorch 实现,还缺少 PyTorch 到 ONNX 的映射关系。但所谓车到山前必有路,对于这三个环节,我们也分别都有以下的添加支持的方法:
    PyTorch 算子
    组合现有算子
    添加 TorchScript 算子
    添加普通 C++ 拓展算子
    映射方法
    为 ATen 算子添加符号函数
    为 TorchScript 算子添加符号函数
    封装成 torch.autograd.Function 并添加符号函数
    ONNX 算子
    使用现有 ONNX 算子
    定义新 ONNX 算子

  2. pytorch 算子是如何与onnx 算子对齐的?
    onnx 算子文档:https://github.com/onnx/onnx/blob/main/docs/Operators.md
    torch 对onnx算子映射:https://github.com/pytorch/pytorch/tree/main/torch/onnx
    在这里插入图片描述
    表格的第一列是算子名,第二列是该算子发生变动的算子集版本号,也就是我们之前在torch.onnx.export中提到的opset_version表示的算子集版本号。在这里插入图片描述
    symbolic_opset{n}.py(符号表文件)即表示 PyTorch 在支持第 n 版 ONNX 算子集时新加入的内容。判定是否存在映射方法。

  3. Asinh 算子出现于第 9 个 ONNX 算子集。PyTorch 在 9 号版本的符号表文件中是怎样支持这个算子的?
    Asinh 在第9版本onnx 中实现,检查symbolic_opset9.py 发现,但pytorch 中已经实现torch.asinh(), 即缺少映射方法。

  4. BitShift 算子出现于第11个 ONNX 算子集。PyTorch 在 11 号版本的符号表文件中是怎样支持这个算子的?
    通过在 torch.onnx.symbolic_opset11.py 搜索 BitShift,我们可以发现 PyTorch 在 _lshift 和 _rshift 里用到了ONNX的 BitShift 算子。当输入类型为 Byte 时,PyTorch会把算子直接翻译翻译
    BitShift,以代替乘除 2 的次幂的操作。

  5. 算子在pytorch 中已经实现,onnx 算子也实现,缺少映射方法,自己注册,实现转换。
    1. 获取 ATen 中算子接口定义
    2. 添加符号函数

  6. 整合模型,导出onnx文件

  7. 测试算子
    ================================================================

import torchclass Model(torch.nn.Module):def __init__(self):super().__init__()def forward(self, x):return torch.asinh(x)from torch.onnx.symbolic_registry import register_opdef asinh_symbolic(g, input, *, out=None):return g.op("Asinh", input)register_op('asinh', asinh_symbolic, '', 9)model = Model()
input = torch.rand(1, 3, 10, 10)
torch.onnx.export(model, input, 'asinh.onnx')

测试

import onnxruntime 
import torch 
import numpy as np class Model(torch.nn.Module): def __init__(self): super().__init__() def forward(self, x): return torch.asinh(x) model = Model() 
input = torch.rand(1, 3, 10, 10) 
torch_output = model(input).detach().numpy() sess = onnxruntime.InferenceSession('asinh.onnx') 
ort_output = sess.run(None, {'0': input.numpy()})[0] assert np.allclose(torch_output, ort_output) 
  1. 自定义onnx 算子。
    https://zhuanlan.zhihu.com/p/513387413
  2. 构造onnx 模型,并测试。
import onnx
from onnx import helper
from onnx import TensorProto# input and output
a = helper.make_tensor_value_info('a', TensorProto.FLOAT, [10, 10])
x = helper.make_tensor_value_info('x', TensorProto.FLOAT, [10, 10])
b = helper.make_tensor_value_info('b', TensorProto.FLOAT, [10, 10])
output = helper.make_tensor_value_info('output', TensorProto.FLOAT, [10, 10])# Mul
mul = helper.make_node('Mul', ['a', 'x'], ['c'])# Add
add = helper.make_node('Add', ['c', 'b'], ['output'])# graph and model
graph = helper.make_graph([mul, add], 'linear_func', [a, x, b], [output])
model = helper.make_model(graph)# save model
onnx.checker.check_model(model)
print(model)
onnx.save(model, 'linear_func.onnx') 
import onnxruntime 
import numpy as np sess = onnxruntime.InferenceSession('linear_func.onnx') 
a = np.random.rand(10, 10).astype(np.float32) 
b = np.random.rand(10, 10).astype(np.float32) 
x = np.random.rand(10, 10).astype(np.float32) output = sess.run(['output'], {'a': a, 'b': b, 'x': x})[0] assert np.allclose(output, a * x + b)
  1. onnx提取子模型
    https://zhuanlan.zhihu.com/p/516920606

https://zhuanlan.zhihu.com/p/543973749
https://zhuanlan.zhihu.com/p/516920606

这篇关于onnx进阶算子优化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1073772

相关文章

RedHat运维-Linux文本操作基础-AWK进阶

你不用整理,跟着敲一遍,有个印象,然后把它保存到本地,以后要用再去看,如果有了新东西,你自个再添加。这是我参考牛客上的shell编程专项题,只不过换成了问答的方式而已。不用背,就算是我自己亲自敲,我现在好多也记不住。 1. 输出nowcoder.txt文件第5行的内容 2. 输出nowcoder.txt文件第6行的内容 3. 输出nowcoder.txt文件第7行的内容 4. 输出nowcode

【Linux进阶】UNIX体系结构分解——操作系统,内核,shell

1.什么是操作系统? 从严格意义上说,可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境。我们通常将这种软件称为内核(kerel),因为它相对较小,而且位于环境的核心。  从广义上说,操作系统包括了内核和一些其他软件,这些软件使得计算机能够发挥作用,并使计算机具有自己的特生。这里所说的其他软件包括系统实用程序(system utility)、应用程序、shell以及公用函数库等

uniapp接入微信小程序原生代码配置方案(优化版)

uniapp项目需要把微信小程序原生语法的功能代码嵌套过来,无需把原生代码转换为uniapp,可以配置拷贝的方式集成过来 1、拷贝代码包到src目录 2、vue.config.js中配置原生代码包直接拷贝到编译目录中 3、pages.json中配置分包目录,原生入口组件的路径 4、manifest.json中配置分包,使用原生组件 5、需要把原生代码包里的页面修改成组件的方

服务器雪崩的应对策略之----SQL优化

SQL语句的优化是数据库性能优化的重要方面,特别是在处理大规模数据或高频访问时。作为一个C++程序员,理解SQL优化不仅有助于编写高效的数据库操作代码,还能增强对系统性能瓶颈的整体把握。以下是详细的SQL语句优化技巧和策略: SQL优化 1. 选择合适的数据类型2. 使用索引3. 优化查询4. 范式化和反范式化5. 查询重写6. 使用缓存7. 优化数据库设计8. 分析和监控9. 调整配置1、

Java中如何优化数据库查询性能?

Java中如何优化数据库查询性能? 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨在Java中如何优化数据库查询性能,这是提升应用程序响应速度和用户体验的关键技术。 优化数据库查询性能的重要性 在现代应用开发中,数据库查询是最常见的操作之一。随着数据量的增加和业务复杂度的提升,数据库查询的性能优化显得尤为重

打包体积分析和优化

webpack分析工具:webpack-bundle-analyzer 1. 通过<script src="./vue.js"></script>方式引入vue、vuex、vue-router等包(CDN) // webpack.config.jsif(process.env.NODE_ENV==='production') {module.exports = {devtool: 'none

Clickhouse 的性能优化实践总结

文章目录 前言性能优化的原则数据结构优化内存优化磁盘优化网络优化CPU优化查询优化数据迁移优化 前言 ClickHouse是一个性能很强的OLAP数据库,性能强是建立在专业运维之上的,需要专业运维人员依据不同的业务需求对ClickHouse进行有针对性的优化。同一批数据,在不同的业务下,查询性能可能出现两极分化。 性能优化的原则 在进行ClickHouse性能优化时,有几条

群体优化算法---电磁共振优化算法(EROA)介绍包含示例滤波器设计

介绍 电磁共振优化算法(Electromagnetic Resonance Optimization Algorithm, EROA)是一种新型的元启发式优化算法,其灵感来源于电磁共振现象。电磁共振是一种物理现象,当一个系统在特定频率下响应最大时,这个频率被称为共振频率。在优化算法中,共振频率可以用来引导搜索过程,提高优化效率 EROA 算法的基本原理 种群初始化: 在搜索空间内随机生成一定

怎么优化ArcEngine组件开发mfc程序界面?

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!! 问题描述   这种VS2015 + ArcEngine10.2开发的mfc小程序怎么优化界面,使系统看上去更美观 如上问题有来自我自身项目开发,有的收集网站

SEO 优化注意事项

一.站内优化 1.做好HTML头标签 标题(title):标题是网页优化中相当有分量,一般网页title主要包含一些关键词、网站名称等。 关键词(keyword):重要性大家都知道!关键词设定要参考热度、百度指数等一些手段,当然选择这些的前提要与自己网站的主题相关。关键词不宜多,一般就是1-3个。 描述(description):主要是对网站的一个介绍,虽然没有前两个标签在搜索引擎