PaddlePaddle Paddle2ONNX 功能测试开发指南:基于 TIPC 一键验证模型转换与 ONNX 推理

  • 人工智能
  • 深度学习
  • 计算机视觉
  • NLP
  • 语音

【免费下载链接】models

Officially maintained, supported by PaddlePaddle, including CV, NLP, Speech, Rec, TS, big models and so on.

项目地址: https://gitcode.com/gh_mirrors/mo/models
点击查看 免费下载

本篇指南围绕 PaddlePaddle models 仓库的 TIPC(训推一体全流程)测试体系,讲解如何为任意 Paddle 模型搭建 Paddle2ONNX 全流程功能测试:通过 test_paddle2onnx.sh + prepare.sh + common_func.sh 三个脚本与 paddle2onnx_infer_python.txt 一个配置文件,一键跑通「Paddle 模型转 ONNX + ONNX 模型推理」两个环节。读完本文,你将掌握配置文件与运行命令的映射解析原理、逐行配置要领、六步开发流程以及结果核验方法,能够为自己的模型快速复制这套自动化测试能力。

1. 简介:Paddle2ONNX 全流程功能测试测什么

Paddle2ONNX 功能测试主要关注 Linux GPU/CPU 环境下模型的 Paddle2ONNX 全流程功能,具体测试点只有两个:

  • 模型转换:使用 Paddle2ONNX 将 Paddle 静态图推理模型转换为 ONNX 模型,保证转换链路跑通;
  • 模型推理:基于转换产出的 ONNX 模型,使用 Python 推理程序完成预测,保证推理链路跑通。

为了一键跑通上述全部功能,TIPC 体系提供了一套自动化测试工具,由 3 个脚本文件 + 1 个配置文件 组成:

文件作用是否需要修改
test_paddle2onnx.sh测试脚本,解析 paddle2onnx_infer_python.txt 得到具体执行命令,依次执行模型转换与模型推理无需修改
prepare.sh准备测试所需的小数据集与预训练/推理模型按需修改(模型名分支)
common_func.sh公共函数库,提供配置解析、参数拼装、状态检查等通用函数无需修改
paddle2onnx_infer_python.txt配置文件,内容会被 test_paddle2onnx.sh 解析成具体执行命令字段按模型修改

这套工具在仓库中的完整落地示例位于 tutorials/mobilenetv3_prod/Step6/test_tipc 目录,其中 mobilenet_v3_small 的配置与测试脚本可直接作为开发模板。TIPC 系列文档的总览见 tutorials/tipc/paddle2onnx/README.md,它将该主题拆成「Paddle2ONNX 推理程序功能开发」与「Paddle2ONNX 推理测试程序开发」两步,本篇聚焦后者。

2. 命令与配置文件解析

2.1 命令解析:一切的起点是「三段式」

Paddle2ONNX 模型转换和模型预测的运行命令差别很大,但都可以拆解为三个部分:

python  run_script   set_configs

以通过 argparse 传参的场景为例,命令 python3.7 deploy/onnx_python/infer.py --onnx_file=./inference/mobilenetv3_model_onnx/model.onnx 的三段拆解如下:

  • python 部分:python3.7(解释器);
  • run_script 部分:deploy/onnx_python/infer.py(可执行脚本);
  • set_configs 部分:--onnx_file=./inference/mobilenetv3_model_onnx/model.onnx(传给脚本的配置参数)。

其中可修改参数 set_configs 一般通过 = 分隔,= 前为 key,= 后为 value。于是,只要给定一个配置文件模板,解析出其中的 key 和 value,再结合固定的 python 与 run_script,就能拼装出一条完整可执行的命令——这正是 test_paddle2onnx.sh 的底层逻辑。

2.2 配置文件结构:13 行、两类内容、三种字段

