资讯 文档
技术能力
语音技术
文字识别
人脸与人体
图像技术
语言与知识
视频技术

(升级)Post-pretrain

1 适用场景&准备工作

任务简介

  • ERNIE 在预训练过程中,通过建模海量数据中的词、实体及实体关系,学习真实世界的语义知识。通过 ERNIE 直接对先验语义知识单元进行建模,增强了模型语义表示能力。
  • 这里我们举个例子:

    Learnt by BERT :哈 [mask] 滨是 [mask] 龙江的省会,[mask] 际冰 [mask] 文化名城。
    Learnt by ERNIE:[mask] [mask] [mask] 是黑龙江的省会,国际 [mask] [mask] 文化名城。
    • 在 BERT 模型中,我们通过『哈』与『滨』的局部共现,即可判断出『尔』字,模型没有学习与『哈尔滨』相关的任何知识。
    • ERNIE 通过学习词与实体的表达,使模型能够建模出『哈尔滨』与『黑龙江』的关系,学到『哈尔滨』是 『黑龙江』的省会以及『哈尔滨』是个冰雪城市。
  • 文心中的post pretrain任务位于wenxin_appzoo/ernie_pretrain目录下,内置了完整的基于MLM(Mask Language Model)+NSP(Next Sentence Predict)的ERNIE 预训练任务和MLM预测任务示例。

适用场景

  • 目前我们提供的ERNIE通用模型都是基于百度自有数据集和公开数据集预训练而来,如果用户自己有大量的业务数据,那么就可以使ERNIE模型更加适应业务的知识领域,即通过post pretrain任务,用自己的数据训练出一个专有的ERNIE预训练模型,用它在后续的finetune任务中提升模型效果。

数据准备

训练集、测试集的格式一样,由多个document(片段)组成,每个document之间用空行分割;每个document内每句话占一行,文件格式必须为utf-8,如下图所示:

“全国百佳图书出版单位,国家一级出版社”立体化出版格局纺织出版社是一家出版图书、期刊、音像制品、电子出版物、网络出版物等产品的综合型出版社。
出版图书包括纺织工程、轻化工程、服装服饰、工艺美术、经济管理、大众生活、心理励志、青少年教育八大板块。
除出版产、学、研一线服务的科学技术类图书、工具图书、高等教育及职业教育类教材教辅外,还出版了大量面向大众的实用类社科图书。
目前有2500种以上的可供图书品种,年出书达1500多种。
近20年里,先后有六百多种图书获得了国家和省部级奖励。
旗下的两大服饰时尚期刊《昕薇》、《昕薇风采美妆》,服装产业类专业期刊《中国服饰》,在国内有较大影响力和知名度,拥有众多忠实读者。
合作伙伴0中国纺织出版社极为重视国际间的交流与合作,在国内较早开始国际版权贸易合作,与海内外五十多家出版机构合作,引进、输出版权。
截止到2010年,累计引进图书上千种,输出版权上百种。
与BlackwellScienceLtd.(英)、Quart(英)、Rockport(美)、Fairchild(美)、AloisLeopoldArnold(德)、TheWatermarkPress(澳大利亚)、讲谈社(日)、平凡社(日)、台湾远流出版事业股份有限公司、台湾华文网股份有限公司等多家国际著名出版集团建立了良好的伙伴关系,其中,与日本讲谈社合作出版的《昕薇》、《昕薇风采美妆》倍受读者瞩目。
每一项版权合作项目的成功,都为促进中外文化的交流起到了桥梁和纽带作用。

2006年在中国摄影家协会成立五十周年纪念大会上获中国摄影家协会颁发的“建国以来为中国的摄影事业做出‘突出贡献摄影工作者’称号”。
十多年来,冯建国的摄影创作活动坚持不懈,六次到新疆,九次去西藏,多次到四川、甘肃、青海,足迹走遍中国西部,并以中国西部的黑白影像著称,致力于用影像体现西部的土地与人的风貌与神韵。
在美国、日本、韩国、台北、北京、上海等地的美术馆、专业画廊举办了23场个人展览,10场联合展览。
此外,还应韩国中央大学校艺术大学,祥明大学艺术学院,中央美术学院摄影教研室,北京大学、清华大学摄影协会的邀请,在各校作摄影专题讲座和举办个人影展。
对国际交流,高校之间学术交流起了积极促进作用。

