You're reading an pre-release version of this documentation.
For the latest stable release version, please have a look at master.

Paddle 转 ONNX 示例

概述

本示例展示百度 PaddlePaddle 模型如何转化为 ONNX 格式,从而适配 Netrans 工具。以 LeNet 手写数字识别模型作为示例,通过 paddle2onnx 工具可以直接将 PaddlePaddle 模型转化为 ONNX 格式,也可以通过 paddle.onnx.export 函数将训练好的模型直接保存为 ONNX 格式。

转换流程

graph TD A[PaddlePaddle模型训练] --> B{选择转换方式}; B --> C[动态图模型]; B --> D[静态图部署模型<br>.pdmodel/.pdiparams]; C --> E[使用 paddle.onnx.export API<br>直接导出]; D --> F[使用 paddle2onnx <br>命令行工具转换]; E --> G[生成ONNX模型<br>.onnx]; F --> G;

环境搭建

1mamba create -n conversion python==3.10
2mamba activate conversion
3python -m pip install paddle2onnx
4pip install paddlepaddle -i https://pypi.tuna.tsinghua.edu.cn/simple

使用命令行转换 PaddlePaddle 模型

Paddle2ONNX 在导出模型时,需要传入部署模型格式,包括两个文件:

  • model_name.json:表示模型结构

  • model_name.pdiparams:表示模型参数

基本命令

1paddle2onnx --model_dir model_dir \
2            --model_filename model.json \
3            --params_filename model.pdiparams \
4            --save_file model.onnx

参数说明

参数

说明

--model_dir

配置包含 Paddle 模型的目录路径

--model_filename

[可选] 配置位于 --model_dir 下存储网络结构的文件名

--params_filename

[可选] 配置位于 --model_dir 下存储模型参数的文件名

--save_file

指定转换后的模型保存目录路径

--opset_version

[可选] 配置转换为 ONNX 的 Opset 版本,支持 7~19,默认为 9

--enable_auto_update_opset

[可选] 是否开启 opset 版本自动升级功能,默认 True

--enable_onnx_checker

[可选] 是否检查导出的 ONNX 模型的正确性,建议打开,默认 True

--enable_dist_prim_all

[可选] 是否开启组合算子拆解,默认 False

--optimize_tool

[可选] ONNX 模型优化工具,可选 onnxoptimizer、polygraphy、None,默认 onnxoptimizer

--enable_verbose

[可选] 是否打印更详细的日志信息,默认 False

--version

[可选] 查看 paddle2onnx 版本


LeNet-MNIST 模型转换示例

步骤 1:下载 Paddle 下的 LeNet 权重

步骤 2:命令行转换

执行完成后会在 paddleOCRdemo 目录下生成对应的 ONNX 文件:

1git clone http://git.aistudio.baidu.com/2973232/paddleOCRdemo.git
2paddle2onnx --model_dir paddleOCRdemo \
3            --model_filename lenet_mnist.pdmodel \
4            --params_filename lenet_mnist.pdiparams \
5            --save_file ./paddleOCRdemo/lenet_mnist.onnx \
6            --opset_version 13 \
7            --enable_onnx_checker True

paddle.onnx.export 接口使用

使用 Paddle 完成模型训练后,调用 paddle.onnx.export 接口即可在指定路径下生成 ONNX 模型。

import paddle
from paddle.vision.transforms import Normalize

transform = Normalize(mean=[127.5], std=[127.5], data_format='CHW')

# 下载数据集并初始化 DataSet
train_dataset = paddle.vision.datasets.MNIST(mode='train', transform=transform)
test_dataset = paddle.vision.datasets.MNIST(mode='test', transform=transform)

# 模型组网并初始化网络
lenet = paddle.vision.models.LeNet(num_classes=10)
model = paddle.Model(lenet)

# 模型训练的配置准备,准备损失函数、优化器和评价指标
model.prepare(
    paddle.optimizer.Adam(parameters=model.parameters()),
    paddle.nn.CrossEntropyLoss(),
    paddle.metric.Accuracy()
)

# 模型训练
model.fit(train_dataset, epochs=5, batch_size=64, verbose=1)

# 模型评估
model.evaluate(test_dataset, batch_size=64, verbose=1)

# 导出 ONNX
save_path = 'onnx_save/lenet_mnist'  # 保存路径
x_spec = paddle.static.InputSpec([None, 1, 28, 28], 'float32', 'x')  # 输入形状和数据类型
paddle.onnx.export(lenet, save_path, input_spec=[x_spec], opset_version=13)

作者:ougaoliang