完整的 paddle2onnx_infer_python.txt 配置文件共有 13 行,包含两方面的内容:

  • Paddle2ONNX 模型转换:第 4~10 行(其中第 2、3 行为模型名与 python 环境);
  • 模型 Inference 推理:第 11~13 行。

具体内容见 paddle2onnx_infer_python.txt,完整 13 行如下:

===========================paddle2onnx_params===========================
model_name:mobilenet_v3_small
python:python3.7
2onnx: paddle2onnx
--model_dir:./inference/mobilenet_v3_small_infer/
--model_filename:inference.pdmodel
--params_filename:inference.pdiparams
--save_file:./inference/mobilenet_v3_small_onnx/model.onnx
--opset_version:10
--enable_onnx_checker:True
inference:deploy/onnx_python/infer.py
--onnx_file:./inference/mobilenetv3_model_onnx/model.onnx
--img_path:./lite_data/test/demo.jpg

配置文件中主要存在以下 3 种类型的字段:

  1. 一行内容以冒号 : 为分隔符:该行可被解析为 key:value 格式,需要根据实际含义修改该行内容(下文详述);
  2. 一行内容为 ======xxxxx=====:该行是注释信息,无需修改;
  3. 一行内容以 ## 开头:表示段落分隔符,没有实际意义,无需修改。

2.3 模型转换配置参数

在配置文件中,可以通过 key:value 方式配置 Paddle 模型路径、ONNX 模型路径等常用超参数。模型转换部分(对应配置文件第 2~10 行)的参数说明如下:

行号参考内容含义key 是否需要修改value 是否需要修改修改内容
2model_name:mobilenet_v3_small模型名字否是value 修改为自己的模型名字
3python:python3.7python 环境否是value 修改为自己的 python 环境
42onnx: paddle2onnxpaddle2onnx 命令否否-
5--model_dir:./inference/mobilenet_v3_small_infer/Paddle inference 模型保存路径否是value 修改为自己 Inference 模型的路径
6--model_filename:inference.pdmodelpdmodel 文件名否是value 修改为 pdmodel 文件名
7--params_filename:inference.pdiparamspdiparams 文件名否是value 修改为 pdiparams 文件名
8--save_file:./inference/mobilenet_v3_small_onnx/model.onnx转换出的 onnx 模型目录否是value 修改为 onnx 模型保存路径
9--opset_version:10ONNX Opset 版本号否是(如需变更)value 修改为目标 Opset,Paddle2ONNX 稳定支持 9~11,默认 10
10--enable_onnx_checker:True是否检查导出 ONNX 模型的正确性否是(如需关闭)value 取 True/False

以模型转换命令 paddle2onnx --model_dir=./inference/resnet50_infer/ --model_filename=inference.pdmodel --params_filename=inference.pdiparams --save_file=./inference/resnet50_onnx/model.onnx 为例,共包含 4 个超参数,映射到配置文件的方式为:

  • inference 模型路径:对应 --model_dir=./inference/resnet50_infer/,修改第 5 行,内容改为 --model_dir:./inference/resnet50_infer/;
  • pdmodel 文件名:对应 --model_filename=inference.pdmodel,修改第 6 行,内容改为 --model_filename:inference.pdmodel;
  • pdiparams 文件名、onnx 输出路径:分别对应第 7、8 行,以此类推,将 = 换成 : 写入即可。

2.4 模型 Inference 推理配置参数

推理部分(对应配置文件第 11~13 行)的参数说明如下:

行号参考内容含义key 是否需要修改value 是否需要修改修改内容
11inference:deploy/onnx_python/infer.py启动 inference 预测命令否是value 修改为预测脚本路径
12--onnx_file:./inference/mobilenetv3_model_onnx/model.onnxonnx 模型目录否是value 修改为待预测的 onnx 模型(与转换出的 onnx 模型目录一致)
13--img_path:./lite_data/test/demo.jpg预测图片路径否是value 修改为预测图片路径

