提交 d594e88b 编写于 作者: 0 0YuanZhang0 提交者: pkpk

fix_dmtk_cpu_and_readme (#3041)

上级 56055e7f
#!/bin/sh
export CE_MODE_X=ce
export FLAGS_eager_delete_tensor_gb=0.0
#!/bin/bash
export FLAGS_sync_nccl_allreduce=0
export FLAGS_eager_delete_tensor_gb=1.0
export CUDA_VISIBLE_DEVICES=0
pretrain_model_path="data/saved_models/matching_pretrained"
if [ ! -d ${pretrain_model_path} ]
then
mkdir ${pretrain_model_path}
fi
python -u main.py \
--do_train True \
--use_cuda \
--save_path model_files_tmp/matching_pretrained \
--train_path data/unlabel_data/train.ids \
--val_path data/unlabel_data/val.ids \
--print_step 3 \
--num_scan_data 3 | python _ce.py
--do_train=true \
--use_cuda=true \
--loss_type="CLS" \
--max_seq_len=50 \
--save_model_path="data/saved_models/matching_pretrained" \
--save_param="params" \
--training_file="data/input/data/unlabel_data/train.ids" \
--epoch=20 \
--print_step=1 \
--save_step=400 \
--batch_size=256 \
--hidden_size=256 \
--emb_size=256 \
--vocab_size=484016 \
--learning_rate=0.001 \
--sample_pro=0.1 \
--enable_ce="store_true" | python _ce.py
export CUDA_VISIBLE_DEVICES=0,1,2,3
save_model_path="data/saved_models/human_finetuned"
if [ ! -d ${save_model_path} ]
then
mkdir ${save_model_path}
fi
python -u main.py \
--do_train True \
--use_cuda \
--save_path model_files_tmp/matching_pretrained \
--train_path data/unlabel_data/train.ids \
--val_path data/unlabel_data/val.ids \
--print_step 3 \
--num_scan_data 3 | python _ce.py
--do_train=true \
--use_cuda=true \
--loss_type="L2" \
--max_seq_len=50 \
--init_from_pretrain_model="data/saved_models/matching_pretrained" \
--save_model_path="data/saved_models/human_finetuned" \
--save_param="params" \
--training_file="data/input/data/label_data/human/train.ids" \
--epoch=50 \
--print_step=1 \
--save_step=400 \
--batch_size=256 \
--hidden_size=256 \
--emb_size=256 \
--vocab_size=484016 \
--learning_rate=0.001 \
--sample_pro=0.1 \
--enable_ce="store_true" | python _ce.py
......@@ -7,9 +7,12 @@
* [5、版本更新](#5、版本更新)
## 1、模型简介
    对话自动评估(Auto Dialogue Evaluation)评估开放领域对话系统的回复质量,能够帮助企业或个人快速评估对话系统的回复质量,减少人工评估成本。
1. 在无标注数据的情况下,利用负采样训练匹配模型作为评估工具,实现对多个对话系统回复质量排序;
2. 利用少量标注数据(特定对话系统或场景的人工打分),在匹配模型基础上进行微调,可以显著提高该对话系统或场景的评估效果。
    1. 在无标注数据的情况下,利用负采样训练匹配模型作为评估工具,实现对多个对话系统回复质量排序;
    2. 利用少量标注数据(特定对话系统或场景的人工打分),在匹配模型基础上进行微调,可以显著提高该对话系统或场景的评估效果。
## 2、快速开始
......@@ -22,56 +25,71 @@
- pandas >= 0.20.1
- PaddlePaddle >= 1.3.1,请参考[安装指南](http://www.paddlepaddle.org/#quick-start)进行安装, 本模块使用bert作为pretrain model进行模型的finetuning训练,训练速度较慢,建议安装GPU版本的PaddlePaddle
   注意:使用Windows GPU环境的用户,需要将示例代码中的[fluid.ParallelExecutor](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/fluid_cn.html#parallelexecutor)替换为[fluid.Executor](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/fluid_cn.html#executor)
  注意:使用Windows GPU环境的用户,需要将示例代码中的[fluid.ParallelExecutor](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/fluid_cn.html#parallelexecutor)替换为[fluid.Executor](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/fluid_cn.html#executor)
####   b、安装代码
    克隆数据集代码库到本地
```
git clone https://github.com/PaddlePaddle/models.git
cd models/PaddleNLP/dialogue_model_toolkit/auto_dialogue_evaluation
```
```
git clone https://github.com/PaddlePaddle/models.git
cd models/PaddleNLP/dialogue_model_toolkit/auto_dialogue_evaluation
```
### 任务简介
     本模块内模型训练主要包括两个阶段:
     1)第一阶段:训练一个匹配模型作为评估工具,可用于待评估对话系统内的回复内容进行排序;(matching任务)
     2)第二阶段:利用少量的对话系统的标记数据,对第一阶段训练的匹配模型进行finetuning, 可以提高评估效果(包含human,keywords,seq2seq_att,seq2seq_naive,4个finetuning任务);
    本模块内模型训练主要包括两个阶段:
    1)第一阶段:训练一个匹配模型作为评估工具,可用于待评估对话系统内的回复内容进行排序;(matching任务)
    2)第二阶段:利用少量的对话系统的标记数据,对第一阶段训练的匹配模型进行finetuning, 可以提高评估效果(包含human,keywords,seq2seq_att,seq2seq_naive,4个finetuning任务);
    用于第二阶段fine-tuning的对话系统包括下面四部分:
```
human: 人工模拟的对话系统;
keywords:seq2seq keywords对话系统;
seq2seq_att:seq2seq attention model 对话系统;
seq2seq_naive:naive seq2seq model对话系统;
```
```
human: 人工模拟的对话系统;
keywords:seq2seq keywords对话系统;
seq2seq_att:seq2seq attention model 对话系统;
seq2seq_naive:naive seq2seq model对话系统;
```
### 数据准备
    数据集说明:本模块内只提供训练方法,真实涉及的匹配数据及4个对话系统的数据只开源测试集数据,仅提供样例,用户如有自动化评估对话系统的需求,可自行准备业务数据集按照文档提供流程进行训练;
```
unlabel_data(第一阶段训练匹配数据集)
label_data(第二阶段finetuning数据集)
1、human: 人工对话系统产出的标注数据;
2、keywords:关键词对话系统产出的标注数据;
3、seq2seq_att:seq2seq attention model产出的标注对话数据;
4、seq2seq_naive:传统seq2seq model产出的标注对话数据;
```
     数据集、相关模型下载:
```
unlabel_data(第一阶段训练匹配数据集)
label_data(第二阶段finetuning数据集)
1、human: 人工对话系统产出的标注数据;
2、keywords:关键词对话系统产出的标注数据;
3、seq2seq_att:seq2seq attention model产出的标注对话数据;
4、seq2seq_naive:传统seq2seq model产出的标注对话数据;
```
    数据集、相关模型下载:
```
cd ade && sh prepare_data_and_model.sh
```
```
cd ade && bash prepare_data_and_model.sh
```
    下载经过预处理的数据,运行该脚本之后,data目录下会存在unlabel_data(train.ids/val.ids/test.ids),lable_data: human、keywords、seq2seq_att、seq2seq_naive(四个任务数据train.ids/val.ids/test.ids),以及word2ids.
### 单机训练
####1、第一阶段matching模型的训练:
####      方式一: 推荐直接使用模块内脚本训练
#### 1、第一阶段matching模型的训练:
####     方式一: 推荐直接使用模块内脚本训练
```
sh run .sh matching train
bash run.sh matching train
```
     方式一如果为CPU训练:
    方式一如果为CPU训练:
```
请将run.sh内参数设置为:
1、export CUDA_VISIBLE_DEVICES=
```
     方式一如果为GPU训练:
    方式一如果为GPU训练:
```
请将run.sh内参数设置为:
......@@ -80,14 +98,18 @@ export CUDA_VISIBLE_DEVICES=0
2、如果为多卡训练(用户指定空闲的多张卡):
export CUDA_VISIBLE_DEVICES=0,1,2,3
```
####      方式二: 执行训练相关的代码:
####     方式二: 执行训练相关的代码:
```
export FLAGS_sync_nccl_allreduce=0
export FLAGS_eager_delete_tensor_gb=1 #开启显存优化
export CUDA_VISIBLE_DEVICES=0 #GPU单卡训练
#export CUDA_VISIBLE_DEVICES=0,1,2,3 #GPU多卡训练
#export CUDA_VISIBLE_DEVICES= #CPU训练
#export CPU_NUM=1 #CPU训练时指定CPU number
if [ ! "$CUDA_VISIBLE_DEVICES" ]
then
......@@ -118,29 +140,34 @@ python -u main.py \
--emb_size=256 \
--vocab_size=484016 \
--learning_rate=0.001 \
--sample_pro 0.1
--sample_pro=0.1
```
####2、第二阶段finetuning模型的训练:
####      方式一: 推荐直接使用模块内脚本训练
#### 2、第二阶段finetuning模型的训练:
####     方式一: 推荐直接使用模块内脚本训练
```
sh run.sh task_name task_type
bash run.sh task_name task_type
参数说明:
task_name: seq2seq_naive、seq2seq_att、keywords、human,选择4个任务中任意一项;
task_type: train、predict、evaluate、inference, 选择4个参数选项中任意一项(train: 只执行训练,predict: 只执行预测,evaluate:只执行评估过程,依赖预测的结果,inference: 保存inference model;
训练示例: sh run .sh human train
训练示例: bash run.sh human train
```
     CPU和GPU使用方式如单机训练1中所示;
####      方式二: 执行训练相关的代码:
    CPU和GPU使用方式如单机训练1中所示;
####     方式二: 执行训练相关的代码:
```
export FLAGS_sync_nccl_allreduce=0
export FLAGS_eager_delete_tensor_gb=1 #开启显存优化
export CUDA_VISIBLE_DEVICES=0 #GPU单卡训练
#export CUDA_VISIBLE_DEVICES=0,1,2,3 #GPU多卡训练
#export CUDA_VISIBLE_DEVICES= #CPU训练
#export CPU_NUM=1 #CPU训练时指定CPU number
if [ ! "$CUDA_VISIBLE_DEVICES" ]
then
......@@ -172,22 +199,27 @@ python -u main.py \
--emb_size=256 \
--vocab_size=484016 \
--learning_rate=0.001 \
--sample_pro 0.1
--sample_pro=0.1
```
### 模型预测
####1、第一阶段matching模型的预测:
#### 1、第一阶段matching模型的预测:
####     方式一: 推荐直接使用模块内脚本预测
####      方式一: 推荐直接使用模块内脚本预测
```
sh run .sh matching predict
bash run.sh matching predict
```
     方式一如果为CPU预测:
    方式一如果为CPU预测:
```
请将run.sh内参数设置为:
1、export CUDA_VISIBLE_DEVICES=
export CUDA_VISIBLE_DEVICES=
```
     方式一如果为GPU预测:
    方式一如果为GPU预测:
```
请将run.sh内参数设置为:
单卡预测:
......@@ -195,13 +227,15 @@ export CUDA_VISIBLE_DEVICES=0 #用户可自行指定空闲的卡
```
注:预测时,如采用方式一,用户可通过修改run.sh中init_from_params参数来指定自己需要预测的模型,目前代码中默认预测本模块提供的训练好的模型;
####      方式二: 执行预测相关的代码:
####     方式二: 执行预测相关的代码:
```
export FLAGS_sync_nccl_allreduce=0
export FLAGS_eager_delete_tensor_gb=1 #开启显存优化
export CUDA_VISIBLE_DEVICES=0 #单卡预测
#export CUDA_VISIBLE_DEVICES= #CPU预测
#export CPU_NUM=1 #CPU训练时指定CPU number
if [ ! "$CUDA_VISIBLE_DEVICES" ]
then
......@@ -223,26 +257,33 @@ python -u main.py \
--emb_size=256 \
--vocab_size=484016
```
注:采用方式二时,模型预测过程可参考run.sh内具体任务的参数设置
####2、第二阶段finetuning模型的预测:
####      方式一: 推荐直接使用模块内脚本预测
#### 2、第二阶段finetuning模型的预测:
####     方式一: 推荐直接使用模块内脚本预测
```
sh run.sh task_name task_type
bash run.sh task_name task_type
参数说明:
task_name: seq2seq_naive、seq2seq_att、keywords、human,选择4个任务中任意一项;
task_type: train、predict、evaluate、inference, 选择4个参数选项中任意一项(train: 只执行训练,predict: 只执行预测,evaluate:只执行评估过程,依赖预测的结果,inference: 保存inference model;
预测示例: sh run .sh human predict
预测示例: bash run.sh human predict
```
     指定CPU或者GPU方法同上模型预测1中所示;
####      方式二: 执行预测相关的代码:
    指定CPU或者GPU方法同上模型预测1中所示;
####     方式二: 执行预测相关的代码:
```
export FLAGS_sync_nccl_allreduce=0
export FLAGS_eager_delete_tensor_gb=1 #开启显存优化
export CUDA_VISIBLE_DEVICES=0 #单卡预测
#export CUDA_VISIBLE_DEVICES= #CPU预测
#export CPU_NUM=1 #CPU训练时指定CPU number
if [ ! "$CUDA_VISIBLE_DEVICES" ]
then
......@@ -266,40 +307,55 @@ python -u main.py \
```
### 模型评估
     模块中5个任务,各任务支持计算的评估指标内容如下:
```
第一阶段:
matching: 使用R1@2, R1@10, R2@10, R5@10四个指标进行评估排序模型的效果;
第二阶段:
human: 使用spearman相关系数来衡量评估模型对系统的打分与实际对话系统打分之间的关系;
keywords:使用spearman相关系数来衡量评估模型对系统的打分与实际对话系统打分之间的关系;
seq2seq_att:使用spearman相关系数来衡量评估模型对系统的打分与实际对话系统打分之间的关系;
seq2seq_naive:使用spearman相关系数来衡量评估模型对系统的打分与实际对话系统打分之间的关系;
```
     效果上,以四个不同的对话系统(seq2seq\_naive/seq2seq\_att/keywords/human)为例,使用对话自动评估工具进行自动评估。
     在四个对话系统上,自动评估打分和人工评估打分spearman相关系数,如下:
    模块中5个任务,各任务支持计算的评估指标内容如下:
```
第一阶段:
matching: 使用R1@2, R1@10, R2@10, R5@10四个指标进行评估排序模型的效果;
第二阶段:
human: 使用spearman相关系数来衡量评估模型对系统的打分与实际对话系统打分之间的关系;
keywords:使用spearman相关系数来衡量评估模型对系统的打分与实际对话系统打分之间的关系;
seq2seq_att:使用spearman相关系数来衡量评估模型对系统的打分与实际对话系统打分之间的关系;
seq2seq_naive:使用spearman相关系数来衡量评估模型对系统的打分与实际对话系统打分之间的关系;
```
    效果上,以四个不同的对话系统(seq2seq\_naive/seq2seq\_att/keywords/human)为例,使用对话自动评估工具进行自动评估。
    1. 无标注数据情况下,直接使用预训练好的评估工具进行评估;
在四个对话系统上,自动评估打分和人工评估打分spearman相关系数,如下:
/|seq2seq\_naive|seq2seq\_att|keywords|human
--|:--:|--:|:--:|--:
cor|0.361|0.343|0.324|0.288
     对四个系统平均得分排序:
对四个系统平均得分排序:
人工评估|k(0.591)<n(0.847)<a(1.116)<h(1.240)
--|--:
自动评估|k(0.625)<n(0.909)<a(1.399)<h(1.683)
&ensp;&ensp;&ensp;&ensp;2. 利用少量标注数据微调后,自动评估打分和人工打分spearman相关系数,如下:
/|seq2seq\_naive|seq2seq\_att|keywords|human
--|:--:|--:|:--:|--:
cor|0.474|0.477|0.443|0.378
#### 1、第一阶段matching模型的评估:
#### &ensp;&ensp;&ensp;&ensp;方式一: 推荐直接使用模块内脚本评估
####1、第一阶段matching模型的评估:
#### &ensp;&ensp;&ensp;&ensp; 方式一: 推荐直接使用模块内脚本评估
```
sh run .sh matching evaluate
bash run.sh matching evaluate
```
注:评估计算ground_truth和predict_label之间的打分,默认CPU计算即可;
#### &ensp;&ensp;&ensp;&ensp; 方式二: 执行评估相关的代码:
#### &ensp;&ensp;&ensp;&ensp;方式二: 执行评估相关的代码:
```
export CUDA_VISIBLE_DEVICES= #指默认CPU评估
export CPU_NUM=1 #CPU训练时指定CPU number
python -u main.py \
--do_eval=true \
......@@ -308,19 +364,24 @@ python -u main.py \
--output_prediction_file="data/output/pretrain_matching_predict" \
--loss_type="CLS"
```
####2、第二阶段finetuning模型的评估:
#### &ensp;&ensp;&ensp;&ensp; 方式一: 推荐直接使用模块内脚本评估
#### 2、第二阶段finetuning模型的评估:
#### &ensp;&ensp;&ensp;&ensp;方式一: 推荐直接使用模块内脚本评估
```
sh run.sh task_name task_type
bash run.sh task_name task_type
参数说明:
task_name: seq2seq_naive、seq2seq_att、keywords、human,选择4个任务中任意一项;
task_type: train、predict、evaluate、inference, 选择4个参数选项中任意一项(train: 只执行训练,predict: 只执行预测,evaluate:只执行评估过程,依赖预测的结果,inference: 保存inference model;
评估示例: sh run .sh human evaluate
评估示例: bash run.sh human evaluate
```
#### &ensp;&ensp;&ensp;&ensp; 方式二: 执行评估相关的代码:
#### &ensp;&ensp;&ensp;&ensp;方式二: 执行评估相关的代码:
```
export CUDA_VISIBLE_DEVICES= #指默认CPU评估
export CPU_NUM=1 #CPU训练时指定CPU number
python -u main.py \
--do_eval=true \
......@@ -331,27 +392,34 @@ python -u main.py \
```
### 模型推断
####1、第一阶段matching模型的推断:
#### &ensp;&ensp;&ensp;&ensp; 方式一: 推荐直接使用模块内脚本保存inference model
#### 1、第一阶段matching模型的推断:
#### &ensp;&ensp;&ensp;&ensp;方式一: 推荐直接使用模块内脚本保存inference model
```
sh run .sh matching inference
bash run.sh matching inference
```
&ensp;&ensp;&ensp;&ensp; 方式一如果为CPU执行inference model过程:
&ensp;&ensp;&ensp;&ensp;方式一如果为CPU执行inference model过程:
```
请将run.sh内参数设置为:
1、export CUDA_VISIBLE_DEVICES=
export CUDA_VISIBLE_DEVICES=
```
&ensp;&ensp;&ensp;&ensp; 方式一如果为GPU执行inference model过程:
&ensp;&ensp;&ensp;&ensp;方式一如果为GPU执行inference model过程:
```
请将run.sh内参数设置为:
单卡推断(用户指定空闲的单卡):
export CUDA_VISIBLE_DEVICES=0
```
#### &ensp;&ensp;&ensp;&ensp; 方式二: 执行inference model相关的代码:
#### &ensp;&ensp;&ensp;&ensp;方式二: 执行inference model相关的代码:
```
export CUDA_VISIBLE_DEVICES=0 # 指GPU单卡推断
#export CUDA_VISIBLE_DEVICES= #CPU推断
#export CPU_NUM=1 #CPU训练时指定CPU number
if [ ! "$CUDA_VISIBLE_DEVICES" ]
then
......@@ -367,23 +435,26 @@ python -u main.py \
--inference_model_dir="data/inference_models/matching_inference_model"
```
####2、第二阶段finetuning模型的推断:
#### &ensp;&ensp;&ensp;&ensp; 方式一: 推荐直接使用模块内脚本保存inference model
#### 2、第二阶段finetuning模型的推断:
#### &ensp;&ensp;&ensp;&ensp;方式一: 推荐直接使用模块内脚本保存inference model
```
sh run.sh task_name task_type
bash run.sh task_name task_type
参数说明:
task_name: seq2seq_naive、seq2seq_att、keywords、human,选择4个任务中任意一项;
task_type: train、predict、evaluate、inference, 选择4个参数选项中任意一项(train: 只执行训练,predict: 只执行预测,evaluate:只执行评估过程,依赖预测的结果,inference: 保存inference model;
评估示例: sh run.sh human inference
评估示例: bash run.sh human inference
```
&ensp;&ensp;&ensp;&ensp; CPU和GPU指定方式同模型推断1中所示;
#### &ensp;&ensp;&ensp;&ensp; 方式二: 执行inference model相关的代码:
&ensp;&ensp;&ensp;&ensp;CPU和GPU指定方式同模型推断1中所示;
#### &ensp;&ensp;&ensp;&ensp;方式二: 执行inference model相关的代码:
```
export CUDA_VISIBLE_DEVICES=0 # 指GPU单卡推断
#export CUDA_VISIBLE_DEVICES= #CPU推断
#export CPU_NUM=1 #CPU训练时指定CPU number
if [ ! "$CUDA_VISIBLE_DEVICES" ]
then
......@@ -400,34 +471,39 @@ python -u main.py \
```
### 服务部署
&ensp;&ensp;&ensp;&ensp; 模块内提供已训练好6个对话任务的inference_model模型,用户可根据自身业务情况进行下载使用。
&ensp;&ensp;&ensp;&ensp;模块内提供已训练好6个对话任务的inference_model模型,用户可根据自身业务情况进行下载使用。
#### 服务器部署
&ensp;&ensp;&ensp;&ensp; 请参考PaddlePaddle官方提供的[服务器端部署](https://www.paddlepaddle.org.cn/documentation/docs/zh/1.5/advanced_usage/deploy/inference/index_cn.html)文档进行部署上线。
&ensp;&ensp;&ensp;&ensp;请参考PaddlePaddle官方提供的[服务器端部署](https://www.paddlepaddle.org.cn/documentation/docs/zh/1.5/advanced_usage/deploy/inference/index_cn.html)文档进行部署上线。
## 3、进阶使用
### 背景介绍
&ensp;&ensp;&ensp;&ensp; 对话自动评估任务输入是文本对(上文,回复),输出是回复质量得分,匹配任务(预测上下文是否匹配)和自动评估任务有天然的联系,该项目利用匹配任务作为自动评估的预训练,利用少量标注数据,在匹配模型基础上微调。
&ensp;&ensp;&ensp;&ensp;对话自动评估任务输入是文本对(上文,回复),输出是回复质量得分,匹配任务(预测上下文是否匹配)和自动评估任务有天然的联系,该项目利用匹配任务作为自动评估的预训练,利用少量标注数据,在匹配模型基础上微调。
### 模型概览
&ensp;&ensp;&ensp;&ensp; 本模块内提供的模型为:
&ensp;&ensp;&ensp;&ensp; 1)匹配模型:context和response作为输入,使用lstm学习两个句子的表示,在计算两个线性张量的积作为logits,然后sigmoid_cross_entropy_with_logits作为loss, 最终用来评估相似程度;
&ensp;&ensp;&ensp;&ensp; 2)finetuing模型:在匹配模型的基础上,将sigmoid_cross_entropy_with_logits loss优化成平方损失loss,来进行训练;
&ensp;&ensp;&ensp;&ensp; 模型中所需数据格式如下:
&ensp;&ensp;&ensp;&ensp; 训练、预测、评估使用的数据示例如下,数据由三列组成,以制表符('\t')分隔,第一列是以空格分开的上文id,第二列是以空格分开的回复id,第三列是标签
&ensp;&ensp;&ensp;&ensp;本模块内提供的模型为:
&ensp;&ensp;&ensp;&ensp;1)匹配模型:context和response作为输入,使用lstm学习两个句子的表示,在计算两个线性张量的积作为logits,然后sigmoid_cross_entropy_with_logits作为loss, 最终用来评估相似程度;
&ensp;&ensp;&ensp;&ensp;2)finetuing模型:在匹配模型的基础上,将sigmoid_cross_entropy_with_logits loss优化成平方损失loss,来进行训练;
&ensp;&ensp;&ensp;&ensp;模型中所需数据格式如下:
&ensp;&ensp;&ensp;&ensp;训练、预测、评估使用的数据示例如下,数据由三列组成,以制表符('\t')分隔,第一列是以空格分开的上文id,第二列是以空格分开的回复id,第三列是标签
```
723 236 7823 12 8 887 13 77 4 2
8474 13 44 34 2 87 91 23 0
```
&ensp;&ensp;&ensp;&ensp; 注:本项目额外提供了分词预处理脚本(在preprocess目录下),可供用户使用,具体使用方法如下:
&ensp;&ensp;&ensp;&ensp;注:本项目额外提供了分词预处理脚本(在preprocess目录下),可供用户使用,具体使用方法如下:
```
python tokenizer.py --test_data_dir ./test.txt.utf8 --batch_size 1 > test.txt.utf8.seg
```
## 4、参考论文
1、Anjuli Kannan and Oriol Vinyals. 2017. Adversarial evaluation of dialogue models. arXiv preprint arXiv:1701.08198.
2、Ryan Lowe, Michael Noseworthy, Iulian V Serban, Nicolas Angelard-Gontier, Yoshua Bengio, and Joelle Pineau. 2017. Towards an automatic turing test: Learning to evaluate dialogue responses. arXiv preprint arXiv:1708.07149.
......@@ -451,6 +527,7 @@ of machine translation. In Proceedings of the 40th annual meeting on association
## 作者
zhangxiyuan01@baidu.com
zhouxiangyang@baidu.com
lilu12@baidu.com
......
......@@ -7,7 +7,7 @@ save_steps: 10
num_scan_data: ""
word_emb_init: ""
init_model: ""
use_cuda: ""
use_cuda: True
batch_size: 256
hidden_size: 256
emb_size: 256
......@@ -26,4 +26,4 @@ vocab_path: ""
max_seq_len: 128
random_seed: 110
do_save_inference_model: False
enable_ce: "store_true"
enable_ce: ""
......@@ -16,9 +16,6 @@ fi
TRAIN_TYPE=$1
TASK_TYPE=$2
typeset -l TRAIN_TYPE
typeset -l TASK_TYPE
candi_train_type=("matching" "seq2seq_naive" "seq2seq_att" "keywords" "human")
candi_task_type=("train" "predict" "evaluate" "inference")
......@@ -43,6 +40,7 @@ PYTHON_PATH="python"
#train pretrain model
if [ ! "$CUDA_VISIBLE_DEVICES" ]
then
export CPU_NUM=1
use_cuda=false
else
use_cuda=true
......
#!/bin/bash
train_atis_slot(){
train_atis_slot(){
if [ ! -d "./data/saved_models/atis_slot" ]; then
mkdir "./data/saved_models/atis_slot"
fi
python -u train.py \
--task_name atis_slot \
--use_cuda true \
--do_train true \
--do_val true \
--do_test true \
--epoch 2 \
--batch_size 32 \
--data_dir ./data/atis/atis_slot \
--bert_config_path ./uncased_L-12_H-768_A-12/bert_config.json \
--vocab_path ./uncased_L-12_H-768_A-12/vocab.txt \
--init_pretraining_params ./uncased_L-12_H-768_A-12/params \
--checkpoints ./output/atis_slot \
--save_steps 100 \
--learning_rate 2e-5 \
--weight_decay 0.01 \
--max_seq_len 128 \
--skip_steps 10 \
--validation_steps 1000000 \
--num_iteration_per_drop_scope 10 \
--use_fp16 false \
--enable_ce
--task_name=atis_slot \
--use_cuda=true \
--do_train=true \
--in_tokens=false \
--epoch=2 \
--batch_size=32 \
--data_dir=./data/input/data/atis/atis_slot \
--bert_config_path=./data/pretrain_model/uncased_L-12_H-768_A-12/bert_config.json \
--vocab_path=./data/pretrain_model/uncased_L-12_H-768_A-12/vocab.txt \
--init_from_pretrain_model=./data/pretrain_model/uncased_L-12_H-768_A-12/params \
--save_model_path=./data/saved_models/atis_slot \
--save_param="params" \
--save_steps=100 \
--learning_rate=2e-5 \
--weight_decay=0.01 \
--max_seq_len=128 \
--print_steps=10 \
--use_fp16=false \
--enable_ce=store_true
}
train_mrda(){
train_atis_intent(){
if [ ! -d "./data/saved_models/atis_intent" ]; then
mkdir "./data/saved_models/atis_intent"
fi
python -u train.py \
--task_name mrda \
--use_cuda true \
--do_train true \
--do_val true \
--do_test true \
--epoch 2 \
--batch_size 4096 \
--data_dir ./data/mrda \
--bert_config_path ./uncased_L-12_H-768_A-12/bert_config.json \
--vocab_path ./uncased_L-12_H-768_A-12/vocab.txt \
--init_pretraining_params ./uncased_L-12_H-768_A-12/params \
--checkpoints ./output/mrda \
--save_steps 500 \
--learning_rate 2e-5 \
--weight_decay 0.01 \
--max_seq_len 128 \
--skip_steps 200 \
--validation_steps 1000000 \
--num_iteration_per_drop_scope 10 \
--use_fp16 false \
--enable_ce
--task_name=atis_intent \
--use_cuda=true \
--do_train=true \
--in_tokens=true \
--epoch=2 \
--batch_size=4096 \
--data_dir=./data/input/data/atis/atis_intent \
--bert_config_path=./data/pretrain_model/uncased_L-12_H-768_A-12/bert_config.json \
--vocab_path=./data/pretrain_model/uncased_L-12_H-768_A-12/vocab.txt \
--init_from_pretrain_model=./data/pretrain_model/uncased_L-12_H-768_A-12/params \
--save_model_path=./data/saved_models/atis_intent \
--save_param="params" \
--save_steps=100 \
--learning_rate=2e-5 \
--weight_decay=0.01 \
--max_seq_len=128 \
--print_steps=10 \
--use_fp16=false \
--enable_ce=store_true
}
# FIXME(zjl): this model would fail when GC is enabled,
......@@ -63,5 +65,4 @@ sleep 20
cudaid=${single:=0}
export CUDA_VISIBLE_DEVICES=$cudaid
train_atis_slot | python _ce.py
train_atis_intent | python _ce.py
......@@ -20,7 +20,7 @@
- cudnn >= 7.0
- PaddlePaddle >= 1.3.1,请参考[安装指南](http://www.paddlepaddle.org/#quick-start)进行安装, 由于模块内模型基于bert做finetuning, 训练速度较慢, 建议用户安装GPU版本PaddlePaddle进行训练。
&ensp;&ensp; 注意:使用Windows GPU环境的用户,需要将示例代码中的[fluid.ParallelExecutor](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/fluid_cn.html#parallelexecutor)替换为[fluid.Executor](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/fluid_cn.html#executor)
&ensp;&ensp;注意:使用Windows GPU环境的用户,需要将示例代码中的[fluid.ParallelExecutor](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/fluid_cn.html#parallelexecutor)替换为[fluid.Executor](http://paddlepaddle.org/documentation/docs/zh/1.4/api_cn/fluid_cn.html#executor)
#### &ensp;&ensp;b、安装代码
&ensp;&ensp;&ensp;&ensp;克隆代码库到本地
......@@ -31,7 +31,7 @@ cd models/PaddleNLP/dialogue_model_toolkit/dialogue_general_understanding
```
### 任务简介
&ensp;&ensp;&ensp;&ensp; 本模块内共包含6个任务,内容如下:
&ensp;&ensp;&ensp;&ensp;本模块内共包含6个任务,内容如下:
```
udc: 使用Ubuntu Corpus V1公开数据集,实现对话匹配任务;
......@@ -41,6 +41,7 @@ atis_intent: 使用微软提供的公开数据集(Airline Travel Information Sys
mrda: 使用公开数据集Meeting Recorder Dialogue Act,实现DA识别任务;
swda:使用公开数据集Switchboard Dialogue Act Corpus,实现DA识别任务;
```
### 数据准备
&ensp;&ensp;&ensp;&ensp;数据集说明:
......@@ -52,44 +53,51 @@ MRDA: Meeting Recorder Dialogue Act;
SWDA:Switchboard Dialogue Act Corpus;
```
&ensp;&ensp;&ensp;&ensp; 数据集、相关模型下载:
&ensp;&ensp;&ensp;&ensp;数据集、相关模型下载:
```
cd dgu && sh prepare_data_and_model.sh
cd dgu && bash prepare_data_and_model.sh
```
&ensp;&ensp;&ensp;&ensp; 下载的数据集中已提供了训练集,测试集和验证集,用户如果需要重新生成某任务数据集的训练数据,可执行:
&ensp;&ensp;&ensp;&ensp;下载的数据集中已提供了训练集,测试集和验证集,用户如果需要重新生成某任务数据集的训练数据,可执行:
```
cd dgu/scripts && sh run_build_data.sh task_name
cd dgu/scripts && bash run_build_data.sh task_name
参数说明:
task_name: udc, swda, mrda, atis, dstc2, 选择5个数据集选项中用户需要生成的数据名
```
### 单机训练
#### &ensp;&ensp;&ensp;&ensp; 方式一: 推荐直接使用模块内脚本训练
#### &ensp;&ensp;&ensp;&ensp;方式一: 推荐直接使用模块内脚本训练
```
sh run.sh task_name task_type
bash run.sh task_name task_type
参数说明:
task_name: udc, swda, mrda, atis_intent, atis_slot, dstc2,选择6个任务中任意一项;
task_type: train,predict, evaluate, inference, all, 选择5个参数选项中任意一项(train: 只执行训练,predict: 只执行预测,evaluate:只执行评估过程,依赖预测的结果,inference: 保存inference model,all: 顺序执行训练、预测、评估、保存inference model的过程);
训练示例: sh run.sh atis_intent train
训练示例: bash run.sh atis_intent train
```
&ensp;&ensp;&ensp;&ensp; 方式一如果为CPU训练:
&ensp;&ensp;&ensp;&ensp;方式一如果为CPU训练:
```
请将run.sh内参数设置为:
1、export CUDA_VISIBLE_DEVICES=
```
&ensp;&ensp;&ensp;&ensp; 方式一如果为GPU训练:
&ensp;&ensp;&ensp;&ensp;方式一如果为GPU训练:
```
请将run.sh内参数设置为:
1、如果为单卡训练(用户指定空闲的单卡):
export CUDA_VISIBLE_DEVICES=0
2、如果为多卡训练(用户指定空闲的多张卡):
export CUDA_VISIBLE_DEVICES=0,1,2,3
```
#### &ensp;&ensp;&ensp;&ensp; 方式二: 执行训练相关的代码:
#### &ensp;&ensp;&ensp;&ensp;方式二: 执行训练相关的代码:
```
export FLAGS_sync_nccl_allreduce=0
......@@ -109,6 +117,10 @@ fi
TASK_NAME="atis_intent" #指定训练的任务名称
BERT_BASE_PATH="data/pretrain_model/uncased_L-12_H-768_A-12"
if [ ! -d "./data/saved_models/${TASK_NAME}" ]; then
mkdir "./data/saved_models/${TASK_NAME}"
fi
python -u main.py \
--task_name=${TASK_NAME} \
--use_cuda=${use_cuda} \
......@@ -130,32 +142,40 @@ python -u main.py \
--print_steps=10 \
--use_fp16 false
```
注:采用方式二时,模型训练过程可参考run.sh内相关任务的参数设置
### 模型预测
#### &ensp;&ensp;&ensp;&ensp; 方式一: 推荐直接使用模块内脚本预测
#### &ensp;&ensp;&ensp;&ensp;方式一: 推荐直接使用模块内脚本预测
```
sh run.sh task_name task_type
bash run.sh task_name task_type
参数说明:
task_name: udc, swda, mrda, atis_intent, atis_slot, dstc2,选择6个任务中任意一项;
task_type: train,predict, evaluate, inference, all, 选择5个参数选项中任意一项(train: 只执行训练,predict: 只执行预测,evaluate:只执行评估过程,依赖预测的结果,inference: 保存inference model,all: 顺序执行训练、预测、评估、保存inference model的过程);
预测示例: sh run.sh atis_intent predict
预测示例: bash run.sh atis_intent predict
```
&ensp;&ensp;&ensp;&ensp; 方式一如果为CPU预测:
&ensp;&ensp;&ensp;&ensp;方式一如果为CPU预测:
```
请将run.sh内参数设置为:
1、export CUDA_VISIBLE_DEVICES=
```
&ensp;&ensp;&ensp;&ensp; 方式一如果为GPU预测:
&ensp;&ensp;&ensp;&ensp;方式一如果为GPU预测:
```
请将run.sh内参数设置为:
支持单卡预测(用户指定空闲的单卡):
export CUDA_VISIBLE_DEVICES=0
```
注:预测时,如采用方式一,用户可通过修改run.sh中init_from_params参数来指定自己训练好的需要预测的模型,目前代码中默认为加载官方已经训练好的模型;
#### &ensp;&ensp;&ensp;&ensp; 方式二: 执行预测相关的代码:
#### &ensp;&ensp;&ensp;&ensp;方式二: 执行预测相关的代码:
```
export FLAGS_sync_nccl_allreduce=0
export FLAGS_eager_delete_tensor_gb=1 #开启显存优化
......@@ -191,7 +211,8 @@ python -u main.py \
注:采用方式二时,模型预测过程可参考run.sh内具体任务的参数设置
### 模型评估
&ensp;&ensp;&ensp;&ensp; 模块中6个任务,各任务支持计算的评估指标内容如下:
&ensp;&ensp;&ensp;&ensp;模块中6个任务,各任务支持计算的评估指标内容如下:
```
udc: 使用R1@10、R2@10、R5@10三个指标评估匹配任务的效果;
atis_slot: 使用F1指标来评估序列标注任务;
......@@ -200,7 +221,8 @@ atis_intent: 使用acc指标来评估分类结果;
mrda: 使用acc指标来评估DA任务分类结果;
swda:使用acc指标来评估DA任务分类结果;
```
&ensp;&ensp;&ensp;&ensp; 效果上,6个任务公开数据集评测效果如下表所示:
&ensp;&ensp;&ensp;&ensp;效果上,6个任务公开数据集评测效果如下表所示:
| task_name | udc | udc | udc | atis_slot | dstc2 | atis_intent | swda | mrda |
| :------ | :------ | :------ | :------ | :------| :------ | :------ | :------ | :------ |
......@@ -211,19 +233,20 @@ swda:使用acc指标来评估DA任务分类结果;
| SOTA | 76.70% | 87.40% | 96.90% | 96.89% | 74.50% | 98.32% | 81.30% | 91.70% |
| DGU | 82.03% | 90.59% | 97.73% | 97.14% | 91.23% | 97.76% | 80.37% | 91.53% |
#### &ensp;&ensp;&ensp;&ensp; 方式一: 推荐直接使用模块内脚本评估
#### &ensp;&ensp;&ensp;&ensp;方式一: 推荐直接使用模块内脚本评估
```
sh run.sh task_name task_type
bash run.sh task_name task_type
参数说明:
task_name: udc, swda, mrda, atis_intent, atis_slot, dstc2,选择6个任务中任意一项;
task_type: train,predict, evaluate, inference, all, 选择5个参数选项中任意一项(train: 只执行训练,predict: 只执行预测,evaluate:只执行评估过程,依赖预测的结果,inference: 保存inference model,all: 顺序执行训练、预测、评估、保存inference model的过程);
评估示例: sh run.sh atis_intent evaluate
评估示例: bash run.sh atis_intent evaluate
```
注:评估计算ground_truth和predict_label之间的打分,默认CPU计算即可;
#### &ensp;&ensp;&ensp;&ensp; 方式二: 执行评估相关的代码:
#### &ensp;&ensp;&ensp;&ensp;方式二: 执行评估相关的代码:
```
TASK_NAME="atis_intent" #指定预测的任务名称
......@@ -237,28 +260,34 @@ python -u main.py \
```
### 模型推断
#### &ensp;&ensp;&ensp;&ensp; 方式一: 推荐直接使用模块内脚本保存inference model
#### &ensp;&ensp;&ensp;&ensp;方式一: 推荐直接使用模块内脚本保存inference model
```
sh run.sh task_name task_type
bash run.sh task_name task_type
参数说明:
task_name: udc, swda, mrda, atis_intent, atis_slot, dstc2,选择6个任务中任意一项;
task_type: train,predict, evaluate, inference, all, 选择5个参数选项中任意一项(train: 只执行训练,predict: 只执行预测,evaluate:只执行评估过程,依赖预测的结果,inference: 保存inference model,all: 顺序执行训练、预测、评估、保存inference model的过程);
保存模型示例: sh run.sh atis_intent inference
保存模型示例: bash run.sh atis_intent inference
```
&ensp;&ensp;&ensp;&ensp; 方式一如果为CPU执行inference model过程:
&ensp;&ensp;&ensp;&ensp;方式一如果为CPU执行inference model过程:
```
请将run.sh内参数设置为:
1、export CUDA_VISIBLE_DEVICES=
```
&ensp;&ensp;&ensp;&ensp; 方式一如果为GPU执行inference model过程:
&ensp;&ensp;&ensp;&ensp;方式一如果为GPU执行inference model过程:
```
请将run.sh内参数设置为:
1、单卡模型推断(用户指定空闲的单卡):
export CUDA_VISIBLE_DEVICES=0
```
#### &ensp;&ensp;&ensp;&ensp; 方式二: 执行inference model相关的代码:
#### &ensp;&ensp;&ensp;&ensp;方式二: 执行inference model相关的代码:
```
TASK_NAME="atis_intent" #指定预测的任务名称
BERT_BASE_PATH="./data/pretrain_model/uncased_L-12_H-768_A-12"
......@@ -282,7 +311,7 @@ python -u main.py \
```
### 预训练模型
&ensp;&ensp;&ensp;&ensp; 支持PaddlePaddle官方提供的BERT及ERNIE相关模型作为预训练模型
&ensp;&ensp;&ensp;&ensp;支持PaddlePaddle官方提供的BERT及ERNIE相关模型作为预训练模型
| Model | Layers | Hidden size | Heads |Parameters |
| :------| :------: | :------: |:------: |:------: |
......@@ -294,9 +323,9 @@ python -u main.py \
### 服务部署
&ensp;&ensp;&ensp;&ensp; 模块内提供已训练好6个对话任务的inference_model模型,用户可根据自身业务情况进行下载使用。
&ensp;&ensp;&ensp;&ensp;模块内提供已训练好6个对话任务的inference_model模型,用户可根据自身业务情况进行下载使用。
#### 服务器部署
&ensp;&ensp;&ensp;&ensp; 请参考PaddlePaddle官方提供的[服务器端部署](https://www.paddlepaddle.org.cn/documentation/docs/zh/1.5/advanced_usage/deploy/inference/index_cn.html)文档进行部署上线。
&ensp;&ensp;&ensp;&ensp;请参考PaddlePaddle官方提供的[服务器端部署](https://www.paddlepaddle.org.cn/documentation/docs/zh/1.5/advanced_usage/deploy/inference/index_cn.html)文档进行部署上线。
## 3、进阶使用
......@@ -361,6 +390,7 @@ python -u main.py \
## 作者
zhangxiyuan01@baidu.com
zhouxiangyang@baidu.com
## 如何贡献代码
......
......@@ -27,4 +27,4 @@ use_cuda: True
task_name: ""
in_tokens: False
do_save_inference_model: False
enable_ce: "store_true"
enable_ce: ""
......@@ -6,6 +6,7 @@ export FLAGS_eager_delete_tensor_gb=1
export CUDA_VISIBLE_DEVICES=0
if [ ! "$CUDA_VISIBLE_DEVICES" ]
then
export CPU_NUM=1
use_cuda=false
else
use_cuda=true
......@@ -14,9 +15,6 @@ fi
TASK_NAME=$1
TASK_TYPE=$2
typeset -l TASK_NAME
typeset -l TASK_TYPE
BERT_BASE_PATH="./data/pretrain_model/uncased_L-12_H-768_A-12"
INPUT_PATH="./data/input/data/${TASK_NAME}"
SAVE_MODEL_PATH="./data/saved_models/${TASK_NAME}"
......@@ -64,7 +62,7 @@ then
print_steps=10
batch_size=4096
in_tokens=true
epoch=1
epoch=20
learning_rate=2e-5
INPUT_PATH="./data/input/data/atis/${TASK_NAME}"
elif [ "${TASK_NAME}" = "atis_slot" ]
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册