Skip to content

【PaddleNLP No.21】Create paddle.inference infer example for ernie-3.0-tiny #10480

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Apr 24, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion slm/model_zoo/ernie-3.0-tiny/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -525,7 +525,7 @@ python run_eval.py \
```

* `model_name_or_path`:动态图模型的目录,主要用于加载 tokenizer。
* `infer_prefix`:预测模型的路径(目录+前缀)。例如当 `infer_prefix` 为 `output/infer_model` 时,代表预测模型和参数文件分别为 `output/infer_model.pdmodel` 和 `output/infer_model.pdiparams`。
* `infer_prefix`:预测模型的路径(目录+前缀)。例如当 `infer_prefix` 为 `output/infer_model` 时,代表预测模型和参数文件分别为 `output/infer_model.json`(paddle3.0.0 默认开启 PIR)`output/infer_model.pdmodel`(未开启 PIR) 和 `output/infer_model.pdiparams`。
* `test_path` :评估所用文件路径名;
* `do_eval`,是否输出评价指标的结果。如果设置,脚本会开启评估模式,最终会输出精度评价指标的值。如果不设置,则会输出模型后处理后的结果。例如:

Expand Down
17 changes: 3 additions & 14 deletions slm/model_zoo/ernie-3.0-tiny/deploy/README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
# FastDeploy ERNIE 3.0 Tiny 模型高性能部署
# ERNIE 3.0 Tiny 模型推理

**目录**
* [FastDeploy 部署介绍](#FastDeploy 部署介绍)
* [代码结构](#代码结构)
* [环境要求](#环境要求)
* [详细部署文档](#详细部署文档)
Expand All @@ -10,10 +9,6 @@

## FastDeploy 部署介绍

**⚡️FastDeploy**是一款**全场景**、**易用灵活**、**极致高效**的 AI 推理部署工具,满足开发者**多硬件、多平台**的产业部署需求。开发者可以基于 FastDeploy 将训练好的预测模型在不同的硬件、不同的操作系统以及不同的推理引擎后端上进行部署。目前 FastDeploy 提供多种编程语言的 SDK,包括 C++、Python 以及 Java SDK。

目前 ERNIE 3.0 Tiny 模型已提供基于 FastDeploy 的云边端的部署示例,在服务端上的 GPU 硬件上,支持`Paddle Inference`、`ONNX Runtime`、`Paddle TensorRT`以及`TensorRT`后端,在 CPU 上支持`Paddle Inference`、`ONNX Runtime`以及`OpenVINO`后端;在移动端上支持`Paddle Lite`后端。多硬件、多推理引擎后端的支持可以满足开发者不同的部署需求。

本部署示例是车载语音场景下的口语理解(Spoken Language Understanding,SLU)任务,详细可看[ERNIE 3.0 Tiny 介绍](../README.md)。


Expand All @@ -24,18 +19,12 @@
```text

├── python
│   ├── infer_demo.py # Python 部署示例代码
│   └── README.md # Python 部署示例文档
│   ├── infer_demo.py # Python 推理示例代码
│   └── README.md # Python 推理示例文档
└── README.md # 文档

```

<a name="环境要求"></a>

## 环境要求

在部署 ERNIE 3.0 Tiny 模型前,需要安装 FastDeploy SDK,可参考[FastDeploy SDK 安装文档](https://github.com/PaddlePaddle/FastDeploy/blob/develop/docs/cn/build_and_install/download_prebuilt_libraries.md)确认部署环境是否满足 FastDeploy 环境要求,并按照介绍安装相应的 SDK。

<a name="详细部署文档"></a>

## 详细部署文档
Expand Down
223 changes: 12 additions & 211 deletions slm/model_zoo/ernie-3.0-tiny/deploy/python/README.md
Original file line number Diff line number Diff line change
@@ -1,61 +1,36 @@
# FastDeploy ERNIE 3.0 Tiny 模型 Python 部署示例

在部署前,参考 [FastDeploy SDK 安装文档](https://github.com/PaddlePaddle/FastDeploy/blob/develop/docs/cn/build_and_install/download_prebuilt_libraries.md) 安装 FastDeploy Python SDK。
# ERNIE 3.0 Tiny 模型 Python 推理示例

本目录下分别提供 `infer_demo.py` 快速完成在 CPU/GPU 的车载语音场景下的口语理解(Spoken Language Understanding,SLU)任务的 Python 部署示例,并展示端到端预测性能的 Benchmark。


## 依赖安装

直接执行以下命令安装部署示例的依赖。

```bash

