简体中文 | English
paddle2onnx支持将PaddlePaddle模型格式转化到ONNX模型格式。
- 模型格式,支持Paddle静态图和动态图模型转为ONNX,可转换由save_inference_model导出的静态图模型,使用方法请参考IPthon示例。动态图转换目前处于实验状态,将伴随Paddle 2.0正式版发布后,提供详细使用教程。
- 算子支持,目前稳定支持导出ONNX Opset 9~11,部分Paddle算子支持更低的ONNX Opset转换,详情可参考算子列表。
- 模型类型,官方测试可转换的模型请参考模型库。
python >= 2.7
静态图: paddlepaddle >= 1.8.0
动态图: paddlepaddle >= 2.0.0
1.7.0 | 可选
pip install paddle2onnx
git clone https://github.com/PaddlePaddle/paddle2onnx.git
python setup.py install
Paddle模型的参数保存为多个文件(not combined):
paddle2onnx --model_dir paddle_model --save_file onnx_file --opset_version 10 --enable_onnx_checker True
Paddle模型的参数保存在一个单独的二进制文件中(combined):
paddle2onnx --model_dir paddle_model --model_filename model_filename --params_filename params_filename --save_file onnx_file --opset_version 10 --enable_onnx_checker True
如需配置输入的大小,请使用如下命令:
paddle2onnx --model_dir paddle_model --model_filename model_filename --params_filename params_filename --save_file onnx_file --opset_version 10 --enable_onnx_checker True --input_shape_dict "{'x': [1, 3, 224, 224]}"
参数 | 参数说明 |
---|---|
--model_dir | 配置包含Paddle模型的路径, 由paddle.fluid.io.save_inference_model 保存得到 |
--model_filename | [可选] 配置位于--model_dir 下存储网络结构的文件名称。当且仅当所有模型参数被保存在一个单独的二进制文件中,它才需要被指定。默认为None |
--params_filename | [可选] 配置位于--model_dir 下存储模型参数的文件名称。当且仅当所有模型参数被保存在一个单独的二进制文件中,它才需要被指定。默认为None |
--save_file | 指定转换后的模型保存目录路径 |
--opset_version | [可选] 配置转换为ONNX的OpSet版本,目前比较稳定地支持9、10、11三个版本,默认为9 |
--enable_dev_version | [可选] 是否使用新版本Paddle2ONNX(当前正在开发中),默认为False |
--enable_onnx_checker | [可选] 配置是否检查导出为ONNX模型的正确性, 建议打开此开关。若指定为True,需要安装 onnx>=1.7.0, 默认为False |
--enable_paddle_fallback | [可选] 配置custom op是否使用paddle_fallback模式导出, 默认为False |
--enable_auto_update_opset | [可选] 配置是否开启opset version自动校正功能, 默认为True |
--input_shape_dict | [可选] 配置输入的shape, 默认为空 |
--version | [可选] 查看paddle2onnx版本 |
--output_names | [可选] 配置模型的输出名, 默认为空,支持配置为list形式,如:--output_names "['my_output1','my_output2']",或者dict形式,如:--output_names "{'paddle_output1':'my_output1', 'paddle_output2':'my_output2'}" |
- PaddlePaddle模型的两种存储形式:
- 参数被保存在一个单独的二进制文件中(combined),需要在指定--model_dir的前提下,指定--model_filename, --params_filename, 分别表示--model_dir目录下的网络文件名称和参数文件名称。
- 参数被保存为多个文件(not combined),只需要指定--model_dir,该目录下面需要包含了'__model__',以及多个参数文件。
- 使用onnxruntime验证转换模型:
- 若使用onnxruntime验证转换后的onnx模型,请注意onnxruntime和onnx的版本匹配。onnxruntime和onnx版本要求
- 若模型转换中提示OP不支持,欢迎开发者自己开发并向我们提PR,具体请参考文档OP开发指南
import paddle
from paddle import nn
from paddle.static import InputSpec
import paddle2onnx as p2o
class LinearNet(nn.Layer):
def __init__(self):
super(LinearNet, self).__init__()
self._linear = nn.Linear(784, 10)
def forward(self, x):
return self._linear(x)
layer = LinearNet()
# configure model inputs
x_spec = InputSpec([None, 784], 'float32', 'x')
# convert model to inference mode
layer.eval()
save_path = 'onnx.save/linear_net'
p2o.dygraph2onnx(layer, save_path + '.onnx', input_spec=[x_spec])
# when you paddlepaddle>2.0.0, you can try:
# paddle.onnx.export(layer, save_path, input_spec=[x_spec])
Provided under the Apache-2.0 license.