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

1 简介

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

2 什么是ONNX IR

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

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

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

3 代码实现

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

ONNX version IR version Opset version ai.onnx Opset version ai.onnx.ml Opset version ai.onnx.training
1.0 3 1 1 -
1.1 3 5 1 -
1.1.2 3 6 1 -
1.2 3 7 1 -
1.3 3 8 1 -
1.4.1 4 9 1 -
1.5.0 5 10 1 -
1.6.0 6 11 2 -
1.7.0 7 12 2 1
1.8.0 7 13 2 1
1.8.1 7 13 2 1
1.9.0 7 14 2 1
1.10.0 8 15 2 1
1.10.1 8 15 2 1
1.10.2 8 15 2 1
1.11.0 8 16 3 1
1.12.0 8 17 3 1
1.13.0 8 18 3 1
1.13.1 8 18 3 1
1.14.0 9 19 3 1
1.14.1 9 19 3 1
1.15.0 9 20 4 1
1.16.0 10 21 5 1

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

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

cpp 复制代码
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 中添加如下代码:

cpp 复制代码
auto ir_version = _helper.GetIRVersion();
auto model = std::make_shared<ONNX_NAMESPACE::ModelProto>();
model->set_ir_version(ir_version);

4 参考资料

相关推荐
Fuxiao___5 分钟前
不使用递归的决策树生成算法
算法
我爱工作&工作love我10 分钟前
1435:【例题3】曲线 一本通 代替三分
c++·算法
白-胖-子1 小时前
【蓝桥等考C++真题】蓝桥杯等级考试C++组第13级L13真题原题(含答案)-统计数字
开发语言·c++·算法·蓝桥杯·等考·13级
workflower1 小时前
数据结构练习题和答案
数据结构·算法·链表·线性回归
好睡凯1 小时前
c++写一个死锁并且自己解锁
开发语言·c++·算法
Sunyanhui11 小时前
力扣 二叉树的直径-543
算法·leetcode·职场和发展
一个不喜欢and不会代码的码农1 小时前
力扣105:从先序和中序序列构造二叉树
数据结构·算法·leetcode
图片转成excel表格1 小时前
WPS Office Excel 转 PDF 后图片丢失的解决方法
人工智能·科技·深度学习
前端郭德纲1 小时前
浏览器是加载ES6模块的?
javascript·算法
SoraLuna1 小时前
「Mac玩转仓颉内测版10」PTA刷题篇1 - L1-001 Hello World
算法·macos·cangjie