Skip to content

Commit 1f9b47e

Browse files
authored
[PIR]Fix ernie-3.0 deploy&add training without hf (#10475)
1 parent fea8d82 commit 1f9b47e

File tree

6 files changed

+372
-336
lines changed

6 files changed

+372
-336
lines changed

slm/model_zoo/ernie-3.0/README.md

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1293,6 +1293,7 @@ batch_size=32 和 1,预测精度为 FP16 时,GPU 下的效果-时延图:
12931293
├── compress_token_cls.py # 序列标注任务的压缩脚本
12941294
├── compress_qa.py # 阅读理解任务的压缩脚本
12951295
├── utils.py # 训练工具脚本
1296+
├── infer.py # 推理脚本
12961297
├── configs # 压缩配置文件夹
12971298
│ └── default.yml # 默认配置文件
12981299
├── deploy # 部署目录
@@ -1375,6 +1376,9 @@ python run_seq_cls.py --model_name_or_path ernie-3.0-medium-zh --dataset afqmc
13751376
# 序列标注任务
13761377
python run_token_cls.py --model_name_or_path ernie-3.0-medium-zh --dataset msra_ner --output_dir ./best_models --export_model_dir best_models/ --do_train --do_eval --do_export --config=configs/default.yml
13771378

1379+
# 如果无法连接huggingface
1380+
python run_token_cls_without_hf.py --model_name_or_path ernie-3.0-medium-zh --dataset msra_ner --output_dir ./best_models --export_model_dir best_models/ --do_train --do_eval --do_export --config=configs/default.yml
1381+
13781382
# 阅读理解任务
13791383
python run_qa.py --model_name_or_path ernie-3.0-medium-zh --dataset cmrc2018 --output_dir ./best_models --export_model_dir best_models/ --do_train --do_eval --do_export --config=configs/default.yml
13801384
```
@@ -1527,6 +1531,14 @@ python compress_qa.py --model_name_or_path best_models/cmrc2018/ --dataset cmrc2
15271531

15281532
三类任务(分类、序列标注、阅读理解)经过裁剪 + 量化后加速比均达到 3 倍左右,所有任务上平均精度损失可控制在 0.5 以内(0.46)。
15291533

1534+
<a name="推理"></a>
1535+
1536+
## 推理
1537+
目录中的 ```infer.py```提供了使用导出模型进行推理的样例。运行命令:
1538+
```shell
1539+
python infer.py --model_name_or_path ernie-3.0-medium-zh --model_path ./best_models/afqmc/export/
1540+
```
1541+
15301542
<a name="部署"></a>
15311543

15321544
## 部署
@@ -1549,7 +1561,7 @@ python compress_qa.py --model_name_or_path best_models/cmrc2018/ --dataset cmrc2
15491561

15501562
<a name="Python 部署"></a>
15511563

1552-
#### Python 部署
1564+
### Python 部署
15531565

15541566
Python 部署请参考:[Python 部署指南](./deploy/python/README.md)
15551567

slm/model_zoo/ernie-3.0/deploy/python/README.md

Lines changed: 25 additions & 163 deletions
Original file line numberDiff line numberDiff line change
@@ -8,51 +8,37 @@
88

99
### 快速开始
1010

11-
以下示例展示如何基于 FastDeploy 库完成 ERNIE 3.0 Medium 模型在 CLUE Benchmark 的 [AFQMC 数据集](https://github.com/CLUEbenchmark/CLUE)上进行文本分类任务的 Python 预测部署,可通过命令行参数`--device`以及`--backend`指定运行在不同的硬件以及推理引擎后端,并使用`--model_dir`参数指定运行的模型,具体参数设置可查看下面[参数说明](#参数说明)。示例中的模型是按照 [ERNIE 3.0 训练文档](../../README.md)导出得到的部署模型,其模型目录为`model_zoo/ernie-3.0/best_models/afqmc/export`(用户可按实际情况设置)。
11+
以下示例展示如何完成 ERNIE 3.0 Medium 模型在 CLUE Benchmark 的 [AFQMC 数据集](https://github.com/CLUEbenchmark/CLUE)上进行文本分类任务的 Python 预测部署,可通过命令行参数`--device`指定运行在不同的硬件,并使用`--model_dir`参数指定运行的模型,具体参数设置可查看下面[参数说明](#参数说明)。示例中的模型是按照 [ERNIE 3.0 训练文档](../../README.md)导出得到的部署模型,其模型目录为`model_zoo/ernie-3.0/best_models/afqmc/export`(用户可按实际情况设置)。
1212

1313
```bash
1414

1515
# CPU 推理
16-
python seq_cls_infer.py --model_dir ../../best_models/afqmc/export --device cpu --backend paddle
16+
python seq_cls_infer.py --model_dir ../../best_models/afqmc/export --device cpu
1717

1818
# GPU 推理
19-
python seq_cls_infer.py --model_dir ../../best_models/afqmc/export --device gpu --backend paddle
19+
python seq_cls_infer.py --model_dir ../../best_models/afqmc/export --device gpu
2020

2121
```
2222

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

2525
```bash
26+
I0423 05:00:21.622229 8408 print_statistics.cc:44] --- detected [85, 273] subgraphs!
27+
--- Running PIR pass [dead_code_elimination_pass]
28+
I0423 05:00:21.622710 8408 print_statistics.cc:50] --- detected [113] subgraphs!
29+
--- Running PIR pass [replace_fetch_with_shadow_output_pass]
30+
I0423 05:00:21.622859 8408 print_statistics.cc:50] --- detected [1] subgraphs!
31+
--- Running PIR pass [remove_shadow_feed_pass]
32+
I0423 05:00:21.626749 8408 print_statistics.cc:50] --- detected [2] subgraphs!
33+
--- Running PIR pass [inplace_pass]
34+
I0423 05:00:21.631474 8408 print_statistics.cc:50] --- detected [2] subgraphs!
35+
I0423 05:00:21.631560 8408 analysis_predictor.cc:1186] ======= pir optimization completed =======
36+
I0423 05:00:21.641817 8408 pir_interpreter.cc:1640] pir interpreter is running by trace mode ...
37+
Batch 0, example 0 | s1: 花呗收款额度限制 | s2: 收钱码,对花呗支付的金额有限制吗 | label: 1 | score: 0.5175
38+
Batch 1, example 0 | s1: 花呗支持高铁票支付吗 | s2: 为什么友付宝不支持花呗付款 | label: 0 | score: 0.9873
2639

