A pretrained NLP model for every NLP tasks
Project description
English|简体中文
ERNIE是百度开创性提出的基于知识增强的持续学习语义理解框架,该框架将大数据预训练与多源丰富知识相结合,通过持续学习技术,不断吸收海量文本数据中词汇、结构、语义等方面的知识,实现模型效果不断进化。ERNIE在情感分析、文本匹配、自然语言推理、词法分析、阅读理解、智能问答等16个公开数据集上全面显著超越世界领先技术,在国际权威的通用语言理解评估基准GLUE上,得分首次突破90分,获得全球第一。在今年3月落下帷幕的全球最大语义评测SemEval 2020上,ERNIE摘得5项世界冠军, 该技术也被全球顶级科技商业杂志《麻省理工科技评论》官方网站报道,相关创新成果也被国际顶级学术会议AAAI、IJCAI收录。ERNIE在工业界得到了大规模应用,如搜索引擎、新闻推荐、广告系统、语音交互、智能客服等。
提醒: ERNIE老版本代码已经迁移至repro分支,欢迎使用我们全新升级的基于动静结合的新版ERNIE套件进行开发。另外,也欢迎上EasyDL体验更丰富的功能(如ERNIE 2.0、ERNIE 2.1、ERNIE领域模型等)。
新闻
- 2020.5.20:
- 欢迎试用
动态图
实现的 ERNIE:- 基于PaddlePaddle v1.8使用 ERNIE 进行 Pretrain 和 Finetune.
- 动态执行, 所见即所得。
- 大规模分布式训练。
- 易于部署。
- 通过Aistudio 教程快速入门NLP。
- 向后兼容老版 checkpoint。
ERNIE-GEN
模型正式开源! (点击进入)- 最强文本生成预训练模型正式开源,相关工作已被
IJCAI-2020
收录。- 首次把 ERNIE 预训练技术能力扩展至文本生成领域,在多个典型任务上取得最佳。
- 您现在即可下载论文报告的所有模型(包含
base/large/large-160G
)。
- 首次在预训练阶段加入span-by-span 生成任务,让模型每次能够生成一个语义完整的片段。
- 提出填充式生成机制和噪声感知机制来缓解曝光偏差问题。
- 精巧的 Mulit-Flow Attention 实现框架。
- 最强文本生成预训练模型正式开源,相关工作已被
- 欢迎试用
- 2020.4.30 发布ERNIESage, 一种新型图神经网络模型,采用ERNIE做为aggreagtor. 由PGL实现。
- 2020.3.27 在SemEval2020五项子任务上夺冠。
- 2019.12.26 GLUE榜第一名。
- 2019.11.6 发布ERNIE Tiny。
- 2019.7.7 发布ERNIE 2.0。
- 2019.3.16 发布ERNIE 1.0。
导航
快速上手
import numpy as np
import paddle.fluid.dygraph as D
from ernie.tokenizing_ernie import ErnieTokenizer
from ernie.modeling_ernie import ErnieModel
D.guard().__enter__() # activate paddle `dygrpah` mode
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')
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
教程
手边没有GPU?欢迎在AIStudio中直接试用 ERNIE. (请选择最新版本的教程并申请GPU运行环境)
安装
1. 安装 PaddlePaddle
本项目依赖PaddlePaddle 1.7.0+, 请参考这里安装 PaddlePaddle。
2. 安装 ERNIE
pip install paddle-ernie
或者
git clone https://github.com/PaddlePaddle/ERNIE.git --depth 1
cd ERNIE
pip install -r requirements.txt
pip install -e .
3. 下载预训练模型(可选)
Model | 细节参数 | 下载简写 |
---|---|---|
ERNIE 1.0 Base 中文 | Layer:12, Hidden:768, Heads:12 | ernie-1.0 |
ERNIE Tiny | Layer:3, Hdden:1024, Heads:16 | ernie-tiny |
ERNIE 2.0 Base 英文 | Layer:12, Hidden:768, Heads:12 | ernie-2.0-en |
ERNIE 2.0 Large 英文 | Layer:24, Hidden:1024, Heads16 | ernie-2.0-large-en |
ERNIE Gen Base 英文 | Layer:12, Hidden:768, Heads:12 | ernie-gen-base-en |
ERNIE Gen Large 英文 | Layer:24, Hidden:1024, Heads:16 | ernie-gen-large-en |
ERNIE Gen Large 160G英文 | Layer:24, Hidden:1024, Heads:16 + 额外160G 预训练语料 | ernie-gen-large-160g-en |
4. 下载数据集
英文数据集
运行此脚本,下载GLUE datasets.
请将数据目录整理成以下格式,方便在后续 demo 教程中使用(通过--data_dir
参数将数据路径传入训练脚本);
data/xnli
├── dev
│ └── 1
├── test
│ └── 1
└── train
└── 1
示例数据(MNLI任务测试、训练集合)。
中文数据
数据集 | 描述 |
---|---|
XNLI | XNLI 是由 Facebook 和纽约大学的研究者联合构建的自然语言推断数据集,包括 15 种语言的数据。我们用其中的中文数据来评估模型的语言理解能力。链接 |
ChnSentiCorp | ChnSentiCorp 是一个中文情感分析数据集,包含酒店、笔记本电脑和书籍的网购评论。 |
MSRA-NER | MSRA-NER (SIGHAN2006) 数据集由微软亚研院发布,其目标是识别文本中具有特定意义的实体,包括人名、地名、机构名。 |
NLPCC2016-DBQA | NLPCC2016-DBQA 是由国际自然语言处理和中文计算会议 NLPCC 于 2016 年举办的评测任务,其目标是从候选中找到合适的文档作为问题的答案。链接 |
CMRC2018 | CMRC2018 是中文信息学会举办的评测,评测的任务是抽取类阅读理解。链接 |
支持的NLP任务
- 使用
动态图
模型进行finetune:
python3 ./ernie_d/demo/finetune_classifier_dygraph.py \
--from_pretrained ernie-1.0 \
--data_dir ./data/xnli
- 分布式 finetune
paddle.distributed.launch
是一个进程管理器,我们采用它在每一张GPU上启动一个python进程,并配置相应的环境变量以进行分布式训练:
当采用分布式训练时,我们采用max_steps
做为终止条件而非epoch
, 这样处理是为了避免进程间死锁。
你可以通过EPOCH * NUM_TRAIN_EXAMPLES / TOTAL_BATCH
的方式计算出所需执行的max_steps
.
另外值得注意的是训练集需要在不同的进程间进行切分;以避免所有进程训练同一份数据造成的过拟合。
示例脚本(请确保你有两张以上GPU卡, 在线模型下载功能在paddle.distributed.launch
下无法工作,
你可能需要一个先通过单卡finetune方式下载预训练模型,或者根据这里手动下载并解压预训练模型):
python3 -m paddle.distributed.launch \
./demo/finetune_classifier_dygraph_distributed.py \
--data_dir data/mnli \
--max_steps 10000 \
--from_pretrained ernie2.0-en
更多示例脚本:
推荐超参数设置:
任务 | 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) |
预训练 (ERNIE 1.0)
请见这里
在线预测
如果finetune_classifier_dygraph.py
中指定了--inference_model_dir
参数,funetune脚本会将你的模型序列化并产出可以直接部署线上预测的inference_model
.
关于生产环境中使用线上预测代码的实现细节,请见C++ inference API.
或者你可以使用propeller
启动一个多GPU预测服务(需要GPU环境),只需执行:
python -m propeller.tools.start_server -m /path/to/saved/inference_model -p 8881
即可启动预测服务;随后在Python端采用如下命令访问该服务(仅限 python3):
from propeller.service.client import InferenceClient
from ernie.tokenizing_ernie import ErnieTokenizer
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)
你也可从[此处]((https://ernie.bj.bcebos.com/ernie1.0_zh_inference_model.tar.gz.)下载一个预先制作好的ernie-1.0 base模型的 inference_model
.
该模型没有经过finetune,一般可以用做上层模型结构的 feature-base finetune或者做为一个文本特征抽取器。
因为该模行由老版API 产出,在进行客户端请求时需要在输入tensor后面追加一个维度:
ids = np.expand_dims(ids, -1) # ids.shape==[BATCH, SEQLEN, 1]
蒸馏
知识蒸馏是进行ERNIE模型压缩、加速的有效方式;关于知识蒸馏的实现细节请参见这里。
文献引用
ERNIE 1.0
@article{sun2019ernie,
title={Ernie: Enhanced representation through knowledge integration},
author={Sun, Yu and Wang, Shuohuan and Li, Yukun and Feng, Shikun and Chen, Xuyi and Zhang, Han and Tian, Xin and Zhu, Danxiang and Tian, Hao and Wu, Hua},
journal={arXiv preprint arXiv:1904.09223},
year={2019}
}
ERNIE 2.0
@article{sun2019ernie20,
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},
journal={arXiv preprint arXiv:1907.12412},
year={2019}
}
ERNIE-GEN
@article{xiao2020ernie-gen,
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},
journal={arXiv preprint arXiv:2001.11314},
year={2020}
}
若希望复现 paper 中的所有实验,请切换至本repo的repro
分支。
讨论组
- ERNIE官方主页
- Github Issues: bug reports, feature requests, install issues, usage issues, etc.
- QQ 群: 760439550 (ERNIE discussion group).
- Forums: discuss implementations, research, etc.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distribution
Hashes for jtyoui_ernie-0.0.3-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 525b46dd32383c90423486869b242b0a906e9ad6459738f3ec0ca0a855cc6f59 |
|
MD5 | 6fefefdafdd79ba473a2bf760158aab7 |
|
BLAKE2b-256 | 900658e4ebe920d3c5b9a2fb7d5a8e2c62e85916e1215067e3668b74b7fe922d |