onnx代码解读

一、定义

  1. torch.jit.trace 相关代码解读
  2. onnx 内部实现
    3 查看是否为aten 算子
  3. aten 算子实现
  4. torch.autograd.Functions 算子实现
  5. 自定义算子实现
  6. 查找未实现的节点
  7. 一次性发现所有的未实现 aten 算子

二、实现

  1. torch.jit.trace 相关代码解读
    1. torch.jit.script() : 将其转换为可运行的脚本。转换后的脚本可以像普通的 Python 函数一样调用,也可以保存到磁盘并在没有 PyTorch 依赖的环境中执行。
    2. torch.jit.trace : 跟踪了给定输入张量的执行路径,因此在使用转换后的模块对象进行推理时,输入张量的维度和数据类型必须与跟踪时使用的相同。

3 查看是否为aten 算子

import torchprint(torch.jit.trace(torch.nn.ELU(), # moduletorch.ones(1)   # example input).graph
)

算子追踪,在这里插入图片描述
3. aten 算子实现
  1.查看torch 接口定义    torch/nn/functional.pyi
  2.查看onnx 算子命名    https://github.com/onnx/onnx/blob/main/docs/Operators.md
  3. 查看注册函数书写   symbolic_opset9.py

import torch
import torch.onnx.verification
torch.manual_seed(0)
opset_version = 15
# Define a custom symbolic function for aten::relu.
# The custom symbolic function is incorrect, which will result in mismatches.#def relu(input: Tensor) -> Tensor: ...   查看接口定义,
def correct_relu_symbolic_function(g, input):return g.op("Relu", input)             #查看onnx 实现torch.onnx.register_custom_op_symbolic(     #注册"aten::relu",correct_relu_symbolic_function,opset_version=opset_version,
)class Model(torch.nn.Module):def __init__(self):super().__init__()self.layers = torch.nn.Sequential(torch.nn.Linear(3, 4),torch.nn.ReLU(),torch.nn.Linear(4, 5),torch.nn.ReLU(),torch.nn.Linear(5, 6),)def forward(self, x):return self.layers(x)graph_info = torch.onnx.verification.find_mismatch(Model(),(torch.randn(2, 3),),opset_version=opset_version,
)
  1. torch.autograd.Functions 算子实现
    如果算子是torch.autograd.Functions 的子模块,可以使用该方法实现。
import torchclass MyRelu(torch.autograd.Function):@staticmethoddef forward(ctx, input: torch.Tensor) -> torch.Tensor:ctx.save_for_backward(input)return input.clamp(min=0)@staticmethoddef symbolic(g: torch.Graph, input: torch.Value) -> torch.Value:return g.op("Clip", input, g.op("Constant", value_t=torch.tensor(0, dtype=torch.float)))import torch
import torch.onnx.verification
torch.manual_seed(0)
opset_version = 15myrelu = MyRelu.apply        #核心
class Model(torch.nn.Module):def __init__(self):super().__init__()self.layers = torch.nn.Sequential(torch.nn.Linear(3, 4),torch.nn.Linear(4, 5),torch.nn.Linear(5, 6),)def forward(self, x):return myrelu(self.layers(x))graph_info = torch.onnx.verification.find_mismatch(Model(),(torch.randn(2, 3),),opset_version=opset_version,
)
  1. 自定义算子实现
    1. onnx 算子实现

    1. 自定义c++ 算子 +Extending TorchScript with Custom C++ Operators 实现
  2. 查找未实现的节点

import torch
import torch.onnx.verification
torch.manual_seed(0)
opset_version = 15
# Define a custom symbolic function for aten::relu.
# The custom symbolic function is incorrect, which will result in mismatches.   注册函数错误,导致find_mismatch 算子
def incorrect_relu_symbolic_function(g, self):return self
torch.onnx.register_custom_op_symbolic("aten::relu",incorrect_relu_symbolic_function,opset_version=opset_version,
)
class Model(torch.nn.Module):def __init__(self):super().__init__()self.layers = torch.nn.Sequential(torch.nn.Linear(3, 4),torch.nn.ReLU(),torch.nn.Linear(4, 5),torch.nn.ReLU(),torch.nn.Linear(5, 6),)def forward(self, x):return self.layers(x)
graph_info = torch.onnx.verification.find_mismatch(Model(),(torch.randn(2, 3),),opset_version=opset_version,
)#===================== Mismatch info for graph partition : ======================
================================ Mismatch error ================================
Tensor-likes are not close!
Mismatched elements: 12 / 12 (100.0%)
Greatest absolute difference: 0.2328854203224182 at index (1, 2) (up to 1e-07 allowed)
Greatest relative difference: 0.699536174352349 at index (1, 3) (up to 0.001 allowed)
==================================== Tree: =====================================
5 X   __2 X    __1 \u2713
id:  |  id: 0 |  id: 00|        ||        |__1 X (aten::relu)|           id: 01||__3 X    __1 \u2713id: 1 |  id: 10||__2 X     __1 X (aten::relu)id: 11 |  id: 110||__1 \u2713id: 111
=========================== Mismatch leaf subgraphs: ===========================
['01', '110']
============================= Mismatch node kinds: =============================
{'aten::relu': 2}

