# CLUE Benchmark **目录** * [CLUE 评测结果](#CLUE 评测结果) * [一键复现模型效果](#一键复现模型效果) * [启动 CLUE 分类任务](#启动 CLUE 分类任务) * [使用 Trainer 启动 CLUE 分类任务](#使用 Trainer 启动 CLUE 分类任务) * [启动 CLUE 阅读理解任务](#启动 CLUE 阅读理解任务) * [批量启动 Grid Search](#批量启动 GridSearch) * [环境依赖](#环境依赖) * [一键启动方法](#一键启动方法) * [Grid Search 脚本说明](#GridSearch 脚本说明) * [参加 CLUE 竞赛](#参加 CLUE 竞赛) * [分类任务](#分类任务) * [阅读理解任务](#阅读理解任务) [CLUE](https://www.cluebenchmarks.com/) 自成立以来发布了多项 NLP 评测基准,包括分类榜单,阅读理解榜单和自然语言推断榜单等,在学术界、工业界产生了深远影响。是目前应用最广泛的中文语言测评指标之一。详细可参考 [CLUE 论文](https://arxiv.org/abs/2004.05986)。 本项目基于 PaddlePaddle 在 CLUE 数据集上对领先的开源预训练模型模型进行了充分评测,为开发者在预训练模型选择上提供参考,同时开发者基于本项目可以轻松一键复现模型效果,也可以参加 CLUE 竞赛取得好成绩。 ## CLUE 评测结果 使用多种**中文**预训练模型微调在 CLUE 的各验证集上有如下结果:
Arch Model AVG AFQMC TNEWS IFLYTEK CMNLI OCNLI CLUEWSC2020 CSL CMRC2018 CHID C3
24L1024H ERNIE 1.0-Large-zh-cw 79.03 75.97 59.65 62.91 85.09 81.73 93.09 84.53 74.22/91.88 88.57 84.54
ERNIE 2.0-Large-zh 77.03 76.41 59.67 62.29 83.82 79.69 89.14 84.10 71.48/90.35 85.52 78.12
HFL/RoBERTa-wwm-ext-large 76.61 76.00 59.33 62.02 83.88 78.81 90.79 83.67 70.58/89.82 85.72 75.26
20L1024H ERNIE 3.0-Xbase-zh 78.39 76.16 59.55 61.87 84.40 81.73 88.82 83.60 75.99/93.00 86.78 84.98
12L768H ERNIE 3.0-Base-zh 76.05 75.93 58.26 61.56 83.02 80.10 86.18 82.63 70.71/90.41 84.26 77.88
ERNIE 1.0-Base-zh-cw 76.47 76.07 57.86 59.91 83.41 79.58 89.91 83.42 72.88/90.78 84.68 76.98
ERNIE-Gram-zh 75.72 75.28 57.88 60.87 82.90 79.08 88.82 82.83 71.82/90.38 84.04 73.69
ERNIE 2.0-Base-zh 74.32 75.65 58.25 61.64 82.62 78.71 81.91 82.33 66.08/87.46 82.78 73.19
Langboat/Mengzi-BERT-Base 74.69 75.35 57.76 61.64 82.41 77.93 88.16 82.20 67.04/88.35 83.74 70.70
ERNIE 1.0-Base-zh 74.17 74.84 58.91 62.25 81.68 76.58 85.20 82.77 67.32/87.83 82.47 69.68
HFL/RoBERTa-wwm-ext 74.11 74.60 58.08 61.23 81.11 76.92 88.49 80.77 68.39/88.50 83.43 68.03
BERT-Base-Chinese 72.57 74.63 57.13 61.29 80.97 75.22 81.91 81.90 65.30/86.53 82.01 65.38
UER/Chinese-RoBERTa-Base 71.78 72.89 57.62 61.14 80.01 75.56 81.58 80.80 63.87/84.95 81.52 62.76
8L512H UER/Chinese-RoBERTa-Medium 67.06 70.64 56.10 58.29 77.35 71.90 68.09 78.63 57.63/78.91 75.13 56.84
6L768H ERNIE 3.0-Medium-zh 72.49 73.37 57.00 60.67 80.64 76.88 79.28 81.60 65.83/87.30 79.91 69.73
HLF/RBT6, Chinese 70.06 73.45 56.82 59.64 79.36 73.32 76.64 80.67 62.72/84.77 78.17 59.85
TinyBERT6, Chinese 69.62 72.22 55.70 54.48 79.12 74.07 77.63 80.17 63.03/83.75 77.64 62.11
RoFormerV2 Small 68.52 72.47 56.53 60.72 76.37 72.95 75.00 81.07 62.97/83.64 67.66 59.41
UER/Chinese-RoBERTa-L6-H768 67.09 70.13 56.54 60.48 77.49 72.00 72.04 77.33 53.74/75.52 76.73 54.40
6L384H ERNIE 3.0-Mini-zh 66.90 71.85 55.24 54.48 77.19 73.08 71.05 79.30 58.53/81.97 69.71 58.60
4L768H HFL/RBT4, Chinese 67.42 72.41 56.50 58.95 77.34 70.78 71.05 78.23 59.30/81.93 73.18 56.45
4L512H UER/Chinese-RoBERTa-Small 63.25 69.21 55.41 57.552 73.64 69.80 66.78 74.83 46.75/69.69 67.59 50.92
4L384H ERNIE 3.0-Micro-zh 64.21 71.15 55.05 53.83 74.81 70.41 69.08 76.50 53.77/77.82 62.26 55.53
4L312H ERNIE 3.0-Nano-zh 62.97 70.51 54.57 48.36 74.97 70.61 68.75 75.93 52.00/76.35 58.91 55.11
TinyBERT4, Chinese 60.82 69.07 54.02 39.71 73.94 69.59 70.07 75.07 46.04/69.34 58.53 52.18
4L256H UER/Chinese-RoBERTa-Mini 53.40 69.32 54.22 41.63 69.40 67.36 65.13 70.07 5.96/17.13 51.19 39.68
3L1024H HFL/RBTL3, Chinese 66.63 71.11 56.14 59.56 76.41 71.29 69.74 76.93 58.50/80.90 71.03 55.56
3L768H HFL/RBT3, Chinese 65.72 70.95 55.53 59.18 76.20 70.71 67.11 76.63 55.73/78.63 70.26 54.93
2L128H UER/Chinese-RoBERTa-Tiny 44.45 69.02 51.47 20.28 59.95 57.73 63.82 67.43 3.08/14.33 23.57 28.12

