README.md

    English|简体中文

    ./.metas/ERNIE_milestone.png

    ERNIE是百度开创性提出的基于知识增强的持续学习语义理解框架,该框架将大数据预训练与多源丰富知识相结合,通过持续学习技术,不断吸收海量文本数据中词汇、结构、语义等方面的知识,实现模型效果不断进化。ERNIE在累积 40 余个典型 NLP 任务取得 SOTA 效果,并在 GLUE、VCR、XTREME、SemEval 等国际权威评测上斩获十余项冠军。ERNIE 在 2020年荣获了中国人工智能学会优秀科技成果奖及世界人工智能大会最高荣誉 SAIL奖,该技术也被全球顶级科技商业杂志《麻省理工科技评论》官方网站报道,相关创新成果也被国际顶级学术会议AAAI、ACL、NAACL、IJCAI收录。ERNIE在工业界得到了大规模应用,如搜索引擎、新闻推荐、广告系统、语音交互、智能客服等。

    提醒: ERNIE老版本代码已经迁移至repro分支,欢迎使用我们全新升级的基于动静结合的新版ERNIE套件进行开发。另外,也欢迎上EasyDL体验更丰富的功能(如ERNIE 2.0、ERNIE 2.1、ERNIE领域模型等)。

    【了解更多】

    新闻

    • 2021.5.20:

      • ERNIE 最新开源四大预训练模型:
        • 多粒度语言知识模型ERNIE-Gram 正式开源
        • 超长文本双向建模预训练模型ERNIE-Doc 正式开源
        • 融合场景图知识的跨模态预训练模型ERNIE-ViL 正式开源
        • 语言与视觉一体的预训练模型ERNIE-UNIMO 正式开源
    • 2020.12.29:

      • ERNIE开源工具套件全面升级 PaddlePaddle v2.0
      • 所有demo教程均引入AMP(混合精度训练), 平均提速达2.3倍。
      • 引入Gradient accumulation, 8G显存也可运行ERNIE-large模型。
    • 2020.9.24:

      • ERNIE-ViL 技术发布! (点击进入)
        • 面向视觉-语言知识增强的预训练框架,首次在视觉-语言预训练引入结构化的知识。
          • 利用场景图中的知识,构建了物体、属性和关系预测任务,精细刻画模态间细粒度语义对齐。
        • 五项视觉-语言下游任务取得最好效果,视觉常识推理榜单取得第一。
    • 2020.5.20:

      • 欢迎试用动态图实现的 ERNIE:
        • 动态执行, 所见即所得。
        • 大规模分布式训练。
        • 易于部署。
        • 通过Aistudio 教程快速入门NLP。
        • 向后兼容老版 checkpoint。
      • ERNIE-GEN 模型正式开源! (点击进入)
        • 最强文本生成预训练模型正式开源,相关工作已被 IJCAI-2020 收录。
          • 首次把 ERNIE 预训练技术能力扩展至文本生成领域,在多个典型任务上取得最佳。
          • 您现在即可下载论文报告的所有模型(包含 base/large/large-430G)。
        • 首次在预训练阶段加入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 as P
    from ernie.tokenizing_ernie import ErnieTokenizer
    from ernie.modeling_ernie import ErnieModel
    
    model = ErnieModel.from_pretrained('ernie-1.0')    # Try to get pretrained model from server, make sure you have network connection
    model.eval()
    tokenizer = ErnieTokenizer.from_pretrained('ernie-1.0')
    
    ids, _ = tokenizer.encode('hello world')
    ids = P.to_tensor(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. 从0开始学ERNIE
    2. 情感识别
    3. 完形填空
    4. 知识蒸馏
    5. 万事不决问ERNIE
    6. 加载并读取老式checkpoint
    7. ERNIE作诗

    安装

    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 .

    propeller是辅助模型训练的高级框架,包含NLP常用的前、后处理流程。你可以通过将本repo根目录放入PYTHONPATH的方式导入propeller:

    export PYTHONPATH=$PWD:$PYTHONPATH
    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 430G英文 Layer:24, Hidden:1024, Heads:16 + 额外430G 预训练语料 ernie-gen-large-430g-en
    ERNIE Doc Base 中文 Layer:12, Hidden:768, Heads:12 ernie-doc-base-zh
    ERNIE Doc Base 英文 Layer:12, Hidden:768, Heads:12 ernie-doc-base-en
    ERNIE Doc Large 英文 Layer:24, Hidden:1024, Heads:16 ernie-doc-large-en
    ERNIE Gram Base 中文 L12H768A12 ernie-gram-zh
    ERNIE Gram Base 英文 L12H768A12 ernie-gram-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.py \
           --from_pretrained ernie-1.0 \
           --data_dir ./data/xnli
    • 加入--use_amp以启用AMP功能(请在支持TensorCore设备上启用AMP)

    • 通过--bsz指定全局batch_size(一步优化中模型所能见到的样本数), 通过--micro_bsz 指定输入给每一张GPU卡的样本数 若--bsz > --micro_bsz 脚本会自动开启梯度累计功能.

    • 分布式 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_distributed.py \
        --data_dir data/mnli \
        --max_steps 10000 \
        --from_pretrained ernie2.0-en

    更多示例脚本:

    1. 情感分析
    2. 语义匹配
    3. 命名实体识别(NER)
    4. 机器阅读理解 (需要多卡环境运行;参见上面"分布式 finetune"一节)
    5. 文本摘要生成
    6. 使用静态图完成文本分类

    推荐超参数设置:

    任务 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)
    VCR 64 2e-5(base)/2e-5(large)

    预训练 (ERNIE 1.0)

    请见这里

    在线预测

    如果finetune_classifier.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)

    你也可从此处下载一个预先制作好的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}
    }

    ERNIE-ViL

    @article{yu2020ernie,
      title={ERNIE-ViL: Knowledge Enhanced Vision-Language Representations Through Scene Graph},
      author={Yu, Fei and Tang, Jiji and Yin, Weichong and Sun, Yu and Tian, Hao and Wu, Hua and Wang, Haifeng},
      journal={arXiv preprint arXiv:2006.16934},
      year={2020}
    }
    

    ERNIE-Gram

    @article{xiao2020ernie,
      title={ERNIE-Gram: Pre-Training with Explicitly N-Gram Masked Language Modeling for Natural Language Understanding},
      author={Xiao, Dongling and Li, Yu-Kun and Zhang, Han and Sun, Yu and Tian, Hao and Wu, Hua and Wang, Haifeng},
      journal={arXiv preprint arXiv:2010.12148},
      year={2020}
    }

    ERNIE-Doc

    @article{ding2020ernie,
      title={ERNIE-DOC: The Retrospective Long-Document Modeling Transformer},
      author={Ding, Siyu and Shang, Junyuan and Wang, Shuohuan and Sun, Yu and Tian, Hao and Wu, Hua and Wang, Haifeng},
      journal={arXiv preprint arXiv:2012.15688},
      year={2020}
    }

    ERNIE-UNIMO

    @article{li2020unimo,
      title={UNIMO: Towards Unified-Modal Understanding and Generation via Cross-Modal Contrastive Learning},
      author={Li, Wei and Gao, Can and Niu, Guocheng and Xiao, Xinyan and Liu, Hao and Liu, Jiachen and Wu, Hua and Wang, Haifeng},
      journal={arXiv preprint arXiv:2012.15409},
      year={2020}
    }

    若希望复现 paper 中的所有实验,请切换至本repo的repro分支。

    讨论组

    • ERNIE官方主页
    • Github Issues: bug reports, feature requests, install issues, usage issues, etc.
    • QQ 群: 760439550 (ERNIE discussion group).
    • QQ 2群: 958422639 (ERNIE discussion group-v2).
    • Forums: discuss implementations, research, etc.

    项目简介

    An Implementation of ERNIE For Language Understanding (including Pre-training models and Fine-tuning tools)

    发行版本 7

    ERNIE with paddle 2.1

    全部发行版

    贡献者 39

    全部贡献者

    开发语言

    • Python 94.6 %
    • C++ 4.1 %
    • CMake 0.7 %
    • Shell 0.6 %