1. ONNX介绍
2. ONNX构成(底层实现)
ONNX 在底层是用 Protobuf 定义的。Protobuf,全称 Protocol Buffer,是 Google 提出的一套表示和序列化数据的机制。使用 Protobuf 时,用户需要先写一份数据定义文件(以.proto为文件名后缀),然后根据业务需要通过google提供的转换工具将数据定义文件转换成用不同语言实现的接口代码,然后使用接口把结构化数据存储进一份二进制文件中或从文件中使用接口将数据读出为结构化数据。可以说,数据定义文件就是数据类,二进制文件就是数据类的实例。
一个 Protobuf 数据定义文件的例子如下:
这段定义了 Person 这种数据类型,其中 name、id 两个字段为必须包含项,email字段选择性包含项。根据这份定义文件,用户就可以选择一种编程语言,定义一个含有成员变量 name、id、email 的 Person 类,然后把这个类的某个实例用 Protobuf 存储成二进制文件;反之,用户也可以用二进制文件和对应的数据定义文件,读取出一个 Person 类的实例。
下面这个文章详细介绍了onnx的文件构成:
https://blog.csdn.net/Rolandxxx/article/details/127713806
3.ONNX编辑调整工具
直接用 Protobuf 生成 ONNX 模型还是比较麻烦的。幸运的是,ONNX 提供了很多实用 API,我们可以在完全不了解 Protobuf 的前提下,构造、读取及修改 ONNX 模型。python端使用onnx工具对onnx模型进行调整,可通过下载代码载入调整工具:
通过onnx.helper来操作onnx时常用的API包括:
操作node列表项
通过onnx.helper.make_node生成多个算子节点
操作initializer列表项
通过onnx.helper.make_tensor对算子节点进行初始化
操作input和output列表项
通过onnx.helper.make_value_info生成输入输出
操作graph(计算)
以node列表、input/output/initializer列表项为参数,通过onnx.helper.make_graph接口生成计算图
操作model(模型)
通过onnx.helper.make_model
使用onnx.helper的make_tensor、make_tensor_value_info、make_attribute、make_node,make_graph,make_node等一系列make方法来完整构建了一个ONNX模型。
节点操作时设计到的算子名称和参数信息可以参考
https://github.com/onnx/onnx/blob/main/docs/Operators.md
以下示例包含了通过onnx.helper来构建计算图的示例:
https://blog.csdn.net/qq_42178122/article/details/127604762
以下示例包含了通过onnx.helper来构建计算图的示例和注意事项
https://blog.csdn.net/qq_39967751/article/details/124989296
4. 常规调整及示例
4.1 节点操作
暂时无法在飞书文档外展示此内容
暂时无法在飞书文档外展示此内容
原始tanway.onnx中3个输入类型中工具链不支持int32的输入:
修改后的模型tanway_test.onnx编译成功:
4.2 版本转换
使用version_converter