# 安装GPU版本fastdeploy
pip install fastdeploy-gpu-python -f https://www.paddlepaddle.org.cn/whl/fastdeploy.html

```

## 快速开始

以下示例可通过命令行参数`--device`以及`--backend`指定运行在不同的硬件以及推理引擎后端,并使用`--model_dir`参数指定运行的模型,具体参数设置可查看下面[参数说明](#参数说明)。示例中的模型是按照[ERNIE 3.0 Tiny 训练文档](../../README.md)导出得到的部署模型,其模型目录为`model_zoo/ernie-tiny/output/BS64_LR5e-5_20EPOCHS_WD0.01_WR0.1/`(用户可按实际情况设置)。
以下示例可通过命令行参数`--device`指定运行在不同的硬件,并使用`--model_dir`参数指定运行的模型,具体参数设置可查看下面[参数说明](#参数说明)。示例中的模型是按照[ERNIE 3.0 Tiny 训练文档](../../README.md)导出得到的部署模型,其模型目录为`model_zoo/ernie-tiny/output/BS64_LR5e-5_EPOCHS30/`(用户可按实际情况设置)。

```bash

# 在GPU上使用paddle_inference后端,模型目录可按照实际模型路径设置
python infer_demo.py --device gpu --backend paddle --model_dir ../../output/BS64_LR5e-5_20EPOCHS_WD0.01_WR0.1 --slot_label_path ../../data/slot_label.txt --intent_label_path ../../data/intent_label.txt
python infer_demo.py --device gpu --model_dir ../../output/BS64_LR5e-5_EPOCHS30 --slot_label_path ../../data/slot_label.txt --intent_label_path ../../data/intent_label.txt

# 在CPU上使用paddle_inference后端,模型目录可按照实际模型路径设置
python infer_demo.py --device cpu --backend paddle --model_dir ../../output/BS64_LR5e-5_20EPOCHS_WD0.01_WR0.1 --slot_label_path ../../data/slot_label.txt --intent_label_path ../../data/intent_label.txt
python infer_demo.py --device cpu --backend paddle --model_dir ../../output/BS64_LR5e-5_EPOCHS30 --slot_label_path ../../data/slot_label.txt --intent_label_path ../../data/intent_label.txt

```

运行完成后返回的结果如下:

```bash

[INFO] fastdeploy/runtime.cc(596)::Init Runtime initialized with Backend::PDINFER in Device::GPU.
......
--- Running PIR pass [inplace_pass]
I0423 14:02:46.963447 2082 print_statistics.cc:50] --- detected [2] subgraphs!
I0423 14:02:46.963521 2082 analysis_predictor.cc:1186] ======= pir optimization completed =======
I0423 14:02:46.971112 2082 pir_interpreter.cc:1640] pir interpreter is running by trace mode ...
No. 0 text = 来一首周华健的花心
{'intent': 'music.play', 'confidence': 0.99833965, 'slot': [{'slot': 'singer', 'entity': '周华健', 'pos': [3, 5]}, {'slot': 'song', 'entity': '花心', 'pos': [7, 8]}]}
{'intent': 'music.play', 'confidence': 0.9986396431922913, 'slot': [{'slot': 'song', 'entity': '来'}, {'slot': 'singer', 'entity': '华健的'}, {'slot': 'song', 'entity': '心'}]}
No. 1 text = 播放我们都一样
{'intent': 'music.play', 'confidence': 0.9985164, 'slot': [{'slot': 'song', 'entity': '我们都一样', 'pos': [2, 6]}]}
{'intent': 'music.play', 'confidence': 0.9983224272727966, 'slot': [{'slot': 'song', 'entity': '们都一样'}]}
No. 2 text = 到信阳市汽车配件城
{'intent': 'navigation.navigation', 'confidence': 0.998626, 'slot': [{'slot': 'destination', 'entity': '信阳市汽车配件城', 'pos': [1, 8]}]}