修改后:
aten 算子实现

import torch
import torch.onnx.verification
torch.manual_seed(0)
opset_version = 15
# Define a custom symbolic function for aten::relu.
# The custom symbolic function is incorrect, which will result in mismatches.#def relu(input: Tensor) -> Tensor: ...   查看接口定义,
def correct_relu_symbolic_function(g, input):return g.op("Relu", input)             #查看onnx 实现torch.onnx.register_custom_op_symbolic(     #注册"aten::relu",correct_relu_symbolic_function,opset_version=opset_version,
)class Model(torch.nn.Module):def __init__(self):super().__init__()self.layers = torch.nn.Sequential(torch.nn.Linear(3, 4),torch.nn.ReLU(),torch.nn.Linear(4, 5),torch.nn.ReLU(),torch.nn.Linear(5, 6),)def forward(self, x):return self.layers(x)graph_info = torch.onnx.verification.find_mismatch(Model(),(torch.randn(2, 3),),opset_version=opset_version,
)

方式二、
c++ 自定义算子


import torch
import torch.onnx.verification
torch.manual_seed(0)
opset_version = 15from torch.onnx import register_custom_op_symbolic        # 为 TorchScript 算子补充注册符号函数
from torch.onnx.symbolic_helper import parse_args
# '''
# 装饰器 @parse_args 了。简单来说,TorchScript 算子的符号函数要求标注出每一个输入参数的类型。比如"v"表示 Torch 库里的 value 类型,
# 一般用于标注张量,而"i"表示 int 类型,"f"表示 float 类型,"none"表示该参数为空。具体的类型含义可以在 torch.onnx.symbolic_helper.py
# '''
@parse_args("v", "v")
def correct_relu_symbolic_function(g,input):return g.op("Relu", input)torch.onnx.register_custom_op_symbolic(     #注册"aten::relu",correct_relu_symbolic_function,opset_version=opset_version,
)class Model(torch.nn.Module):def __init__(self):super().__init__()self.layers = torch.nn.Sequential(torch.nn.Linear(3, 4),torch.nn.ReLU(),torch.nn.Linear(4, 5),torch.nn.ReLU(),torch.nn.Linear(5, 6),)def forward(self, x):return self.layers(x)graph_info = torch.onnx.verification.find_mismatch(Model(),(torch.randn(2, 3),),opset_version=opset_version,
)
  1. 一次性发现所有的未实现 aten 算子
import torch
import torch.onnx.verification
torch.manual_seed(0)
opset_version = 15class Model(torch.nn.Module):def __init__(self):super().__init__()self.layers = torch.nn.Sequential(torch.nn.Linear(3, 4),torch.nn.ReLU(),torch.nn.Linear(4, 5),torch.nn.ReLU(),torch.nn.Linear(5, 6),)def forward(self, x):return self.layers(x)torch_script_graph, unconvertible_ops = torch.onnx.utils.unconvertible_ops(Model(), (torch.randn(2, 3),), opset_version=opset_version
)print(set(unconvertible_ops))

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSD(computational storage devices)架构介绍

CSD(computational storage devices)架构介绍 前言一、CSD与传统SSD的架构对比二、为什么要采用FPGA三、FPGA缺点四、个人总结reference 前言 虽然一直有接触CSD,但一直对其原理和架构知之甚少,半知不解。今天,趁着我还…

CSS计数器

CSS 中的计数器类似于变量,可以实现简单的计数功能,并将结果显示在页面上,在早期的网站上应用比较广泛。要实现计数器需要用到以下几个属性: counter-reset:创建或者重置计数器;counter-increment&#xf…

机器学习框架(含实例说明)

机器学习框架是用于开发和部署机器学习模型的软件库和工具集。它们提供了一系列的算法、工具和基础设施,帮助开发者更高效地构建、训练和部署机器学习模型。以下是一些主要的机器学习框架及其详细介绍: 1. TensorFlow TensorFlow 是由Google开发的开源…

盘点2024年双十一最值得入手的好物,双十一必买清单大汇总

随着科技的飞速发展,数码产品已成为我们生活中不可或缺的伙伴。2024年双十一购物狂欢节即将来临,众多消费者早已摩拳擦掌,准备在这个年度盛事中淘到心仪的数码好物。在这个信息爆炸的时代,如何从琳琅满目的商品中挑选出性价比高、…

C# WPF 仿 Android Toast 效果

转载请注明出处: https://blog.csdn.net/hx7013/article/details/142860084 主职Android, 最近需要写一些WPF的程序作为上位机,目前WPF的MessageBox过于臃肿,且想找一个内置的非阻塞的简单提示一直找不到,想到了Android的Toast所以写了这个扩…

如何实现C#和Python之间实时视频数据交互

我们在做RTSP|RTMP播放的时候,遇到好多开发者,他们的视觉算法大多运行在python下,需要高效率的实现C#和Python的视频数据交互,常用的方法如下: 方法一:通过HTTP请求传输视频数据 服务器端(Pyth…