以推理命令 python3.7 deploy/onnx_python/infer.py --onnx_file=./inference/resnet50_model_onnx/model.onnx --img_path=./my_data/test_img.png 为例,共包含 2 个超参数:

  • onnx 模型路径:--onnx_file=./inference/resnet50_model_onnx/model.onnx,修改第 12 行,key 为 --onnx_file,value 为 ./inference/resnet50_model_onnx/model.onnx,内容改为 --onnx_file:./inference/resnet50_model_onnx/model.onnx;
  • 预测图片路径:--img_path=./my_data/test_img.png,修改第 13 行,key 为 --img_path,value 为 ./my_data/test_img.png,内容改为 --img_path:./my_data/test_img.png。

2.5 源码级解析机制:脚本如何把配置文件变成命令

从源码看,配置文件之所以能被解析成命令,依赖 common_func.sh 中两个核心函数:

  • func_parser_key:以 : 为分隔符(IFS=":"),取数组第一个元素作为 key;
  • func_parser_value:以 : 为分隔符,取数组第二个元素作为 value;
  • func_set_params:将 key、value 拼装为 key=value,当 key 或 value 为 null/空串时输出空,从而支持可选参数。

而 test_paddle2onnx.sh 的执行流程为:

  1. source test_tipc/common_func.sh 引入公共函数;
  2. 用 awk 'NR==1, NR==13{print}' 截取配置文件前 13 行,按换行拆分为数组;
  3. 依次解析 model_name、python、padlle2onnx_cmd(第 3 行 2onnx: 的值)、转换参数(第 4~9 行)与推理参数(第 10~12 行);
  4. 在 func_paddle2onnx 函数中,先用 func_set_params 拼出 trans_model_cmd(模型转换命令),执行并通过 status_check 记录状态;再用 ${python} ${inference_py} ${set_img_dir} ${set_model_dir} 拼出推理命令并执行。

值得注意的是,脚本将日志统一写入 ./test_tipc/output/${model_name}/paddle2onnx_infer/ 目录,包括结果汇总日志 results_paddle2onnx.log、转换日志 trans_model.log 与推理日志 paddle2onnx_infer_cpu.log,运行失败时可通过这些日志精确定位到具体命令。

3. Paddle2ONNX 功能测试开发六步流程

完整的 Paddle2ONNX 链路(含推理程序功能开发)可参考下图流程:

Paddle2ONNX 模型转换与 ONNX 推理开发流程图

测试程序开发共分 6 个步骤,其中设置了 2 个核验点(验证配置正确性、验证目录结构与文档齐全),下面逐步展开。

3.1 步骤一:准备待测试的命令

【基本内容】

准备模型转换、模型推理两条命令,后续会按照第 2 节所述内容,将命令中的可变参数映射到配置文件中。

【实战】

MobileNetV3 的 Paddle2ONNX 模型转换、推理示例运行命令如下:

# Paddle2ONNX 模型转换
paddle2onnx --model_dir=./inference/mobilenet_v3_small_infer/ \
--model_filename=inference.pdmodel \
--params_filename=inference.pdiparams \
--save_file=./inference/mobilenet_v3_small_onnx/model.onnx \
--opset_version=10 \
--enable_onnx_checker=True
# ONNX 模型推理
python3.7 deploy/onnx_python/infer.py --onnx_file=./inference/mobilenetv3_model_onnx/model.onnx --img_path=./lite_data/test/demo.jpg

转换命令中的 --model_dir/--model_filename/--params_filename/--save_file 对应配置第 5~8 行;推理命令中的 --onnx_file/--img_path 对应配置第 12~13 行。参考的 ONNX Python 推理实现见 deploy/onnx_python/infer.py 及其 README。

3.2 步骤二:准备数据与环境

