# ERNIE 3.0 轻量级模型
**目录**
* [模型介绍](#模型介绍)
* [在线蒸馏技术](#在线蒸馏技术)
* [模型效果](#模型效果)
* [开始运行](#开始运行)
* [环境要求](#环境要求)
* [数据准备](#数据准备)
* [模型训练](#模型训练)
* [模型预测](#模型预测)
* [模型压缩](#模型压缩)
* [环境依赖](#环境依赖)
* [模型压缩 API 使用](#模型压缩API使用)
* [压缩效果](#压缩效果)
* [精度测试](#精度测试)
* [性能测试](#性能测试)
* [CPU 性能](#CPU性能)
* [GPU 性能](#CPU性能)
* [使用 FastTokenizer 加速](#使用FastTokenizer加速)
* [部署](#部署)
* [Python 部署](#Python部署)
* [服务化部署](#服务化部署)
* [Notebook教程](#Notebook教程)
* [参考文献](#参考文献)
<a name="模型介绍"></a>
## 模型介绍
本次开源的模型是在文心大模型ERNIE 3.0, 文心大模型ERNIE 3.0 作为百亿参数知识增强的大模型,除了从海量文本数据中学习词汇、结构、语义等知识外,还从大规模知识图谱中学习。 基础上通过**在线蒸馏技术**得到的轻量级模型,模型结构与 ERNIE 2.0 保持一致,相比 ERNIE 2.0 具有更强的中文效果。
相关技术详解可参考文章[《解析全球最大中文单体模型鹏城-百度·文心技术细节》](https://www.jiqizhixin.com/articles/2021-12-08-9)
### 在线蒸馏技术
在线蒸馏技术在模型学习的过程中周期性地将知识信号传递给若干个学生模型同时训练,从而在蒸馏阶段一次性产出多种尺寸的学生模型。相对传统蒸馏技术,该技术极大节省了因大模型额外蒸馏计算以及多个学生的重复知识传递带来的算力消耗。
这种新颖的蒸馏方式利用了文心大模型的规模优势,在蒸馏完成后保证了学生模型的效果和尺寸丰富性,方便不同性能需求的应用场景使用。此外,由于文心大模型的模型尺寸与学生模型差距巨大,模型蒸馏难度极大甚至容易失效。为此,通过引入了助教模型进行蒸馏的技术,利用助教作为知识传递的桥梁以缩短学生模型和大模型表达空间相距过大的问题,从而促进蒸馏效率的提升。
更多技术细节可以参考论文:
- [ERNIE-Tiny: A Progressive Distillation Framework for Pretrained Transformer Compression](https://arxiv.org/abs/2106.02241)
- [ERNIE 3.0 Titan: Exploring Larger-scale Knowledge Enhanced Pre-training for Language Understanding and Generation](https://arxiv.org/abs/2112.12731)
<p align="center">
<img width="644" alt="image" src="https://user-images.githubusercontent.com/1371212/168516904-3fff73e0-010d-4bef-adc1-4d7c97a9c6ff.png" title="ERNIE 3.0 Online Distillation">
</p>
<a name="模型效果"></a>
### 模型效果
本项目开源 **ERNIE 3.0 _Base_** 、**ERNIE 3.0 _Medium_** 、 **ERNIE 3.0 _Mini_** 、 **ERNIE 3.0 _Micro_** 、 **ERNIE 3.0 _Nano_** 五个模型:
- [**ERNIE 3.0-_Base_**](https://bj.bcebos.com/paddlenlp/models/transformers/ernie_3.0/ernie_3.0_base_zh.pdparams) (_12-layer, 768-hidden, 12-heads_)
- [**ERNIE 3.0-_Medium_**](https://bj.bcebos.com/paddlenlp/models/transformers/ernie_3.0/ernie_3.0_medium_zh.pdparams) (_6-layer, 768-hidden, 12-heads_)
- [**ERNIE 3.0-_Mini_**](https://bj.bcebos.com/paddlenlp/models/transformers/ernie_3.0/ernie_3.0_mini_zh.pdparams) (_6-layer, 384-hidden, 12-heads_)
- [**ERNIE 3.0-_Micro_**](https://bj.bcebos.com/paddlenlp/models/transformers/ernie_3.0/ernie_3.0_micro_zh.pdparams) (_4-layer, 384-hidden, 12-heads_)
- [**ERNIE 3.0-_Nano_**](https://bj.bcebos.com/paddlenlp/models/transformers/ernie_3.0/ernie_3.0_nano_zh.pdparams) (_4-layer, 312-hidden, 12-heads_)
下面是 PaddleNLP 中轻量级中文模型的**效果-时延图**。横坐标表示在 IFLYTEK 数据集 (最大序列长度设置为 128) 上测试的延迟(latency,单位:ms),纵坐标是 CLUE 10 个任务上的平均精度(包含文本分类、文本匹配、自然语言推理、代词消歧、阅读理解等任务),其中 CMRC2018 阅读理解任务的评价指标是 Exact Match(EM),其他任务的评价指标均是 Accuracy。图中越靠**左上**的模型,精度和性能水平越高。
图中模型名下方标注了模型的参数量,测试环境见[性能测试](#性能测试)。
batch_size=32 时,CPU 下的效果-时延图(线程数 1 和 8):
<table>
<tr>
<td><a><img src="https://user-images.githubusercontent.com/26483581/175852121-2798b5c9-d122-4ac0-b4c8-da46b89b5512.png"></a></td>
<td><a><img src="https://user-images.githubusercontent.com/26483581/175852129-bbe58835-8eec-45d5-a4a9-cc2cf9a3db6a.png"></a></td>
</tr>
</table>
batch_size=1 时,CPU 下的效果-时延图(线程数 1 和 8):
<table>
<tr>
<td><a><img src="https://user-images.githubusercontent.com/26483581/175852106-658e18e7-705b-4f53-bad0-027281163ae3.png"></a></td>
<td><a><img src="https://user-images.githubusercontent.com/26483581/175852112-4b89d675-7c95-4d75-84b6-db5a6ea95e2c.png"></a></td>
</tr>
</table>
batch_size=32 和 1,预测精度为 FP16 时,GPU 下的效果-时延图:
<table>
<tr>
<td><a><img src="https://user-images.githubusercontent.com/26483581/175854679-3247f42e-8716-4a36-b5c6-9ce4661b36c7.png"></a></td>
<td><a><img src="https://user-images.githubusercontent.com/26483581/175854670-57878b34-c213-47ac-b620-aaaec082f435.png"></a></td>
</tr>
</table>
从图上可看出,ERNIE 3.0 系列轻量级模型在精度和性能上的综合表现已全面领先于 UER-py、Huawei-Noah 以及 HFL 的中文模型。且当 batch_size=1、预测精度为 FP16 时,在 GPU 上宽且浅的模型的推理性能更有优势。
在 CLUE **验证集**上评测指标如下表所示:
<table style="width:100%;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td style="text-align:center;vertical-align:middle">
<span style="font-size:18px;">Arch</span>
</td>
<td style="text-align:center">
<span style="font-size:18px;">Model</span>
</td>
<td style="text-align:center">
<span style="font-size:18px;">AVG</span>
</td>
<td style="text-align:center">
<span style="font-size:18px;">AFQMC</span>
</td>
<td style="text-align:center;">
<span style="font-size:18px;">TNEWS</span>
</td>
<td style="text-align:center;">
<span style="font-size:18px;">IFLYTEK</span>
</td>
<td style="text-align:center;">
<span style="font-size:18px;">CMNLI</span>
</td>
<td style="text-align:center;">
<span style="font-size:18px;">OCNLI</span>
</td>
<td style="text-align:center;">
<span style="font-size:18px;">CLUEWSC2020</span>
</td>
<td style="text-align:center;">
<span style="font-size:18px;">CSL</span>
</td>
<td style="text-align:center;">
<span style="font-size:18px;">CMRC2018</span>
</td>
<td style="text-align:center;">
<span style="font-size:18px;">CHID</span>
</td>
<td style="text-align:center;">
<span style="font-size:18px;">C<sup>3</sup></span>
</td>
</tr>
<tr>
<td rowspan=3 align=center> 24L1024H </td>
<td style="text-align:center">
<span style="font-size:18px">ERNIE 1.0-Large-cw</span>
</td>
<td style="text-align:center">
<span style=