e7d0df49创建于 2025年9月19日历史提交

常用框架导出ONNX

如果模型开源仓已提供导出ONNX工具或脚本,请根据相关说明导出ONNX。如果开源仓未提供导出方法,请根据下列常用框架的ONNX导出方法自行导出。

PyTorch导ONNX

import torch
from torchvision.models import resnet50, ResNet50_Weights

dummy_input = torch.randn(1, 3, 224, 224)

weights = ResNet50_Weights.DEFAULT
model = resnet50(weights=weights)
model.eval()

input_names = [ "input_data" ] 
output_names = [ "output_data" ]

torch.onnx.export(
        model,                # pytorch网络模型
        dummy_input,          # 随机的模拟输入
        "resnet.onnx",        # 导出的onnx文件位置
        export_params=True,   # 导出训练好的模型参数
        verbose=True,         # verbose=True,支持打印onnx节点和对应的PyTorch代码行
        training=torch.onnx.TrainingMode.EVAL,  # 导出模型调整到推理状态,将dropout,BatchNorm等涉及的超参数固定
        input_names=input_names,    # 为静态网络图中的输入节点设置别名,在进行onnx推理时,将input_names字段与输入数据绑定
        output_names=output_names,  # 为输出节点设置别名
        # 如果不设置dynamic_axes,那么对于输入形状为[1, 3, 224, 224],在以后使用onnx进行推理时也必须输入[1, 3, 224, 224]
        # 下面设置了输入的第0维是动态的,以后推理时batch_size的大小可以是其他动态值
        dynamic_axes={
            "input_data": {0: "-1"},
            "output_data": {0: "-1"}
        },
        keep_initializers_as_inputs=None,  #是否将模型参数作为输入数据的一部分进行导出
        opset_version=11                  # ONNX 运算符的版本号
)

torch.onnx.export参数说明(当前为torch2.0,可自行更换torch版本)

说明:

  1. 少数模型如shufflenetv1即使设置dynamic_axes实际上导出的onnx也是固定batch的,转换为om时需要各自固定不同的batch size

  2. 对于超大(大于2GB)的ONNX模型,模型结构与权重往往都是分开存放,且存放在同一目录下。默认情况下各节点权重对应多个文件单独存放,如将所有节点的权重合并成一个大文件存放,参考下面的代码

    model = onnx.load(input_onnx_path)
    onnx.save(
        model,
        output_onnx_path,
        save_as_external_data=False,    # 将权重数据与模型结构不分开保存
        all_tensors_to_one_file=True  # 将所有节点的权重合并成一个大文件保存
    )
    

TensorFlow导ONNX

python和tensorflow版本对应,如tensorflow-2.4.0 和python3.6-3.8匹配

pip install -U tf2onnx
python -m tf2onnx.convert --input saved_model.pb \
--output model.onnx \
--inputs input/audio/preprocessed:0 \
--outputs output/softmax:0
  • 参数说明:

    • input:需要进行转换的pb模型
    • output:转换后的onnx模型名称
    • inputs:pb模型输入层的名字
    • outputs:pb模型输出层的名字

tf2onnx命令行参数说明

说明:

  1. pb模型转om可以通过上面的方式转onnx后再转,也可用atc直接转om

PaddlePaddle导ONNX

原仓提供了导出onnx的工具

# PIP 安装
pip install paddle2onnx
paddle2onnx --model_dir saved_inference_model \
            --model_filename model.pdmodel \
            --params_filename model.pdiparams \
            --save_file model.onnx \
            --enable_dev_version True
  • 参数说明:

    • model_dir:配置包含 Paddle 模型的目录路径
    • model_filename:[可选] 配置位于 --model_dir 下存储网络结构的文件名
    • params_filename:[可选] 配置位于 --model_dir 下存储模型参数的文件名称
    • save_file:指定转换后的模型保存目录路径
    • enable_dev_version:[可选] 是否使用新版本 Paddle2ONNX(推荐使用),默认为 True

paddle2onnx命令行参数说明

MindSpore导ONNX

import numpy as np
from mindspore import export, Tensor
from mindvision.classification.models import lenet

net = lenet()
input_tensor = Tensor(np.ones([1, 1, 32, 32]).astype(np.float32))

#导onnx
export(
       net,  #MindSpore网络结构
       input_tensor,  #网络的输入,如果网络有多个输入,需要一同传入
       file_name='lenet',  #导出模型的文件名称 
       file_format='ONNX' #MindSpore目前支持导出”AIR”,”ONNX”和”MINDIR”格式的模型
        )

mindspore.export参数说明

说明:

  1. mindspore模型可通过转onnx转om,或者通过mindir转om