常用框架导出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版本)
说明:
-
少数模型如shufflenetv1即使设置dynamic_axes实际上导出的onnx也是固定batch的,转换为om时需要各自固定不同的batch size
-
对于超大(大于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命令行参数说明
说明:
- 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参数说明
说明:
- mindspore模型可通过转onnx转om,或者通过mindir转om