27-
[INFO] fastdeploy/runtime.cc(596)::Init Runtime initialized with Backend::PDINFER in Device::CPU.
28-
Batch id:0, example id:0, sentence1:花呗收款额度限制, sentence2:收钱码,对花呗支付的金额有限制吗, label:0, similarity:0.5099
29-
Batch id:1, example id:0, sentence1:花呗支持高铁票支付吗, sentence2:为什么友付宝不支持花呗付款, label:0, similarity:0.9862
30-
31-
```
32-
33-
### 量化模型部署
34-
35-
该示例支持部署 Paddle INT8 新格式量化模型,仅需在`--model_dir`参数传入量化模型路径,并且在对应硬件上选择可用的推理引擎后端,即可完成量化模型部署。在 GPU 上部署量化模型时,可选后端为`paddle_tensorrt``tensorrt`;在 CPU 上部署量化模型时,可选后端为`paddle``onnx_runtime`。下面将展示如何使用该示例完成量化模型部署,示例中的模型是按照 [ERNIE 3.0 训练文档](../../README.md) 压缩量化后导出得到的量化模型。
36-
37-
```bash
38-
39-
# 在GPU上使用 tensorrt 后端,模型目录可按照实际模型路径设置
40-
python seq_cls_infer.py --model_dir ../../best_models/afqmc/width_mult_0.75/mse16_1/ --device gpu --backend tensorrt --model_prefix int8
41-
42-
# 在CPU上使用paddle_inference后端,模型目录可按照实际模型路径设置
43-
python seq_cls_infer.py --model_dir ../../best_models/afqmc/width_mult_0.75/mse16_1/ --device cpu --backend paddle --model_prefix int8
44-
45-
```
46-
47-
运行完成后返回的结果如下:
48-
49-
```bash
50-
[INFO] fastdeploy/runtime/runtime.cc(101)::Init Runtime initialized with Backend::PDINFER in Device::GPU.
51-
Batch id:0, example id:0, sentence1:花呗收款额度限制, sentence2:收钱码,对花呗支付的金额有限制吗, label:0, similarity:0.5224
52-
Batch id:1, example id:0, sentence1:花呗支持高铁票支付吗, sentence2:为什么友付宝不支持花呗付款, label:0, similarity:0.9856
5340
```
5441

55-
5642
### 参数说明
5743

5844
`seq_cls_infer.py` 除了以上示例的命令行参数,还支持更多命令行参数的设置。以下为各命令行参数的说明。
@@ -63,66 +49,32 @@ Batch id:1, example id:0, sentence1:花呗支持高铁票支付吗, sentence2:
6349
|--batch_size |输入的 batch size,默认为 1|
6450
|--max_length |最大序列长度,默认为 128|
6551
|--device | 运行的设备,可选范围: ['cpu', 'gpu'],默认为'cpu' |
66-
|--backend | 支持的推理后端,可选范围: ['onnx_runtime', 'paddle', 'openvino', 'tensorrt', 'paddle_tensorrt'],默认为'paddle' |
67-
|--use_fp16 | 是否使用 FP16模式进行推理。使用 tensorrt 和 paddle_tensorrt 后端时可开启,默认为 False |
6852

6953
## 序列标注任务
7054

7155
### 快速开始
7256

73-
以下示例展示如何基于 FastDeploy 库完成 ERNIE 3.0 Medium 模型在 CLUE Benchmark 的[ MSRA_NER 数据集](https://github.com/lemonhu/NER-BERT-pytorch/tree/master/data/msra)上进行序列标注任务的 Python 预测部署,可通过命令行参数`--device`以及`--backend`指定运行在不同的硬件以及推理引擎后端,并使用`--model_dir`参数指定运行的模型,具体参数设置可查看下面[参数说明](#参数说明)。示例中的模型是按照 [ERNIE 3.0 训练文档](../../README.md)导出得到的部署模型,其模型目录为`model_zoo/ernie-3.0/best_models/msra_ner/export`(用户可按实际情况设置)。
57+
以下示例展示如何完成 ERNIE 3.0 Medium 模型在 CLUE Benchmark 的[ MSRA_NER 数据集](https://github.com/lemonhu/NER-BERT-pytorch/tree/master/data/msra)上进行序列标注任务的 Python 预测部署,可通过命令行参数`--device`指定运行在不同的硬件,并使用`--model_dir`参数指定运行的模型,具体参数设置可查看下面[参数说明](#参数说明)。示例中的模型是按照 [ERNIE 3.0 训练文档](../../README.md)导出得到的部署模型,其模型目录为`model_zoo/ernie-3.0/best_models/msra_ner/export`(用户可按实际情况设置)。
7458

7559

7660
```bash
7761