预测目前内置完词填空任务,数据格式如下所示,每行一条明文样本,待预测的字或者词用字符"_"表示,文件编码必须是utf-8。

“全国百佳图书出版单位,国家一级出版社”立体化出版格局纺织出版社是一家出版图书、__、____、电子出版物、网络出版物等产品的综合型出版社。
出版__包括纺织工程、轻化工程、____、工艺美术、____、大众生活、心理励志、青少年教育八大板块。
除出版产、学、研一线服务的科学技术类图书、____、高等教育及职业教育类教材教辅外,还出版了大量面向大众的实用类____。
近20年里,先后有六百多种图书获得了国家和省部级__。
旗下的两大服饰时尚期刊《昕薇》、《昕薇风采美妆》,服装产业类专业期刊《中国服饰》,在国内有较大___和___,拥有众多忠实读者。
作为出版音像制品及电子出版物的中纺音像出版社,每年出版近百种纺织、服装、经管、生活等专业音像_____,服务于行业。
◆专业团队品质保证为读者提供优质的__,是我们不断的追求;优质、实用、创新是我们的____;高素质的编辑队伍、富有创意的设计人员及经验丰富的出版人员是我们品质的保证;辐射全国的营销网络,是我们的产品能及时送达到读者手中的保障。
◆广泛的国际交流和合作中国纺织出版社与日本、美国、英国、德国、韩国等国家及香港、台湾地区五十多家____建立了良好的____。
____上百种,并同日本讲谈社、台湾华文网建立了战略合作伙伴关系。
面向更加开放的__,中国纺织出版社将一如既往,坚持以__为基础,以__为先导,多元拓展的发展思路,以___的产品奉献给广大读者。
每一项版权合作项目的成功,都为促进____的交流起到了桥梁和纽带作用。

网络与模型选择选择

文心目前提供的网络结构为MLM+NSP,位于wenxin_appzoo/ernie_pretrain/model目录下,可以支持ernie_pretraining任务的预训练模型有:ERNIE3.0 Base、ERNIE3.0 Large,这些模型可以通过wenxin_appzoo/models_hub中对应的下载脚本下载使用。

模型评估指标选择

PPL:即perplexity(困惑度),是用来度量一个概率分布或概率模型预测样本的好坏程度的指标,值越小模型效果越好。具体计算方式见Metrics->ppl相关部分

运行环境选择

  • ERNIE网络优先考虑GPU机器,显存大小最好在10G以上,Cuda版本在Cuda10及以上,Python版本为Python3.7,PaddlePaddle版本为2.2.1及以上。

2 开始训练

环境安装

详见环境安装与配置

目录结构

Post pretrain任务位于/wenxin_appzoo/tasks/ernie_pretrain目录下

├── data        ## 各种Demo数据集
│   ├── predict_data
│   │   └── part_1.txt
│   ├── test_data
│   │   └── part_1.txt
│   └── train_data
│       ├── part_1.txt
│       └── part_2.txt
├── examples   
│   ├── ernie_pre_train_ch_infer.json  ## 基于post pretrain的完型填空预测任务的配置文件
│   └── ernie_pre_train_ch.json  ## post pretrain训练任务的配置文件
├── inference
│   ├── custom_inference.py     ## 预测脚本
│   
├── model
│   ├── ernie_mask_lm.py       ## 基于ERNIE的MLM+NSP网络组网
├── reader
│   ├── ernie_mask_language_model_infer_reader.py   ## 预测任务数据读取器
│   ├── ernie_pretrain_reader.py     ## 训练任务数据读取器
│   
├── run_infer.py        ## 训练任务启动脚本
├── run_trainer.py      ## 预测任务启动脚本
└── trainer
    ├── custom_dynamic_trainer.py    ## 训练脚本
    

参数配置

