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

实战演练:使用动态图训练

动态图训练使用

以BOW分类任务为例:首先进入文本分类的示例代码目录./wenxin_appzoo/wenxin_appzoo/tasks/text_classification/ 。

  • 认识目录:该任务下的目录结构为
  ... ... 
  ├── data_set_reader    ## 数据读取器
  │   ├── ernie_classification_base_dataset_reader.py
  │   └── ernie_classification_dataset_reader.py
  ├── examples          ## 内置的常用任务配置,动静态图共用,修改部分参数值即可灵活切换
  │   ├── cls_bow_ch_infer.json
  │   ├── cls_bow_ch.json
  │   ├── cls_ernie_3.0_xnli_ch_infer.json
  │   ├── cls_ernie_3.0_xnli_ch.json
  │   ├── cls_ernie_3.0_xnli_ch_save_infer_from_ckpt.json
  │   ├── cls_ernie_fc_ch_infer.json
  │   ├── cls_ernie_fc_ch.json
  │   ├── cls_ernie_multi_label_ch_infer.json
  │   └── cls_ernie_multi_label_ch.json
  ├── inference                             
  │   ├── custom_cls_inference_ernie3.py  ## ERNIE2.0在分类任务上的预测脚本,仅支持静态图
  │   ├── custom_inference.py     ## ERNIE2.x在分类任务上的预测脚本, 动静态图共用
  │   └── __init__.py
  ├── model                          ## 内置网络结构
  │   ├── base_cls.py
  │   ├── bow_classification.py        ## BOW网络结构,动静态图共用
  │   ├── ernie3_classification.py     ## ERNIE3.0在分类任务上的网络结构,ERNIE3.0目前仅支持静态图
  │   ├── ernie_classification.py      ## ERNIE2.x在分类任务上的网络结构, 动静态图共用
  │   └── multi_label_classification.py  ## 多标签分类任务的网络结构, 动静态图共用
  ├── reader
  │   ├── categorical_field_reader.py
  │   └── multi_label_field_reader.py
  ├── run_infer_ernie3.py
  ├── run_infer.py
  ├── run_trainer.py
  └── trainer
      ├── custom_dynamic_trainer.py    ## ERNIE 2.X任务和非ERNIE任务的动态图训练脚本
      ├── custom_trainer_ernie3.py   ## ERNIE 3.0任务的静态图训练脚本(ERNIE3.0目前仅支持静态图训练)
      ├── custom_trainer.py    ## ERNIE 2.X任务和非ERNIE任务的静态图训练脚本
      └── __init__.py

配置任务

json配置文件主要分为三个部分:dataset_reader(数据部分)、model(网络部分)、trainer或inference(执行部分),在模型训练的时候,json文件中需要配置dataset_reader、model和trainer这三个部分;在预测推理的时候,json文件中需要配置dataset_reader、inference这两个部分。reader部分和inference部分动静态图共用,不再赘述。

model部分的配置

{
  ...
  "model": {
    "type": "BowClassification",  ## 文心采用模型(models)的方式定义神经网络的基本操作,本例采用预置的模型BowClassification实现文本分类,具体网络可参考models目录。
    "is_dygraph": 1,             ## 区分动态图模型和静态图模型,1表示动态图,0表示静态图
    "optimization": {
      "learning_rate": 2e-05    ## 预置模型的优化器所需的参数配置,如学习率等。
    },
    "vocab_size": 33261,       ## 该模型(model)使用的词表大小,必填参数。
    "num_labels": 2            ## 该分类模型的类别数目是多少,必填参数,不填则默认是二分类
  },
  ...
}

trainer部分的配置

{
  ...
  "trainer": {
    "type": CustomDynamicTrainer,  ## 使用哪个trainer对象,主要是区分使用动态图trainer还是静态图trainer,与model中的is_dygraph参数取值要对应 ,在当前task中,动态图使用CustomDynamicTrainer, 静态图使用CustomTrainer。
    "PADDLE_PLACE_TYPE": "cpu",
    "PADDLE_IS_FLEET": 0,
    "train_log_step": 20,
    "is_eval_dev": 0,
    "is_eval_test": 1,
    "eval_step": 100,
    "save_model_step": 10000,
    "load_parameters": "",
    "load_checkpoint": "",
    "pre_train_model": [],
    "output_path": "./output/cls_bow_ch",
    "extra_param": {
      "meta":{
        "job_type": "text_classification"
      }

    }
    ...
}
  • 开始训练

    # Bow 中文文本分类模型
    # 基于json实现预置网络训练。其调用了配置文件./examples/cls_bow_ch.json
    # 单卡训练
    python run_trainer.py --param_path ./examples/cls_bow_ch.json
    # 如果需要使用多卡训练,则使用以下命令
    # --gpus参数指定的显卡号需要是$CUDA_VISIBLE_DEVICES的子集
    fleetrun --gpus=0,1 run_trainer.py --param_path ./examples/cls_bow_ch.json

架构原理:动静结合

动静结合的核心做法是:

  • 统一数据处理:动态图和静态图共用一套Reader(数据读取器)对明文数据进行分词、转ID、组batch,静态图中使用py_reader进行id转tensor处理,动态图中使用DataSet进行id转tensor处理。Reader具体细节见Reader
  • 统一网络结构:所有网络结构(Model)都使用动态图的OP进行编写,继承自Layer。Model具体细节见Model
  • 灵活使用训练流程:每个任务对应的有两个Trainer(训练控制器),一个动态图Trainer,继承自BaseDynamicTrainer, 一个静态图Trainer,继承自BaseStaticTrainer,分别控制整体的训练流程,训练结束后产出两类文件,一类用来做持续训练的checkpoints文件,一类用来做预测部署的inference model文件,动态图模式下的inference model文件由PaddlePaddle的TracedLayer方式生成。Trainer具体细节见Trainer
  • 静态图模式统一体预测部署:预测部署都使用inference model文件进行预测。
上一篇
实战演练:使用文心训练模型
下一篇
实战演练:使用文心进行模型效果评估