Skip to content

Commit 07a25b2

Browse files
authored
Add clue benchmark (cmrc2018, chid, c3) (#1810)
* update chid, c3 * update chid, c3 * update chid * update train c3 script * update train and test * fix chid data process * fix readme error
1 parent 3351ab0 commit 07a25b2

File tree

7 files changed

+1531
-318
lines changed

7 files changed

+1531
-318
lines changed

examples/benchmark/clue/README.md

Lines changed: 70 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -8,41 +8,51 @@
88

99
使用多种中文预训练模型微调在 CLUE 的各验证集上有如下结果:
1010

11-
| Model | AFQMC | TNEWS | IFLYTEK | CMNLI | OCNLI | CLUEWSC2020 | CSL |
12-
| --------------------- | ----- | ----- | ------- | ----- | ----- | ----------- | ----- |
13-
| RoBERTa-wwm-ext-large | 76.20 | 59.50 | 62.10 | 84.02 | 79.15 | 90.79 | 82.03 |
1411

12+
| Model | AFQMC | TNEWS | IFLYTEK | CMNLI | OCNLI | CLUEWSC2020 | CSL | C<sup>3</sup> |
13+
| --------------------- | ----- | ----- | ------- | ----- | ----- | ----------- | ----- | ------------- |
14+
| RoBERTa-wwm-ext-large | 76.20 | 59.50 | 62.10 | 84.02 | 79.15 | 90.79 | 82.03 | 75.79 |
1515

16-
其中 AFQMC、TNEWS、 IFLYTEK、CMNLI、OCNLI、CLUEWSC2020 和 CSL 任务使用的评估指标均是 Accuracy。
16+
17+
AFQMC、TNEWS、IFLYTEK、CMNLI、OCNLI、CLUEWSC2020、CSL 和 C<sup>3</sup> 任务使用的评估指标均是 Accuracy。
18+
其中前 7 项属于分类任务,后面 1 项属于阅读理解任务,这两种任务的训练过程在下面将会分开介绍。
1719

1820
**NOTE:具体评测方式如下**
19-
1. 以上所有任务均基于 Grid Search 方式进行超参寻优,训练每间隔 100 steps 评估验证集效果,取验证集最优效果作为表格中的汇报指标。
21+
1. 以上所有任务均基于 Grid Search 方式进行超参寻优。分类任务训练每间隔 100 steps 评估验证集效果,阅读理解任务每隔一个 epoch 评估验证集效果,取验证集最优效果作为表格中的汇报指标。
22+
23+
2. 分类任务 Grid Search 超参范围: batch_size: 16, 32, 64; learning rates: 1e-5, 2e-5, 3e-5, 5e-5;因为 CLUEWSC2020 数据集效果对 batch_size 较为敏感,对CLUEWSC2020 评测时额外增加了 batch_size = 8 的超参搜索。
24+
25+
3. 阅读理解任务 Grid Search 超参范围:batch_size: 24, 32; learning rates: 1e-5, 2e-5, 3e-5。
26+
27+
4. 以上任务的 epoch、max_seq_length、warmup proportion 如下表所示:
2028

21-
2. Grid Search 超参范围: batch_size: 16, 32, 64; learning rates: 1e-5, 2e-5, 3e-5, 5e-5;
29+
| TASK | AFQMC | TNEWS | IFLYTEK | CMNLI | OCNLI | CLUEWSC2020 | CSL | CMRC2018 | CHID | C<sup>3</sup> |
30+
| ----------------- | ----- | ----- | ------- | ----- | ----- | ----------- | ---- | -------- | ---- | ------------- |
31+
| epoch | 3 | 3 | 3 | 2 | 5 | 50 | 5 | 2 | 3 | 8 |
32+
| max_seq_length | 128 | 128 | 128 | 128 | 128 | 128 | 128 | 512 | 64 | 512 |
33+
| warmup_proportion | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.06 | 0.05 |
2234

23-
3. 因为 CLUEWSC2020 数据集效果对 batch_size 较为敏感,对CLUEWSC2020 评测时额外增加了 batch_size = 8 的超参搜索。
2435

2536

2637
## 一键复现模型效果
2738

28-
这一小节以 TNEWS 任务为例展示如何一键复现本文的评测结果
39+
这一节将会对分类、阅读理解任务分别展示如何一键复现本文的评测结果
2940

30-
### 启动 CLUE 任务
41+
### 启动 CLUE 分类任务
3142
以 CLUE 的 TNEWS 任务为例,启动 CLUE 任务进行 Fine-tuning 的方式如下:
3243

33-
#### 单卡训练
3444
```shell
3545
export CUDA_VISIBLE_DEVICES=0
3646
export TASK_NAME=TNEWS
3747
export LR=3e-5
38-
export BS=16
48+
export BS=32
3949
export EPOCH=6
4050
export MAX_SEQ_LEN=128
4151
export MODEL_PATH=roberta-wwm-ext-large
4252

4353
cd classification
54+
mkdir roberta-wwm-ext-large
4455
python -u ./run_clue_classifier.py \
45-
--model_type roberta \
4656
--model_name_or_path ${MODEL_PATH} \
4757
--task_name ${TASK_NAME} \
4858
--max_seq_length ${MAX_SEQ_LEN} \
@@ -57,47 +67,16 @@ python -u ./run_clue_classifier.py \
5767
--adam_epsilon 1e-8 \
5868
--output_dir ${MODEL_PATH}/models/${TASK_NAME}/${LR}_${BS}/ \
5969
--device gpu \
70+
--do_train \
6071

6172
```
6273

63-
另外,如需评估,传入参数 `--do_eval True` 即可,如果只对读入的 checkpoint 进行评估不训练,可以将 `--do_train` 设为 False。
64-
65-
#### 多卡训练
66-
67-
```shell
68-
69-
unset CUDA_VISIBLE_DEVICES
70-
export TASK_NAME=TNEWS
71-
export LR=3e-5
72-
export BS=32
73-
export EPOCH=6
74-
export MAX_SEQ_LEN=128
75-
export MODEL_PATH=roberta-wwm-ext-large
76-
77-
cd classification
78-
python -m paddle.distributed.launch --gpus "0,1" run_clue_classifier.py \
79-
--model_type roberta \
80-
--model_name_or_path ${MODEL_PATH} \
81-
--task_name ${TASK_NAME} \
82-
--max_seq_length ${MAX_SEQ_LEN} \
83-
--batch_size ${BS} \
84-
--learning_rate ${LR} \
85-
--num_train_epochs ${EPOCH} \
86-
--logging_steps 100 \
87-
--seed 42 \
88-
--save_steps 100 \
89-
--warmup_proportion 0.1 \
90-
--weight_decay 0.01 \
91-
--adam_epsilon 1e-8 \
92-
--output_dir ${MODEL_PATH}/models/${TASK_NAME}/${LR}_${BS}/ \
93-
--device gpu \
74+
另外,如需评估,传入参数 `--do_eval` 即可,如果只对读入的 checkpoint 进行评估不训练,则不需传入 `--do_train`
9475

95-
```
9676
其中参数释义如下:
97-
- `model_type` 指示了 Fine-tuning 使用的预训练模型类型,如:ernie、bert、roberta 等,因不同类型的预训练模型可能有不同的 Fine-tuning layer 和 tokenizer。
98-
- `model_name_or_path` 指示了 Fine-tuning 使用的具体预训练模型,可以是 PaddleNLP 提供的预训练模型,可以选择 `model_type`[Transformer预训练模型汇总](../../../docs/model_zoo/transformers.rst)中相对应的中文预训练权重。注意这里选择的模型权重要和上面配置的模型类型匹配,例如 model_type 配置的是 ernie,则 model_name_or_path 只能选择 ernie 相关的模型。另,clue 任务应选择中文预训练权重。
77+
- `model_name_or_path` 指示了 Fine-tuning 使用的具体预训练模型,可以是 PaddleNLP 提供的预训练模型,可以选择[Transformer预训练模型汇总](../../../docs/model_zoo/transformers.rst)中相对应的中文预训练权重。注意 CLUE 任务应选择中文预训练权重。
9978

100-
- `task_name` 表示 Fine-tuning 的任务,当前支持 AFQMC、TNEWS、IFLYTEK、OCNLI、CMNLI、CSL、CLUEWSC2020。
79+
- `task_name` 表示 Fine-tuning 的分类任务,当前支持 AFQMC、TNEWS、IFLYTEK、OCNLI、CMNLI、CSL、CLUEWSC2020。
10180
- `max_seq_length` 表示最大句子长度,超过该长度将被截断。
10281
- `batch_size` 表示每次迭代**每张卡**上的样本数目。
10382
- `learning_rate` 表示基础学习率大小,将于 learning rate scheduler 产生的值相乘作为当前学习率。
@@ -120,22 +99,61 @@ global step 400/20010, epoch: 0, batch: 399, rank_id: 0, loss: 2.631579, lr: 0.0
12099
eval loss: 2.476962, acc: 0.1697, eval done total : 25.794789791107178 s
121100
```
122101

102+
### 启动 CLUE 阅读理解任务
103+
以 CLUE 的 C<sup>3</sup> 任务为例,启动 CLUE 任务进行 Fine-tuning 的方式如下:
104+
105+
```shell
106+
107+
cd mrc
108+
109+
mkdir roberta-wwm-ext-large
110+
MODEL_PATH=roberta-wwm-ext-large
111+
BATCH_SIZE=24
112+
LR=2e-5
113+
114+
python -u run_c3.py \
115+
--model_name_or_path ${MODEL_PATH} \
116+
--batch_size ${BATCH_SIZE} \
117+
--learning_rate ${LR} \
118+
--max_seq_length 512 \
119+
--num_train_epochs 8 \
120+
--warmup_proportion 0.05 \
121+
122+
```
123+
123124
## 参加 CLUE 竞赛
124125

125-
对于 CLUE 分类任务,可以直接使用本项目中提供的脚本 `classification/predict_clue_classifier.py` 对单个任务进行预测,并将分类结果输出到文件。
126+
对各个任务运行预测脚本,汇总多个结果文件压缩之后,即可提交至CLUE官网进行评测。
127+
128+
下面 2 小节会分别介绍分类、阅读理解任务产生预测结果的方法。
129+
130+
### 分类任务
126131

127-
以 TNEWS 为例,假设 TNEWS 模型所在路径为 `${TNEWS_MODEL}`可以运行如下脚本得到模型在测试集上的预测结果,并将预测结果写入地址 `${OUTPUT_DIR}/tnews_predict.json`
132+
以 TNEWS 为例,可以直接使用脚本 `classification/run_clue_classifier.py` 对单个任务进行预测,注意脚本启动时需要传入参数 `--do_predict`假设 TNEWS 模型所在路径为 `${TNEWS_MODEL}`运行如下脚本可得到模型在测试集上的预测结果,预测结果会写入地址 `${OUTPUT_DIR}/tnews_predict.json`
128133

129134
```
130135
cd classification
131136
OUTPUT_DIR=results
132137
mkdir ${OUTPUT_DIR}
133138
134-
python predict_clue_classifier.py \
135-
--model_type roberta \
139+
python run_clue_classifier.py \
136140
--task_name TNEWS \
137141
--model_name_or_path ${TNEWS_MODEL} \
138142
--output_dir ${OUTPUT_DIR} \
143+
--do_predict \
139144
```
140145

141-
对各个任务运行预测脚本,汇总多个结果文件压缩之后,即可提交至CLUE官网进行评测。
146+
### 阅读理解任务
147+
148+
以 C<sup>3</sup> 为例,直接使用 `mrc/run_c3.py`对该任务进行预测,注意脚本启动时需要传入参数 `--do_predict`。假设 C<sup>3</sup> 模型所在路径为 `${C3_MODEL}`,运行如下脚本可得到模型在测试集上的预测结果,预测结果会写入地址 `${OUTPUT_DIR}/c311_predict.json`
149+
150+
```shell
151+
cd mrc
152+
OUTPUT_DIR=results
153+
mkdir ${OUTPUT_DIR}
154+
155+
python run_c3.py \
156+
--model_name_or_path ${C3_MODEL} \
157+
--output_dir ${OUTPUT_DIR} \
158+
--do_predict \
159+
```

0 commit comments

Comments
 (0)