ONNX 版本转换器

ONNX 提供了一个库,用于在不同操作集版本之间转换 ONNX 模型。主要动机是在不加强 ONNX 后端规范的情况下,提高 ONNX 模型的向后兼容性。这使得后端开发者能够支持特定的操作集版本,用户能够编写或导出模型到特定的操作集版本,但在具有不同操作集版本的环境中运行。在实现方面,该库利用了内存表示,这种表示比原始 protobuf 结构更方便操作,并且利用了为 ONNX 优化器开发的 protobuf 格式的转换器。

您可能对调用提供的特定操作适配器感兴趣,或者对实现新的适配器感兴趣(或两者兼有)。默认适配器仅在默认域中工作,但可以根据相关重大更改的性质进行泛化,以跨域工作或利用新的转换方法。

调用版本转换器

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

Python API 的描述和示例, 这里

C++ API 由一个单一的函数组成

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

它接受一个输入 ModelProto,模型的初始操作集版本,以及目标操作集版本,并返回一个新的 ModelProto,这是应用初始版本和目标版本之间所有相关适配器的结果。有关可用传递的列表,请参见 convert.h

实现适配器

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

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