【基本内容】

  1. 数据集:为方便快速验证转换与推理过程,需要准备一个小数据集(训练集和验证集各 8~16 张图像即可,压缩后数据大小建议在 20M 以内),放在 lite_data 文件夹下。小数据集准备思路可参考论文复现赛指南中的数据章节。
  2. 环境:安装好 PaddlePaddle 后,再安装 Paddle2ONNX 与 ONNXRuntime 即可进行功能测试开发:
    • python -m pip install paddle2onnx
    • python -m pip install onnxruntime==1.9.0(建议版本,可根据环境更换)

【注意事项】

  • 为方便管理,建议在上传 repo 前先将 lite_data 文件夹压缩为 tar 包,直接上传 tar 包;测试时先解压再使用。
    • 压缩命令:tar -zcf lite_data.tar lite_data
    • 解压命令:tar -xf lite_data.tar
  • 从 prepare.sh 的 paddle2onnx_infer 分支可以看到,该脚本会自动完成三件事:安装 paddle2onnx 与 onnxruntime==1.9.0、解压 ./test_images/lite_data.tar、下载并解压 mobilenet_v3_small 的 inference 模型包(mobilenet_v3_small_infer.tar),因此新模型接入时需要在 prepare.sh 中补充对应的模型获取分支。

3.3 步骤三:准备开发所需脚本

【基本内容】

在 repo 中新建 test_tipc 目录,将文件 common_func.sh、prepare.sh 和 test_paddle2onnx.sh 分别拷贝到 test_tipc 目录中。

【注意事项】

  • 上述 3 个脚本文件无需改动,在实际使用时直接修改配置文件即可。其中 prepare.sh 在接入新模型时需按模型名补充数据/模型下载分支。

3.4 步骤四:填写配置文件

【基本内容】

在 repo 的 test_tipc/ 目录中新建 configs/model_name 目录,将文件 paddle2onnx_infer_python.txt 拷贝到该目录中,其中 model_name 需要修改为您自己的模型名称。

【实战】

配置文件的含义解析参考第 2.2 节「配置文件解析」:将两条待测命令的可变参数按 key:value 格式逐行填入,例如把 model_name 改为自己的模型名、python 改为实际解释器、--model_dir 等改为自己模型推理文件的真实路径、--img_path 改为测试图片路径。

3.5 步骤五:验证配置正确性

【基本内容】

基于修改完的配置,依次运行以下两条命令:

bash test_tipc/prepare.sh ${your_params_file} paddle2onnx_infer
bash test_tipc/test_paddle2onnx.sh ${your_params_file} paddle2onnx_infer

【注意事项】

如果运行失败,脚本会输出具体的报错命令,可根据输出的报错命令排查配置文件的问题并修改,示例报错如下:

Run failed with command - paddle2onnx --model_dir=./inference/mobilenet_v3_small_infer/ --model_filename=inference.pdmodel --params_filename=inference.pdiparams --save_file=./inference/mobilenet_v3_small_onnx/model.onnx --opset_version=10 --enable_onnx_checker=True!

排查要点:核对第 5~8 行的路径是否存在且正确、第 3 行 python 环境是否可用、第 9~10 行 Opset 与 checker 参数是否被目标模型支持;同时可查看 ./test_tipc/output/${model_name}/paddle2onnx_infer/ 下的 trans_model.log 与 paddle2onnx_infer_cpu.log 定位具体原因。

【实战】

以 mobilenet_v3_small 的 Linux GPU/CPU Paddle2ONNX 功能测试为例,完整命令如下:

bash test_tipc/prepare.sh ./test_tipc/configs/mobilenet_v3_small/paddle2onnx_infer_python.txt  paddle2onnx_infer
bash test_tipc/test_paddle2onnx.sh ./test_tipc/configs/mobilenet_v3_small/paddle2onnx_infer_python.txt paddle2onnx_infer

输出结果如下,表示命令运行成功:

Run successfully with command -  paddle2onnx --model_dir=./inference/mobilenet_v3_small_infer/ --model_filename=inference.pdmodel --params_filename=inference.pdiparams --save_file=./inference/mobilenet_v3_small_onnx/model.onnx --opset_version=10 --enable_onnx_checker=True!