文心中的各种参数都是在json文件中进行配置的,您可以通过修改所加载的json文件来进行参数的自定义配置。json配置文件主要分为三个部分:dataset_reader(数据部分)、model(网络部分)、trainer或inference(执行部分),在模型训练的时候,json文件中需要配置dataset_reader、model和trainer这三个部分;在预测推理的时候,json文件中需要配置dataset_reader、inference这两个部分。Post pretrain任务的训练配置文件为./examples/ernie_pre_train_ch.json,上述三个部分的配置与说明如下所示。

  • dataset_reader:用于配置模型训练或者预测时的数据相关配置,训练任务的dataset_reader中必须有train_reader、test_reader、dev_reader,预测推理任务的dataset_reader仅需要predict_reader。
  • model:用于配置模型训练时的预置网络,包括预置网络的类别及其优化器的参数等。
  • trainer:用于配置模型训练的启动器,包括保存模型时的间隔步数、进行测试集或验证集评估的间隔步数等。
{
  "dataset_reader": {
    "train_reader": {   ## 训练集reader配置                     
      "name": "train_reader",    ## 名称固定,特殊情况下会用这个名字区分reader作用,用户不要修改
      "type": "ErniePretrainDataReaderChinese", ## reader对应的数据读取器的具体类名
      "fields": [],  ## 域(field)是文心的高阶封装,对于同一个样本存在不同域的时候,不同域有单独的数据类型(文本、数值、整型、浮点型)、单独的词表(vocabulary)等,可以根据不同域进行语义表示,如文本转id等操作,field_reader是实现这些操作的类。ERNIE Pretraing任务中没有使用该特性,所以填[]即可。
      "config": {
        "data_path": "./data/train_data",   ## 训练数据train_reader的数据路径,写到文件夹目录
        "shuffle": false,        ## 是否需要shuffle,
        "batch_size": 8,   ## 超参数之一,表示每个step训练多少个样本。
        "epoch": 3,   ## 超参数之一,表示这个数据集中的数据会被重复训练多少轮。
        "sampling_rate": 1.0,   ## 数据集的采样率,文心预留参数,暂时不起作用,后续版本会升级
        "need_data_distribute": true,  ## 表示数据读取过程中是否需要按卡数进行分发,true表示每张卡在同一个step中读取到的数据是不一样的,false表示每张卡在同一个step中读取到的数据是一样的,训练集默认为true,测试集、验证集、预测集都是false。
        "need_generate_examples": false,  ## 表示在数据读取过程中除了id化好的tensor数据外,是否需要返回原始明文样本,测试集默认取值为true,训练集、测试集、验证集为false
        "extra_params":{
          "vocab_path":"../../models_hub/ernie_2.0_base_ch_dir/vocab.txt",
          "label_map_config":"",
          "max_seq_len":256,
          "do_lower_case":true,
          "in_tokens":false,
          "tokenizer": "LACTokenizer",  ## 分词器,采用LAC进行分词
          "word_mask_prob": 0.5,   ## 文心中提供两种mask策略,一种是按词(短语)mask,一种是按字符mask,word_mask_prob表示按词mask的概率,对应的按字符mask的概率为(1-word_mask_prob)。
          "mask_rate": 0.15,   ## 每条样本中被mask的词或者字符占比,取值范围为0-1,这里表示有15%的字词在训练过程中会被mask掉。
          "random_mask_rate": 0.1,  ## mask的策略之一,被选中做mask的字词,有10%的概率会被词表中的随机一个词进行替换。
          "use_mask_id_rate": 0.8  ##mask的策略之一,被选中做mask的字词,有80%的概率会被替换成预置的MASK_ID
        }
      }
    },
    "test_reader": {  
      "name": "test_reader",   ## 测试集reader配置
      "type": "ErniePretrainDataReaderChinese",
      "fields": [],
      "config": {
        "data_path": "./data/test_data",
        "shuffle": false,
        "batch_size": 16,
        "epoch": 1,    ## 必须是1
        "sampling_rate": 1.0,
        "need_data_distribute": false,  ## 必须是false
        "extra_params":{
          "vocab_path":"../../models_hub/ernie_2.0_base_ch_dir/vocab.txt",
          "label_map_config":"",
          "max_seq_len":256,
          "do_lower_case":true,
          "in_tokens":false,
          "tokenizer": "LACTokenizer",
          "word_mask": true
        }
      }
    },
    "dev_reader": {  ## 验证集reader配置
      "name": "dev_reader",
      "type": "ErniePretrainDataReaderChinese",
      "fields": [],
      "config": {
        "data_path": "./data/test_data",
        "shuffle": false,
        "batch_size": 16,
        "epoch": 1,   ## 必须是1
        "sampling_rate": 1.0,
        "need_data_distribute": false,   ## 必须是false
        "extra_params":{
          "vocab_path":"../../models_hub/ernie_2.0_base_ch_dir/vocab.txt",
          "label_map_config":"",
          "max_seq_len":256,
          "do_lower_case":true,
          "in_tokens":false,
          "tokenizer": "FullTokenizer",
          "word_mask": true
        }
      }
    }
  },
  "model": {
    "type": "ErnieMaskLanguageModel",   ## 对应的模型网络类名
    "is_dygraph": 1,   ## 区分动态图模型和静态图模型,1表示动态图,0表示静态图
    "embedding": {     ## ERNIE中的embedding参数设置,必填参数,按照对应的config_path里的值进行填写
      "emb_dim": 768,
      "use_amp": true,
      "mem_len": 0,
      "weight_sharing": false,
      "training_server": true,
      "config_path": "../../models_hub/ernie_2.0_base_ch_dir/ernie_config.json"  ## 如果用户需要更换ERNIE预训练模型,则在该位置替换对应的config配置。
    },
    "optimization":{   ## 优化器设置,文心ERNIE推荐的默认设置。
      "learning_rate": 4e-5,
      "use_lr_decay": true,
      "use_default_decay": false,
      "lr_scheduler": "linear_warmup_decay",
      "use_release_paddle": false,
      "epsilon": 1e-6,
      "warmup_steps": 0,
      "warmup_proportion": 0.06,
      "weight_decay": 0.01,
      "use_dynamic_loss_scaling": false,
      "init_loss_scaling": 524288,
      "incr_every_n_steps": 1000,
      "decr_every_n_nan_or_inf": 2,
      "incr_ratio": 2.0,
      "decr_ratio": 0.8,
      "use_layer_decay": true,
      "layer_decay_ratio": 0.95,
      "n_layers": 60,
      "sharing_layers": 48
    }
  },
  "trainer": {
    "type" : "CustomDynamicTrainer",  ## 使用哪个trainer对象,由对应的task中trainer目录下的trainer类决定,主要是区分使用动态图trainer还是静态图trainer,与model中的is_dygraph参数取值要对应。
    "PADDLE_PLACE_TYPE": "gpu", ## 运行的硬件环境,cpu机器填cpu,gpu机器填gpu。
    "PADDLE_IS_FLEET": 0, ## 是否使用FLEET训练方式,1表示使用,0表示不使用,目前文心的单机多卡和多机多卡都采用的是FLEET方式,所以在运行多卡任务时记得将改参数设置为1,并配合fleetrun命令进行启动。
    "is_recompute": true, ## 是否启用recompute方式,ERNIE3.0百亿模型时,必须设置为true
    "ramdom_seed": 1,
    "use_amp": true,  ## 是否使用amp
    "use_sharding": true,
    "save_inference_model": false,
    "use_fast_executor": true,
    "train_log_step": 10,    ## 训练时打印训练日志的间隔步数。
    "is_eval_dev": 1,   ## 是否在训练的时候评估验证集,如果取值为1,则一定需要配置dev_reader及其数据路径。
    "is_eval_test": 1,   ## 是否在训练的时候评估测试集,如果取值为1,则一定需要配置test_reader及其数据路径。
    "eval_step": 500,  ## 进行测试集或验证集评估的间隔步数。
    "save_model_step": 1000000000000,  ## 保存模型时的间隔步数,建议设置为eval_step的整数倍。
    "load_parameters": "",   ## 加载包含各op参数值的训练好的模型,用于热启动。此处填写checkpoint路径。不填则表示不使用热启动。
    "load_checkpoint": "", ## 加载包含学习率等所有参数的训练模型,用于热启动。此处填写checkpoint路径。不填则表示不使用热启动。
    "pre_train_model": [  ## 加载预训练模型的参数,ERNIE任务的必填参数
        {
            "name": "ernie_2.0_base_ch",
            "params_path": "../../models_hub/ernie_2.0_base_ch_dir/params"
        }
    ],
    "output_path": "./output/mlm_ernie2.0",  ## 保存模型的输出路径,如置空或者不配置则默认输出路径为"./output"
    "extra_param": {   ## 除核心必要信息之外,需要额外标明的参数信息,比如一些meta信息可以作为日志统计的关键字。
      "meta":{
        "job_type": "ernie_pre_train"
      }
    }
  }
}