```

### 量化模型部署

该示例支持部署 Paddle INT8 新格式量化模型,仅需在`--model_dir`参数传入量化模型路径,并且在对应硬件上选择可用的推理引擎后端,即可完成量化模型部署。在 GPU 上部署量化模型时,可选后端为`paddle_tensorrt`、`tensorrt`;在 CPU 上部署量化模型时,可选后端为`paddle`、`onnx_runtime`。下面将展示如何使用该示例完成量化模型部署,示例中的模型是按照 [ERNIE 3.0 Tiny 训练文档](../../README.md) 压缩量化后导出得到的量化模型。

```bash

# 在 GPU 上使用 tensorrt 后端,模型目录可按照实际模型路径设置
python infer_demo.py --device gpu --backend tensorrt --model_prefix int8 --model_dir ../../output/BS64_LR5e-5_20EPOCHS_WD0.01_WR0.1 --slot_label_path ../../data/slot_label.txt --intent_label_path ../../data/intent_label.txt

# 在 CPU 上使用 paddle_inference 后端,模型目录可按照实际模型路径设置
python infer_demo.py --device cpu --backend paddle --model_prefix int8 --model_dir ../../output/BS64_LR5e-5_20EPOCHS_WD0.01_WR0.1_quant --slot_label_path ../../data/slot_label.txt --intent_label_path ../../data/intent_label.txt

