Are you sure you want to delete this task? Once this task is deleted, it cannot be recovered.
deng 1fa7683171 | 1 year ago | |
---|---|---|
ascend310_infer | 3 years ago | |
ckpt | 3 years ago | |
data | 3 years ago | |
mindir | 3 years ago | |
scripts | 3 years ago | |
src | 3 years ago | |
README.md | 1 year ago | |
export.py | 3 years ago | |
postprocess.py | 3 years ago | |
preprocess.py | 3 years ago | |
run_dgu.py | 3 years ago |
对话系统 (Dialogue System) 常常需要根据应用场景的变化去解决多种多样的任务。任务的多样性(意图识别、槽填充、行为识别、状态追踪等等),以及领域训练数据的稀少,给Dialogue System的研究和应用带来了巨大的困难和挑战,要使得Dialogue System得到更好的发展,基于BERT的对话通用理解模型 (DGU: Dialogue General Understanding),通过实验表明,使用base-model (BERT)并结合常见的学习范式,可以实现一个通用的对话理解模型。
DGU模型内共包含4个任务,全部基于公开数据集在mindspore1.1.1上完成训练及评估,详细说明如下:
udc: 使用UDC (Ubuntu Corpus V1) 数据集完成对话匹配 (Dialogue Response Selection) 任务;
atis_intent: 使用ATIS (Airline Travel Information System) 数据集完成对话意图识别 (Dialogue Intent Detection) 任务;
mrda: 使用MRDAC (Meeting Recorder Dialogue Act Corpus) 数据集完成对话行为识别 (Dialogue Act Detection) 任务;
swda: 使用SwDAC (Switchboard Dialogue Act Corpus) 数据集完成对话行为识别 (Dialogue Act Detection) 任务;
BERT的主干结构为Transformer。对于BERT_base,Transformer包含12个编码器模块,每个模块包含一个自注意模块,每个自注意模块包含一个注意模块。
从官网下载安装MindSpore之后,您可以按照如下步骤进行训练和评估:
# 运行微调和评估示例
- 如需运行微调任务,请先准备预训练生成的权重文件(ckpt)。
- 在`finetune_eval_config.py`中设置BERT网络配置和优化器超参。
- 运行下载数据脚本:
bash scripts/download_data.sh
- 运行数据预处理脚本:
bash scripts/run_data_preprocess.sh
- 运行下载及转换预训练模型脚本(转换需要paddle环境):
bash scripts/download_pretrain_model.sh
- dgu:在scripts/run_dgu.sh中设置任务相关的超参,可完成进行针对不同任务的微调。
- 运行`bash scripts/run_dgu_gpu.sh`,对BERT-base模型进行微调。
bash scripts/run_dgu_gpu.sh
在Ascend设备上做分布式训练时,请提前创建JSON格式的HCCL配置文件。
在Ascend设备上做单机分布式训练时,请参考here创建HCCL配置文件。
在Ascend设备上做多机分布式训练时,训练命令需要在很短的时间间隔内在各台设备上执行。因此,每台设备上都需要准备HCCL配置文件。请参考here创建多机的HCCL配置文件。
如需设置数据集格式和参数,请创建JSON格式的模式配置文件,详见TFRecord格式。
For pretraining, schema file contains ["input_ids", "input_mask", "segment_ids", "next_sentence_labels", "masked_lm_positions", "masked_lm_ids", "masked_lm_weights"].
For ner or classification task, schema file contains ["input_ids", "input_mask", "segment_ids", "label_ids"].
For squad task, training: schema file contains ["start_positions", "end_positions", "input_ids", "input_mask", "segment_ids"], evaluation: schema file contains ["input_ids", "input_mask", "segment_ids"].
`numRows` is the only option which could be set by user, other values must be set according to the dataset.
For example, the schema file of cn-wiki-128 dataset for pretraining shows as follows:
{
"datasetType": "TF",
"numRows": 7680,
"columns": {
"input_ids": {
"type": "int64",
"rank": 1,
"shape": [128]
},
"input_mask": {
"type": "int64",
"rank": 1,
"shape": [128]
},
"segment_ids": {
"type": "int64",
"rank": 1,
"shape": [128]
},
"next_sentence_labels": {
"type": "int64",
"rank": 1,
"shape": [1]
},
"masked_lm_positions": {
"type": "int64",
"rank": 1,
"shape": [20]
},
"masked_lm_ids": {
"type": "int64",
"rank": 1,
"shape": [20]
},
"masked_lm_weights": {
"type": "float32",
"rank": 1,
"shape": [20]
}
}
}
.
└─dgu
├─README_CN.md
├─scripts
├─run_dgu.sh # Ascend上单机DGU任务shell脚本
├─run_dgu_gpu.sh # GPU上单机DGU任务shell脚本
├─download_data.sh # 下载数据集shell脚本
├─download_pretrain_model.sh # 下载预训练模型权重shell脚本
├─export.sh # export脚本
├─eval.sh # Ascend上单机DGU任务评估shell脚本
└─run_data_preprocess.sh # 数据集预处理shell脚本
├─src
├─__init__.py
├─adam.py # 优化器
├─args.py # 代码运行参数设置
├─bert_for_finetune.py # 网络骨干编码
├─bert_for_pre_training.py # 网络骨干编码
├─bert_model.py # 网络骨干编码
├─config.py # 预训练参数配置
├─data_util.py # 数据预处理util函数
├─dataset.py # 数据预处理
├─dataconvert.py # 数据转换
├─finetune_eval_config.py # 微调参数配置
├─finetune_eval_model.py # 网络骨干编码
├─metric.py # 评估过程的测评方法
├─pretrainmodel_convert.py # 预训练模型权重转换
├─tokenizer.py # tokenizer函数
└─utils.py # util函数
└─run_dgu.py # DGU模型的微调和评估网络
用法:dataconvert.py [--task_name TASK_NAME]
[--data_dir DATA_DIR]
[--vocab_file_path VOCAB_FILE_PATH]
[--output_dir OUTPUT_DIR]
[--max_seq_len N]
[--eval_max_seq_len N]
选项:
--task_name 训练任务的名称
--data_dir 原始数据集路径
--vocab_file_path BERT模型训练的词汇表
--output_dir 保存生成mindRecord格式数据的路径
--max_seq_len train数据集的max_seq_len
--eval_max_seq_len dev或test数据集的max_seq_len
用法:run_dgu.py [--device_target DEVICE_TARGET] [--do_train DO_TRAIN] [----do_eval DO_EVAL]
[--device_id N] [--epoch_num N]
[--train_data_shuffle TRAIN_DATA_SHUFFLE]
[--eval_data_shuffle EVAL_DATA_SHUFFLE]
[--checkpoint_path CHECKPOINT_PATH]
[--model_name_or_path MODEL_NAME_OR_PATH]
[--train_data_file_path TRAIN_DATA_FILE_PATH]
[--eval_data_file_path EVAL_DATA_FILE_PATH]
[--eval_ckpt_path EVAL_CKPT_PATH]
[--is_modelarts_work IS_MODELARTS_WORK]
选项:
--task_name 训练任务的名称
--device_target 代码实现设备,可选项为Ascend或CPU。默认为Ascend
--do_train 是否基于训练集开始训练,可选项为true或false
--do_eval 是否基于开发集开始评估,可选项为true或false
--epoch_num 训练轮次总数
--train_data_shuffle 是否使能训练数据集轮换,默认为true
--eval_data_shuffle 是否使能评估数据集轮换,默认为false
--checkpoint_path 保存生成微调检查点的路径
--model_name_or_path 初始检查点的文件路径(通常来自预训练BERT模型
--train_data_file_path 用于保存训练数据的mindRecord文件,如train1.1.mindrecord
--eval_data_file_path 用于保存预测数据的mindRecord文件,如dev1.1.mindrecord
--eval_ckpt_path 如仅执行评估,提供用于评估的微调检查点的路径
--is_modelarts_work 是否使用ModelArts线上训练环境,默认为false
可以在config.py
和finetune_eval_config.py
文件中分别配置训练和评估参数。
config for lossscale and etc.
bert_network BERT模型版本,可选项为base或nezha,默认为base
batch_size 输入数据集的批次大小,默认为16
loss_scale_value 损失放大初始值,默认为2^32
scale_factor 损失放大的更新因子,默认为2
scale_window 损失放大的一次更新步数,默认为1000
optimizer 网络中采用的优化器,可选项为AdamWerigtDecayDynamicLR、Lamb、或Momentum,默认为Lamb
数据集和网络参数(预训练/微调/评估):
seq_length 输入序列的长度,默认为128
vocab_size 各内嵌向量大小,需与所采用的数据集相同。默认为21136
hidden_size BERT的encoder层数,默认为768
num_hidden_layers 隐藏层数,默认为12
num_attention_heads 注意头的数量,默认为12
intermediate_size 中间层数,默认为3072
hidden_act 所采用的激活函数,默认为gelu
hidden_dropout_prob BERT输出的随机失活可能性,默认为0.1
attention_probs_dropout_prob BERT注意的随机失活可能性,默认为0.1
max_position_embeddings 序列最大长度,默认为512
type_vocab_size 标记类型的词汇表大小,默认为16
initializer_range TruncatedNormal的初始值,默认为0.02
use_relative_positions 是否采用相对位置,可选项为true或false,默认为False
dtype 输入的数据类型,可选项为mstype.float16或mstype.float32,默认为mstype.float32
compute_type Bert Transformer的计算类型,可选项为mstype.float16或mstype.float32,默认为mstype.float16
Parameters for optimizer:
AdamWeightDecay:
decay_steps 学习率开始衰减的步数
learning_rate 学习率
end_learning_rate 结束学习率,取值需为正数
power 幂
warmup_steps 热身学习率步数
weight_decay 权重衰减
eps 增加分母,提高小数稳定性
Lamb:
decay_steps 学习率开始衰减的步数
learning_rate 学习率
end_learning_rate 结束学习率
power 幂
warmup_steps 热身学习率步数
weight_decay 权重衰减
Momentum:
learning_rate 学习率
momentum 平均移动动量
bash scripts/run_dgu.sh
以上命令后台运行,您可以在task_name.log中查看训练日志。训练结束后,您可以在默认脚本路径下脚本文件夹中找到检查点文件,得到如下损失值:
# grep "epoch" task_name.log
epoch: 0.0, current epoch percent: 0.000, step: 1, outputs are (Tensor(shape=[1], dtype=Float32, [ 1.0856101e+01]), Tensor(shape=[], dtype=Bool, False), Tensor(shape=[], dtype=Float32, 65536))
epoch: 0.0, current epoch percent: 0.000, step: 2, outputs are (Tensor(shape=[1], dtype=Float32, [ 1.0821701e+01]), Tensor(shape=[], dtype=Bool, False), Tensor(shape=[], dtype=Float32, 65536))
...
注意如果所运行的数据集较大,建议添加一个外部环境变量,确保HCCL不会超时。
export HCCL_CONNECT_TIMEOUT=600
将HCCL的超时时间从默认的120秒延长到600秒。
注意若使用的BERT模型较大,保存检查点时可能会出现protobuf错误,可尝试使用下面的环境集。export PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python
bash scripts/run_dgu_gpu.sh
以上命令后台运行,您可以在task_name.log中查看训练日志。训练结束后,您可以在默认脚本路径下脚本文件夹中找到检查点文件,得到如下损失值:
# grep "epoch" task_name.log
epoch: 0, current epoch percent: 1.000, step: 6094, outputs are (Tensor(shape=[], dtype=Float32, value= 0.714172), Tensor(shape=[], dtype=Bool, value= False))
epoch time: 1702423.561 ms, per step time: 279.361 ms
epoch: 1, current epoch percent: 1.000, step: 12188, outputs are (Tensor(shape=[], dtype=Float32, value= 0.788653), Tensor(shape=[], dtype=Bool, value= False))
epoch time: 1684662.219 ms, per step time: 276.446 ms
epoch: 2, current epoch percent: 1.000, step: 18282, outputs are (Tensor(shape=[], dtype=Float32, value= 0.618005), Tensor(shape=[], dtype=Bool, value= False))
epoch time: 1711860.908 ms, per step time: 280.909 ms
...
注意如果所运行的数据集较大,建议添加一个外部环境变量,确保HCCL不会超时。
export HCCL_CONNECT_TIMEOUT=600
将HCCL的超时时间从默认的120秒延长到600秒。
注意若使用的BERT模型较大,保存检查点时可能会出现protobuf错误,可尝试使用下面的环境集。export PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python
运行以下命令前,确保已设置加载与训练检查点路径。若将检查点路径设置为绝对全路径,例如,/username/pretrain/checkpoint_100_300.ckpt,则评估指定的检查点;若将检查点路径设置为文件夹路径,则评估文件夹中所有检查点。
修改eval.sh中task_name为将要评估的任务名以及修改相应的测试数据路径,修改device_target为"Ascend"。
bash scripts/eval.sh
可得到如下结果:
eval model: /home/dgu/checkpoints/swda/swda_3-2_6094.ckpt
loading...
evaling...
==============================================================
(w/o first and last) elapsed time: 2.3705036640167236, per step time : 0.017053983194364918
==============================================================
Accuracy : 0.8092150215136715
运行以下命令前,确保已设置加载与训练检查点路径。请将检查点路径设置为绝对全路径,例如,/username/pretrain/checkpoint_100_300.ckpt,则评估指定的检查点;若将检查点路径设置为文件夹路径,则评估文件夹中所有检查点。
修改eval.sh中task_name为将要评估的任务名以及修改相应的测试数据路径,修改device_target为"GPU"。
bash scripts/eval.sh
可得到如下结果:
eval model: /home/dgu/checkpoints/swda/swda-2_6094.ckpt
loading...
evaling...
==============================================================
(w/o first and last) elapsed time: 10.98917531967163, per step time : 0.0790588152494362
==============================================================
Accuracy : 0.8082890070921985
bash scripts/export.sh
# export finetune ckpt to mindir
参数ckpt_file
,file_format
需要在export.sh
中设置。
以下展示了使用mindir模型执行推理的示例。
# Ascend310推理
bash scripts/run_infer_310.sh [MINDIR_PATH] [DATA_FILE_PATH] [NEED_PREPROCESS] [DEVICE_ID] [DATASET]
MINDIR_PATH
为ckpt导出的mindir模型文件路径。DATA_FILE_PATH
为预处理为MindRecord格式的测试数据。NEED_PREPROCESS
表示数据是否需要预处理,取值范围为:'y' 或者 'n'。DEVICE_ID
可选,默认值为0。DATASET
为执行推理的数据集,可选,数据集包括['atis', 'mrda', 'swda', 'udc'],默认值为'atis'。推理结果保存在脚本执行的当前路径,精度计算结果可以在acc.log中看到。
run_dgu.sh中设置train_data_shuffle为true,eval_data_shuffle为false,默认对数据集进行轮换操作。
config.py中,默认将hidden_dropout_prob和note_pros_dropout_prob设置为0.1,丢弃部分网络节点。
请浏览官网主页。
基于BERT的对话通用理解模型 (DGU: Dialogue General Understanding), 可支持以下任务:udc、atis_intent、mrda、swda
Python Shell C++ Text
Dear OpenI User
Thank you for your continuous support to the Openl Qizhi Community AI Collaboration Platform. In order to protect your usage rights and ensure network security, we updated the Openl Qizhi Community AI Collaboration Platform Usage Agreement in January 2024. The updated agreement specifies that users are prohibited from using intranet penetration tools. After you click "Agree and continue", you can continue to use our services. Thank you for your cooperation and understanding.
For more agreement content, please refer to the《Openl Qizhi Community AI Collaboration Platform Usage Agreement》