You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

README_CN.md 33 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593
  1. # 目录
  2. <!-- TOC -->
  3. - [目录](#目录)
  4. - [BERT概述](#bert概述)
  5. - [模型架构](#模型架构)
  6. - [数据集](#数据集)
  7. - [环境要求](#环境要求)
  8. - [快速入门](#快速入门)
  9. - [脚本说明](#脚本说明)
  10. - [脚本和样例代码](#脚本和样例代码)
  11. - [脚本参数](#脚本参数)
  12. - [预训练](#预训练)
  13. - [微调与评估](#微调与评估)
  14. - [选项及参数](#选项及参数)
  15. - [选项](#选项)
  16. - [参数](#参数)
  17. - [训练过程](#训练过程)
  18. - [用法](#用法)
  19. - [Ascend处理器上运行](#ascend处理器上运行)
  20. - [分布式训练](#分布式训练)
  21. - [Ascend处理器上运行](#ascend处理器上运行-1)
  22. - [评估过程](#评估过程)
  23. - [用法](#用法-1)
  24. - [Ascend处理器上运行后评估cola数据集](#ascend处理器上运行后评估cola数据集)
  25. - [Ascend处理器上运行后评估cluener数据集](#ascend处理器上运行后评估cluener数据集)
  26. - [Ascend处理器上运行后评估squad v1.1数据集](#ascend处理器上运行后评估squad-v11数据集)
  27. - [模型描述](#模型描述)
  28. - [性能](#性能)
  29. - [预训练性能](#预训练性能)
  30. - [推理性能](#推理性能)
  31. - [随机情况说明](#随机情况说明)
  32. - [ModelZoo主页](#modelzoo主页)
  33. <!-- /TOC -->
  34. # BERT概述
  35. BERT网络由谷歌在2018年提出,该网络在自然语言处理领域取得了突破性进展。采用预训练技术,实现大的网络结构,并且仅通过增加输出层,实现多个基于文本的任务的微调。BERT的主干代码采用Transformer的Encoder结构。引入注意力机制,使输出层能够捕获高纬度的全局语义信息。预训练采用去噪和自编码任务,即掩码语言模型(MLM)和相邻句子判断(NSP)。无需标注数据,可对海量文本数据进行预训练,仅需少量数据做微调的下游任务,可获得良好效果。BERT所建立的预训练加微调的模式在后续的NLP网络中得到了广泛的应用。
  36. [论文](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.
  37. [论文](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.
  38. # 模型架构
  39. BERT的主干结构为Transformer。对于BERT_base,Transformer包含12个编码器模块,每个模块包含一个自注意模块,每个自注意模块包含一个注意模块。对于BERT_NEZHA,Transformer包含24个编码器模块,每个模块包含一个自注意模块,每个自注意模块包含一个注意模块。BERT_base和BERT_NEZHA的区别在于,BERT_base使用绝对位置编码生成位置嵌入向量,而BERT_NEZHA使用相对位置编码。
  40. # 数据集
  41. - 下载zhwiki或enwiki数据集进行预训练,使用[WikiExtractor](https://github.com/attardi/wikiextractor)提取和整理数据集中的文本,并将数据集转换为TFRecord格式。详见[BERT](https://github.com/google-research/bert)代码仓中的create_pretraining_data.py文件。
  42. - 下载数据集进行微调和评估,如CLUENER、TNEWS、SQuAD v1.1等。将数据集文件从JSON格式转换为TFRecord格式。详见[BERT](https://github.com/google-research/bert)代码仓中的run_classifier.py文件。
  43. # 环境要求
  44. - 硬件(Ascend处理器)
  45. - 准备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,申请通过后,即可获得资源。
  46. - 框架
  47. - [MindSpore](https://gitee.com/mindspore/mindspore)
  48. - 更多关于Mindspore的信息,请查看以下资源:
  49. - [MindSpore教程](https://www.mindspore.cn/tutorial/training/zh-CN/master/index.html)
  50. - [MindSpore Python API](https://www.mindspore.cn/doc/api_python/zh-CN/master/index.html)
  51. # 快速入门
  52. 从官网下载安装MindSpore之后,您可以按照如下步骤进行训练和评估:
  53. - 在Ascend上运行
  54. ```bash
  55. # 单机运行预训练示例
  56. bash scripts/run_standalone_pretrain_ascend.sh 0 1 /path/cn-wiki-128
  57. # 分布式运行预训练示例
  58. bash scripts/run_distributed_pretrain_ascend.sh /path/cn-wiki-128 /path/hccl.json
  59. # 运行微调和评估示例
  60. - 如需运行微调任务,请先准备预训练生成的权重文件(ckpt)。
  61. - 在`finetune_eval_config.py`中设置BERT网络配置和优化器超参。
  62. - 分类任务:在scripts/run_classifier.sh中设置任务相关的超参。
  63. - 运行`bash scripts/run_classifier.py`,对BERT-base和BERT-NEZHA模型进行微调。
  64. bash scripts/run_classifier.sh
  65. - NER任务:在scripts/run_ner.sh中设置任务相关的超参。
  66. - 运行`bash scripts/run_ner.py`,对BERT-base和BERT-NEZHA模型进行微调。
  67. bash scripts/run_ner.sh
  68. - SQUAD任务:在scripts/run_squad.sh中设置任务相关的超参。
  69. -运行`bash scripts/run_squad.py`,对BERT-base和BERT-NEZHA模型进行微调。
  70. bash scripts/run_squad.sh
  71. ```
  72. - 在GPU上运行
  73. ```bash
  74. # 单机运行预训练示例
  75. bash run_standalone_pretrain_for_gpu.sh 0 1 /path/cn-wiki-128
  76. # 分布式运行预训练示例
  77. bash scripts/run_distributed_pretrain_for_gpu.sh 8 40 /path/cn-wiki-128
  78. # 运行微调和评估示例
  79. - 如需运行微调任务,请先准备预训练生成的权重文件(ckpt)。
  80. - 在`finetune_eval_config.py`中设置BERT网络配置和优化器超参。
  81. - 分类任务:在scripts/run_classifier.sh中设置任务相关的超参。
  82. - 运行`bash scripts/run_classifier.py`,对BERT-base和BERT-NEZHA模型进行微调。
  83. bash scripts/run_classifier.sh
  84. - NER任务:在scripts/run_ner.sh中设置任务相关的超参。
  85. - 运行`bash scripts/run_ner.py`,对BERT-base和BERT-NEZHA模型进行微调。
  86. bash scripts/run_ner.sh
  87. - SQUAD任务:在scripts/run_squad.sh中设置任务相关的超参。
  88. -运行`bash scripts/run_squad.py`,对BERT-base和BERT-NEZHA模型进行微调。
  89. bash scripts/run_squad.sh
  90. ```
  91. 在Ascend设备上做分布式训练时,请提前创建JSON格式的HCCL配置文件。
  92. 在Ascend设备上做单机分布式训练时,请参考[here](https://gitee.com/mindspore/mindspore/tree/master/config/hccl_single_machine_multi_rank.json)创建HCCL配置文件。
  93. 在Ascend设备上做多机分布式训练时,训练命令需要在很短的时间间隔内在各台设备上执行。因此,每台设备上都需要准备HCCL配置文件。请参考[here](https://gitee.com/mindspore/mindspore/tree/master/config/hccl_multi_machine_multi_rank.json)创建多机的HCCL配置文件。
  94. 如需设置数据集格式和参数,请创建JSON格式的模式配置文件,详见[TFRecord](https://www.mindspore.cn/doc/programming_guide/zh-CN/master/dataset_loading.html#tfrecord)格式。
  95. ```text
  96. For pretraining, schema file contains ["input_ids", "input_mask", "segment_ids", "next_sentence_labels", "masked_lm_positions", "masked_lm_ids", "masked_lm_weights"].
  97. For ner or classification task, schema file contains ["input_ids", "input_mask", "segment_ids", "label_ids"].
  98. 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"].
  99. `numRows` is the only option which could be set by user, other values must be set according to the dataset.
  100. For example, the schema file of cn-wiki-128 dataset for pretraining shows as follows:
  101. {
  102. "datasetType": "TF",
  103. "numRows": 7680,
  104. "columns": {
  105. "input_ids": {
  106. "type": "int64",
  107. "rank": 1,
  108. "shape": [128]
  109. },
  110. "input_mask": {
  111. "type": "int64",
  112. "rank": 1,
  113. "shape": [128]
  114. },
  115. "segment_ids": {
  116. "type": "int64",
  117. "rank": 1,
  118. "shape": [128]
  119. },
  120. "next_sentence_labels": {
  121. "type": "int64",
  122. "rank": 1,
  123. "shape": [1]
  124. },
  125. "masked_lm_positions": {
  126. "type": "int64",
  127. "rank": 1,
  128. "shape": [20]
  129. },
  130. "masked_lm_ids": {
  131. "type": "int64",
  132. "rank": 1,
  133. "shape": [20]
  134. },
  135. "masked_lm_weights": {
  136. "type": "float32",
  137. "rank": 1,
  138. "shape": [20]
  139. }
  140. }
  141. }
  142. ```
  143. ## 脚本说明
  144. ## 脚本和样例代码
  145. ```shell
  146. .
  147. └─bert
  148. ├─README.md
  149. ├─scripts
  150. ├─ascend_distributed_launcher
  151. ├─__init__.py
  152. ├─hyper_parameter_config.ini # 分布式预训练超参
  153. ├─get_distribute_pretrain_cmd.py # 分布式预训练脚本
  154. --README.md
  155. ├─run_classifier.sh # Ascend或GPU设备上单机分类器任务shell脚本
  156. ├─run_ner.sh # Ascend或GPU设备上单机NER任务shell脚本
  157. ├─run_squad.sh # Ascend或GPU设备上单机SQUAD任务shell脚本
  158. ├─run_standalone_pretrain_ascend.sh # Ascend设备上单机预训练shell脚本
  159. ├─run_distributed_pretrain_ascend.sh # Ascend设备上分布式预训练shell脚本
  160. ├─run_distributed_pretrain_gpu.sh # GPU设备上分布式预训练shell脚本
  161. └─run_standaloned_pretrain_gpu.sh # GPU设备上单机预训练shell脚本
  162. ├─src
  163. ├─__init__.py
  164. ├─assessment_method.py # 评估过程的测评方法
  165. ├─bert_for_finetune.py # 网络骨干编码
  166. ├─bert_for_pre_training.py # 网络骨干编码
  167. ├─bert_model.py # 网络骨干编码
  168. ├─clue_classification_dataset_precess.py # 数据预处理
  169. ├─cluner_evaluation.py # 评估线索生成工具
  170. ├─config.py # 预训练参数配置
  171. ├─CRF.py # 线索数据集评估方法
  172. ├─dataset.py # 数据预处理
  173. ├─finetune_eval_config.py # 微调参数配置
  174. ├─finetune_eval_model.py # 网络骨干编码
  175. ├─sample_process.py # 样例处理
  176. ├─utils.py # util函数
  177. ├─pretrain_eval.py # 训练和评估网络
  178. ├─run_classifier.py # 分类器任务的微调和评估网络
  179. ├─run_ner.py # NER任务的微调和评估网络
  180. ├─run_pretrain.py # 预训练网络
  181. └─run_squad.py # SQUAD任务的微调和评估网络
  182. ```
  183. ## 脚本参数
  184. ### 预训练
  185. ```shell
  186. 用法:run_pretrain.py [--distribute DISTRIBUTE] [--epoch_size N] [----device_num N] [--device_id N]
  187. [--enable_save_ckpt ENABLE_SAVE_CKPT] [--device_target DEVICE_TARGET]
  188. [--enable_lossscale ENABLE_LOSSSCALE] [--do_shuffle DO_SHUFFLE]
  189. [--enable_data_sink ENABLE_DATA_SINK] [--data_sink_steps N]
  190. [--accumulation_steps N]
  191. [--save_checkpoint_path SAVE_CHECKPOINT_PATH]
  192. [--load_checkpoint_path LOAD_CHECKPOINT_PATH]
  193. [--save_checkpoint_steps N] [--save_checkpoint_num N]
  194. [--data_dir DATA_DIR] [--schema_dir SCHEMA_DIR] [train_steps N]
  195. 选项:
  196. --device_target 代码实现设备,可选项为Ascend或CPU。默认为Ascend
  197. --distribute 是否多卡预训练,可选项为true(多卡预训练)或false。默认为false
  198. --epoch_size 轮次,默认为1
  199. --device_num 使用设备数量,默认为1
  200. --device_id 设备ID,默认为0
  201. --enable_save_ckpt 是否使能保存检查点,可选项为true或false,默认为true
  202. --enable_lossscale 是否使能损失放大,可选项为true或false,默认为true
  203. --do_shuffle 是否使能轮换,可选项为true或false,默认为true
  204. --enable_data_sink 是否使能数据下沉,可选项为true或false,默认为true
  205. --data_sink_steps 设置数据下沉步数,默认为1
  206. --accumulation_steps 更新权重前梯度累加数,默认为1
  207. --save_checkpoint_path 保存检查点文件的路径,默认为""
  208. --load_checkpoint_path 加载检查点文件的路径,默认为""
  209. --save_checkpoint_steps 保存检查点文件的步数,默认为1000
  210. --save_checkpoint_num 保存的检查点文件数量,默认为1
  211. --train_steps 训练步数,默认为-1
  212. --data_dir 数据目录,默认为""
  213. --schema_dir schema.json的路径,默认为""
  214. ```
  215. ### 微调与评估
  216. ```shell
  217. 用法:run_ner.py [--device_target DEVICE_TARGET] [--do_train DO_TRAIN] [----do_eval DO_EVAL]
  218. [--assessment_method ASSESSMENT_METHOD] [--use_crf USE_CRF]
  219. [--device_id N] [--epoch_num N] [--vocab_file_path VOCAB_FILE_PATH]
  220. [--label2id_file_path LABEL2ID_FILE_PATH]
  221. [--train_data_shuffle TRAIN_DATA_SHUFFLE]
  222. [--eval_data_shuffle EVAL_DATA_SHUFFLE]
  223. [--save_finetune_checkpoint_path SAVE_FINETUNE_CHECKPOINT_PATH]
  224. [--load_pretrain_checkpoint_path LOAD_PRETRAIN_CHECKPOINT_PATH]
  225. [--train_data_file_path TRAIN_DATA_FILE_PATH]
  226. [--eval_data_file_path EVAL_DATA_FILE_PATH]
  227. [--schema_file_path SCHEMA_FILE_PATH]
  228. 选项:
  229. --device_target 代码实现设备,可选项为Ascend或CPU。默认为Ascend
  230. --do_train 是否基于训练集开始训练,可选项为true或false
  231. --do_eval 是否基于开发集开始评估,可选项为true或false
  232. --assessment_method 评估方法,可选项为f1或clue_benchmark
  233. --use_crf 是否采用CRF来计算损失,可选项为true或false
  234. --device_id 任务运行的设备ID
  235. --epoch_num 训练轮次总数
  236. --num_class 标注类的数量
  237. --train_data_shuffle 是否使能训练数据集轮换,默认为true
  238. --eval_data_shuffle 是否使能评估数据集轮换,默认为true
  239. --vocab_file_path BERT模型训练的词汇表
  240. --label2id_file_path 标注转ID的JSON文件
  241. --save_finetune_checkpoint_path 保存生成微调检查点的路径
  242. --load_pretrain_checkpoint_path 初始检查点(通常来自预训练BERT模型
  243. --load_finetune_checkpoint_path 如仅执行评估,提供微调检查点保存路径
  244. --train_data_file_path 用于保存训练数据的TFRecord文件,如train.tfrecord文件
  245. --eval_data_file_path 如采用f1来评估结果,则为TFRecord文件保存预测;如采用clue_benchmark来评估结果,则为JSON文件保存预测
  246. --schema_file_path 模式文件保存路径
  247. 用法:run_squad.py [--device_target DEVICE_TARGET] [--do_train DO_TRAIN] [----do_eval DO_EVAL]
  248. [--device_id N] [--epoch_num N] [--num_class N]
  249. [--vocab_file_path VOCAB_FILE_PATH]
  250. [--eval_json_path EVAL_JSON_PATH]
  251. [--train_data_shuffle TRAIN_DATA_SHUFFLE]
  252. [--eval_data_shuffle EVAL_DATA_SHUFFLE]
  253. [--save_finetune_checkpoint_path SAVE_FINETUNE_CHECKPOINT_PATH]
  254. [--load_pretrain_checkpoint_path LOAD_PRETRAIN_CHECKPOINT_PATH]
  255. [--load_finetune_checkpoint_path LOAD_FINETUNE_CHECKPOINT_PATH]
  256. [--train_data_file_path TRAIN_DATA_FILE_PATH]
  257. [--eval_data_file_path EVAL_DATA_FILE_PATH]
  258. [--schema_file_path SCHEMA_FILE_PATH]
  259. options:
  260. --device_target 代码实现设备,可选项为Ascend或CPU。默认为Ascend
  261. --do_train 是否基于训练集开始训练,可选项为true或false
  262. --do_eval 是否基于开发集开始评估,可选项为true或false
  263. --device_id 任务运行的设备ID
  264. --epoch_num 训练轮次总数
  265. --num_class 分类数,SQuAD任务通常为2
  266. --train_data_shuffle 是否使能训练数据集轮换,默认为true
  267. --eval_data_shuffle 是否使能评估数据集轮换,默认为true
  268. --vocab_file_path BERT模型训练的词汇表
  269. --eval_json_path 保存SQuAD任务开发JSON文件的路径
  270. --save_finetune_checkpoint_path 保存生成微调检查点的路径
  271. --load_pretrain_checkpoint_path 初始检查点(通常来自预训练BERT模型
  272. --load_finetune_checkpoint_path 如仅执行评估,提供微调检查点保存路径
  273. --train_data_file_path 用于保存SQuAD训练数据的TFRecord文件,如train1.1.tfrecord
  274. --eval_data_file_path 用于保存SQuAD预测数据的TFRecord文件,如dev1.1.tfrecord
  275. --schema_file_path 模式文件保存路径
  276. usage: run_classifier.py [--device_target DEVICE_TARGET] [--do_train DO_TRAIN] [----do_eval DO_EVAL]
  277. [--assessment_method ASSESSMENT_METHOD] [--device_id N] [--epoch_num N] [--num_class N]
  278. [--save_finetune_checkpoint_path SAVE_FINETUNE_CHECKPOINT_PATH]
  279. [--load_pretrain_checkpoint_path LOAD_PRETRAIN_CHECKPOINT_PATH]
  280. [--load_finetune_checkpoint_path LOAD_FINETUNE_CHECKPOINT_PATH]
  281. [--train_data_shuffle TRAIN_DATA_SHUFFLE]
  282. [--eval_data_shuffle EVAL_DATA_SHUFFLE]
  283. [--train_data_file_path TRAIN_DATA_FILE_PATH]
  284. [--eval_data_file_path EVAL_DATA_FILE_PATH]
  285. [--schema_file_path SCHEMA_FILE_PATH]
  286. options:
  287. --device_target 任务运行的目标设备,可选项为Ascend或CPU
  288. --do_train 是否基于训练集开始训练,可选项为true或false
  289. --do_eval 是否基于开发集开始评估,可选项为true或false
  290. --assessment_method 评估方法,可选项为accuracy、f1、mcc、spearman_correlation
  291. --device_id 任务运行的设备ID
  292. --epoch_num 训练轮次总数
  293. --num_class 标注类的数量
  294. --train_data_shuffle 是否使能训练数据集轮换,默认为true
  295. --eval_data_shuffle 是否使能评估数据集轮换,默认为true
  296. --save_finetune_checkpoint_path 保存生成微调检查点的路径
  297. --load_pretrain_checkpoint_path 初始检查点(通常来自预训练BERT模型)
  298. --load_finetune_checkpoint_path 如仅执行评估,提供微调检查点保存路径
  299. --train_data_file_path 用于保存训练数据的TFRecord文件,如train.tfrecord文件
  300. --eval_data_file_path 用于保存预测数据的TFRecord文件,如dev.tfrecord
  301. --schema_file_path 模式文件保存路径
  302. ```
  303. ## 选项及参数
  304. 可以在`config.py`和`finetune_eval_config.py`文件中分别配置训练和评估参数。
  305. ### 选项
  306. ```text
  307. config for lossscale and etc.
  308. bert_network BERT模型版本,可选项为base或nezha,默认为base
  309. batch_size 输入数据集的批次大小,默认为16
  310. loss_scale_value 损失放大初始值,默认为2^32
  311. scale_factor 损失放大的更新因子,默认为2
  312. scale_window 损失放大的一次更新步数,默认为1000
  313. optimizer 网络中采用的优化器,可选项为AdamWerigtDecayDynamicLR、Lamb、或Momentum,默认为Lamb
  314. ```
  315. ### 参数
  316. ```text
  317. 数据集和网络参数(预训练/微调/评估):
  318. seq_length 输入序列的长度,默认为128
  319. vocab_size 各内嵌向量大小,需与所采用的数据集相同。默认为21136
  320. hidden_size BERT的encoder层数,默认为768
  321. num_hidden_layers 隐藏层数,默认为12
  322. num_attention_heads 注意头的数量,默认为12
  323. intermediate_size 中间层数,默认为3072
  324. hidden_act 所采用的激活函数,默认为gelu
  325. hidden_dropout_prob BERT输出的随机失活可能性,默认为0.1
  326. attention_probs_dropout_prob BERT注意的随机失活可能性,默认为0.1
  327. max_position_embeddings 序列最大长度,默认为512
  328. type_vocab_size 标记类型的词汇表大小,默认为16
  329. initializer_range TruncatedNormal的初始值,默认为0.02
  330. use_relative_positions 是否采用相对位置,可选项为true或false,默认为False
  331. dtype 输入的数据类型,可选项为mstype.float16或mstype.float32,默认为mstype.float32
  332. compute_type Bert Transformer的计算类型,可选项为mstype.float16或mstype.float32,默认为mstype.float16
  333. Parameters for optimizer:
  334. AdamWeightDecay:
  335. decay_steps 学习率开始衰减的步数
  336. learning_rate 学习率
  337. end_learning_rate 结束学习率,取值需为正数
  338. power 幂
  339. warmup_steps 热身学习率步数
  340. weight_decay 权重衰减
  341. eps 增加分母,提高小数稳定性
  342. Lamb:
  343. decay_steps 学习率开始衰减的步数
  344. learning_rate 学习率
  345. end_learning_rate 结束学习率
  346. power 幂
  347. warmup_steps 热身学习率步数
  348. weight_decay 权重衰减
  349. Momentum:
  350. learning_rate 学习率
  351. momentum 平均移动动量
  352. ```
  353. ## 训练过程
  354. ### 用法
  355. #### Ascend处理器上运行
  356. ```bash
  357. bash scripts/run_standalone_pretrain_ascend.sh 0 1 /path/cn-wiki-128
  358. ```
  359. 以上命令后台运行,您可以在pretraining_log.txt中查看训练日志。训练结束后,您可以在默认脚本路径下脚本文件夹中找到检查点文件,得到如下损失值:
  360. ```text
  361. # grep "epoch" pretraining_log.txt
  362. 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))
  363. 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))
  364. ...
  365. ```
  366. > **注意**如果所运行的数据集较大,建议添加一个外部环境变量,确保HCCL不会超时。
  367. >
  368. > ```bash
  369. > export HCCL_CONNECT_TIMEOUT=600
  370. > ```
  371. >
  372. > 将HCCL的超时时间从默认的120秒延长到600秒。
  373. > **注意**若使用的BERT模型较大,保存检查点时可能会出现protobuf错误,可尝试使用下面的环境集。
  374. >
  375. > ```bash
  376. > export PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python
  377. > ```
  378. ### 分布式训练
  379. #### Ascend处理器上运行
  380. ```bash
  381. bash scripts/run_distributed_pretrain_ascend.sh /path/cn-wiki-128 /path/hccl.json
  382. ```
  383. 以上命令后台运行,您可以在pretraining_log.txt中查看训练日志。训练结束后,您可以在默认LOG*文件夹下找到检查点文件,得到如下损失值:
  384. ```text
  385. # grep "epoch" LOG*/pretraining_log.txt
  386. 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))
  387. 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))
  388. ...
  389. 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))
  390. 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))
  391. ...
  392. ```
  393. > **注意**训练过程中会根据device_num和处理器总数绑定处理器内核。如果您不希望预训练中绑定处理器内核,请在`scripts/ascend_distributed_launcher/get_distribute_pretrain_cmd.py`中移除`taskset`相关操作。
  394. ## 评估过程
  395. ### 用法
  396. #### Ascend处理器上运行后评估cola数据集
  397. 运行以下命令前,确保已设置加载与训练检查点路径。请将检查点路径设置为绝对全路径,例如,/username/pretrain/checkpoint_100_300.ckpt。
  398. ```bash
  399. bash scripts/run_classifier.sh
  400. ```
  401. 以上命令后台运行,您可以在classfier_log.txt中查看训练日志。
  402. 如您选择准确性作为评估方法,可得到如下结果:
  403. ```text
  404. acc_num XXX, total_num XXX, accuracy 0.588986
  405. ```
  406. #### Ascend处理器上运行后评估cluener数据集
  407. ```bash
  408. bash scripts/ner.sh
  409. ```
  410. 以上命令后台运行,您可以在ner_log.txt中查看训练日志。
  411. 如您选择F1作为评估方法,可得到如下结果:
  412. ```text
  413. Precision 0.920507
  414. Recall 0.948683
  415. F1 0.920507
  416. ```
  417. #### Ascend处理器上运行后评估squad v1.1数据集
  418. ```bash
  419. bash scripts/squad.sh
  420. ```
  421. 以上命令后台运行,您可以在bant_log.txt中查看训练日志。
  422. 结果如下:
  423. ```text
  424. {"exact_match": 80.3878923040233284, "f1": 87.6902384023850329}
  425. ```
  426. ## 模型描述
  427. ## 性能
  428. ### 预训练性能
  429. | 参数 | Ascend | GPU |
  430. | -------------------------- | ---------------------------------------------------------- | ------------------------- |
  431. | 模型版本 | BERT_base | BERT_base |
  432. | 资源 | Ascend 910;CPU:2.60GHz,192核;内存:755GB || NV SMX2 V100-32G |
  433. | 上传日期 | 2020-08-22 | 2020-05-06 |
  434. | MindSpore版本 | 0.6.0 | 0.3.0 |
  435. | 数据集 | cn-wiki-128(4000w) | ImageNet |
  436. | 训练参数 | src/gd_config.py | src/gd_config.py |
  437. | 优化器 | Lamb | Momentum |
  438. | 损失函数 | SoftmaxCrossEntropy | SoftmaxCrossEntropy |
  439. | 输出 | 概率 | |
  440. | 轮次 | 40 | | |
  441. | Batch_size | 256*8 | 130(8卡) | |
  442. | 损失 | 1.7 | 1.913 |
  443. | 速度 | 340毫秒/步 | 1.913 |
  444. | 总时长 | 73小时 | |
  445. | 参数(M) | 110 | |
  446. | 微调检查点 | 1.2G(.ckpt文件) | |
  447. | 参数 | Ascend | GPU |
  448. | -------------------------- | ---------------------------------------------------------- | ------------------------- |
  449. | 模型版本 | BERT_NEZHA | BERT_NEZHA |
  450. | 资源 | Ascend 910;CPU:2.60GHz,192核;内存:755GB || NV SMX2 V100-32G |
  451. | 上传日期 | 2020-08-20 | 2020-05-06 |
  452. | MindSpore版本 | 0.6.0 | 0.3.0 |
  453. | 数据集 | cn-wiki-128(4000w) | ImageNet |
  454. | 训练参数 | src/config.py | src/config.py |
  455. | 优化器 | Lamb | Momentum |
  456. | 损失函数 | SoftmaxCrossEntropy | SoftmaxCrossEntropy |
  457. | 输出 | 概率 | |
  458. | 轮次 | 40 | | |
  459. | Batch_size | 96*8 | 130(8卡) |
  460. | 损失 | 1.7 | 1.913 |
  461. | 速度 | 360毫秒/步 | 1.913 |
  462. | 总时长 | 200小时 |
  463. | 参数(M) | 340 | |
  464. | 微调检查点 | 3.2G(.ckpt文件) | |
  465. #### 推理性能
  466. | 参数 | Ascend | GPU |
  467. | -------------------------- | ----------------------------- | ------------------------- |
  468. | 模型版本 | | |
  469. | 资源 | Ascend 910 | NV SMX2 V100-32G |
  470. | 上传日期 | 2020-08-22 | 2020-05-22 |
  471. | MindSpore版本 | 0.6.0 | 0.2.0 |
  472. | 数据集 | cola,1.2W | ImageNet, 1.2W |
  473. | batch_size | 32(单卡) | 130(8卡) |
  474. | 准确率 | 0.588986 | ACC1[72.07%] ACC5[90.90%] |
  475. | 速度 | 59.25毫秒/步 | |
  476. | 总时长 | 15分钟 | |
  477. | 推理模型 | 1.2G(.ckpt文件) | |
  478. # 随机情况说明
  479. run_standalone_pretrain.sh和run_distributed_pretrain.sh脚本中将do_shuffle设置为True,默认对数据集进行轮换操作。
  480. run_classifier.sh、run_ner.sh和run_squad.sh中设置train_data_shuffle和eval_data_shuffle为True,默认对数据集进行轮换操作。
  481. config.py中,默认将hidden_dropout_prob和note_pros_dropout_prob设置为0.1,丢弃部分网络节点。
  482. run_pretrain.py中设置了随机种子,确保分布式训练中每个节点的初始权重相同。
  483. # ModelZoo主页
  484. 请浏览官网[主页](https://gitee.com/mindspore/mindspore/tree/master/model_zoo)。