7862
# CPU 推理
79-
python token_cls_infer.py --model_dir ../../best_models/msra_ner/export/ --device cpu --backend paddle
63+
python token_cls_infer.py --model_dir ../../best_models/msra_ner/export/ --device cpu
8064

8165
# GPU 推理
82-
python token_cls_infer.py --model_dir ../../best_models/msra_ner/export/ --device gpu --backend paddle
83-
84-
```
85-
86-
运行完成后返回的结果如下:
87-
88-
```bash
89-
90-
[INFO] fastdeploy/runtime.cc(500)::Init Runtime initialized with Backend::PDINFER in Device::CPU.
91-
input data: 北京的涮肉,重庆的火锅,成都的小吃都是极具特色的美食。
92-
The model detects all entities:
93-
entity: 北京 label: LOC pos: [0, 1]
94-
entity: 重庆 label: LOC pos: [6, 7]
95-
entity: 成都 label: LOC pos: [12, 13]
96-
-----------------------------
97-
input data: 乔丹、科比、詹姆斯和姚明都是篮球界的标志性人物。
98-
The model detects all entities:
99-
entity: 乔丹 label: PER pos: [0, 1]
100-
entity: 科比 label: PER pos: [3, 4]
101-
entity: 詹姆斯 label: PER pos: [6, 8]
102-
entity: 姚明 label: PER pos: [10, 11]
103-
-----------------------------
104-
105-
```
106-
107-
### 量化模型部署
108-
109-
该示例支持部署 Paddle INT8 新格式量化模型,仅需在`--model_dir`参数传入量化模型路径,并且在对应硬件上选择可用的推理引擎后端,即可完成量化模型部署。在 GPU 上部署量化模型时,可选后端为`paddle_tensorrt``tensorrt`;在 CPU 上部署量化模型时,可选后端为`paddle``onnx_runtime`。下面将展示如何使用该示例完成量化模型部署,示例中的模型是按照 [ERNIE 3.0 训练文档](../../README.md) 压缩量化后导出得到的量化模型。
110-
111-
```bash
112-
113-
# 在GPU上使用 tensorrt 后端,模型目录可按照实际模型路径设置
114-
python token_cls_infer.py --model_dir ../../best_models/msra_ner/width_mult_0.75/mse16_1/ --device gpu --backend tensorrt --model_prefix int8
115-
116-
# 在CPU上使用paddle_inference后端,模型目录可按照实际模型路径设置
117-
python token_cls_infer.py --model_dir ../../best_models/msra_ner/width_mult_0.75/mse16_1/ --device cpu --backend paddle --model_prefix int8
66+
python token_cls_infer.py --model_dir ../../best_models/msra_ner/export/ --device gpu
11867

