BERT 多 GPU 单机预训练(无 Horovod,数据并行)
BERT:用于语言理解的深度双向 Transformer 预训练
原理解释
更多的 GPU 意味着一个批次中有更多的数据(即批次大小更大)。一个批次数据的梯度在反向传播时会被平均。
如果一个批次的总学习率是固定的,那么当批次大小更大时,单个数据的学习率会更小。
如果单个数据的学习率是固定的,那么当批次大小更大时,一个批次的总学习率会更大。
**结论:**更多 GPU --> 更大的批次总学习率 --> 更快的训练速度。
新特性
使用 1 个 GPU(批次大小 100)与使用 4 个 GPU(批次大小 400)在相同学习率(0.00001)和相同预训练步数(1,000,000)下,下游任务的准确率差异不超过 0.1%。
要求
Python 3
TensorFlow 1.14 - 1.15
训练
- 在
create_pretraining_data.py
和run_pretraining_gpu.py
中编辑输入和输出文件名 - 运行
create_pretraining_data.py
- 运行
run_pretraining_gpu_v2.py
参数
在 run_pretraining_gpu_v2.py
中编辑 n_gpus
数据
在 sample_text.txt
中,句子以 \n
结尾,段落之间用空行分隔。
下游任务实验结果
Quora 英语问题对数据集:
官方 BERT:准确率 91.2,AUC 96.9
本 BERT(预训练损失 2.05):准确率 90.1,AUC 96.3
注意事项
1)
对于 HierarchicalCopyAllReduce
MirroredStrategy
,global_step/sec
显示的是多个 GPU 步数的总和。
2)
batch_size
是每个 GPU 的批次大小,而不是全局批次大小。