实战演练:使用动态图训练
更新时间:2022-08-18
动态图训练使用
以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文件进行预测。