Python Paddlepaddle模型转onnx模型

环境准备

python3.7
paddlepaddle
paddle2onnx

安装paddle2onnx

1
pip install paddle2onnx

命令行转化

准备好 paddlepaddle 训练好的模型文件

1
2
3
D:\vsCodeWorkspace\python20230512paddleNumber\testfive\mnist_checkpoint\test.pdiparams
D:\vsCodeWorkspace\python20230512paddleNumber\testfive\mnist_checkpoint\test.pdiparams.info
D:\vsCodeWorkspace\python20230512paddleNumber\testfive\mnist_checkpoint\test.pdmodel

执行命令

1
paddle2onnx  --model_dir D:\vsCodeWorkspace\python20230512paddleNumber\testfive\mnist_checkpoint --model_filename test.pdmodel --params_filename test.pdiparams --opset_version 11 --save_file ./onnx/test.onnx

注意 model_filename 和 params_filename 虽标注为可选项,但实际测试中发现若无此参数会报错

参数说明:
https://github.com/PaddlePaddle/Paddle2ONNX

参数 参数说明
–model_dir 配置包含 Paddle 模型的目录路径
–model_filename [可选] 配置位于 --model_dir 下存储网络结构的文件名
–params_filename [可选] 配置位于 --model_dir 下存储模型参数的文件名称
–save_file 指定转换后的模型保存目录路径
–opset_version [可选] 配置转换为 ONNX 的 OpSet 版本,目前支持 7~16 等多个版本,默认为 9
–enable_dev_version [可选] 是否使用新版本 Paddle2ONNX(推荐使用),默认为 True
–enable_onnx_checker [可选] 配置是否检查导出为 ONNX 模型的正确性, 建议打开此开关, 默认为 False
–enable_auto_update_opset [可选] 是否开启 opset version 自动升级功能,当低版本 opset 无法转换时,自动选择更高版本的 opset进行转换, 默认为 True
–deploy_backend [可选] 量化模型部署的推理引擎,支持 onnxruntime、tensorrt 或 others,当选择 others 时,所有的量化信息存储于 max_range.txt 文件中,默认为 onnxruntime
–save_calibration_file [可选] TensorRT 8.X版本部署量化模型需要读取的 cache 文件的保存路径,默认为 calibration.cache
–version [可选] 查看 paddle2onnx 版本
–external_filename [可选] 当导出的 ONNX 模型大于 2G 时,需要设置 external data 的存储路径,推荐设置为:external_data
–export_fp16_model [可选] 是否将导出的 ONNX 的模型转换为 FP16 格式,并用 ONNXRuntime-GPU 加速推理,默认为 False
–custom_ops [可选] 将 Paddle OP 导出为 ONNX 的 Custom OP,例如:–custom_ops ‘{“paddle_op”:”onnx_op”},默认为 {}
  • 使用 onnxruntime 验证转换模型, 请注意安装最新版本(最低要求 1.10.0)

执行结果如下

1
2
3
4
5
6
7
8
[Paddle2ONNX] Start to parse PaddlePaddle model...
[Paddle2ONNX] Model file path: D:\vsCodeWorkspace\python20230512paddleNumber\testfive\mnist_checkpoint\test.pdmodel
[Paddle2ONNX] Paramters file path: D:\vsCodeWorkspace\python20230512paddleNumber\testfive\mnist_checkpoint\test.pdiparams
[Paddle2ONNX] Start to parsing Paddle model...
[Paddle2ONNX] Use opset_version = 11 for ONNX export.
[Paddle2ONNX] PaddlePaddle model is exported as ONNX format now.
[INFO] ===============Make PaddlePaddle Better!================
[INFO] A little survey: https://iwenjuan.baidu.com/?code=r8hu2s

获得onnx 的输出文件

1
D:\vsCodeWorkspace\python20230512paddleNumber\testfive\onnx\test.onnx

代码方式转化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import os
import time
import paddle
from paddle.static import InputSpec

model = paddle.jit.load("./testfive/mnist_checkpoint/test")
model.eval() # 设置为预测模型

# 将模型设置为评估状态
model.eval()

# 定义输入数据

x_spec = InputSpec([None, 784], 'float32', 'x')
# ONNX模型导出
paddle.onnx.export(model, './testfive/onnxSave/linear_net',input_spec=[x_spec])

输出

1
2
3
4
5
6
7
8
9

[INFO] Static PaddlePaddle model saved in ./testfive/onnx.save\paddle_model_static_onnx_temp_dir.
[Paddle2ONNX] Start to parse PaddlePaddle model...
[Paddle2ONNX] Model file path: ./testfive/onnx.save\paddle_model_static_onnx_temp_dir\model.pdmodel
[Paddle2ONNX] Paramters file path: ./testfive/onnx.save\paddle_model_static_onnx_temp_dir\model.pdiparams
[Paddle2ONNX] Start to parsing Paddle model...
[Paddle2ONNX] Use opset_version = 9 for ONNX export.
[Paddle2ONNX] PaddlePaddle model is exported as ONNX format now.
[INFO] ONNX model saved in ./testfive/onnx.save/linear_net.onnx.

保存文件的地址

1
D:\vsCodeWorkspace\pythonpaddleNumber\testfive\onnxSave\linear_net.onnx

模型验证

1
2
3
4
5
6
7
8
9
10
# 导入 ONNX 库
import onnx
# 载入 ONNX 模型
#onnx_model = onnx.load("./testfive/onnx/test.onnx")
onnx_model = onnx.load("./testfive/onnxSave/linear_net.onnx")

# 使用 ONNX 库检查 ONNX 模型是否合理
onnx.checker.check_model(onnx_model)

# onnx.checker.check_model 不报错则证明onnx 网格没问题

运行之后 onnx.checker.check_model 不报错则证明没有任何问题

报错问题解决

问题1

将训练的模型转化为.onnx文件,然而,在模型验证的时候报错,错误如下:

1
ValidationError: Your model ir_version is higher than the checker's

解决问题1

原因:版本不匹配
需要升级一下onnx

1
pip install --upgrade onnx  -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

升级之后就不会报错了。

一辈子很短,努力的做好两件事就好;
第一件事是热爱生活,好好的去爱身边的人;
第二件事是努力学习,在工作中取得不一样的成绩,实现自己的价值,而不是仅仅为了赚钱;

继开 wechat
欢迎加我的微信,共同交流技术