ONNX 版本转换器

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

您可能会对调用提供的特定于 op 的适配器感兴趣,或者对实现新的适配器(或两者都做)感兴趣。默认适配器仅在默认域中工作,但可以推广到跨域工作或利用新的转换方法,具体取决于相关的重大更改的性质。

调用版本转换器

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

Python API 描述(附有示例)可以在 这里 找到。

C++ API 包括一个单一函数

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

它接受一个输入的 ModelProto、模型的初始 opset 版本和目标 opset 版本,并返回一个经过应用初始版本和目标版本之间所有相关适配器的新 ModelProto。可用 pass 的列表,请参阅 convert.h

实现适配器

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

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