Run successfully with command - python3.7 deploy/onnx_python/infer.py --img_path=./lite_data/test/demo.jpg --onnx_file=./inference/mobilenet_v3_small_onnx/model.onnx > ./log/mobilenet_v3_small/paddle2onnx_infer_cpu.log 2>&1 !

【核验】

基于修改后的配置文件,测试通过,全部命令成功——即模型转换命令与推理命令均以退出码 0 结束(status_check 依据退出码写入 results_paddle2onnx.log)。

3.6 步骤六:撰写说明文档

【基本内容】

撰写 TIPC 功能总览与测试流程说明文档,分别为:

  1. TIPC 功能总览文档:test_tipc/README.md;
  2. Paddle2ONNX 测试说明文档:test_tipc/docs/test_paddle2onnx.md。

两个文档模板分别位于下述位置,可直接拷贝到自己的 repo 中,再根据自己的模型进行修改:

  1. test_tipc/README.md
  2. test_tipc/docs/test_paddle2onnx.md

【实战】

mobilenet_v3_small 的 test_tipc 文档即上述两处模板来源,其中 README 对该模型支持的功能(含 Paddle2ONNX)做总体介绍,docs 下的说明文档对 Paddle2ONNX 功能支持情况进行详细介绍。

【核验】

repo 中最终目录结构如下:

test_tipc
    |--configs                              # 配置目录
    |    |--model_name                      # 您的模型名称
    |           |--paddle2onnx_infer_python.txt   # paddle2onnx测试配置文件
    |--docs                                 # 文档目录
    |   |--test_paddle2onnx.md   # paddle2onnx测试说明文档
    |----README.md                          # TIPC说明文档
    |----test_paddle2onnx.sh     # TIPC paddle2onnx解析脚本,无需改动
    |----common_func.sh                     # TIPC基础训练推理测试常用函数,无需改动

基于 test_paddle2onnx.md 文档,即可完整跑通「Paddle2ONNX 功能测试」流程。

4. FAQ 与常见问题排查

  • 模型转换失败如何排查? 转换阶段失败时脚本会打印 Run failed with command - ... 并附上完整命令,先核对命令中 --model_dir/--model_filename/--params_filename 指向的文件是否存在、是否为动转静导出的静态图推理模型;同时检查 trans_model.log 中 Paddle2ONNX 的具体报错。
  • ONNX Opset 版本如何选择? Paddle2ONNX 目前稳定支持导出 ONNX Opset 9~11,默认值为 10,部分 Paddle 算子支持更低的 Opset 转换;若算子转换报错,可尝试调整 --opset_version 后重新验证。
  • 推理阶段报错如何定位? 推理日志写入 paddle2onnx_infer_cpu.log,常见原因包括:--onnx_file 指向的 onnx 模型与转换产物路径不一致、--img_path 图片路径缺失、onnxruntime 版本与转换产物的算子不兼容(prepare 阶段默认安装 1.9.0)。
  • 环境依赖如何准备? 功能测试需要 PaddlePaddle、Paddle2ONNX 与 ONNXRuntime 三者就绪;prepare.sh 的 paddle2onnx_infer 分支会自动完成 paddle2onnx 与 onnxruntime==1.9.0 的安装,小数据集与推理模型也会一并下载解压,新模型只需在 prepare.sh 中补充对应下载分支。

至此,从命令准备、数据环境、脚本拷贝、配置填写、结果验证到文档撰写,一条完整的 Paddle2ONNX 功能测试开发链路即全部打通。

  • 人工智能
  • 深度学习
  • 计算机视觉
  • NLP
  • 语音

【免费下载链接】models

Officially maintained, supported by PaddlePaddle, including CV, NLP, Speech, Rec, TS, big models and so on.

项目地址: https://gitcode.com/gh_mirrors/mo/models
点击查看 免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值