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,该 ModelProto 是应用 initial_version 和 target_version 之间所有相关适配器的结果。有关可用传递的列表,请参阅 convert.h

实现适配器

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

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