11968
```
12069

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

12372
```bash
124-
125-
[INFO] fastdeploy/runtime.cc(500)::Init Runtime initialized with Backend::PDINFER in Device::CPU.
73+
......
74+
--- Running PIR pass [inplace_pass]
75+
I0423 09:51:42.250245 4644 print_statistics.cc:50] --- detected [1] subgraphs!
76+
I0423 09:51:42.250334 4644 analysis_predictor.cc:1186] ======= pir optimization completed =======
77+
I0423 09:51:42.261358 4644 pir_interpreter.cc:1640] pir interpreter is running by trace mode ...
12678
input data: 北京的涮肉,重庆的火锅,成都的小吃都是极具特色的美食。
12779
The model detects all entities:
12880
entity: 北京 label: LOC pos: [0, 1]
@@ -148,97 +100,7 @@ entity: 姚明 label: PER pos: [10, 11]
148100
|--batch_size |输入的 batch size,默认为 1|
149101
|--max_length |最大序列长度,默认为 128|
150102
|--device | 运行的设备,可选范围: ['cpu', 'gpu'],默认为'cpu' |
151-
|--backend | 支持的推理后端,可选范围: ['onnx_runtime', 'paddle', 'openvino', 'tensorrt', 'paddle_tensorrt'],默认为'paddle' |
152-
|--use_fp16 | 是否使用 FP16模式进行推理。使用 tensorrt 和 paddle_tensorrt 后端时可开启,默认为 False |
153-
|--model_prefix| 模型文件前缀。前缀会分别与'.pdmodel'和'.pdiparams'拼接得到模型文件名和参数文件名。默认为 'model'|
154-
155-
156-
## FastDeploy 高阶用法
157-
158-
FastDeploy 在 Python 端上,提供 `fastdeploy.RuntimeOption.use_xxx()` 以及 `fastdeploy.RuntimeOption.use_xxx_backend()` 接口支持开发者选择不同的硬件、不同的推理引擎进行部署。在不同的硬件上部署 ERNIE 3.0 模型,需要选择硬件所支持的推理引擎进行部署,下表展示如何在不同的硬件上选择可用的推理引擎部署 ERNIE 3.0 模型。
159-
160-
符号说明: (1) ✅: 已经支持; (2) ❔: 正在进行中; (3) N/A: 暂不支持;
161-
162-
<table>
163-
<tr>
164-
<td align=center> 硬件</td>
165-
<td align=center> 硬件对应的接口</td>
166-
<td align=center> 可用的推理引擎 </td>
167-
<td align=center> 推理引擎对应的接口 </td>
168-
<td align=center> 是否支持 Paddle 新格式量化模型 </td>
169-
<td align=center> 是否支持 FP16 模式 </td>
170-
</tr>
171-
<tr>
172-
<td rowspan=3 align=center> CPU </td>
173-
<td rowspan=3 align=center> use_cpu() </td>
174-
<td align=center> Paddle Inference </td>
175-
<td align=center> use_paddle_infer_backend() </td>
176-
<td align=center> ✅ </td>
177-
<td align=center> N/A </td>
178-
</tr>
179-
<tr>
180-
<td align=center> ONNX Runtime </td>
181-
<td align=center> use_ort_backend() </td>
182-
<td align=center> ✅ </td>
183-
<td align=center> N/A </td>
184-
</tr>
185-
<tr>
186-
<td align=center> OpenVINO </td>
187-
<td align=center> use_openvino_backend() </td>
188-
<td align=center> ❔ </td>
189-
<td align=center> N/A </td>
190-
</tr>
191-
<tr>
192-
<td rowspan=4 align=center> GPU </td>
193-
<td rowspan=4 align=center> use_gpu() </td>
194-
<td align=center> Paddle Inference </td>
195-
<td align=center> use_paddle_infer_backend() </td>
196-
<td align=center> ✅ </td>
197-
<td align=center> N/A </td>
198-
</tr>
199-
<tr>
200-
<td align=center> ONNX Runtime </td>
201-
<td align=center> use_ort_backend() </td>
202-
<td align=center> ✅ </td>
203-
<td align=center> ❔ </td>
204-
</tr>
205-
<tr>
206-
<td align=center> Paddle TensorRT </td>
207-
<td align=center> use_trt_backend() + enable_paddle_to_trt() </td>
208-
<td align=center> ✅ </td>
209-
<td align=center> ✅ </td>
210-
</tr>
211-
<tr>
212-
<td align=center> TensorRT </td>
213-
<td align=center> use_trt_backend() </td>
214-
<td align=center> ✅ </td>
215-
<td align=center> ✅ </td>
216-
</tr>
217-
<tr>
218-
<td align=center> 昆仑芯 XPU </td>
219-
<td align=center> use_kunlunxin() </td>
220-
<td align=center> Paddle Lite </td>
221-
<td align=center> use_paddle_lite_backend() </td>
222-
<td align=center> N/A </td>
223-
<td align=center> ✅ </td>
224-
</tr>
225-
<tr>
226-
<td align=center> 华为 昇腾 </td>
227-
<td align=center> use_ascend() </td>
228-
<td align=center> Paddle Lite </td>
229-
<td align=center> use_paddle_lite_backend() </td>
230-
<td align=center> ❔ </td>
231-
<td align=center> ✅ </td>
232-
</tr>
233-
<tr>
234-
<td align=center> Graphcore IPU </td>
235-
<td align=center> use_ipu() </td>
236-
<td align=center> Paddle Inference </td>
237-
<td align=center> use_paddle_infer_backend() </td>
238-
<td align=center> ❔ </td>
239-
<td align=center> N/A </td>
240-
</tr>
241-
</table>
103+
|--model_prefix| 模型文件前缀。前缀会分别与'PADDLE_INFERENCE_MODEL_SUFFIX'和'PADDLE_INFERENCE_WEIGHTS_SUFFIX'拼接得到模型文件名和参数文件名。默认为 'model'|
242104

243105
## 相关文档
244106

0 commit comments

Comments
 (0)