4
4
* [ 模型介绍] ( #模型介绍 )
5
5
* [ 在线蒸馏技术] ( #在线蒸馏技术 )
6
6
* [ 模型效果] ( #模型效果 )
7
- * [ 微调] ( #微调 )
7
+ * [ 开始运行] ( #开始运行 )
8
+ * [ 环境要求] ( #环境要求 )
9
+ * [ 数据准备] ( #数据准备 )
10
+ * [ 模型训练] ( #模型训练 )
11
+ * [ 模型预测] ( #模型预测 )
8
12
* [ 模型压缩] ( #模型压缩 )
9
13
* [ 环境依赖] ( #环境依赖 )
10
14
* [ 模型压缩 API 使用] ( #模型压缩API使用 )
17
21
* [ 部署] ( #部署 )
18
22
* [ Python 部署] ( #Python部署 )
19
23
* [ 服务化部署] ( #服务化部署 )
20
- * [ Paddle2ONNX 部署] ( #Paddle2ONNX部署 )
21
24
* [ Notebook教程] ( #Notebook教程 )
22
25
* [ 参考文献] ( #参考文献 )
23
26
24
27
<a name =" 模型介绍 " ></a >
25
28
26
29
## 模型介绍
27
30
28
- 本次开源的模型是在文心大模型ERNIE 3.0 基础上通过** 在线蒸馏技术** 得到的轻量级模型,模型结构与 ERNIE 2.0 保持一致,相比 ERNIE 2.0 具有更强的中文效果。
31
+ 本次开源的模型是在文心大模型ERNIE 3.0, 文心大模型ERNIE 3.0 作为百亿参数知识增强的大模型,除了从海量文本数据中学习词汇、结构、语义等知识外,还从大规模知识图谱中学习。 基础上通过** 在线蒸馏技术** 得到的轻量级模型,模型结构与 ERNIE 2.0 保持一致,相比 ERNIE 2.0 具有更强的中文效果。
29
32
30
33
相关技术详解可参考文章[ 《解析全球最大中文单体模型鹏城-百度·文心技术细节》] ( https://www.jiqizhixin.com/articles/2021-12-08-9 )
31
34
32
- <a name =" 在线蒸馏技术 " ></a >
33
-
34
35
### 在线蒸馏技术
35
36
36
37
在线蒸馏技术在模型学习的过程中周期性地将知识信号传递给若干个学生模型同时训练,从而在蒸馏阶段一次性产出多种尺寸的学生模型。相对传统蒸馏技术,该技术极大节省了因大模型额外蒸馏计算以及多个学生的重复知识传递带来的算力消耗。
47
48
48
49
<a name =" 模型效果 " ></a >
49
50
50
- ## 模型效果
51
+
52
+ ### 模型效果
51
53
52
54
本项目开源 ** ERNIE 3.0 _ Base_ ** 、** ERNIE 3.0 _ Medium_ ** 、 ** ERNIE 3.0 _ Mini_ ** 、 ** ERNIE 3.0 _ Micro_ ** 、 ** ERNIE 3.0 _ Nano_ ** 五个模型:
53
55
@@ -1277,45 +1279,65 @@ batch_size=32 和 1,预测精度为 FP16 时,GPU 下的效果-时延图:
1277
1279
<br />
1278
1280
1279
1281
1280
- 以下是本项目目录结构及说明:
1281
-
1282
- ``` shell
1282
+ <a name =" 代码结构 " ></a >
1283
+ ## 代码结构
1284
+ 以下是本项目代码结构
1285
+ ``` text
1283
1286
.
1284
1287
├── run_seq_cls.py # 分类任务的微调脚本
1285
1288
├── run_token_cls.py # 序列标注任务的微调脚本
1286
1289
├── run_qa.py # 阅读理解任务的微调脚本
1287
1290
├── compress_seq_cls.py # 分类任务的压缩脚本
1288
1291
├── compress_token_cls.py # 序列标注任务的压缩脚本
1289
1292
├── compress_qa.py # 阅读理解任务的压缩脚本
1290
- ├── config.yml # 压缩配置文件
1291
- ├── infer.py # 支持 CLUE 分类、CLUE CMRC2018、MSRA_NER 任务的预测脚本
1293
+ ├── utils.py # 训练工具脚本
1294
+ ├── configs # 压缩配置文件夹
1295
+ │ └── default.yml # 默认配置文件
1292
1296
├── deploy # 部署目录
1293
- │ └── python
1294
- │ └── ernie_predictor.py
1297
+ │ └── predictor # onnx离线部署
1295
1298
│ └── infer_cpu.py
1296
1299
│ └── infer_gpu.py
1297
1300
│ └── README.md
1298
- │ └── serving
1299
- │ └── seq_cls_rpc_client.py
1300
- │ └── seq_cls_service.py
1301
- │ └── seq_cls_config.yml
1302
- │ └── token_cls_rpc_client.py
1303
- │ └── token_cls_service.py
1304
- │ └── token_cls_config.yml
1301
+ │ └── requirements_cpu.txt
1302
+ │ └── requirements_gpu.txt
1303
+ │ └── simple_serving # 基于PaddleNLP SimpleServing 服务化部署
1304
+ │ └── client_qa.py
1305
+ │ └── client_seq_cls.py
1306
+ │ └── client_token_cls.py
1305
1307
│ └── README.md
1306
- │ └── paddle2onnx
1307
- │ └── ernie_predictor.py
1308
- │ └── infer.py
1308
+ │ └── server_qa.py
1309
+ │ └── server_seq_cls.py
1310
+ │ └── server_token_cls.py
1311
+ │ └── triton_serving # 基于Triton Serving 服务化部署
1312
+ │ └── models
1309
1313
│ └── README.md
1310
- └── README.md # 文档,本文件
1314
+ │ └── seq_cls_grpc_client.py
1315
+ │ └── token_cls_grpc_client.py
1316
+ └── README.md # 文档
1311
1317
1312
- ```
1318
+ <a name="开始运行"></a>
1319
+ ## 开始运行
1320
+ 下面提供以CLUE数据集进行模型微调相关训练、预测、部署的代码, CLUE数据集是中文语言理解测评基准数据集,包括了文本分类、文本推理、实体抽取、问答等相关数据集。
1313
1321
1314
- <a name =" 微调 " ></a >
1322
+ ### 环境要求
1323
+ - python >= 3.7
1324
+ - paddlepaddle >= 2.3
1325
+ - paddlenlp >= 2.4
1326
+ - paddleslim >= 2.4
1315
1327
1316
- ## 微调
1328
+ ### 数据准备
1329
+ 此次微调数据主要是以CLUE benchmark 数据集为主, CLUE benchmark 包括了文本分类、实体抽取、问答三大类数据集,而 CLUE benchmark 数据目前已经集成在PaddleNLP的datasets里面,可以通过下面的方式来使用数据集
1330
+
1331
+ ```python
1332
+ from paddlenlp.datasets import load_dataset
1333
+
1334
+ # Load the clue Tnews dataset
1335
+ train_ds, test_ds = load_dataset('clue', 'tnews', splits=('train', 'test'))
1336
+
1337
+ ```
1317
1338
1318
- ERNIE 3.0 发布的预训练模型还不能直接在下游任务上直接使用,需要使用具体任务上的数据对预训练模型进行微调。
1339
+ <a name =" 模型训练 " ></a >
1340
+ ## 模型训练
1319
1341
1320
1342
使用 PaddleNLP 只需要一行代码可以拿到 ERNIE 3.0 系列模型,之后可以在自己的下游数据下进行微调,从而获得具体任务上效果更好的模型。
1321
1343
@@ -1341,33 +1363,31 @@ qa_model = AutoModelForQuestionAnswering.from_pretrained("ernie-3.0-medium-zh")
1341
1363
``` shell
1342
1364
# 分类任务
1343
1365
# 该脚本共支持 CLUE 中 7 个分类任务,超参不全相同,因此分类任务中的超参配置利用 config.yml 配置
1344
- python run_seq_cls.py \
1345
- --task_name tnews \
1346
- --model_name_or_path ernie-3.0-medium-zh \
1347
- --do_train
1366
+ python run_seq_cls.py --model_name_or_path ernie-3.0-medium-zh --dataset afqmc --output_dir ./best_models --export_model_dir best_models/ --do_train --do_eval --do_export --config=configs/default.yml
1367
+
1368
+ # 序列标注任务
1369
+ 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
1370
+
1371
+ # 阅读理解任务
1372
+ 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
1373
+ ```
1374
+
1375
+ <a name =" 模型预测 " ></a >
1376
+ ## 模型预测
1377
+
1378
+ ``` shell
1379
+ # 分类任务
1380
+ # 该脚本共支持 CLUE 中 7 个分类任务,超参不全相同,因此分类任务中的超参配置利用 config.yml 配置
1381
+ python run_seq_cls.py --model_name_or_path best_models/afqmc/ --dataset afqmc --output_dir ./best_models --do_predict --config=configs/default.yml
1348
1382
1349
1383
# 序列标注任务
1350
- python run_token_cls.py \
1351
- --task_name msra_ner \
1352
- --model_name_or_path ernie-3.0-medium-zh \
1353
- --do_train \
1354
- --num_train_epochs 3 \
1355
- --learning_rate 0.00005 \
1356
- --save_steps 100 \
1357
- --batch_size 32 \
1358
- --max_seq_length 128 \
1359
- --remove_unused_columns False
1384
+ python run_token_cls.py --model_name_or_path best_models/msra_ner/ --dataset msra_ner --output_dir ./best_models --do_predict --config=configs/default.yml
1360
1385
1361
1386
# 阅读理解任务
1362
- python run_qa.py \
1363
- --model_name_or_path ernie-3.0-medium-zh \
1364
- --do_train \
1365
- --learning_rate 0.00003 \
1366
- --num_train_epochs 8 \
1367
- --batch_size 24 \
1368
- --max_seq_length 512
1387
+ python run_qa.py --model_name_or_path best_models/cmrc2018/ --dataset cmrc2018 --output_dir ./best_models --do_predict --config=configs/default.yml
1369
1388
```
1370
1389
1390
+
1371
1391
<a name =" 模型压缩 " ></a >
1372
1392
1373
1393
## 模型压缩
@@ -1405,73 +1425,23 @@ trainer = Trainer(
1405
1425
trainer.compress()
1406
1426
1407
1427
```
1408
- 使用压缩 API 基于 Trainer 需要先初始化一个 Trainer 实例,然后调用 ` compress() ` 启动压缩。
1409
-
1410
- 假设上述代码位于脚本 compress.py 中,可这样调用:
1411
-
1412
- ``` shell
1413
- python compress.py \
1414
- --dataset " clue cluewsc2020" \
1415
- --model_name_or_path best_models/CLUEWSC2020 \
1416
- --output_dir ./compress_models \
1417
- --per_device_train_batch_size 32 \
1418
- --per_device_eval_batch_size 32 \
1419
- --width_mult_list 0.75 \
1420
- --batch_size_list 4 8 16 \
1421
- --batch_num_list 1 \
1422
- ```
1423
-
1424
- 可以通过传入命令行参数来控制模型压缩的一些超参数,压缩 API 可以传入的超参数可参考[ 文档] ( ../../docs/compression.md ) 。
1428
+ 压缩 API 可以传入的超参数可参考[ 文档] ( ../../docs/compression.md ) 。
1425
1429
1426
1430
本项目提供了压缩 API 在分类(包含文本分类、文本匹配、自然语言推理、代词消歧等任务)、序列标注、阅读理解三大场景下的使用样例,可以分别参考 ` compress_seq_cls.py ` 、` compress_token_cls.py ` 、` compress_qa.py ` ,启动方式如下:
1427
1431
1428
1432
``` shell
1429
1433
# 分类任务
1430
- # 该脚本共支持 CLUE 中 7 个分类任务,超参不全相同,因此分类任务中的超参配置利用 config.yml 配置
1431
- python compress_seq_cls.py \
1432
- --dataset " clue tnews" \
1433
- --model_name_or_path best_models/TNEWS \
1434
- --output_dir ./
1434
+ # 该脚本共支持 CLUE 中 7 个分类任务,超参不全相同,因此分类任务中的超参配置利用 configs/defalut.yml 配置
1435
+ python compress_seq_cls.py --model_name_or_path best_models/afqmc/ --dataset afqmc --output_dir ./best_models/afqmc --config=configs/default.yml
1435
1436
1436
1437
# 序列标注任务
1437
- python compress_token_cls.py \
1438
- --dataset " msra_ner" \
1439
- --model_name_or_path best_models/MSRA_NER \
1440
- --output_dir ./ \
1441
- --max_seq_length 128 \
1442
- --per_device_train_batch_size 32 \
1443
- --per_device_eval_batch_size 32 \
1444
- --learning_rate 0.00005 \
1445
- --remove_unused_columns False \
1446
- --num_train_epochs 3
1438
+ python compress_token_cls.py --model_name_or_path best_models/msra_ner/ --dataset msra_ner --output_dir ./best_models/msra_ner --config=configs/default.yml
1447
1439
1448
1440
# 阅读理解任务
1449
- python compress_qa.py \
1450
- --dataset " clue cmrc2018" \
1451
- --model_name_or_path best_models/CMRC2018 \
1452
- --output_dir ./ \
1453
- --max_answer_length 50 \
1454
- --max_seq_length 512 \
1455
- --learning_rate 0.00003 \
1456
- --num_train_epochs 8 \
1457
- --per_device_train_batch_size 24 \
1458
- --per_device_eval_batch_size 24 \
1441
+ python compress_qa.py --model_name_or_path best_models/cmrc2018/ --dataset cmrc2018 --output_dir ./best_models/cmrc2018 --config=configs/default.yml
1459
1442
1460
1443
```
1461
1444
1462
- 一行代码验证上面模型压缩后模型的精度:
1463
-
1464
- ``` shell
1465
- # 原模型
1466
- python infer.py --task_name tnews --model_path best_models/TNEWS/compress/inference/infer --use_trt
1467
- # 裁剪后
1468
- python infer.py --task_name tnews --model_path best_models/TNEWS/compress/0.75/float --use_trt
1469
- # 量化后
1470
- python infer.py --task_name tnews --model_path best_models/TNEWS/compress/0.75/hist16/int8 --use_trt --precision int8
1471
-
1472
- ```
1473
- 其中 --model_path 参数需要传入静态图模型的路径和前缀名。
1474
-
1475
1445
1476
1446
<a name =" 压缩效果 " ></a >
1477
1447
@@ -1599,30 +1569,18 @@ AutoTokenizer.from_pretrained("ernie-3.0-medium-zh", use_fast=True)
1599
1569
1600
1570
### Python 部署
1601
1571
1602
- Python部署请参考:[ Python 部署指南] ( ./deploy/python /README.md )
1572
+ Python部署请参考:[ Python 部署指南] ( ./deploy/predictor /README.md )
1603
1573
1604
1574
<a name =" 服务化部署 " ></a >
1605
1575
1606
1576
### 服务化部署
1607
1577
1608
- - [ Triton Inference Server 服务化部署指南] ( ./deploy/triton/README.md )
1609
- - [ Paddle Serving 服务化部署指南] ( ./deploy/serving/README.md )
1610
-
1611
- <a name =" Paddle2ONNX部署 " ></a >
1612
-
1613
- ### Paddle2ONNX 部署
1614
-
1615
- ONNX 导出及 ONNXRuntime 部署请参考:[ ONNX 导出及 ONNXRuntime 部署指南] ( ./deploy/paddle2onnx/README.md )
1616
-
1617
-
1618
- ### Paddle Lite 移动端部署
1619
-
1620
- 即将支持,敬请期待
1578
+ - [ Triton Inference Server 服务化部署指南] ( ./deploy/triton_serving/README.md )
1579
+ - [ PaddleNLp SimpleServing 服务化部署指南] ( ./deploy/simple_serving/README.md )
1621
1580
1622
1581
1623
1582
<a name =" 参考文献 " ></a >
1624
1583
1625
-
1626
1584
## Notebook教程
1627
1585
1628
1586
- [ 【快速上手ERNIE 3.0】中文情感分析实战] ( https://aistudio.baidu.com/aistudio/projectdetail/3955163 )
0 commit comments