浙江省发规院产业发展研究所调研组莅临迪捷软件考察调研

2024年10月10日下午,浙江省发展与规划院产业发展研究所调研组一行莅临迪捷软件考察调研,绍兴市府办、区发改、区经信、迪荡街道等相关领导陪同。 调研组一行参观了迪捷软件的展厅与办公区,深入了解了迪捷软件的公司发展历程、运营状况、产品…

『网络游戏』数据库表格转储【25】

避免勿删数据库表格,可以将表格存储 放到桌面即可 现在将表格删除后点击 浏览桌面表格保存即可 修改客户端脚本:NetSvc.cs 目的是在数据库更新异常时弹出提示以便修改 本章结束

一文区分SSTI 和 CSTI

前言 有时,SSTI(服务器端模板注入)和 CSTI(客户端模板注入)可能会由于它们相似的负载语法而混淆。这种混乱可能会导致渗透测试人员浪费时间尝试实现反向 shell,即使payload仅限于客户端。 定义 &#x1d…

【AI系统】AI系统的组成

AI系统的组成是实现其设计目标的基础。本文将详细介绍AI系统的各个组成部分,以及它们如何协同工作以支持AI应用程序的开发和运行。 I. 引言 AI系统的复杂性要求其组成不仅要关注单一的硬件或软件,而是需要一个多层次、多维度的架构设计。这包括从应用与…

安卓13禁止用户打开开发者选项 android13禁止用户打开开发者选项

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.编译6.彩蛋1.前言 设置 =》关于平板电脑 =》版本号,一般的话,在这里连续点击就可以打开我们的开发者选项了。但是有些系统要进行保密,因此要禁止用户进入。 2.问题分析 这里我们是通过点…

vue3.5系列之响应式props解构的几点技巧对比

在最新的版本3.5x中&#xff0c;对props的能力也进行了加强。下面&#xff0c;我们具体看下有哪些变化&#xff0c;给我们带来的新的体验&#xff01; 体验一 3.5之前解构props的效果 // 子组件 <template><div><h1>响应式props</h1><p>{{ co…

Linux工具的使用——yum和vim的理解和使用

目录 linux工具的使用1.linux软件包管理器yum1.1yum的背景了解关于yum的拓展 1.2yum的使用 2.Linux编辑器-vim使用2.1vim的基本概念2.2vim的基本操作2.3命令模式命令集2.3.1关于光标的命令&#xff1a;2.3.2关于复制粘贴的命令2.3.3关于删除的命令2.3.4关于文本编辑的命令 2.4插…

ElasticSearch备考 -- Update by query Reindex

一、题目 有个索引task&#xff0c;里面的文档长这样 现在需要添加一个字段all&#xff0c;这个字段的值是以下 a、b、c、d字段的值连在一起 二、思考 需要把四个字段拼接到一起&#xff0c;组成一个新的字段&#xff0c;这个就需要脚本&#xff0c; 这里有两种方案&#xff…

Python进阶--正则表达式

目录 1. 基础匹配 2. 元字符匹配 1. 基础匹配 正则表达式&#xff0c;又称规则表达式&#xff08;Regular Expression&#xff09;&#xff0c;是使用单个字符串来描述、匹配某个句法规则的字符串&#xff0c;常被用来检索、替换那些符合某个模式&#xff08;规则&#xff…

zotero使用koofr+google drive/onedrive同步

最早了解到这个思路是来自 知乎-【从零开始使用Zotero】(3) Zotero文献同步方式 和 How to Sync Zotero Files Using WebDAV and Google Drive with Koofr: A Step-by-Step Guide 虽然周围很多人都在用Readpaper这种web端的了&#xff0c;但是经常逛Arxiv而且zotero的web插…

计算机网络——email

pop3拉出来 超出ASCII码范围就不让传了 这样就可以传更大的文件

与 MySQL 建立连接

命令行连接 MySQL 前面介绍了在 Windows 下安装最新版 MySQL 初始化安装步骤&#xff0c;启动 MySQL 服务&#xff0c;记录的初始密码可用于 “root” 账户登录进行相关操作&#xff0c;Windows 和 Linux 命令行操作步骤一样: 上图为 MySQL 的初始密码。在 Windows 下打开 CMD …

EdgeNAT: 高效边缘检测的 Transformer

EdgeNAT: Transformer for Efficient Edge Detection 介绍了一种名为EdgeNAT的基于Transformer的边缘检测方法。 1. 背景与动机 EdgeNAT预测结果示例。(a, b):来自BSDS500的数据集的输入图像。(c, d):对应的真实标签。(e, f):由EdgeNAT检测到的边缘。(e)显示了由于颜色变化…

小学期中考试老师怎么发成绩

随着期中考试的落幕&#xff0c;老师们面临着一项既耗时又易出错的任务——发布成绩。传统的手动统计和通知方式不仅效率低下&#xff0c;还容易出错。现在&#xff0c;有了一种新的在线平台&#xff0c;可以帮助老师们简化这一流程。 这个平台叫做“易查分”&#xff0c;它是一…