ONNX 版本转换器¶

ONNX 提供了一个库,用于在不同的 opset 版本之间转换 ONNX 模型。其主要动机是提高 ONNX 模型的向后兼容性,而无需加强 ONNX 后端的规范。这允许后端开发者支持特定的 opset 版本,也允许用户编写或导出模型到特定的 opset 版本,但在使用不同 opset 版本的环境中运行。在实现方面,该库利用了内存中的表示形式,这种形式比原始 protobuf 结构体更方便操作,并利用了为 ONNX Optimizer 开发的、用于往返 protobuf 格式的转换器。

您可能对调用提供的特定于操作符的适配器感兴趣,或者实现新的适配器(或两者皆是)。默认适配器仅在默认域中工作,但可以推广到跨域工作或利用新的转换方法,这取决于相关破坏性变更的性质。

调用版本转换器

版本转换器可以通过 C++ 或 Python 调用。

Python API 的描述以及示例,见此处

C++ API 包含一个函数

ModelProto ConvertVersion(
    const ModelProto& mp_in,
    const OpSetID& initial_version,
    const OpSetID& target_version);

该函数接受输入的 ModelProto、模型的初始 opset 版本以及目标 opset 版本,并返回一个新的 ModelProto,它是应用 initial_version 和 target_version 之间所有相关适配器的结果。可用 passes 的列表,请参阅convert.h

实现适配器

您可以通过继承 Adapter 并使用 VersionConverter::registerAdapter() 注册新适配器来创建一个新适配器。适配器操作的是在ir.h中定义的内存中的图表示形式。在adapters目录中有许多示例。请确保所有适配器都从 opset 版本 i 转换为 i + 1 或 i - 1,即从版本 6 转换为版本 5 或反之,即使要转换的两个版本是版本 1 和版本 6。

如果您的适配器适用于默认域,请考虑将其添加到 ONNX 核心仓库中