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 或反之亦然,即使要转换的 2 个版本是版本 1 和版本 6。

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