{'intent': 'navigation.navigation', 'confidence': 0.9985769987106323, 'slot': [{'slot': 'destination', 'entity': '到'}, {'slot': 'destination', 'entity': '阳市汽车配件城'}]}
```

运行完成后返回的结果如下:
Expand All @@ -79,187 +54,13 @@ No. 2 text = 到信阳市汽车配件城
| 参数 |参数说明 |
|----------|--------------|
|--device | 运行的设备,可选范围: ['cpu', 'gpu'],默认为'cpu' |
|--backend | 支持的推理后端,可选范围: ['onnx_runtime', 'paddle', 'openvino', 'tensorrt', 'paddle_tensorrt'],默认为'paddle' |
|--model_dir | 指定部署模型的目录。支持传入 Paddle INT8 新格式量化模型。 |
|--slot_label_path| 指定的 slot label 文件路径 |
|--intent_label_path| 指定的 intent label 文件路径 |
|--batch_size |最大可测的 batch size,默认为 1|
|--max_length |最大序列长度,默认为 128|
|--use_trt_fp16 | 是否使用 FP16 模式进行推理。使用 TensorRT 和 Paddle TensorRT 后端时可开启,默认为 False |
|--model_prefix| 模型文件前缀。前缀会分别与'.pdmodel'和'.pdiparams'拼接得到模型文件名和参数文件名。默认为 'infer_model'|

## FastDeploy 高阶用法

FastDeploy 在 Python 端上,提供 `fastdeploy.RuntimeOption.use_xxx()` 以及 `fastdeploy.RuntimeOption.use_xxx_backend()` 接口支持开发者选择不同的硬件、不同的推理引擎进行部署。在不同的硬件上部署 ERNIE 3.0 Tiny 模型,需要选择硬件所支持的推理引擎进行部署,下表展示如何在不同的硬件上选择可用的推理引擎部署 ERNIE 3.0 Tiny 模型。

符号说明: (1) ✅: 已经支持; (2) ❔: 正在进行中; (3) N/A: 暂不支持;

<table>
<tr>
<td align=center> 硬件</td>
<td align=center> 硬件对应的接口</td>
<td align=center> 可用的推理引擎 </td>
<td align=center> 推理引擎对应的接口 </td>
<td align=center> 是否支持 ERNIE 3.0 Tiny 模型 </td>
<td align=center> 是否支持 Paddle 新格式量化模型 </td>
<td align=center> 是否支持 FP16模式 </td>
</tr>
<tr>
<td rowspan=3 align=center> CPU </td>
<td rowspan=3 align=center> use_cpu() </td>
<td align=center> Paddle Inference </td>
<td align=center> use_paddle_infer_backend() </td>
<td align=center> ✅ </td>
<td align=center> ✅ </td>
<td align=center> N/A </td>
</tr>
<tr>
<td align=center> ONNX Runtime </td>
<td align=center> use_ort_backend() </td>
<td align=center> ✅ </td>
<td align=center> ✅ </td>
<td align=center> N/A </td>
</tr>
<tr>
<td align=center> OpenVINO </td>
<td align=center> use_openvino_backend() </td>
<td align=center> ✅ </td>
<td align=center> ❔ </td>
<td align=center> N/A </td>
</tr>
<tr>
<td rowspan=4 align=center> GPU </td>
<td rowspan=4 align=center> use_gpu() </td>
<td align=center> Paddle Inference </td>
<td align=center> use_paddle_infer_backend() </td>
<td align=center> ✅ </td>
<td align=center> ✅ </td>
<td align=center> N/A </td>
</tr>
<tr>
<td align=center> ONNX Runtime </td>
<td align=center> use_ort_backend() </td>
<td align=center> ✅ </td>
<td align=center> ✅ </td>
<td align=center> ❔ </td>
</tr>
<tr>
<td align=center> Paddle TensorRT </td>
<td align=center> use_trt_backend() + enable_paddle_to_trt() </td>
<td align=center> ✅ </td>
<td align=center> ✅ </td>
<td align=center> ✅ </td>
</tr>
<tr>
<td align=center> TensorRT </td>
<td align=center> use_trt_backend() </td>
<td align=center> ✅ </td>
<td align=center> ✅ </td>
<td align=center> ✅ </td>
</tr>
<tr>
<td align=center> 昆仑芯 XPU </td>
<td align=center> use_kunlunxin() </td>
<td align=center> Paddle Lite </td>
<td align=center> use_paddle_lite_backend() </td>
<td align=center> ✅ </td>
<td align=center> N/A </td>
<td align=center> ✅ </td>
</tr>
<tr>
<td align=center> 华为 昇腾 </td>
<td align=center> use_ascend() </td>
<td align=center> Paddle Lite </td>
<td align=center> use_paddle_lite_backend() </td>
<td align=center> ✅ </td>
<td align=center> ❔ </td>
<td align=center> ✅ </td>
</tr>
<tr>
<td align=center> Graphcore IPU </td>
<td align=center> use_ipu() </td>
<td align=center> Paddle Inference </td>
<td align=center> use_paddle_infer_backend() </td>
<td align=center> ❔ </td>
<td align=center> ❔ </td>
<td align=center> N/A </td>
</tr>
</table>

## 性能 Benchmark
### 实验环境

<table>
<tr>
<td align=center> GPU 型号 </td>
<td align=center> A10 </td>
</tr>
<tr>
<td align=center> CUDA 版本 </td>
<td align=center> 11.6 </td>
</tr>
<tr>
<td align=center> cuDNN 版本 </td>
<td align=center> 8.4.0 </td>
</tr>
<tr>
<td align=center> CPU 型号 </td>
<td align=center> Intel(R) Xeon(R) Gold 6271C CPU @ 2.60GHz </td>
</tr>
</table>

### 参数设置

batch size = 32,max length = 16。

测试文本长度15。

### 性能对比

#### FP32 模型

**使用 Paddle Inference 后端预测**。

<table>
<tr>
<td align=center> 切词方式 </td>
<td align=center> 端到端延时(ms) </td>
<td align=center> Runtime 延时(ms) </td>
<td align=center> Tokenizer 延时(ms) </td>
<td align=center> PostProcess 延时(ms) </td>
</tr>
<tr>
<td align=center> Python Tokenizer </td>
<td align=center> 8.9028 </td>
<td align=center> 0.9987 </td>
<td align=center> 7.5499 </td>
<td align=center> 0.3541 </td>
</tr>
</table>

#### INT8 模型

**使用 Paddle TensorRT 后端预测**。

<table>
<tr>
<td align=center> 切词方式 </td>
<td align=center> 端到端延时(ms) </td>
<td align=center> Runtime 延时(ms) </td>
<td align=center> Tokenizer 延时(ms) </td>
<td align=center> PostProcess 延时(ms) </td>
</tr>
<tr>
<td align=center> Python Tokenizer </td>
<td align=center> 9.2509 </td>
<td align=center> 1.0543 </td>
<td align=center> 7.8407 </td>
<td align=center> 0.3559 </td>
</tr>
</table>

## 相关文档

[ERNIE 3.0 Tiny 模型详细介绍](../../README.md)

[FastDeploy SDK 安装文档](https://github.com/PaddlePaddle/FastDeploy/blob/develop/docs/cn/build_and_install/download_prebuilt_libraries.md)
Loading