开始训练

  1. 首先下载需要用到的ERNIE 预训练模型。模型下载脚本在wenxin_appzoo/models_hub/目录下,选择对应脚本并使用sh命令运行即可。
  2. 将训练数据、评测数据存放妥当。
  3. 运行训练脚本。

    # 单卡训练
    python run_trainer.py --param_path ./examples/ernie_pre_train_ch.json
    # 如果需要使用多卡训练,则使用以下命令,先使用export CUDA_VISIBLE_DEVICES=0,1指定使用0号和1号卡
    # --gpus参数指定的显卡号需要是$CUDA_VISIBLE_DEVICES的子集
    fleetrun --gpus=0,1 run_trainer.py --param_path ./examples/ernie_pre_train_ch.json

Post pretrain 任务训练结束后,会产生两种模型文件,一种是checkpoints文件,一种是inference文件。用户可以用checkpoints文件进行下游任务的finetune,用法和使用上与其他ERNIE预训练模型一致;用户可以用inference文件进行模型预测推理,这里我们以上一节「post pretrain 开始训练」训练出来模型进行模型预测推理,需要注意的是本次文心开发套件中提供的inference模型仅支持完型填空任务。

3 开始预测

环境安装

详见环境安装与配置

准备数据

预测目前内置完词填空任务,数据格式如下所示,每行一条明文样本,待预测的字或者词用字符”_”表示,文件编码必须是utf-8。