AFQMC(语义相似度)、TNEWS(文本分类)、IFLYTEK(长文本分类)、CMNLI(自然语言推理)、OCNLI(自然语言推理)、CLUEWSC2020(代词消歧)、CSL(论文关键词识别)、CHID(成语阅读理解填空) 和 C3(中文多选阅读理解) 任务使用的评估指标均是 Accuracy。CMRC2018(阅读理解) 的评估指标是 EM (Exact Match)/F1,计算每个模型效果的平均值时,取 EM 为最终指标。 其中前 7 项属于分类任务,后面 3 项属于阅读理解任务,这两种任务的训练过程在下面将会分开介绍。 **NOTE:具体评测方式如下** 1. 以上所有任务均基于 Grid Search 方式进行超参寻优。分类任务训练每间隔 100 steps 评估验证集效果,阅读理解任务每隔一个 epoch 评估验证集效果,取验证集最优效果作为表格中的汇报指标。 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 的超参搜索; 因为 CLUEWSC2020 和 IFLYTEK 数据集对 dropout 概率值较为敏感,所以对 CLUEWSC2020 和 IFLYTEK 数据集评测时额外增加了 dropout_prob = 0.0 的超参搜索。 3. 阅读理解任务 Grid Search 超参范围:batch_size: 24, 32; learning rates: 1e-5, 2e-5, 3e-5。阅读理解任务均使用多卡训练,其中 Grid Search 中的 batch_size 是指多张卡上的 batch_size 总和。 4. 以上每个下游任务的固定超参配置如下表所示: | TASK | AFQMC | TNEWS | IFLYTEK | CMNLI | OCNLI | CLUEWSC2020 | CSL | CMRC2018 | CHID | C3 | | ----------------- | ----- | ----- | ------- | ----- | ----- | ----------- | ---- | -------- | ---- | ------------- | | epoch | 3 | 3 | 3 | 2 | 5 | 50 | 5 | 2 | 3 | 8 | | max_seq_length | 128 | 128 | 128 | 128 | 128 | 128 | 256 | 512 | 64 | 512 | | warmup_proportion | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.1 | 0.06 | 0.1 | | num_cards | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 | 4 | 4 | 不同预训练模型在下游任务上做 Grid Search 之后的最优超参(learning_rate、batch_size)如下: | Model | AFQMC | TNEWS | IFLYTEK | CMNLI | OCNLI | CLUEWSC2020 | CSL | CMRC2018 | CHID | C3 | | -------------------------------- | ------- | ------- | ------- | -------- | -------- | ----------- | ------- | -------- | ------- | ------------- | | ERNIE 1.0-Large-zh-cw | 2e-5,64 | 3e-5,32 | 5e-5,16 | 2e-5,16 | 2e-5,32 | 1e-5,32 | 1e-5,16 | 2e-5,24 | 1e-5,24 | 2e-5,32 | | ERNIE 3.0-Xbase-zh | 2e-5,16 | 3e-5,32 | 3e-5,32 | 3e-5,64 | 3e-5,64 | 2e-5,32 | 1e-5,16 | 3e-5,24 | 2e-5,24 | 3e-5,24 | | ERNIE 2.0-Large-zh | 1e-5,32 | 3e-5,64 | 3e-5,32 | 2e-5,32 | 1e-5,16 | 3e-5,32 | 1e-5,64 | 2e-5,24 | 2e-5,24 | 3e-5,32 | | HFL/RoBERTa-wwm-ext-large | 1e-5,32 | 3e-5,32 | 2e-5,32 | 1e-5,16 | 1e-5,16 | 2e-5,16 | 2e-5,16 | 3e-5,32 | 1e-5,24 | 2e-5,24 | | ERNIE 3.0-Base-zh | 3e-5,16 | 3e-5,32 | 5e-5,32 | 3e-5,32 | 2e-5,64 | 2e-5,16 | 2e-5,32 | 2e-5,24 | 3e-5,24 | 3e-5,32 | | ERNIE 1.0-Base-zh-cw | 2e-5,16 | 3e-5,32 | 5e-5,16 | 2e-5,16 | 3e-5,32 | 2e-5,16 | 2e-5,32 | 3e-5,24 | 2e-5,32 | 3e-5,24 | | ERNIE-Gram-zh | 1e-5,16 | 5e-5,16 | 5e-5,16 | 2e-5,32 | 2e-5,64 | 3e-5,16 | 3e-5,64 | 3e-5,32 | 2e-5,24 | 2e-5,24 | | ERNIE 2.0-Base-zh | 3e-5,64 | 3e-5,64 | 5e-5,16 | 5e-5,64 | 5e-5,32 | 5e-5,16 | 2e-5,16 | 2e-5,32 | 3e-5,24 | 3e-5,32 | | Langboat/Mengzi-Bert-Base | 3e-5,32 | 5e-5,32 | 5e-5,16 | 2e-5,16 | 2e-5,16 | 3e-5,8 | 1e-5,16 | 3e-5,24 | 3e-5,24 | 2e-5,32 | | ERNIE 1.0-Base-zh | 3e-5,16 | 3e-5,32 | 5e-5,16 | 5e-5,32 | 3e-5,16 | 2e-5,8 | 2e-5,16 | 3e-5,32 | 3e-5,24 | 3e-5,24 | | HFL/RoBERTa-wwm-ext | 3e-5,32 | 3e-5,64 | 5e-5,16 | 3e-5,32 | 2e-5,32 | 3e-5,32 | 2e-5,32 | 3e-5,32 | 2e-5,32 | 3e-5,24 | | BERT-Base-Chinese | 2e-5,16 | 5e-5,16 | 5e-5,16 | 5e-5,64 | 3e-5,16 | 3e-5,16 | 1e-5,16 | 3e-5,24 | 2e-5,32 | 3e-5,24 | | UER/Chinese-RoBERTa-Base | 2e-5,16 | 5e-5,16 | 5e-5,16 | 2e-5,16 | 3e-5,16 | 3e-5,8 | 2e-5,16 | 3e-5,24 | 3e-5,32 | 3e-5,32 | | UER/Chinese-RoBERTa-Medium | 3e-5,32 | 5e-5,64 | 5e-5,16 | 5e-5,32 | 3e-5,32 | 3e-5,16 | 5e-5,32 | 3e-5,24 | 3e-5,24 | 3e-5,32 | | ERNIE 3.0-Medium-zh | 3e-5,32 | 3e-5,64 | 5e-5,32 | 2e-5,32 | 1e-5,64 | 3e-5,16 | 2e-5,32 | 3e-5,24 | 2e-5,24 | 1e-5,24 | | TinyBERT6, Chinese | 1e-5,16 | 3e-5,32 | 5e-5,16 | 5e-5,32 | 3e-5,64 | 3e-5,16 | 3e-5,16 | 3e-5,32 | 3e-5,24 | 2e-5,24 | | RoFormerV2 Small | 5e-5,16 | 2e-5,16 | 5e-5,16 | 5e-5,32 | 2e-5,16 | 3e-5,8 | 3e-5,16 | 3e-5,24 | 3e-5,24 | 3e-5,24 | | HLF/RBT6, Chinese | 3e-5,16 | 5e-5,16 | 5e-5,16 | 5e-5,64 | 3e-5,16 | 3e-5,8 | 5e-5,64 | 2e-5,24 | 3e-5,32 | 2e-5,32 | | UER/Chinese-RoBERTa-L6-H768 | 2e-5,16 | 3e-5,16 | 5e-5,16 | 5e-5,16 | 5e-5,32 | 2e-5,32 | 3e-5,16 | 3e-5,32 | 3e-5,24 | 3e-5,24 | | ERNIE 3.0-Mini-zh | 5e-5,64 | 5e-5,64 | 5e-5,16 | 5e-5,32 | 2e-5,16 | 2e-5,8 | 2e-5,16 | 3e-5,24 | 3e-5,24 | 3e-5,24 | | HFL/RBT4, Chinese | 5e-5,16 | 5e-5,16 | 5e-5,16 | 5e-5,16 | 2e-5,16 | 2e-5,8 | 2e-5,16 | 3e-5,32 | 3e-5,24 | 3e-5,32 | | UER/Chinese-RoBERTa-Small | 2e-5,32 | 5e-5,32 | 5e-5,16 | 5e-5,16 | 5e-5,16 | 2e-5,64 | 5e-5,32 | 3e-5,24 | 3e-5,24 | 3e-5,24 | | ERNIE 3.0-Micro-zh | 3e-5,16 | 5e-5,32 | 5e-5,16 | 5e-5,16 | 2e-5,32 | 5e-5,16 | 3e-5,64 | 3e-5,24 | 3e-5,32 | 3e-5,24 | | ERNIE 3.0-Nano-zh | 2e-5,32 | 5e-5,16 | 5e-5,16 | 5e-5,16 | 3e-5,16 | 1e-5,8 | 3e-5,32 | 3e-5,24 | 3e-5,24 | 2e-5,24 | | TinyBERT4, Chinese | 3e-5,32 | 5e-5,16 | 5e-5,16 | 5e-5,16 | 3e-5,16 | 1e-5,16 | 5e-5,16 | 3e-5,24 | 3e-5,24 | 2e-5,24 | | UER/Chinese-RoBERTa-Mini | 3e-5,16 | 5e-5,16 | 5e-5,16 | 5e-5,16 | 5e-5,32 | 3e-5,8 | 5e-5,32 | 3e-5,24 | 3e-5,32 | 3e-5,32 | | HFL/RBTL3, Chinese | 5e-5,32 | 5e-5,16 | 5e-5,16 | 5e-5,32 | 2e-5,16 | 5e-5,8 | 2e-5,16 | 3e-5,24 | 2e-5,24 | 3e-5,24 | | HFL/RBT3, Chinese | 5e-5,64 | 5e-5,32 | 5e-5,16 | 5e-5,16 | 2e-5,16 | 3e-5,16 | 5e-5,16 | 3e-5,32 | 3e-5,24 | 3e-5,32 | | UER/Chinese-RoBERTa-Tiny | 5e-5,64 | 5e-5,16 | 5e-5,16 | 5e-5,16 | 5e-5,16 | 5e-5,8 | 5e-5,16 | 3e-5,24 | 3e-5,24 | 3e-5,24 | 其中,`ERNIE 3.0-Base-zh`、`ERNIE 3.0-Medium-zh`、`ERNIE-Gram-zh`、`ERNIE 1.0-Base-zh`、`ERNIE 3.0-Mini-zh`、`ERNIE 3.0-Micro-zh`、`ERNIE 3.0-Nano-zh` 、`HFL/RBT3, Chinese`、`HFL/RBTL3, Chinese`、`HFL/RBT6, Chinese`、`TinyBERT4, Chinese`、`UER/Chinese-RoBERTa-Base`、`UER/Chinese-RoBERTa-Mini`、`UER/Chinese-RoBERTa-Small` 在 CLUEWSC2020 处的 dropout_prob 为 0.0,`ERNIE 3.0-Base-zh`、`HLF/RBT6, Chinese`、`Langboat/Mengzi-BERT-Base`、`ERNIE-Gram-zh`、`ERNIE 1.0-Base-zh` 、`TinyBERT6, Chinese`、`UER/Chinese-RoBERTa-L6-H768`、`ERNIE 3.0-Mini-zh`、`ERNIE 3.0-Micro-zh`、`ERNIE 3.0-Nano-zh`、`HFL/RBT3, Chinese`、`HFL/RBT4, Chinese`、`HFL/RBT6, Chinese`、`TinyBERT4, Chinese`、`UER/Chinese-RoBERTa-Medium`、`UER/Chinese-RoBERTa-Base`、`UER/Chinese-RoBERTa-Mini`、`UER/Chinese-RoBERTa-Tiny`、`UER/Chinese-RoBERTa-Small` 在 IFLYTEK 处的 dropout_prob 为 0.0。 ## 一键复现模型效果 这一节将会对分类、阅读理解任务分别展示如何一键复现本文的评测结果。 ### 启动 CLUE 分类任务 以 CLUE 的 TNEWS 任务为例,启动 CLUE 任务进行 Fine-tuning 的方式如下: ```shell export CUDA_VISIBLE_DEVICES=0 export TASK_NAME=TNEWS export LR=3e-5 export BS=32 export EPOCH=6 export MAX_SEQ_LEN=128 export MODEL_PATH=ernie-3.0-medium-zh cd classification mkdir ernie-3.0-medium-zh python -u ./run_clue_classifier.py \ --model_name_or_path ${MODEL_PATH} \ --task_name ${TASK_NAME} \ --max_seq_length ${MAX_SEQ_LEN} \ --batch_size ${BS} \ --learning_rate ${LR} \ --num_train_epochs ${EPOCH} \ --logging_steps 100 \ --seed 42 \ --save_steps 100 \ --warmup_proportion 0.1 \ --weight_decay 0.01 \ --adam_epsilon 1e-8 \ --output_dir ${MODEL_PATH}/models/${TASK_NAME}/${LR}_${BS}/ \ --device gpu \ --dropout 0.1 \ --gradient_accumulation_steps 1 \ --save_best_model True \ --do_train \ ``` 另外,如需评估,传入参数 `--do_eval` 即可,如果只对读入的 checkpoint 进行评估不训练,则不需传入 `--do_train`。 其中参数释义如下: - `model_name_or_path` 指示了 Fine-tuning 使用的具体预训练模型,可以是 PaddleNLP 提供的预训练模型,可以选择[Transformer 预训练模型汇总](https://paddlenlp.readthedocs.io/zh/latest/model_zoo/index.html#transformer) 中相对应的中文预训练权重。注意 CLUE 任务应选择中文预训练权重。 - `task_name` 表示 Fine-tuning 的分类任务,当前支持 AFQMC、TNEWS、IFLYTEK、OCNLI、CMNLI、CSL、CLUEWSC2020。 - `max_seq_length` 表示最大句子长度,超过该长度将被截断。 - `batch_size` 表示每次迭代**每张卡**上的样本数目。 - `learning_rate` 表示基础学习率大小,将于 learning rate scheduler 产生的值相乘作为当前学习率。 - `num_train_epochs` 表示训练轮数。 - `logging_steps` 表示日志打印间隔。 - `save_steps` 表示模型保存及评估间隔。 - `save_best_model` 是否保存在评估集上效果最好的模型,默认为 True - `output_dir` 表示模型保存路径。 - `device` 表示训练使用的设备, 'gpu' 表示使用 GPU, 'xpu' 表示使用百度昆仑卡, 'cpu' 表示使用 CPU。 Fine-tuning 过程将按照 `logging_steps` 和 `save_steps` 的设置打印出如下日志: ``` global step 100/20010, epoch: 0, batch: 99, rank_id: 0, loss: 2.734340, lr: 0.0000014993, speed: 8.7969 step/s eval loss: 2.720359, acc: 0.0827, eval done total : 25.712125062942505 s global step 200/20010, epoch: 0, batch: 199, rank_id: 0, loss: 2.608563, lr: 0.0000029985, speed: 2.5921 step/s eval loss: 2.652753, acc: 0.0945, eval done total : 25.64827537536621 s global step 300/20010, epoch: 0, batch: 299, rank_id: 0, loss: 2.555283, lr: 0.0000044978, speed: 2.6032 step/s eval loss: 2.572999, acc: 0.112, eval done total : 25.67190170288086 s global step 400/20010, epoch: 0, batch: 399, rank_id: 0, loss: 2.631579, lr: 0.0000059970, speed: 2.6238 step/s eval loss: 2.476962, acc: 0.1697, eval done total : 25.794789791107178 s ``` #### 使用 Trainer 启动 CLUE 分类任务 PaddleNLP 提供了 Trainer API,本示例新增了`run_clue_classifier_trainer.py`脚本供用户使用。 ``` export CUDA_VISIBLE_DEVICES=0 export TASK_NAME=TNEWS export LR=3e-5 export BS=32 export EPOCH=6 export MAX_SEQ_LEN=128 export MODEL_PATH=ernie-3.0-medium-zh cd classification mkdir ernie-3.0-medium-zh python -u ./run_clue_classifier_trainer.py \ --model_name_or_path ${MODEL_PATH} \ --dataset "clue ${TASK_NAME}" \ --max_seq_length ${MAX_SEQ_LEN} \ --per_device_train_batch_size ${BS} \ --per_device_eval_batch_size ${BS} \ --learning_rate ${LR} \ --num_train_epochs ${EPOCH} \ --logging_steps 100 \ --seed 42 \ --save_steps 100 \ --warmup_ratio 0.1 \ --weight_decay 0.01 \ --adam_epsilon 1e-8 \ --output_dir ${MODEL_PATH}/models/${TASK_NAME}/${LR}_${BS}/ \ --device gpu \ --do_train \ --do_eval \ --metric_for_best_model "eval_accuracy" \ --load_best_model_at_end \ --save_total_limit 3 \ ``` 大部分参数含义如上文所述,这里简要介绍一些新参数: - `dataset`, 同上文`task_name`,此处为小写字母。表示 Fine-tuning 的分类任务,当前支持 afamc、tnews、iflytek、ocnli、cmnli、csl、cluewsc2020。 - `per_device_train_batch_size` 同上文`batch_size`。训练时,每次迭代**每张卡**上的样本数目。 - `per_device_eval_batch_size` 同上文`batch_size`。评估时,每次迭代**每张卡**上的样本数目。 - `warmup_ratio` 同上文`warmup_proportion`,warmup 步数占总步数的比例。 - `metric_for_best_model` 评估时,最优评估指标。 - `load_best_model_at_end` 训练结束时,时候加载评估结果最好的 ckpt。 - `save_total_limit` 保存的 ckpt 数量的最大限制 ### 启动 CLUE 阅读理解任务 以 CLUE 的 C3 任务为例,多卡启动 CLUE 任务进行 Fine-tuning 的方式如下: ```shell cd mrc MODEL_PATH=ernie-3.0-medium-zh BATCH_SIZE=6 LR=2e-5 python -m paddle.distributed.launch --gpus "0,1,2,3" run_c3.py \ --model_name_or_path ${MODEL_PATH} \ --batch_size ${BATCH_SIZE} \ --learning_rate ${LR} \ --max_seq_length 512 \ --num_train_epochs 8 \ --do_train \ --warmup_proportion 0.1 \ --gradient_accumulation_steps 3 \ ``` 需要注意的是,如果显存无法容纳所传入的 `batch_size`,可以通过传入 `gradient_accumulation_steps` 参数来模拟该 `batch_size`。 ### 批量启动 Grid Search #### 环境依赖 Grid Search 需要在 GPU 环境下进行,需要注意的是 C3 任务需要显存大于 16 GB,最好是在显存 32 GB 的环境下启动。 Grid Search 中的 GPU 调度需要依赖 pynvml 库,pynvml 库提供了 GPU 管理的 Python 接口。可启动以下命令进行安装 pynvml: ```shell pip install pynvml ``` #### 一键启动方法 运行下面一句命令即可启动 Grid Search 任务。前期需要注意数据集是否正常下载,否则训练任务不会正式启动。 脚本默认不保存模型,如需保存每个超参数下最好的模型,需要修改 Python 脚本中的 `--save_best_models` 参数为 True。 ```shell cd grid_search_tools # 这里 ernie-3.0-base-zh 是模型名,也可以传用户自定义的模型目录 # 自定义的模型目录需要有 model_config.json, model_state.pdparams, tokenizer_config.json 和 vocab.txt 四个文件 python grid_seach.py ernie-3.0-base-zh ``` 确认模型所有任务训练完成后,可以调用脚本 `extract_result.sh` 一键抽取 Grid Search 结果,打印出每个任务的最佳结果和对应的超参数,例如: ```shell bash extract_result.sh ernie-3.0-base-zh ``` ```text AFQMC TNEWS IFLYTEK CMNLI OCNLI CLUEWSC2020 CSL CMRC2018 CHID C3 75.93 58.26 61.56 83.02 80.10 86.18 82.63 70.71/90.41 84.26 77.88 ==================================================================== Best hyper-parameters list: ==================================================================== TASK result (lr, batch_size, dropout_p) AFQMC 75.93 (3e-05,16,0.1) TNEWS 58.26 (3e-05,32,0.1) IFLYTEK 61.56 (5e-05,32,0.0) CMNLI 83.02 (3e-05,32,0.1) OCNLI 80.10 (2e-05,64,0.1) CLUEWSC2020 86.18 (2e-05,16,0.0) CSL 82.63 (2e-05,32,0.1) CMRC2018 70.71/90.41 (2e-05,24,0.1) CHID 84.26 (3e-05,24,0.1) C3 77.88 (3e-05,32,0.1) ``` 另外,如遇意外情况(如机器重启)导致训练中断,可以直接再次启动 `grid_search.py` 脚本,之前已完成(输出完整日志)的任务则会直接跳过。 #### Grid Search 脚本说明 本节介绍 grid_search_tools 目录下各个脚本的功能: - `grid_search.py` Grid Search 任务入口脚本,该脚本负责调度 GPU 资源,可自动将 7 个分类任务、3 个阅读理解下所有超参数对应的任务完成,训练完成后会自动调用抽取结果的脚本 `extract_result.sh` 打印出所有任务的最佳结果和对应的超参。 - `warmup_dataset_and_model.py` 首次运行时,该脚本完成模型下载(如需)、数据集下载,阅读理解任务数据预处理、预处理文件缓存等工作,再次运行则会检查这些文件是否存在,存在则跳过。该脚本由 `grid_search.py` 在 Grid Search 训练前自动调用,预处理 cache 文件生成后,后面所有训练任务即可加载缓存文件避免重复进行数据预处理。如果该阶段任务失败,大多需要检查网络,解决之后需重启 `grid_search.py`,直到训练正常开始。该脚本也可手动调用,需要 1 个参数,模型名称或目录。该脚本在使用 Intel(R) Xeon(R) Gold 6271C CPU 且 `--num_proc`默认为 4 的情况下需约 30 分钟左右完成,可以更改 `run_mrc.sh` 中的 `--num_proc` 参数以改变生成 cache 的进程数。需要注意的是,若改变 num_proc,之前的缓存则不能再使用,该脚本会重新处理数据并生成新的 cache,cache 相关内容可查看[datasets.Dataset.map 文档](https://huggingface.co/docs/datasets/v2.0.0/package_reference/main_classes?highlight=map#datasets.Dataset.map)。 - `extract_result.sh` 从日志抽取每个任务的最佳结果和对应的最佳超参并打印,`grid_search.py` 在完成训练任务后会自动调用,也可手动调用,需要 1 个参数:模型名称或目录。手动调用前需要确认训练均全部完成,并且保证该目录下有分类和阅读理解所有任务的日志。 - `run_mrc.sh` 阅读理解任务的启动脚本。 - `run_cls.sh` 分类任务的启动脚本。 ## 参加 CLUE 竞赛 对各个任务运行预测脚本,汇总多个结果文件压缩之后,即可提交至 CLUE 官网进行评测。 下面 2 小节会分别介绍分类、阅读理解任务产生预测结果的方法。 ### 分类任务 以 TNEWS 为例,可以直接使用脚本 `classification/run_clue_classifier.py` 对单个任务进行预测,注意脚本启动时需要传入参数 `--do_predict`。假设 TNEWS 模型所在路径为 `${TNEWS_MODEL}`,运行如下脚本可得到模型在测试集上的预测结果,预测结果会写入地址 `${OUTPUT_DIR}/tnews_predict.json`。 ``` cd classification OUTPUT_DIR=results mkdir ${OUTPUT_DIR} python run_clue_classifier.py \ --task_name TNEWS \ --model_name_or_path ${TNEWS_MODEL} \ --output_dir ${OUTPUT_DIR} \ --do_predict \ ``` ### 阅读理解任务 以 C3 为例,直接使用 `mrc/run_c3.py`对该任务进行预测,注意脚本启动时需要传入参数 `--do_predict`。假设 C3 模型所在路径为 `${C3_MODEL}`,运行如下脚本可得到模型在测试集上的预测结果,预测结果会写入地址 `${OUTPUT_DIR}/c311_predict.json`。 ```shell cd mrc OUTPUT_DIR=results mkdir ${OUTPUT_DIR} python run_c3.py \ --model_name_or_path ${C3_MODEL} \ --output_dir ${OUTPUT_DIR} \ --do_predict \ ```