README.md 11.9 KB
Newer Older
M
Meiyim 已提交
1
[English](./README.eng.md)|简体中文
Y
Yibing Liu 已提交
2

M
Meiyim 已提交
3
![./.metas/ERNIE_milestone.png](./.metas/ERNIE_milestone.png)
C
chenxuyi 已提交
4

M
Meiyim 已提交
5
**提醒: ERNIE老版本代码已经迁移至[repro分支](https://github.com/PaddlePaddle/ERNIE/tree/repro),欢迎使用我们全新升级的基于动静结合的新版ERNIE套件进行开发。另外,也欢迎上[EasyDL](https://ai.baidu.com/easydl/pro)体验更丰富的功能(如ERNIE 2.0、ERNIE 2.1、ERNIE领域模型等)。**
T
tianxin 已提交
6

M
Meiyim 已提交
7
ERNIE是百度开创性提出的基于知识增强的持续学习语义理解框架,该框架将大数据预训练与多源丰富知识相结合,通过持续学习技术,不断吸收海量文本数据中词汇、结构、语义等方面的知识,实现模型效果不断进化。ERNIE在情感分析、文本匹配、自然语言推理、词法分析、阅读理解、智能问答等16个公开数据集上全面显著超越世界领先技术,在国际权威的通用语言理解评估基准GLUE上,得分首次突破90分,获得全球第一。在今年3月落下帷幕的全球最大语义评测SemEval 2020上,ERNIE摘得5项世界冠军, 该技术也被全球顶级科技商业杂志《麻省理工科技评论》官方网站报道,相关创新成果也被国际顶级学术会议AAAI、IJCAI收录。ERNIE在工业界得到了大规模应用,如搜索引擎、新闻推荐、广告系统、语音交互、智能客服等。
T
tianxin 已提交
8

M
Meiyim 已提交
9
# 新闻
T
tianxin 已提交
10

M
Meiyim 已提交
11 12 13 14 15 16 17 18 19 20 21 22 23 24
- 2020.5.20: 欢迎试用`动态图`实现的 ERNIE:
    - 基于[PaddlePaddle v1.8](https://github.com/PaddlePaddle/Paddle/tree/release/1.8)使用 ERNIE 进行 Pretrain 和 Finetune.
    - 动态执行, 所见即所得。
    - 大规模分布式训练。
    - 易于部署。
    - 通过Aistudio 教程快速入门NLP。
    - 向后兼容老版 checkpoint。
    - 发布目前效果最佳的生成预训练模型 **[ERNIE-GEN](https://github.com/PaddlePaddle/ERNIE/tree/repro/ernie-gen)** base/large/large-160G 版本,ERNIE能力扩展至文本生成任务。
- 2020.4.30 发布[ERNIESage](https://github.com/PaddlePaddle/PGL/tree/master/examples/erniesage), 一种新型图神经网络模型,采用ERNIE做为aggreagtor. 由[PGL](https://github.com/PaddlePaddle/PGL)实现。
- 2020.3.27 [在SemEval2020五项子任务上夺冠](https://www.jiqizhixin.com/articles/2020-03-27-8)
- 2019.12.26 [GLUE榜第一名](https://www.technologyreview.com/2019/12/26/131372/ai-baidu-ernie-google-bert-natural-language-glue/)
- 2019.11.6 发布[ERNIE Tiny](https://www.jiqizhixin.com/articles/2019-11-06-9)
- 2019.7.7 发布[ERNIE 2.0](https://www.jiqizhixin.com/articles/2019-07-31-10)
- 2019.3.16 发布[ERNIE 1.0](https://www.jiqizhixin.com/articles/2019-03-16-3)
T
tianxin 已提交
25

L
liyukun01 已提交
26

M
Meiyim 已提交
27
# 导航
L
liyukun01 已提交
28

M
Meiyim 已提交
29 30 31 32 33 34
* [教程](#教程)
* [安装](#安装)
* [Fine-tuning任务](#fine-tuning-任务)
* [预训练(ERNIE 1.0)](#预训练-ernie-10)
* [在线预测](#在线预测)
* [蒸馏](#蒸馏)
T
tianxin 已提交
35

M
Meiyim 已提交
36 37 38 39 40 41
# 快速上手
```python
import numpy as np
import paddle.fluid.dygraph as D
from ernie.tokenizing_ernie import ErnieTokenizer
from ernie.modeling_ernie import ErnieModel
T
tianxin 已提交
42

M
Meiyim 已提交
43
D.guard().__enter__() # activate paddle `dygrpah` mode
T
tianxin 已提交
44

M
Meiyim 已提交
45 46
model = ErnieModel.from_pretrained('ernie-1.0')    # Try to get pretrained model from server, make sure you have network connection
tokenizer = ErnieTokenizer.from_pretrained('ernie-1.0')
T
tianxin 已提交
47

M
Meiyim 已提交
48 49 50 51
ids, _ = tokenizer.encode('hello world')
ids = D.to_variable(np.expand_dims(ids, 0))  # insert extra `batch` dimension
pooled, encoded = model(ids)                 # eager execution
print(pooled.numpy())                        # convert  results to numpy
T
tianxin 已提交
52 53 54

```

M
Meiyim 已提交
55
# 教程
T
tianxin 已提交
56

M
Meiyim 已提交
57 58
手边没有GPU?欢迎在[AIStudio](https://aistudio.baidu.com/aistudio/index)中直接试用 ERNIE. 
(请选择最新版本的教程并申请GPU运行环境)
T
tianxin 已提交
59

M
Meiyim 已提交
60 61 62 63 64
1. [从0开始学ERNIE](https://aistudio.baidu.com/aistudio/projectdetail/266623)
1. [情感识别](https://aistudio.baidu.com/aistudio/projectdetail/427482)
2. [完形填空](https://aistudio.baidu.com/aistudio/projectdetail/433491)
3. [知识蒸馏](https://aistudio.baidu.com/aistudio/projectdetail/439460)
4. [万事不决问ERNIE](https://aistudio.baidu.com/aistudio/projectdetail/456443)
T
tianxin 已提交
65

M
Meiyim 已提交
66
# 安装
T
tianxin 已提交
67

M
Meiyim 已提交
68
##### 1. 安装 ERNIE
T
tianxin 已提交
69 70


M
Meiyim 已提交
71 72
```script
pip install paddle-ernie==0.0.1.dev1
T
tianxin 已提交
73 74
```

M
Meiyim 已提交
75
或者
C
chenxuyi 已提交
76

M
Meiyim 已提交
77 78 79 80 81
```shell
git clone -b dygraph https://github.com/PaddlePaddle/ERNIE.git --single-branch
cd ERNIE
pip install -r requirement.txt
pip setup.py -e .
T
tianxin 已提交
82

C
chenxuyi 已提交
83
```
T
tianxin 已提交
84

M
Meiyim 已提交
85
##### 3. 下载预训练模型(可选)
T
tianxin 已提交
86 87


M
Meiyim 已提交
88
| Model                                              | Description                                                  |
T
tianxin 已提交
89
| :------------------------------------------------- | :----------------------------------------------------------- |
M
Meiyim 已提交
90 91 92 93 94 95
| [ERNIE 1.0 Base 中文](https://ernie-github.cdn.bcebos.com/model-ernie1.0.1.tar.gz)           | L12H768A12  |
| [ERNIE Tiny](https://ernie-github.cdn.bcebos.com/model-ernie_tiny.1.tar.gz)                 | L3H1024A16      |
| [ERNIE 2.0 Base 英文](https://ernie-github.cdn.bcebos.com/model-ernie2.0-en.1.tar.gz)        | base: L12H768A12  |
| [ERNIE 2.0 Large 英文](https://ernie-github.cdn.bcebos.com/model-ernie2.0-large-en.1.tar.gz) | large: L24H1024A16|
| [ERNIE Gen base 英文](https://ernie-github.cdn.bcebos.com/model-ernie-gen-base-en.1.tar.gz)  | L12H768A12  |
| [ERNIE Gen Large 英文](https://ernie-github.cdn.bcebos.com/model-ernie-gen-large-en.1.tar.gz)| L24H1024A16 |
T
tianxin 已提交
96

M
Meiyim 已提交
97
##### 4. 下载数据集
T
tianxin 已提交
98 99


M
Meiyim 已提交
100
**英文数据集**
T
tianxin 已提交
101

M
Meiyim 已提交
102
运行[](https://gist.github.com/W4ngatang/60c2bdb54d156a41194446737ce03e2e)脚本,下载[GLUE datasets](https://gluebenchmark.com/tasks).
T
tianxin 已提交
103

M
Meiyim 已提交
104
请将数据目录整理成以下格式,方便在后续 demo 教程中使用(通过`--data_dir`参数将数据路径传入训练脚本);
T
tianxin 已提交
105

M
Meiyim 已提交
106 107 108 109 110 111 112 113
```shell
data/xnli
├── dev
│   └── 1
├── test
│   └── 1
└── train
    └── 1
T
tianxin 已提交
114 115
```

M
Meiyim 已提交
116
[示例](https://ernie-github.cdn.bcebos.com/data-mnli-m.tar.gz)数据(MNLI任务测试、训练集合)。
T
tianxin 已提交
117 118


M
Meiyim 已提交
119
**中文数据**
T
tianxin 已提交
120

M
Meiyim 已提交
121 122 123 124 125 126 127
| 数据集|描述|
|:--------|:----------|
| [XNLI](https://ernie-github.cdn.bcebos.com/data-xnli.tar.gz)                 |XNLI 是由 Facebook 和纽约大学的研究者联合构建的自然语言推断数据集,包括 15 种语言的数据。我们用其中的中文数据来评估模型的语言理解能力。[链接](https://github.com/facebookresearch/XNLI)|
| [ChnSentiCorp](https://ernie-github.cdn.bcebos.com/data-chnsenticorp.tar.gz) |ChnSentiCorp 是一个中文情感分析数据集,包含酒店、笔记本电脑和书籍的网购评论。|
| [MSRA-NER](https://ernie-github.cdn.bcebos.com/data-msra_ner.tar.gz)         |MSRA-NER (SIGHAN2006) 数据集由微软亚研院发布,其目标是识别文本中具有特定意义的实体,包括人名、地名、机构名。|
| [NLPCC2016-DBQA](https://ernie-github.cdn.bcebos.com/data-dbqa.tar.gz)       |NLPCC2016-DBQA 是由国际自然语言处理和中文计算会议 NLPCC 于 2016 年举办的评测任务,其目标是从候选中找到合适的文档作为问题的答案。[链接](http://tcci.ccf.org.cn/conference/2016/dldoc/evagline2.pdf)|
|[CMRC2018](https://ernie-github.cdn.bcebos.com/data-cmrc2018.tar.gz)|CMRC2018 是中文信息学会举办的评测,评测的任务是抽取类阅读理解。[链接](https://github.com/ymcui/cmrc2018)
T
tianxin 已提交
128 129


M
Meiyim 已提交
130
# Fine-tuning 任务
T
tianxin 已提交
131

M
Meiyim 已提交
132
- 使用 `动态图` 模型进行finetune:
T
tianxin 已提交
133

M
Meiyim 已提交
134 135 136 137
```script
python3 ./demo/finetune_classifier_dygraph.py \
    --from_pretrained ernie_1.0 \
    --data_dir ./data/xnli
T
tianxin 已提交
138 139
```

M
Meiyim 已提交
140
- 分布式 finetune
T
tianxin 已提交
141

M
Meiyim 已提交
142
`paddle.distributed.launch` 是一个进程管理器,我们采用它在每一张GPU上启动一个python进程,并配置相应的环境变量以进行分布式训练:
T
tianxin 已提交
143

M
Meiyim 已提交
144 145
当采用分布式训练时,我们采用`max_steps`做为终止条件而非`epoch`, 这样处理是为了避免进程间死锁。
另外值得注意的是训练集需要在不同的进程间进行切分;以避免所有进程训练同一份数据造成的过拟合。
T
tianxin 已提交
146

M
Meiyim 已提交
147
示例脚本(请确保你有两张以上GPU卡):
T
tianxin 已提交
148

M
Meiyim 已提交
149 150 151 152 153 154
```script
python3 -m paddle.distributed.launch \
./demo/finetune_classifier_dygraph_distributed.py \
    --data_dir data/mnli \
    --max_steps 10000 \
    --from_pretrained ernie2.0-en
T
tianxin 已提交
155 156 157
```


M
Meiyim 已提交
158
更多示例脚本:
T
tianxin 已提交
159

M
Meiyim 已提交
160 161 162 163 164
1. [情感分析](./demo/finetune_sentiment_analysis_dygraph.py)
1. [语义匹配](./demo/finetune_classifier_dygraph.py)
1. [命名实体识别(NER)](./demo/finetune_ner_dygraph.py)
1. [机器阅读理解](./demo/finetune_mrc_dygraph.py)
1. [文本摘要生成](./experimental/seq2seq/README.md)
T
tianxin 已提交
165 166


M
Meiyim 已提交
167
**推荐超参数设置:**
T
tianxin 已提交
168

M
Meiyim 已提交
169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187
|任务|batch size|learning rate|
|--|--|--|
| CoLA         | 32 / 64 (base)  | 3e-5                     |
| SST-2       
 | 64 / 256 (base) | 2e-5                     |
| STS-B        | 128             | 5e-5                     |
| QQP          | 256             | 3e-5(base)/5e-5(large)   |
| MNLI         | 256 / 512 (base)| 3e-5                     |
| QNLI         | 256             | 2e-5                     |
| RTE          | 16 / 4 (base)   | 2e-5(base)/3e-5(large)   |
| MRPC         | 16 / 32 (base)  | 3e-5                     |
| WNLI         | 8               | 2e-5                     |
| XNLI         | 512             | 1e-4(base)/4e-5(large)   |
| CMRC2018     | 64              | 3e-5                     |
| DRCD         | 64              | 5e-5(base)/3e-5(large)   |
| MSRA-NER(SIGHAN2006)  | 16     | 5e-5(base)/1e-5(large)   |
| ChnSentiCorp | 24              | 5e-5(base)/1e-5(large)   |
| LCQMC        | 32              | 2e-5(base)/5e-6(large)   |
| NLPCC2016-DBQA| 64             | 2e-5(base)/1e-5(large)   |
T
tianxin 已提交
188

M
Meiyim 已提交
189
# 预训练 (ERNIE 1.0)
T
tianxin 已提交
190

M
Meiyim 已提交
191
请见[这里](./demo/pretrain/README.md)
T
tianxin 已提交
192

M
Meiyim 已提交
193
# 在线预测
T
tianxin 已提交
194

M
Meiyim 已提交
195
如果`finetune_classifier_dygraph.py`中指定了`--inference_model_dir`参数,funetune脚本会将你的模型序列化并产出可以直接部署线上预测的`inference_model`.
T
tianxin 已提交
196

M
Meiyim 已提交
197 198
关于生产环境中使用线上预测代码的实现细节,请见[C++ inference API](./inference/README.md).
或者你可以使用`propeller`启动一个多GPU预测服务(需要GPU环境),只需执行:
T
tianxin 已提交
199

M
Meiyim 已提交
200 201
```shell
python -m propeller.tools.start_server -m /path/to/saved/inference_model  -p 8881
T
tianxin 已提交
202 203
```

M
Meiyim 已提交
204
即可启动预测服务;随后在Python端采用如下命令访问该服务(仅限 python3):
T
tianxin 已提交
205

M
Meiyim 已提交
206 207 208
```python
from propeller.service.client import InferenceClient
from ernie.tokenizing_ernie import ErnieTokenizer
T
tianxin 已提交
209

M
Meiyim 已提交
210 211 212 213 214 215
client = InferenceClient('tcp://localhost:8881')
tokenizer = ErnieTokenizer.from_pretrained('ernie-1.0')
ids, sids = tokenizer.encode('hello world')
ids = np.expand_dims(ids, 0)
sids = np.expand_dims(sids, 0)
result = client(ids, sids)
T
tianxin 已提交
216 217
```

M
Meiyim 已提交
218 219 220
你也可从[此处]((https://ernie.bj.bcebos.com/ernie1.0_zh_inference_model.tar.gz).)下载一个预先制作好的ernie-1.0 base模型的 `inference_model`.
该模型没有经过finetune,一般可以用做上层模型结构的 feature-base finetune或者做为一个文本特征抽取器。
因为该模行由老版API 产出,在进行客户端请求时需要在输入tensor后面追加一个维度:
T
tianxin 已提交
221

M
Meiyim 已提交
222 223
```python3
ids = np.expand_dims(ids, -1) # ids.shape==[BATCH, SEQLEN, 1]
T
tianxin 已提交
224 225
```

M
Meiyim 已提交
226
# 蒸馏
T
tianxin 已提交
227

M
Meiyim 已提交
228
知识蒸馏是进行ERNIE模型压缩、加速的有效方式;关于知识蒸馏的实现细节请参见[这里](./distill/README.md)
T
tianxin 已提交
229

M
Meiyim 已提交
230
### 引用
T
tianxin 已提交
231

M
Meiyim 已提交
232
[ERNIE 2.0](https://arxiv.org/abs/1907.12412)
T
tianxin 已提交
233
```
M
Meiyim 已提交
234 235 236 237
@article{SunERNIE,
  title={ERNIE 2.0: A Continual Pre-training Framework for Language Understanding},
  author={Sun, Yu and Wang, Shuohuan and Li, Yukun and Feng, Shikun and Tian, Hao and Wu, Hua and Wang, Haifeng},
}
T
tianxin 已提交
238 239
```

M
Meiyim 已提交
240
[ERNIE Gen](https://arxiv.org/abs/2001.11314)
T
tianxin 已提交
241 242

```
M
Meiyim 已提交
243 244 245 246 247
@article{Xiao2020ERNIE,
  title={ERNIE-GEN: An Enhanced Multi-Flow Pre-training and Fine-tuning Framework for Natural Language Generation},
  author={Xiao, Dongling and Zhang, Han and Li, Yukun and Sun, Yu and Tian, Hao and Wu, Hua and Wang, Haifeng},
  year={2020},
}
T
tianxin 已提交
248 249
```

M
Meiyim 已提交
250
若希望复现 paper 中的所有实验,请切换至本repo的`repro`分支。
T
tianxin 已提交
251

M
Meiyim 已提交
252
### 讨论组
T
tianxin 已提交
253

M
Meiyim 已提交
254 255 256
- [Github Issues](https://github.com/PaddlePaddle/ERNIE/issues): bug reports, feature requests, install issues, usage issues, etc.
- QQ 群: 760439550 (ERNIE discussion group).
- [Forums](http://ai.baidu.com/forum/topic/list/168?pageNo=1): discuss implementations, research, etc.
C
chenxuyi 已提交
257