“全国百佳图书出版单位,国家一级出版社”立体化出版格局纺织出版社是一家出版图书、__、____、电子出版物、网络出版物等产品的综合型出版社。
出版__包括纺织工程、轻化工程、____、工艺美术、____、大众生活、心理励志、青少年教育八大板块。
除出版产、学、研一线服务的科学技术类图书、____、高等教育及职业教育类教材教辅外,还出版了大量面向大众的实用类____。
近20年里,先后有六百多种图书获得了国家和省部级__。
旗下的两大服饰时尚期刊《昕薇》、《昕薇风采美妆》,服装产业类专业期刊《中国服饰》,在国内有较大___和___,拥有众多忠实读者。
作为出版音像制品及电子出版物的中纺音像出版社,每年出版近百种纺织、服装、经管、生活等专业音像_____,服务于行业。
专业团队品质保证为读者提供优质的__,是我们不断的追求;优质、实用、创新是我们的____;高素质的编辑队伍、富有创意的设计人员及经验丰富的出版人员是我们品质的保证;辐射全国的营销网络,是我们的产品能及时送达到读者手中的保障。
广泛的国际交流和合作中国纺织出版社与日本、美国、英国、德国、韩国等国家及香港、台湾地区五十多家____建立了良好的____。
____上百种,并同日本讲谈社、台湾华文网建立了战略合作伙伴关系。
面向更加开放的__,中国纺织出版社将一如既往,坚持以__为基础,以__为先导,多元拓展的发展思路,以___的产品奉献给广大读者。
每一项版权合作项目的成功,都为促进____的交流起到了桥梁和纽带作用。

