当前位置: 首页 > news >正文

【Paddle2ONNX】为 Paddle2ONNX 升级自适应ONNX IR Version功能

1 简介

最近在浏览 Paddle2ONNX 的 Issues 时,我发现有用户需要让 Paddle2ONNX 支持导出的 ONNX 模型根据opset版本自适应 ONNX IR 版本,于是我动手添加了这个功能。

  • 能否指定 IR representation的版本 · Issue #1248 · PaddlePaddle/Paddle2ONNX

2 什么是ONNX IR

ONNX (Open Neural Network Exchange) IR (Intermediate Representation) Version 的作用是定义和描述 ONNX 模型文件的结构和格式。该参数主要在以下方面发挥作用:

  • 兼容性管理
  • 模型文件解析
  • 演进管理

显然,对于 Runtime 来说,指定 ONNX IR 是提升程序鲁棒性的方式之一,因此一般会对 ONNX IR 有所要求。

3 代码实现

由于 ONNX Opset 和 ONNX IR 是强绑定的,具体关系如下表:

ONNX versionIR versionOpset version ai.onnxOpset version ai.onnx.mlOpset version ai.onnx.training
1.0311-
1.1351-
1.1.2361-
1.2371-
1.3381-
1.4.1491-
1.5.05101-
1.6.06112-
1.7.071221
1.8.071321
1.8.171321
1.9.071421
1.10.081521
1.10.181521
1.10.281521
1.11.081631
1.12.081731
1.13.081831
1.13.181831
1.14.091931
1.14.191931
1.15.092041
1.16.0102151

如果你需要更详细的介绍,请前往 ONNX Versioning

在Paddle2ONNX中,控制 opset 版本的是 OnnxHelper 类,因此我们考虑先能够从该类中获取到当前 opset 对应的 IR ,我们可以添加如下函数实现这个功能:

ONNX_NAMESPACE::Version OnnxHelper::GetIRVersion() const {int ir_version = 0;switch (opset_version) {case 7:case 8:ir_version = 3;break;case 9:ir_version = 4;break;case 10:ir_version = 5;break;case 11:ir_version = 6;break;case 12:case 13:case 14:ir_version = 7;break;case 15:case 16:case 17:case 18:ir_version = 8;break;case 19:case 20:ir_version = 9;break;case 21:ir_version = 10;break;default:Assert(false, "Opset version must be 7-20");}return static_cast<ONNX_NAMESPACE::Version>(ir_version);
}

当然,也可以通过 std::map 实现这个功能

然后我们需要获取到当前 IR 版本,并给 onnx 模型指定他,可以在 exporter.cc 中添加如下代码:

auto ir_version = _helper.GetIRVersion();
auto model = std::make_shared<ONNX_NAMESPACE::ModelProto>();
model->set_ir_version(ir_version);

4 参考资料

  • [ONNX][Version] Update IR Version by Zheng-Bicheng · Pull Request #1261 · PaddlePaddle/Paddle2ONNX
  • onnx/docs/Versioning.md at main · onnx/onnx
http://www.lryc.cn/news/362769.html

相关文章:

  • JS 中的DOM 操作
  • 短剧出海怎么做?
  • 【C++修行之道】类和对象(四)运算符重载
  • 伯克希尔也被ST?
  • 低代码和零代码软件时代质量管理(QM)和质量管理系统(QMS)
  • JS跨页面或跨JS文件对变量赋值
  • xxe漏洞——无回显(ctfshow web374——378)
  • 深入解读 Android Hook 技术-从原理到实践
  • 架构每日一学 15:想要提升协作效率,必须先统一语义
  • 基于树莓派4B设计的智能家居系统(华为云IOT)
  • 路由懒加载
  • 在Spring中实现资源的动态加载和卸载
  • Windows下 CLion中,配置 OpenCV、LibTorch
  • 机器学习知识点总结
  • OBproxy基础运维
  • 【Python】 探索Pytz库中的时区列表
  • C#操作MySQL从入门到精通(9)——Mysql中的数据类型以及对应的C#中的数据类型
  • 第六讲:AD、DA的工作原理及实现、运放电路
  • 计网ppt标黄知识点整理第(4)章节——谢希仁版本、期末复习自用
  • [数据集][目标检测]RSNA肺炎检测数据集VOC+YOLO格式6012张1类别
  • AndroidStudio中debug.keystore的创建和配置使用
  • 什么是最好的手机数据恢复软件?6 款手机数据恢复软件 [2024 年更新]
  • 力扣2653.滑动子数组的美丽值
  • 2024-06-04 架构-不同层次的抽象的处理-分析
  • MySQL——C语言连接数据库
  • 新能源汽车推行精益生产:绿色动力下的效率革命
  • FCA-九数云 试题及答案
  • qt dragEnterEvent dragLeaveEvent dragMoveEvent dropEvent都不响应的问题解决方案。
  • LVS精益价值管理系统 DownLoad.aspx 任意文件读取漏洞复现
  • 【GIC400】——中断使能