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函数将paddle训练好的模型直接保存为ONNX格式。

环境搭建

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 版本自动升级功能,当低版本 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模型转化示例

  • 下载Paddle下的lenet权重

  • 命令行转换 lenet_mnist 模型,执行完成会在paddleOCRdemo目录下生成对应的onnx

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

paddle.onnx.export 接口使用教程

使用paddle完成模型训练之后,转换成 ONNX 格式只需要调用 paddle.onnx.export 接口,便会在指定的路径下生成 ONNX 模型

 1import paddle
 2from paddle.vision.transforms import Normalize
 3
 4transform = Normalize(mean=[127.5], std=[127.5], data_format='CHW')
 5# 下载数据集并初始化 DataSet
 6train_dataset = paddle.vision.datasets.MNIST(mode='train', transform=transform)
 7test_dataset = paddle.vision.datasets.MNIST(mode='test', transform=transform)
 8
 9# 模型组网并初始化网络
10lenet = paddle.vision.models.LeNet(num_classes=10)
11model = paddle.Model(lenet)
12
13# 模型训练的配置准备,准备损失函数,优化器和评价指标
14model.prepare(paddle.optimizer.Adam(parameters=model.parameters()),paddle.nn.CrossEntropyLoss(),paddle.metric.Accuracy())
15
16# 模型训练
17model.fit(train_dataset, epochs=5, batch_size=64, verbose=1)
18# 模型评估
19model.evaluate(test_dataset, batch_size=64, verbose=1)
20
21# export to ONNX
22save_path = 'onnx_save/lenet_mnist' # 需要保存的路径
23x_spec = paddle.static.InputSpec([None, 1, 28, 28], 'float32', 'x') # 为模型指定输入的形状和数据类型,支持持 Tensor 或 InputSpec ,InputSpec 支持动态的 shape。
24paddle.onnx.export(lenet, save_path, input_spec=[x_spec], opset_version=13)