百度Paddle转ONNX示例
概述
本示例中展示百度PaddlePaddle模型如何转化为ONNX格式,从而适配netrans工具,选取lenet 手写数字识别模型作为示例模型,通过paddle2onnx工具可以直接将PaddlePaddle模型转化为ONNX格式,也可以通过paddle.onnx.export函数将paddle训练好的模型直接保存为ONNX格式。
模型类型:lenet 手写数字识别任务模型,手写数字识别任务中取得了很好的性能。
环境搭建
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)
作者 @ogl ougaoliang@hngwg.com