参数配置

  • 训练出的模型储存在./output/mlm_ernie2.0/save_inference_model/中,在该目录下找到被保存的inference_model文件,如inference_step_64。
  • 将其上面的模型路径填入./examples/ernie_pre_train_ch_infer.json中的inference_model_path字段,修改部分示例如下:
{
  "dataset_reader": {
    "predict_reader": {
      "name": "predict_reader",  ## 预测集reader配置
      "type": "ErnieMaskLanguageModelInferReader",  ## reader对应的数据读取器的具体类名
      "fields": [], ## 域(field)是文心的高阶封装,对于同一个样本存在不同域的时候,不同域有单独的数据类型(文本、数值、整型、浮点型)、单独的词表(vocabulary)等,可以根据不同域进行语义表示,如文本转id等操作,field_reader是实现这些操作的类。Post pretrain任务中没有使用该特性,所以填[]即可。
      "config": {
        "data_path": "./data/predict_data", ## 预测数据predict_reader的数据路径,写到文件夹目录
        "shuffle": false,  ## 是否需要shuffle,预测集必须选择false
        "batch_size": 8,
        "epoch": 1,    ## 必须是1
        "sampling_rate": 1.0,
        "need_data_distribute": false,    ## 表示数据读取过程中是否需要按卡数进行分发,true表示每张卡在同一个step中读取到的数据是不一样的,false表示每张卡在同一个step中读取到的数据是一样的,训练集默认为true,测试集、验证集、预测集都是false。
        "need_generate_examples": true,  ## 表示在数据读取过程中除了id化好的tensor数据外,是否需要返回原始明文样本,测试集默认取值为true,训练集、测试集、验证集为false
        "extra_params":{
          "vocab_path":"../../models_hub/ernie_2.0_base_ch_dir/vocab.txt",  ## 词表文件,必须和模型训练时用的词表一致。
          "label_map_config":"",
          "max_seq_len":256,    ## 最大文本长度
          "do_lower_case":true,
          "in_tokens":false,
          "tokenizer": "LACTokenizer"   ## 分词器,采用LAC进行分词
        }
      }
    }
  },

  "inference": {
    "type": "CustomInference",  ## 预测inference对应类名
    "output_path": "./output/predict_result.txt",  ## 预测结果的输出路径,如果不填则默认输出路径为"./output/predict_result.txt"
    "PADDLE_PLACE_TYPE": "cpu",  ## 运行的硬件环境,cpu机器填cpu,gpu机器填gpu。
    "thread_num": 2,   ## 线程数设置
    "inference_model_path": "./output/mlm_ernie2.0/save_inference_model/inference_step_64/",  ## 待预测模型路径
    "extra_param": {
      "meta":{
        "job_type": "ernie_pre_train"
      }

    }
  }
}

启动预测

  • 运行run_infer.py

    python run_infer.py --param_path ./examples/ernie_pre_train_ch_infer.json
  • 结果如下图所示,每行分为两列,第一列为明文样本,第二列为待预测的位置上的字符对应到词表中所有字符上的概率分布(所有字符概率之和为1,以数组形式存在文件中)。举例来说,如果你的词表大小为2000,那么待预测的位置上那个字符的预测就过就是2000个小于1,和为1的小数,你可以选择值最大的小数,它在整个数组中的下标即词表文件中对的词ID。

    “全国百佳图书出版单位,国家一级出版社”立体化出版格局纺织出版社是一家出版图书、__、____、电子出版物、网络出版物等产品的综合型出版社。   [[1.8193338003659465e-13, 3.0005784285063375e-15, 5.359626371187476e-12, 1.499642077185115e-11, 0.0012198316399008036, 0.0002375178737565875, 0.00021588786330539733, 0.007447452750056982, 0.004532313905656338, 0.00040645874105393887, 0.000307588983559981, 0.0009025050676427782, 0.004245138727128506, 0.00020297853916417807, 0.0016760972794145346, 0.00010909938282566145, 0.0010835039429366589, 0.0027346238493919373, 0.011458061635494232, 0.026744892820715904, ....]]
上一篇
(New)ERNIE-ViLG 文生图预测
下一篇
(New)微调策略升级