forked from mindspore-Ecosystem/mindspore
!11003 upload chinese readme
From: @yoonlee666 Reviewed-by: Signed-off-by:
This commit is contained in:
commit
84303c539f
|
@ -0,0 +1,593 @@
|
|||
|
||||
# 目录
|
||||
|
||||
<!-- TOC -->
|
||||
|
||||
- [目录](#目录)
|
||||
- [BERT概述](#bert概述)
|
||||
- [模型架构](#模型架构)
|
||||
- [数据集](#数据集)
|
||||
- [环境要求](#环境要求)
|
||||
- [快速入门](#快速入门)
|
||||
- [脚本说明](#脚本说明)
|
||||
- [脚本和样例代码](#脚本和样例代码)
|
||||
- [脚本参数](#脚本参数)
|
||||
- [预训练](#预训练)
|
||||
- [微调与评估](#微调与评估)
|
||||
- [选项及参数](#选项及参数)
|
||||
- [选项](#选项)
|
||||
- [参数](#参数)
|
||||
- [训练过程](#训练过程)
|
||||
- [用法](#用法)
|
||||
- [Ascend处理器上运行](#ascend处理器上运行)
|
||||
- [分布式训练](#分布式训练)
|
||||
- [Ascend处理器上运行](#ascend处理器上运行-1)
|
||||
- [评估过程](#评估过程)
|
||||
- [用法](#用法-1)
|
||||
- [Ascend处理器上运行后评估cola数据集](#ascend处理器上运行后评估cola数据集)
|
||||
- [Ascend处理器上运行后评估cluener数据集](#ascend处理器上运行后评估cluener数据集)
|
||||
- [Ascend处理器上运行后评估squad v1.1数据集](#ascend处理器上运行后评估squad-v11数据集)
|
||||
- [模型描述](#模型描述)
|
||||
- [性能](#性能)
|
||||
- [预训练性能](#预训练性能)
|
||||
- [推理性能](#推理性能)
|
||||
- [随机情况说明](#随机情况说明)
|
||||
- [ModelZoo主页](#modelzoo主页)
|
||||
|
||||
<!-- /TOC -->
|
||||
|
||||
# BERT概述
|
||||
|
||||
BERT网络由谷歌在2018年提出,该网络在自然语言处理领域取得了突破性进展。采用预训练技术,实现大的网络结构,并且仅通过增加输出层,实现多个基于文本的任务的微调。BERT的主干代码采用Transformer的Encoder结构。引入注意力机制,使输出层能够捕获高纬度的全局语义信息。预训练采用去噪和自编码任务,即掩码语言模型(MLM)和相邻句子判断(NSP)。无需标注数据,可对海量文本数据进行预训练,仅需少量数据做微调的下游任务,可获得良好效果。BERT所建立的预训练加微调的模式在后续的NLP网络中得到了广泛的应用。
|
||||
|
||||
[论文](https://arxiv.org/abs/1810.04805): Jacob Devlin, Ming-Wei Chang, Kenton Lee, Kristina Toutanova.[BERT:深度双向Transformer语言理解预训练](https://arxiv.org/abs/1810.04805)). arXiv preprint arXiv:1810.04805.
|
||||
|
||||
[论文](https://arxiv.org/abs/1909.00204): Junqiu Wei, Xiaozhe Ren, Xiaoguang Li, Wenyong Huang, Yi Liao, Yasheng Wang, Jiashu Lin, Xin Jiang, Xiao Chen, Qun Liu.[NEZHA:面向汉语理解的神经语境表示](https://arxiv.org/abs/1909.00204). arXiv preprint arXiv:1909.00204.
|
||||
|
||||
# 模型架构
|
||||
|
||||
BERT的主干结构为Transformer。对于BERT_base,Transformer包含12个编码器模块,每个模块包含一个自注意模块,每个自注意模块包含一个注意模块。对于BERT_NEZHA,Transformer包含24个编码器模块,每个模块包含一个自注意模块,每个自注意模块包含一个注意模块。BERT_base和BERT_NEZHA的区别在于,BERT_base使用绝对位置编码生成位置嵌入向量,而BERT_NEZHA使用相对位置编码。
|
||||
|
||||
# 数据集
|
||||
|
||||
- 下载zhwiki或enwiki数据集进行预训练,使用[WikiExtractor](https://github.com/attardi/wikiextractor)提取和整理数据集中的文本,并将数据集转换为TFRecord格式。详见[BERT](https://github.com/google-research/bert)代码仓中的create_pretraining_data.py文件。
|
||||
- 下载数据集进行微调和评估,如CLUENER、TNEWS、SQuAD v1.1等。将数据集文件从JSON格式转换为TFRecord格式。详见[BERT](https://github.com/google-research/bert)代码仓中的run_classifier.py文件。
|
||||
|
||||
# 环境要求
|
||||
|
||||
- 硬件(Ascend处理器)
|
||||
- 准备Ascend或GPU处理器搭建硬件环境。如需试用昇腾处理器,请发送[申请表](https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/file/other/Ascend%20Model%20Zoo%E4%BD%93%E9%AA%8C%E8%B5%84%E6%BA%90%E7%94%B3%E8%AF%B7%E8%A1%A8.docx)至ascend@huawei.com,申请通过后,即可获得资源。
|
||||
- 框架
|
||||
- [MindSpore](https://gitee.com/mindspore/mindspore)
|
||||
- 更多关于Mindspore的信息,请查看以下资源:
|
||||
- [MindSpore教程](https://www.mindspore.cn/tutorial/training/zh-CN/master/index.html)
|
||||
- [MindSpore Python API](https://www.mindspore.cn/doc/api_python/zh-CN/master/index.html)
|
||||
|
||||
# 快速入门
|
||||
|
||||
从官网下载安装MindSpore之后,您可以按照如下步骤进行训练和评估:
|
||||
|
||||
- 在Ascend上运行
|
||||
|
||||
```bash
|
||||
# 单机运行预训练示例
|
||||
bash scripts/run_standalone_pretrain_ascend.sh 0 1 /path/cn-wiki-128
|
||||
|
||||
# 分布式运行预训练示例
|
||||
bash scripts/run_distributed_pretrain_ascend.sh /path/cn-wiki-128 /path/hccl.json
|
||||
|
||||
# 运行微调和评估示例
|
||||
- 如需运行微调任务,请先准备预训练生成的权重文件(ckpt)。
|
||||
- 在`finetune_eval_config.py`中设置BERT网络配置和优化器超参。
|
||||
|
||||
- 分类任务:在scripts/run_classifier.sh中设置任务相关的超参。
|
||||
- 运行`bash scripts/run_classifier.py`,对BERT-base和BERT-NEZHA模型进行微调。
|
||||
|
||||
bash scripts/run_classifier.sh
|
||||
|
||||
- NER任务:在scripts/run_ner.sh中设置任务相关的超参。
|
||||
- 运行`bash scripts/run_ner.py`,对BERT-base和BERT-NEZHA模型进行微调。
|
||||
|
||||
bash scripts/run_ner.sh
|
||||
|
||||
- SQUAD任务:在scripts/run_squad.sh中设置任务相关的超参。
|
||||
-运行`bash scripts/run_squad.py`,对BERT-base和BERT-NEZHA模型进行微调。
|
||||
|
||||
bash scripts/run_squad.sh
|
||||
```
|
||||
|
||||
- 在GPU上运行
|
||||
|
||||
```bash
|
||||
# 单机运行预训练示例
|
||||
bash run_standalone_pretrain_for_gpu.sh 0 1 /path/cn-wiki-128
|
||||
|
||||
# 分布式运行预训练示例
|
||||
bash scripts/run_distributed_pretrain_for_gpu.sh 8 40 /path/cn-wiki-128
|
||||
|
||||
# 运行微调和评估示例
|
||||
- 如需运行微调任务,请先准备预训练生成的权重文件(ckpt)。
|
||||
- 在`finetune_eval_config.py`中设置BERT网络配置和优化器超参。
|
||||
|
||||
- 分类任务:在scripts/run_classifier.sh中设置任务相关的超参。
|
||||
- 运行`bash scripts/run_classifier.py`,对BERT-base和BERT-NEZHA模型进行微调。
|
||||
|
||||
bash scripts/run_classifier.sh
|
||||
|
||||
- NER任务:在scripts/run_ner.sh中设置任务相关的超参。
|
||||
- 运行`bash scripts/run_ner.py`,对BERT-base和BERT-NEZHA模型进行微调。
|
||||
|
||||
bash scripts/run_ner.sh
|
||||
|
||||
- SQUAD任务:在scripts/run_squad.sh中设置任务相关的超参。
|
||||
-运行`bash scripts/run_squad.py`,对BERT-base和BERT-NEZHA模型进行微调。
|
||||
|
||||
bash scripts/run_squad.sh
|
||||
```
|
||||
|
||||
在Ascend设备上做分布式训练时,请提前创建JSON格式的HCCL配置文件。
|
||||
|
||||
在Ascend设备上做单机分布式训练时,请参考[here](https://gitee.com/mindspore/mindspore/tree/master/config/hccl_single_machine_multi_rank.json)创建HCCL配置文件。
|
||||
|
||||
在Ascend设备上做多机分布式训练时,训练命令需要在很短的时间间隔内在各台设备上执行。因此,每台设备上都需要准备HCCL配置文件。请参考[here](https://gitee.com/mindspore/mindspore/tree/master/config/hccl_multi_machine_multi_rank.json)创建多机的HCCL配置文件。
|
||||
|
||||
如需设置数据集格式和参数,请创建JSON格式的模式配置文件,详见[TFRecord](https://www.mindspore.cn/doc/programming_guide/zh-CN/master/dataset_loading.html#tfrecord)格式。
|
||||
|
||||
```text
|
||||
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]
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 脚本说明
|
||||
|
||||
## 脚本和样例代码
|
||||
|
||||
```shell
|
||||
.
|
||||
└─bert
|
||||
├─README.md
|
||||
├─scripts
|
||||
├─ascend_distributed_launcher
|
||||
├─__init__.py
|
||||
├─hyper_parameter_config.ini # 分布式预训练超参
|
||||
├─get_distribute_pretrain_cmd.py # 分布式预训练脚本
|
||||
--README.md
|
||||
├─run_classifier.sh # Ascend或GPU设备上单机分类器任务shell脚本
|
||||
├─run_ner.sh # Ascend或GPU设备上单机NER任务shell脚本
|
||||
├─run_squad.sh # Ascend或GPU设备上单机SQUAD任务shell脚本
|
||||
├─run_standalone_pretrain_ascend.sh # Ascend设备上单机预训练shell脚本
|
||||
├─run_distributed_pretrain_ascend.sh # Ascend设备上分布式预训练shell脚本
|
||||
├─run_distributed_pretrain_gpu.sh # GPU设备上分布式预训练shell脚本
|
||||
└─run_standaloned_pretrain_gpu.sh # GPU设备上单机预训练shell脚本
|
||||
├─src
|
||||
├─__init__.py
|
||||
├─assessment_method.py # 评估过程的测评方法
|
||||
├─bert_for_finetune.py # 网络骨干编码
|
||||
├─bert_for_pre_training.py # 网络骨干编码
|
||||
├─bert_model.py # 网络骨干编码
|
||||
├─clue_classification_dataset_precess.py # 数据预处理
|
||||
├─cluner_evaluation.py # 评估线索生成工具
|
||||
├─config.py # 预训练参数配置
|
||||
├─CRF.py # 线索数据集评估方法
|
||||
├─dataset.py # 数据预处理
|
||||
├─finetune_eval_config.py # 微调参数配置
|
||||
├─finetune_eval_model.py # 网络骨干编码
|
||||
├─sample_process.py # 样例处理
|
||||
├─utils.py # util函数
|
||||
├─pretrain_eval.py # 训练和评估网络
|
||||
├─run_classifier.py # 分类器任务的微调和评估网络
|
||||
├─run_ner.py # NER任务的微调和评估网络
|
||||
├─run_pretrain.py # 预训练网络
|
||||
└─run_squad.py # SQUAD任务的微调和评估网络
|
||||
```
|
||||
|
||||
## 脚本参数
|
||||
|
||||
### 预训练
|
||||
|
||||
```shell
|
||||
用法:run_pretrain.py [--distribute DISTRIBUTE] [--epoch_size N] [----device_num N] [--device_id N]
|
||||
[--enable_save_ckpt ENABLE_SAVE_CKPT] [--device_target DEVICE_TARGET]
|
||||
[--enable_lossscale ENABLE_LOSSSCALE] [--do_shuffle DO_SHUFFLE]
|
||||
[--enable_data_sink ENABLE_DATA_SINK] [--data_sink_steps N]
|
||||
[--accumulation_steps N]
|
||||
[--save_checkpoint_path SAVE_CHECKPOINT_PATH]
|
||||
[--load_checkpoint_path LOAD_CHECKPOINT_PATH]
|
||||
[--save_checkpoint_steps N] [--save_checkpoint_num N]
|
||||
[--data_dir DATA_DIR] [--schema_dir SCHEMA_DIR] [train_steps N]
|
||||
|
||||
选项:
|
||||
--device_target 代码实现设备,可选项为Ascend或CPU。默认为Ascend
|
||||
--distribute 是否多卡预训练,可选项为true(多卡预训练)或false。默认为false
|
||||
--epoch_size 轮次,默认为1
|
||||
--device_num 使用设备数量,默认为1
|
||||
--device_id 设备ID,默认为0
|
||||
--enable_save_ckpt 是否使能保存检查点,可选项为true或false,默认为true
|
||||
--enable_lossscale 是否使能损失放大,可选项为true或false,默认为true
|
||||
--do_shuffle 是否使能轮换,可选项为true或false,默认为true
|
||||
--enable_data_sink 是否使能数据下沉,可选项为true或false,默认为true
|
||||
--data_sink_steps 设置数据下沉步数,默认为1
|
||||
--accumulation_steps 更新权重前梯度累加数,默认为1
|
||||
--save_checkpoint_path 保存检查点文件的路径,默认为""
|
||||
--load_checkpoint_path 加载检查点文件的路径,默认为""
|
||||
--save_checkpoint_steps 保存检查点文件的步数,默认为1000
|
||||
--save_checkpoint_num 保存的检查点文件数量,默认为1
|
||||
--train_steps 训练步数,默认为-1
|
||||
--data_dir 数据目录,默认为""
|
||||
--schema_dir schema.json的路径,默认为""
|
||||
```
|
||||
|
||||
### 微调与评估
|
||||
|
||||
```shell
|
||||
用法:run_ner.py [--device_target DEVICE_TARGET] [--do_train DO_TRAIN] [----do_eval DO_EVAL]
|
||||
[--assessment_method ASSESSMENT_METHOD] [--use_crf USE_CRF]
|
||||
[--device_id N] [--epoch_num N] [--vocab_file_path VOCAB_FILE_PATH]
|
||||
[--label2id_file_path LABEL2ID_FILE_PATH]
|
||||
[--train_data_shuffle TRAIN_DATA_SHUFFLE]
|
||||
[--eval_data_shuffle EVAL_DATA_SHUFFLE]
|
||||
[--save_finetune_checkpoint_path SAVE_FINETUNE_CHECKPOINT_PATH]
|
||||
[--load_pretrain_checkpoint_path LOAD_PRETRAIN_CHECKPOINT_PATH]
|
||||
[--train_data_file_path TRAIN_DATA_FILE_PATH]
|
||||
[--eval_data_file_path EVAL_DATA_FILE_PATH]
|
||||
[--schema_file_path SCHEMA_FILE_PATH]
|
||||
选项:
|
||||
--device_target 代码实现设备,可选项为Ascend或CPU。默认为Ascend
|
||||
--do_train 是否基于训练集开始训练,可选项为true或false
|
||||
--do_eval 是否基于开发集开始评估,可选项为true或false
|
||||
--assessment_method 评估方法,可选项为f1或clue_benchmark
|
||||
--use_crf 是否采用CRF来计算损失,可选项为true或false
|
||||
--device_id 任务运行的设备ID
|
||||
--epoch_num 训练轮次总数
|
||||
--num_class 标注类的数量
|
||||
--train_data_shuffle 是否使能训练数据集轮换,默认为true
|
||||
--eval_data_shuffle 是否使能评估数据集轮换,默认为true
|
||||
--vocab_file_path BERT模型训练的词汇表
|
||||
--label2id_file_path 标注转ID的JSON文件
|
||||
--save_finetune_checkpoint_path 保存生成微调检查点的路径
|
||||
--load_pretrain_checkpoint_path 初始检查点(通常来自预训练BERT模型
|
||||
--load_finetune_checkpoint_path 如仅执行评估,提供微调检查点保存路径
|
||||
--train_data_file_path 用于保存训练数据的TFRecord文件,如train.tfrecord文件
|
||||
--eval_data_file_path 如采用f1来评估结果,则为TFRecord文件保存预测;如采用clue_benchmark来评估结果,则为JSON文件保存预测
|
||||
--schema_file_path 模式文件保存路径
|
||||
|
||||
用法:run_squad.py [--device_target DEVICE_TARGET] [--do_train DO_TRAIN] [----do_eval DO_EVAL]
|
||||
[--device_id N] [--epoch_num N] [--num_class N]
|
||||
[--vocab_file_path VOCAB_FILE_PATH]
|
||||
[--eval_json_path EVAL_JSON_PATH]
|
||||
[--train_data_shuffle TRAIN_DATA_SHUFFLE]
|
||||
[--eval_data_shuffle EVAL_DATA_SHUFFLE]
|
||||
[--save_finetune_checkpoint_path SAVE_FINETUNE_CHECKPOINT_PATH]
|
||||
[--load_pretrain_checkpoint_path LOAD_PRETRAIN_CHECKPOINT_PATH]
|
||||
[--load_finetune_checkpoint_path LOAD_FINETUNE_CHECKPOINT_PATH]
|
||||
[--train_data_file_path TRAIN_DATA_FILE_PATH]
|
||||
[--eval_data_file_path EVAL_DATA_FILE_PATH]
|
||||
[--schema_file_path SCHEMA_FILE_PATH]
|
||||
options:
|
||||
--device_target 代码实现设备,可选项为Ascend或CPU。默认为Ascend
|
||||
--do_train 是否基于训练集开始训练,可选项为true或false
|
||||
--do_eval 是否基于开发集开始评估,可选项为true或false
|
||||
--device_id 任务运行的设备ID
|
||||
--epoch_num 训练轮次总数
|
||||
--num_class 分类数,SQuAD任务通常为2
|
||||
--train_data_shuffle 是否使能训练数据集轮换,默认为true
|
||||
--eval_data_shuffle 是否使能评估数据集轮换,默认为true
|
||||
--vocab_file_path BERT模型训练的词汇表
|
||||
--eval_json_path 保存SQuAD任务开发JSON文件的路径
|
||||
--save_finetune_checkpoint_path 保存生成微调检查点的路径
|
||||
--load_pretrain_checkpoint_path 初始检查点(通常来自预训练BERT模型
|
||||
--load_finetune_checkpoint_path 如仅执行评估,提供微调检查点保存路径
|
||||
--train_data_file_path 用于保存SQuAD训练数据的TFRecord文件,如train1.1.tfrecord
|
||||
--eval_data_file_path 用于保存SQuAD预测数据的TFRecord文件,如dev1.1.tfrecord
|
||||
--schema_file_path 模式文件保存路径
|
||||
|
||||
usage: run_classifier.py [--device_target DEVICE_TARGET] [--do_train DO_TRAIN] [----do_eval DO_EVAL]
|
||||
[--assessment_method ASSESSMENT_METHOD] [--device_id N] [--epoch_num N] [--num_class N]
|
||||
[--save_finetune_checkpoint_path SAVE_FINETUNE_CHECKPOINT_PATH]
|
||||
[--load_pretrain_checkpoint_path LOAD_PRETRAIN_CHECKPOINT_PATH]
|
||||
[--load_finetune_checkpoint_path LOAD_FINETUNE_CHECKPOINT_PATH]
|
||||
[--train_data_shuffle TRAIN_DATA_SHUFFLE]
|
||||
[--eval_data_shuffle EVAL_DATA_SHUFFLE]
|
||||
[--train_data_file_path TRAIN_DATA_FILE_PATH]
|
||||
[--eval_data_file_path EVAL_DATA_FILE_PATH]
|
||||
[--schema_file_path SCHEMA_FILE_PATH]
|
||||
options:
|
||||
--device_target 任务运行的目标设备,可选项为Ascend或CPU
|
||||
--do_train 是否基于训练集开始训练,可选项为true或false
|
||||
--do_eval 是否基于开发集开始评估,可选项为true或false
|
||||
--assessment_method 评估方法,可选项为accuracy、f1、mcc、spearman_correlation
|
||||
--device_id 任务运行的设备ID
|
||||
--epoch_num 训练轮次总数
|
||||
--num_class 标注类的数量
|
||||
--train_data_shuffle 是否使能训练数据集轮换,默认为true
|
||||
--eval_data_shuffle 是否使能评估数据集轮换,默认为true
|
||||
--save_finetune_checkpoint_path 保存生成微调检查点的路径
|
||||
--load_pretrain_checkpoint_path 初始检查点(通常来自预训练BERT模型)
|
||||
--load_finetune_checkpoint_path 如仅执行评估,提供微调检查点保存路径
|
||||
--train_data_file_path 用于保存训练数据的TFRecord文件,如train.tfrecord文件
|
||||
--eval_data_file_path 用于保存预测数据的TFRecord文件,如dev.tfrecord
|
||||
--schema_file_path 模式文件保存路径
|
||||
```
|
||||
|
||||
## 选项及参数
|
||||
|
||||
可以在`config.py`和`finetune_eval_config.py`文件中分别配置训练和评估参数。
|
||||
|
||||
### 选项
|
||||
|
||||
```text
|
||||
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
|
||||
```
|
||||
|
||||
### 参数
|
||||
|
||||
```text
|
||||
数据集和网络参数(预训练/微调/评估):
|
||||
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 平均移动动量
|
||||
```
|
||||
|
||||
## 训练过程
|
||||
|
||||
### 用法
|
||||
|
||||
#### Ascend处理器上运行
|
||||
|
||||
```bash
|
||||
bash scripts/run_standalone_pretrain_ascend.sh 0 1 /path/cn-wiki-128
|
||||
```
|
||||
|
||||
以上命令后台运行,您可以在pretraining_log.txt中查看训练日志。训练结束后,您可以在默认脚本路径下脚本文件夹中找到检查点文件,得到如下损失值:
|
||||
|
||||
```text
|
||||
# grep "epoch" pretraining_log.txt
|
||||
epoch: 0.0, current epoch percent: 0.000, step: 1, outpus 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, outpus are (Tensor(shape=[1], dtype=Float32, [ 1.0821701e+01]), Tensor(shape=[], dtype=Bool, False), Tensor(shape=[], dtype=Float32, 65536))
|
||||
...
|
||||
```
|
||||
|
||||
> **注意**如果所运行的数据集较大,建议添加一个外部环境变量,确保HCCL不会超时。
|
||||
>
|
||||
> ```bash
|
||||
> export HCCL_CONNECT_TIMEOUT=600
|
||||
> ```
|
||||
>
|
||||
> 将HCCL的超时时间从默认的120秒延长到600秒。
|
||||
> **注意**若使用的BERT模型较大,保存检查点时可能会出现protobuf错误,可尝试使用下面的环境集。
|
||||
>
|
||||
> ```bash
|
||||
> export PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python
|
||||
> ```
|
||||
|
||||
### 分布式训练
|
||||
|
||||
#### Ascend处理器上运行
|
||||
|
||||
```bash
|
||||
bash scripts/run_distributed_pretrain_ascend.sh /path/cn-wiki-128 /path/hccl.json
|
||||
```
|
||||
|
||||
以上命令后台运行,您可以在pretraining_log.txt中查看训练日志。训练结束后,您可以在默认LOG*文件夹下找到检查点文件,得到如下损失值:
|
||||
|
||||
```text
|
||||
# grep "epoch" LOG*/pretraining_log.txt
|
||||
epoch: 0.0, current epoch percent: 0.001, step: 100, outpus are (Tensor(shape=[1], dtype=Float32, [ 1.08209e+01]), Tensor(shape=[], dtype=Bool, False), Tensor(shape=[], dtype=Float32, 65536))
|
||||
epoch: 0.0, current epoch percent: 0.002, step: 200, outpus are (Tensor(shape=[1], dtype=Float32, [ 1.07566e+01]), Tensor(shape=[], dtype=Bool, False), Tensor(shape=[], dtype=Float32, 65536))
|
||||
...
|
||||
epoch: 0.0, current epoch percent: 0.001, step: 100, outpus are (Tensor(shape=[1], dtype=Float32, [ 1.08218e+01]), Tensor(shape=[], dtype=Bool, False), Tensor(shape=[], dtype=Float32, 65536))
|
||||
epoch: 0.0, current epoch percent: 0.002, step: 200, outpus are (Tensor(shape=[1], dtype=Float32, [ 1.07770e+01]), Tensor(shape=[], dtype=Bool, False), Tensor(shape=[], dtype=Float32, 65536))
|
||||
...
|
||||
```
|
||||
|
||||
> **注意**训练过程中会根据device_num和处理器总数绑定处理器内核。如果您不希望预训练中绑定处理器内核,请在`scripts/ascend_distributed_launcher/get_distribute_pretrain_cmd.py`中移除`taskset`相关操作。
|
||||
|
||||
## 评估过程
|
||||
|
||||
### 用法
|
||||
|
||||
#### Ascend处理器上运行后评估cola数据集
|
||||
|
||||
运行以下命令前,确保已设置加载与训练检查点路径。请将检查点路径设置为绝对全路径,例如,/username/pretrain/checkpoint_100_300.ckpt。
|
||||
|
||||
```bash
|
||||
bash scripts/run_classifier.sh
|
||||
```
|
||||
|
||||
以上命令后台运行,您可以在classfier_log.txt中查看训练日志。
|
||||
|
||||
如您选择准确性作为评估方法,可得到如下结果:
|
||||
|
||||
```text
|
||||
acc_num XXX, total_num XXX, accuracy 0.588986
|
||||
```
|
||||
|
||||
#### Ascend处理器上运行后评估cluener数据集
|
||||
|
||||
```bash
|
||||
bash scripts/ner.sh
|
||||
```
|
||||
|
||||
以上命令后台运行,您可以在ner_log.txt中查看训练日志。
|
||||
|
||||
如您选择F1作为评估方法,可得到如下结果:
|
||||
|
||||
```text
|
||||
Precision 0.920507
|
||||
Recall 0.948683
|
||||
F1 0.920507
|
||||
```
|
||||
|
||||
#### Ascend处理器上运行后评估squad v1.1数据集
|
||||
|
||||
```bash
|
||||
bash scripts/squad.sh
|
||||
```
|
||||
|
||||
以上命令后台运行,您可以在bant_log.txt中查看训练日志。
|
||||
结果如下:
|
||||
|
||||
```text
|
||||
{"exact_match": 80.3878923040233284, "f1": 87.6902384023850329}
|
||||
```
|
||||
|
||||
## 模型描述
|
||||
|
||||
## 性能
|
||||
|
||||
### 预训练性能
|
||||
|
||||
| 参数 | Ascend | GPU |
|
||||
| -------------------------- | ---------------------------------------------------------- | ------------------------- |
|
||||
| 模型版本 | BERT_base | BERT_base |
|
||||
| 资源 | Ascend 910;CPU:2.60GHz,192核;内存:755GB || NV SMX2 V100-32G |
|
||||
| 上传日期 | 2020-08-22 | 2020-05-06 |
|
||||
| MindSpore版本 | 0.6.0 | 0.3.0 |
|
||||
| 数据集 | cn-wiki-128(4000w) | ImageNet |
|
||||
| 训练参数 | src/gd_config.py | src/gd_config.py |
|
||||
| 优化器 | Lamb | Momentum |
|
||||
| 损失函数 | SoftmaxCrossEntropy | SoftmaxCrossEntropy |
|
||||
| 输出 | 概率 | |
|
||||
| 轮次 | 40 | | |
|
||||
| Batch_size | 256*8 | 130(8卡) | |
|
||||
| 损失 | 1.7 | 1.913 |
|
||||
| 速度 | 340毫秒/步 | 1.913 |
|
||||
| 总时长 | 73小时 | |
|
||||
| 参数(M) | 110 | |
|
||||
| 微调检查点 | 1.2G(.ckpt文件) | |
|
||||
|
||||
| 参数 | Ascend | GPU |
|
||||
| -------------------------- | ---------------------------------------------------------- | ------------------------- |
|
||||
| 模型版本 | BERT_NEZHA | BERT_NEZHA |
|
||||
| 资源 | Ascend 910;CPU:2.60GHz,192核;内存:755GB || NV SMX2 V100-32G |
|
||||
| 上传日期 | 2020-08-20 | 2020-05-06 |
|
||||
| MindSpore版本 | 0.6.0 | 0.3.0 |
|
||||
| 数据集 | cn-wiki-128(4000w) | ImageNet |
|
||||
| 训练参数 | src/config.py | src/config.py |
|
||||
| 优化器 | Lamb | Momentum |
|
||||
| 损失函数 | SoftmaxCrossEntropy | SoftmaxCrossEntropy |
|
||||
| 输出 | 概率 | |
|
||||
| 轮次 | 40 | | |
|
||||
| Batch_size | 96*8 | 130(8卡) |
|
||||
| 损失 | 1.7 | 1.913 |
|
||||
| 速度 | 360毫秒/步 | 1.913 |
|
||||
| 总时长 | 200小时 |
|
||||
| 参数(M) | 340 | |
|
||||
| 微调检查点 | 3.2G(.ckpt文件) | |
|
||||
|
||||
#### 推理性能
|
||||
|
||||
| 参数 | Ascend | GPU |
|
||||
| -------------------------- | ----------------------------- | ------------------------- |
|
||||
| 模型版本 | | |
|
||||
| 资源 | Ascend 910 | NV SMX2 V100-32G |
|
||||
| 上传日期 | 2020-08-22 | 2020-05-22 |
|
||||
| MindSpore版本 | 0.6.0 | 0.2.0 |
|
||||
| 数据集 | cola,1.2W | ImageNet, 1.2W |
|
||||
| batch_size | 32(单卡) | 130(8卡) |
|
||||
| 准确率 | 0.588986 | ACC1[72.07%] ACC5[90.90%] |
|
||||
| 速度 | 59.25毫秒/步 | |
|
||||
| 总时长 | 15分钟 | |
|
||||
| 推理模型 | 1.2G(.ckpt文件) | |
|
||||
|
||||
# 随机情况说明
|
||||
|
||||
run_standalone_pretrain.sh和run_distributed_pretrain.sh脚本中将do_shuffle设置为True,默认对数据集进行轮换操作。
|
||||
|
||||
run_classifier.sh、run_ner.sh和run_squad.sh中设置train_data_shuffle和eval_data_shuffle为True,默认对数据集进行轮换操作。
|
||||
|
||||
config.py中,默认将hidden_dropout_prob和note_pros_dropout_prob设置为0.1,丢弃部分网络节点。
|
||||
|
||||
run_pretrain.py中设置了随机种子,确保分布式训练中每个节点的初始权重相同。
|
||||
|
||||
# ModelZoo主页
|
||||
|
||||
请浏览官网[主页](https://gitee.com/mindspore/mindspore/tree/master/model_zoo)。
|
|
@ -0,0 +1,454 @@
|
|||
|
||||
# 目录
|
||||
|
||||
<!-- TOC -->
|
||||
|
||||
- [目录](#目录)
|
||||
- [TinyBERT概述](#tinybert概述)
|
||||
- [模型架构](#模型架构)
|
||||
- [数据集](#数据集)
|
||||
- [环境要求](#环境要求)
|
||||
- [快速入门](#快速入门)
|
||||
- [脚本说明](#脚本说明)
|
||||
- [脚本和样例代码](#脚本和样例代码)
|
||||
- [脚本参数](#脚本参数)
|
||||
- [一般蒸馏](#一般蒸馏)
|
||||
- [任务蒸馏](#任务蒸馏)
|
||||
- [选项及参数](#选项及参数)
|
||||
- [选项](#选项)
|
||||
- [参数](#参数)
|
||||
- [训练流程](#训练流程)
|
||||
- [用法](#用法)
|
||||
- [Ascend处理器上运行](#ascend处理器上运行)
|
||||
- [在GPU处理器上运行](#在gpu处理器上运行)
|
||||
- [分布式训练](#分布式训练)
|
||||
- [Ascend处理器上运行](#ascend处理器上运行-1)
|
||||
- [GPU处理器上运行](#gpu处理器上运行)
|
||||
- [评估过程](#评估过程)
|
||||
- [用法](#用法-1)
|
||||
- [基于SST-2数据集进行评估](#基于sst-2数据集进行评估)
|
||||
- [基于MNLI数据集进行评估](#基于mnli数据集进行评估)
|
||||
- [基于QNLI数据集进行评估](#基于qnli数据集进行评估)
|
||||
- [模型描述](#模型描述)
|
||||
- [性能](#性能)
|
||||
- [评估性能](#评估性能)
|
||||
- [推理性能](#推理性能)
|
||||
- [随机情况说明](#随机情况说明)
|
||||
- [ModelZoo主页](#modelzoo主页)
|
||||
|
||||
<!-- /TOC -->
|
||||
|
||||
# TinyBERT概述
|
||||
|
||||
从推理角度看,[TinyBERT](https://github.com/huawei-noah/Pretrained-Language-Model/tree/master/TinyBERT)比[BERT-base](https://github.com/google-research/bert)(BERT模型基础版本)体积小了7.5倍、速度快了9.4倍,自然语言理解的性能表现更突出。TinyBert在预训练和任务学习两个阶段创新采用了转换蒸馏。
|
||||
|
||||
[论文](https://arxiv.org/abs/1909.10351): Xiaoqi Jiao, Yichun Yin, Lifeng Shang, Xin Jiang, Xiao Chen, Linlin Li, Fang Wang, Qun Liu. [TinyBERT: Distilling BERT for Natural Language Understanding](https://arxiv.org/abs/1909.10351). arXiv preprint arXiv:1909.10351.
|
||||
|
||||
# 模型架构
|
||||
|
||||
TinyBERT模型的主干结构是转换器,转换器包含四个编码器模块,其中一个为自注意模块。一个自注意模块即为一个注意模块。
|
||||
|
||||
# 数据集
|
||||
|
||||
- 下载zhwiki或enwiki数据集进行一般蒸馏。使用[WikiExtractor](https://github.com/attardi/wikiextractor)提取和整理数据集中的文本。如需将数据集转化为TFRecord格式。详见[BERT](https://github.com/google-research/bert)代码库中的create_pretraining_data.py文件。
|
||||
- 下载GLUE数据集进行任务蒸馏。将数据集由JSON格式转化为TFRecord格式。详见[BERT](https://github.com/google-research/bert)代码库中的run_classifier.py文件。
|
||||
|
||||
# 环境要求
|
||||
|
||||
- 硬件(Ascend或GPU)
|
||||
- 使用Ascend或GPU处理器准备硬件环境。如需试用昇腾处理器,请发送[申请表](https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/file/other/Ascend%20Model%20Zoo%E4%BD%93%E9%AA%8C%E8%B5%84%E6%BA%90%E7%94%B3%E8%AF%B7%E8%A1%A8.docx)到ascend@huawei.com。申请通过后,即可获得资源。
|
||||
- 框架
|
||||
- [MindSpore](https://gitee.com/mindspore/mindspore)
|
||||
- 更多关于Mindspore的信息,请查看以下资源:
|
||||
- [MindSpore教程](https://www.mindspore.cn/tutorial/training/zh-CN/master/index.html)
|
||||
- [MindSpore Python API](https://www.mindspore.cn/doc/api_python/zh-CN/master/index.html)
|
||||
|
||||
# 快速入门
|
||||
|
||||
从官网下载安装MindSpore之后,可以开始一般蒸馏。任务蒸馏和评估方法如下:
|
||||
|
||||
```bash
|
||||
# 单机运行一般蒸馏示例
|
||||
bash scripts/run_standalone_gd.sh
|
||||
|
||||
Before running the shell script, please set the `load_teacher_ckpt_path`, `data_dir`, `schema_dir` and `dataset_type` in the run_standalone_gd.sh file first. If running on GPU, please set the `device_target=GPU`.
|
||||
|
||||
# Ascend设备上分布式运行一般蒸馏示例
|
||||
bash scripts/run_distributed_gd_ascend.sh 8 1 /path/hccl.json
|
||||
|
||||
Before running the shell script, please set the `load_teacher_ckpt_path`, `data_dir`, `schema_dir` and `dataset_type` in the run_distributed_gd_ascend.sh file first.
|
||||
|
||||
# GPU设备上分布式运行一般蒸馏示例
|
||||
bash scripts/run_distributed_gd_gpu.sh 8 1 /path/data/ /path/schema.json /path/teacher.ckpt
|
||||
|
||||
# 运行任务蒸馏和评估示例
|
||||
bash scripts/run_standalone_td.sh
|
||||
|
||||
Before running the shell script, please set the `task_name`, `load_teacher_ckpt_path`, `load_gd_ckpt_path`, `train_data_dir`, `eval_data_dir`, `schema_dir` and `dataset_type` in the run_standalone_td.sh file first.
|
||||
If running on GPU, please set the `device_target=GPU`.
|
||||
```
|
||||
|
||||
若在Ascend设备上运行分布式训练,请提前创建JSON格式的HCCL配置文件。
|
||||
详情参见如下链接:
|
||||
https:gitee.com/mindspore/mindspore/tree/master/model_zoo/utils/hccl_tools.
|
||||
|
||||
如需设置数据集格式和参数,请创建JSON格式的视图配置文件,详见[TFRecord](https://www.mindspore.cn/doc/programming_guide/zh-CN/master/dataset_loading.html#tfrecord) 格式。
|
||||
|
||||
```text
|
||||
For general task, schema file contains ["input_ids", "input_mask", "segment_ids"].
|
||||
|
||||
For task distill and eval phase, schema file contains ["input_ids", "input_mask", "segment_ids", "label_ids"].
|
||||
|
||||
`numRows` is the only option which could be set by user, the others value must be set according to the dataset.
|
||||
|
||||
For example, the dataset is cn-wiki-128, the schema file for general distill phase as following:
|
||||
{
|
||||
"datasetType": "TF",
|
||||
"numRows": 7680,
|
||||
"columns": {
|
||||
"input_ids": {
|
||||
"type": "int64",
|
||||
"rank": 1,
|
||||
"shape": [256]
|
||||
},
|
||||
"input_mask": {
|
||||
"type": "int64",
|
||||
"rank": 1,
|
||||
"shape": [256]
|
||||
},
|
||||
"segment_ids": {
|
||||
"type": "int64",
|
||||
"rank": 1,
|
||||
"shape": [256]
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
# 脚本说明
|
||||
|
||||
## 脚本和样例代码
|
||||
|
||||
```shell
|
||||
.
|
||||
└─bert
|
||||
├─README.md
|
||||
├─scripts
|
||||
├─run_distributed_gd_ascend.sh # Ascend设备上分布式运行一般蒸馏的shell脚本
|
||||
├─run_distributed_gd_gpu.sh # GPU设备上分布式运行一般蒸馏的shell脚本
|
||||
├─run_standalone_gd.sh # 单机运行一般蒸馏的shell脚本
|
||||
├─run_standalone_td.sh # 单机运行任务蒸馏的shell脚本
|
||||
├─src
|
||||
├─__init__.py
|
||||
├─assessment_method.py # 评估过程的测评方法
|
||||
├─dataset.py # 数据处理
|
||||
├─gd_config.py # 一般蒸馏阶段的参数配置
|
||||
├─td_config.py # 任务蒸馏阶段的参数配置
|
||||
├─tinybert_for_gd_td.py # 网络骨干编码
|
||||
├─tinybert_model.py # 网络骨干编码
|
||||
├─utils.py # util函数
|
||||
├─__init__.py
|
||||
├─run_general_distill.py # 一般蒸馏训练网络
|
||||
├─run_task_distill.py # 任务蒸馏训练评估网络
|
||||
```
|
||||
|
||||
## 脚本参数
|
||||
|
||||
### 一般蒸馏
|
||||
|
||||
```text
|
||||
用法:run_general_distill.py [--distribute DISTRIBUTE] [--epoch_size N] [----device_num N] [--device_id N]
|
||||
[--device_target DEVICE_TARGET] [--do_shuffle DO_SHUFFLE]
|
||||
[--enable_data_sink ENABLE_DATA_SINK] [--data_sink_steps N]
|
||||
[--save_ckpt_path SAVE_CKPT_PATH]
|
||||
[--load_teacher_ckpt_path LOAD_TEACHER_CKPT_PATH]
|
||||
[--save_checkpoint_step N] [--max_ckpt_num N]
|
||||
[--data_dir DATA_DIR] [--schema_dir SCHEMA_DIR] [--dataset_type DATASET_TYPE] [train_steps N]
|
||||
|
||||
选项:
|
||||
--device_target 代码实现设备,可选项为Ascend或CPU。默认为Ascend
|
||||
--distribute 是否多卡预训练,可选项为true(多卡预训练)或false。默认为false
|
||||
--epoch_size 轮次,默认为1
|
||||
--device_id 设备ID,默认为0
|
||||
--device_num 使用设备数量,默认为1
|
||||
--save_ckpt_path 保存检查点文件的路径,默认为""
|
||||
--max_ckpt_num 保存检查点文件的最大数,默认为1
|
||||
--do_shuffle 是否使能轮换,可选项为true或false,默认为true
|
||||
--enable_data_sink 是否使能数据下沉,可选项为true或false,默认为true
|
||||
--data_sink_steps 设置数据下沉步数,默认为1
|
||||
--save_checkpoint_step 保存检查点文件的步数,默认为1000
|
||||
--load_teacher_ckpt_path 加载检查点文件的路径,默认为""
|
||||
--data_dir 数据目录,默认为""
|
||||
--schema_dir schema.json的路径,默认为""
|
||||
--dataset_type 数据集类型,可选项为tfrecord或mindrecord,默认为tfrecord
|
||||
```
|
||||
|
||||
### 任务蒸馏
|
||||
|
||||
```text
|
||||
usage: run_general_task.py [--device_target DEVICE_TARGET] [--do_train DO_TRAIN] [--do_eval DO_EVAL]
|
||||
[--td_phase1_epoch_size N] [--td_phase2_epoch_size N]
|
||||
[--device_id N] [--do_shuffle DO_SHUFFLE]
|
||||
[--enable_data_sink ENABLE_DATA_SINK] [--save_ckpt_step N]
|
||||
[--max_ckpt_num N] [--data_sink_steps N]
|
||||
[--load_teacher_ckpt_path LOAD_TEACHER_CKPT_PATH]
|
||||
[--load_gd_ckpt_path LOAD_GD_CKPT_PATH]
|
||||
[--load_td1_ckpt_path LOAD_TD1_CKPT_PATH]
|
||||
[--train_data_dir TRAIN_DATA_DIR]
|
||||
[--eval_data_dir EVAL_DATA_DIR]
|
||||
[--task_name TASK_NAME] [--schema_dir SCHEMA_DIR] [--dataset_type DATASET_TYPE]
|
||||
|
||||
options:
|
||||
--device_target 代码实现设备,可选项为Ascend或CPU。默认为Ascend
|
||||
--do_train 是否使能训练任务,可选项为true或false,默认为true
|
||||
--do_eval 是否使能评估任务,可选项为true或false,默认为true
|
||||
--td_phase1_epoch_size td phase1的epoch size大小,默认为10
|
||||
--td_phase2_epoch_size td phase2的epoch size大小,默认为3
|
||||
--device_id 设备ID,默认为0
|
||||
--do_shuffle 是否使能轮换,可选项为true或false,默认为true
|
||||
--enable_data_sink 是否使能数据下沉,可选项为true或false,默认为true
|
||||
--save_ckpt_step 保存检查点文件的步数,默认为1000
|
||||
--max_ckpt_num 保存的检查点文件的最大数,默认为1
|
||||
--data_sink_steps 设置数据下沉步数,默认为1
|
||||
--load_teacher_ckpt_path 加载teacher检查点文件的路径,默认为""
|
||||
--load_gd_ckpt_path 加载通过一般蒸馏生成的检查点文件的路径,默认为""
|
||||
--load_td1_ckpt_path 加载通过任务蒸馏阶段1生成的检查点文件的路径,默认为""
|
||||
--train_data_dir 训练数据集目录,默认为""
|
||||
--eval_data_dir 评估数据集目录,默认为""
|
||||
--task_name 分类任务,可选项为SST-2、QNLI、MNLI,默认为""
|
||||
--schema_dir schema.json的路径,默认为""
|
||||
--dataset_type 数据集类型,可选项为tfrecord或mindrecord,默认为tfrecord
|
||||
```
|
||||
|
||||
## 选项及参数
|
||||
|
||||
`gd_config.py` and `td_config.py` 包含BERT模型参数与优化器和损失缩放选项。
|
||||
|
||||
### 选项
|
||||
|
||||
```text
|
||||
batch_size 输入数据集的批次大小,默认为16
|
||||
Parameters for lossscale:
|
||||
loss_scale_value 损失放大初始值,默认为
|
||||
scale_factor 损失放大的更新因子,默认为2
|
||||
scale_window 损失放大的一次更新步数,默认为50
|
||||
|
||||
Parameters for optimizer:
|
||||
learning_rate 学习率
|
||||
end_learning_rate 结束学习率,取值需为正数
|
||||
power 幂
|
||||
weight_decay 权重衰减
|
||||
eps 增加分母,提高小数稳定性
|
||||
```
|
||||
|
||||
### 参数
|
||||
|
||||
```text
|
||||
Parameters for bert network:
|
||||
seq_length 输入序列的长度,默认为128
|
||||
vocab_size 各内嵌向量大小,需与所采用的数据集相同。默认为30522
|
||||
hidden_size BERT的encoder层数
|
||||
num_hidden_layers 隐藏层数
|
||||
num_attention_heads 注意头的数量,默认为12
|
||||
intermediate_size 中间层数
|
||||
hidden_act 所采用的激活函数,默认为gelu
|
||||
hidden_dropout_prob BERT输出的随机失活可能性
|
||||
attention_probs_dropout_prob BERT注意的随机失活可能性
|
||||
max_position_embeddings 序列最大长度,默认为512
|
||||
save_ckpt_step 保存检查点数量,默认为100
|
||||
max_ckpt_num 保存检查点最大数量,默认为1
|
||||
type_vocab_size 标记类型的词汇表大小,默认为2
|
||||
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
|
||||
```
|
||||
|
||||
## 训练流程
|
||||
|
||||
### 用法
|
||||
|
||||
#### Ascend处理器上运行
|
||||
|
||||
运行以下命令前,确保已设置load_teacher_ckpt_path、data_dir和schma_dir。请将路径设置为绝对全路径,例如/username/checkpoint_100_300.ckpt。
|
||||
|
||||
```bash
|
||||
bash scripts/run_standalone_gd.sh
|
||||
```
|
||||
|
||||
以上命令后台运行,您可以在log.txt文件中查看运行结果。训练结束后,您可以在默认脚本文件夹中找到检查点文件。得到如下损失值:
|
||||
|
||||
```text
|
||||
# grep "epoch" log.txt
|
||||
epoch: 1, step: 100, outpus are (Tensor(shape=[1], dtype=Float32, 28.2093), Tensor(shape=[], dtype=Bool, False), Tensor(shape=[], dtype=Float32, 65536))
|
||||
epoch: 2, step: 200, outpus are (Tensor(shape=[1], dtype=Float32, 30.1724), Tensor(shape=[], dtype=Bool, False), Tensor(shape=[], dtype=Float32, 65536))
|
||||
...
|
||||
```
|
||||
|
||||
> **注意**训练过程中会根据`device_num`和处理器总数绑定处理器内核。如果您不希望预训练中绑定处理器内核,请在scripts/run_distributed_gd_ascend.sh脚本中移除相关操作。
|
||||
|
||||
#### 在GPU处理器上运行
|
||||
|
||||
运行以下命令前,确保已设置load_teacher_ckpt_path、data_dir、schma_dir和device_target=GPU。请将路径设置为绝对全路径,例如/username/checkpoint_100_300.ckpt。
|
||||
|
||||
```bash
|
||||
bash scripts/run_standalone_gd.sh
|
||||
```
|
||||
|
||||
以上命令后台运行,您可以在log.txt文件中查看运行结果。训练结束后,您可以在默认脚本路径下脚本文件夹中找到检查点文件。得到如下损失值:
|
||||
|
||||
```text
|
||||
# grep "epoch" log.txt
|
||||
epoch: 1, step: 100, outpus are 28.2093
|
||||
...
|
||||
```
|
||||
|
||||
### 分布式训练
|
||||
|
||||
#### Ascend处理器上运行
|
||||
|
||||
运行以下命令前,确保已设置load_teacher_ckpt_path、data_dir和schma_dir。请将路径设置为绝对全路径,例如/username/checkpoint_100_300.ckpt。
|
||||
|
||||
```bash
|
||||
bash scripts/run_distributed_gd_ascend.sh 8 1 /path/hccl.json
|
||||
```
|
||||
|
||||
以上命令后台运行,您可以在log.txt文件中查看运行结果。训练后,可以得到默认log*文件夹路径下的检查点文件。 得到如下损失值:
|
||||
|
||||
```text
|
||||
# grep "epoch" LOG*/log.txt
|
||||
epoch: 1, step: 100, outpus are (Tensor(shape=[1], dtype=Float32, 28.1478), Tensor(shape=[], dtype=Bool, False), Tensor(shape=[], dtype=Float32, 65536))
|
||||
...
|
||||
epoch: 1, step: 100, outpus are (Tensor(shape=[1], dtype=Float32, 30.5901), Tensor(shape=[], dtype=Bool, False), Tensor(shape=[], dtype=Float32, 65536))
|
||||
...
|
||||
```
|
||||
|
||||
#### GPU处理器上运行
|
||||
|
||||
输入绝对全路径,例如:"/username/checkpoint_100_300.ckpt"。
|
||||
|
||||
```bash
|
||||
bash scripts/run_distributed_gd_gpu.sh 8 1 /path/data/ /path/schema.json /path/teacher.ckpt
|
||||
```
|
||||
|
||||
以上命令后台运行,您可以在log.txt文件中查看运行结果。训练结束后,您可以在默认LOG*文件夹下找到检查点文件。得到如下损失值:
|
||||
|
||||
```text
|
||||
# grep "epoch" LOG*/log.txt
|
||||
epoch: 1, step: 1, outpus are 63.4098
|
||||
...
|
||||
```
|
||||
|
||||
## 评估过程
|
||||
|
||||
### 用法
|
||||
|
||||
如需运行后继续评估,请设置`do_train=true`和`do_eval=true`;如需单独运行评估,请设置`do_train=false`和`do_eval=true`。如需在GPU处理器上运行,请设置`device_target=GPU`。
|
||||
|
||||
#### 基于SST-2数据集进行评估
|
||||
|
||||
```bash
|
||||
bash scripts/run_standalone_td.sh
|
||||
```
|
||||
|
||||
以上命令后台运行,您可以在log.txt文件中查看运行结果。得出如下测试数据集准确率:
|
||||
|
||||
```bash
|
||||
# grep "The best acc" log.txt
|
||||
The best acc is 0.872685
|
||||
The best acc is 0.893515
|
||||
The best acc is 0.899305
|
||||
...
|
||||
The best acc is 0.902777
|
||||
...
|
||||
```
|
||||
|
||||
#### 基于MNLI数据集进行评估
|
||||
|
||||
运行如下命令前,请确保已设置加载与训练检查点路径。请将检查点路径设置为绝对全路径,例如,/username/pretrain/checkpoint_100_300.ckpt。
|
||||
|
||||
```bash
|
||||
bash scripts/run_standalone_td.sh
|
||||
```
|
||||
|
||||
以上命令将在后台运行,请在log.txt文件中查看结果。测试数据集的准确率如下:
|
||||
|
||||
```text
|
||||
# grep "The best acc" log.txt
|
||||
The best acc is 0.803206
|
||||
The best acc is 0.803308
|
||||
The best acc is 0.810355
|
||||
...
|
||||
The best acc is 0.813929
|
||||
...
|
||||
```
|
||||
|
||||
#### 基于QNLI数据集进行评估
|
||||
|
||||
运行如下命令前,请确保已设置加载与训练检查点路径。请将检查点路径设置为绝对全路径,例如/username/pretrain/checkpoint_100_300.ckpt。
|
||||
|
||||
```bash
|
||||
bash scripts/run_standalone_td.sh
|
||||
```
|
||||
|
||||
以上命令后台运行,您可以在log.txt文件中查看运行结果。测试数据集的准确率如下:
|
||||
|
||||
```text
|
||||
# grep "The best acc" log.txt
|
||||
The best acc is 0.870772
|
||||
The best acc is 0.871691
|
||||
The best acc is 0.875183
|
||||
...
|
||||
The best acc is 0.891176
|
||||
...
|
||||
```
|
||||
|
||||
## 模型描述
|
||||
|
||||
## 性能
|
||||
|
||||
### 评估性能
|
||||
|
||||
| 参数 | Ascend | GPU |
|
||||
| -------------------------- | ---------------------------------------------------------- | ------------------------- |
|
||||
| 模型版本 | TinyBERT | TinyBERT |
|
||||
| 资源 | Ascend 910, cpu:2.60GHz 192核, 内存:755G | NV SMX2 V100-32G, cpu:2.10GHz 64核, 内存:251G |
|
||||
| 上传日期 | 2020-08-20 | 2020-08-24 |
|
||||
| MindSpore版本 | 0.6.0 | 0.7.0 |
|
||||
| 数据集 | cn-wiki-128 | cn-wiki-128 |
|
||||
| 训练参数 | src/gd_config.py | src/gd_config.py |
|
||||
| 优化器| AdamWeightDecay | AdamWeightDecay |
|
||||
| 损耗函数 | SoftmaxCrossEntropy | SoftmaxCrossEntropy |
|
||||
| 输出 | 概率 | 概率 |
|
||||
| 损失 | 6.541583 | 6.6915 |
|
||||
| 速度 | 35.4毫秒/步 | 98.654毫秒/步 |
|
||||
| 总时长 | 17.3 小时 (3轮, 8卡) | 48小时 (3轮, 8卡) |
|
||||
| 参数 (M) | 15分钟 | 15分钟 |
|
||||
| 任务蒸馏检查点| 74M(.ckpt 文件) | 74M(.ckpt 文件) |
|
||||
|
||||
#### 推理性能
|
||||
|
||||
| 参数 | Ascend | GPU |
|
||||
| -------------------------- | ----------------------------- | ------------------------- |
|
||||
| 模型版本 | | |
|
||||
| 资源 | Ascend 910 | NV SMX2 V100-32G |
|
||||
| 上传日期 | 2020-08-20 | 2020-08-24 |
|
||||
| MindSpore版本 | 0.6.0 | 0.7.0 |
|
||||
| 数据集 | SST-2, | SST-2 |
|
||||
| batch_size | 32 | 32 |
|
||||
| 准确率 | 0.902777 | 0.9086 |
|
||||
| 速度 | | |
|
||||
| 总时长 | | |
|
||||
| 推理模型 | 74M(.ckpt 文件) | 74M(.ckpt 文件) |
|
||||
|
||||
# 随机情况说明
|
||||
|
||||
run_standaloned_td.sh脚本中设置了do_shuffle来轮换数据集。
|
||||
|
||||
gd_config.py和td_config.py文件中设置了hidden_dropout_prob和attention_pros_dropout_prob,使网点随机失活。
|
||||
|
||||
run_general_distill.py文件中设置了随机种子,确保分布式训练初始权重相同。
|
||||
|
||||
# ModelZoo主页
|
||||
|
||||
请浏览官网[主页](https://gitee.com/mindspore/mindspore/tree/master/model_zoo)。
|
Loading…
Reference in New Issue