从 3 天到 1 小时,微软最新优化器将 BERT 预训练提速 65 倍
今年,微软发布了最强预训练模型BERT,宣告了NLP领域的重大突破。
BERT 在 33 亿文本的语料库上训练语言模型,然后在不同的下游任务上进行微调。 它在 11 个不同的 NLP 任务中取得了迄今为止最好的结果。
然而,在 33 亿文本的语料库上预训练 BERT 模型的成本非常高。 微软使用自家的16个TPU集群(一共64个TPU)来训练小版本的BERT,总共耗时4天左右。 时间。
如此巨大的训练成本让普通研究人员无法尝试自己训练一个 BERT。
有没有办法促进BERT的训练? 日前,来自中国、UC、UCLA的几位研究人员提出了一种新的优化器——LAMB优化器,将训练的batch size推到硬件的极限,使用(1024个TPUv3芯片)来减少训练时间BERT 从 3 天缩短到 76 分钟!
论文地址:
“关联”
其中一位是来自 UC 的杨优(),这项工作是他在 Brain 实习期间完成的。
接着,辛致远带来了这篇论文的译文:
推进深度神经网络的最有效方法
大批量训练是推进小型分布式系统中深度神经网络训练的关键。 然而,大批量训练很困难,因为它会产生泛化差距。 直接优化通常会增加测试集的准确性。
BERT 是建立在深度单向语言理解之上的最先进的深度学习模型。 对于 BERT谷歌优化,当 batch size 变大时(比如超过 8192),原来的 large-batch 就失效了。 BERT的预训练也需要很长时间才能完成(使用16块TPUv3芯片需要3天左右)。
为了解决这个问题,我们提出了 LAMB 优化器,它可以帮助我们在不损失准确性的情况下将批量大小扩展到 65536。
LAMB是一个通用的优化器,适用于小批量和大批量,不仅学习率不需要超参数调优。 BERT-Large 模型需要 100 万次迭代才能完成预训练,而 batch size 为 65536/32768 的 LAMB 只需要 8599 次迭代。 我们将 推到 的内存限制,BERT 训练可以在 76 分钟内完成(表 1)。
表 1:我们使用 SQuAD-v1 的 作为精度指标。 F1 的基准性能是通过 BERT 公开可用的预训练模型(BERT-large)(截至 2019 年 2 月 1 日)实现的。 我们在实验中使用 tpuv3。 我们使用与基线相同的设置:总数的前 9/10 为序列宽度 128,最后 1/10 的序列宽度为 512。 所有实验都以相同的运行次数运行。
深度神经网络的训练非常耗时。 目前,减少训练时间最有效的方法是使用多个芯片(如 CPU、GPU 和 TPU)并行化 SGD 变体的优化过程。 由于前向传播和反向传播中不同层之间的数据依赖性,跨层并行化效率不高。 相反,研究人员在每次迭代时以小批量并行化数据点。 如果训练次数确定,线性减少意味着迭代次数(即更新权重的次数)会线性减少。 为了最小化训练时间,最大化 是理想的。
但是,大批量训练很困难。 例如,batch size为512的训练可以达到80%以上的top-5测试准确率。 但是将扩大到4096后,直接训练可能只能得到50%~60%的top5准确率。
等。 (10)感觉在large-batch 中存在泛化差距(gap)。 等。 (6) 感觉训练时间越长,泛化差异越小。 然而,训练时间长意味着训练大批量没有任何好处。
因此,大批量训练的目标是在一定数量的 内实现可观的准确性。 通过设计一系列学习率计划,研究人员已经能够将训练批次大小扩大到 32K,而准确性损失较小。 据我们所知,英等人。 达到了最快的训练速度,达到了 76+% 的 top-1 准确率。 通过使用 LARS 优化器并将批量大小扩展到 32K,Ying 等人。 使用在2.2分钟内完成了-50的训练。 (最新,东芝研究所刷新了这个速率,将训练时间缩短为74.7秒)
BERT是目前最先进的深度学习语言模型。 BERT 建立在深度单向语言理解的基础上。 对于BERT,当扩展到非常大的时候(比如超过8192),原来的large-batch 就失效了。 BERT 预训练也需要很长时间才能完成(16 个 TPUv3 芯片大约需要 3 天)。
为了扩大BERT的batch size,本文提出了一种LAMB优化器。 LAMB 支持 -wise 和 layer-wise (layer-wise)。
LAMB 是适用于小批量和大批量的通用优化器。 用户只需要调整学习率,不需要调整其他超参数。 使用 LAMB,我们可以在不损失准确性的情况下将 BERT 预训练的批量大小扩大到 64K。
BERT预训练包括两个阶段:
(1)前9/10使用128的序列宽度;
(2) 最后1/10使用512的序列宽度。
完成 BERT 预训练需要 100 万次迭代,但我们只需要 8599 次迭代,这使我们能够将 BERT 训练时间从 3 天减少到 76 分钟。
我们将批量大小推到了 的硬件限制。 小于 32768(序列宽度 512)的批次大小将耗尽显存。 小于 65536 的批量大小(序列宽度为 128)不会提供任何加速。 我们的优化器可以将批量大小扩展到 128k 甚至更高。 由于硬件限制,我们在批量大小达到 32768 且序列宽度为 512 时停止,并在批量大小达到 65536 且序列宽度为 128 时停止。
本文所有BERT模型均指BERT-Large模型。 为了公平比较,本文中的所有实验都运行相同数量的(即固定数量的浮点运算)。 我们的结果如表 1 所示。
LAMB优化器
LAMB 的全称是 Layer-wise for Batch。
BERT 训练的基线使用具有权重衰减的 Adam 作为优化器,它是 Adam 优化器的变体。 另一种已成功应用于训练大批量频域神经网络的自适应优化器是 LARS。
这个优化器启发我们提出了一种用于大批量 BERT 训练的新优化器。 算法 1 显示了我们提出的 LAMB 优化器的概述。
实验和结果
常规训练
TPU 是用于浮点运算的强大计算硬件。 我们在所有实验中都使用 TPUv3。 有 1024 个芯片,可以为混合精度估计提供超过 100 的性能。 我们的结果如表 1 所示。基线模型在预训练时使用和数据集。
我们使用与原始 BERT 模型相同的数据集,即 和 ,分别具有 2.5B 和 8 亿个短语。 原始 BERT 模型的作者首先训练序列宽度为 128 的 900k 次迭代,然后训练序列宽度为 512 的 100k 次迭代。
16 个 TPUv3 芯片的总训练时间约为 3 天。 我们使用 SQuAD-v1 的 F1 分数作为准确性指标。 F1 分数越高,准确率越高。 耶鲁问答数据集 (SQuAD) 是一个阅读理解数据集,其中包含众包工作者从维基百科文章中提出的问题。 每道题的答案是阅读文章对应的一段文字,或者题目很难回答。 我们从 BERT 的公共存储库下载了预训练模型。
使用作者提供的脚本,F1得分为90.395。 在我们的代码中,我们使用了 BERT 作者提供的数据集和基线模型,仅更改了优化器。 通过使用 LAMB 优化器,我们能够在 15625 次迭代中获得 91.460 的 F1 分数,批处理大小为 32768(14063 次迭代,序列宽度为 128,1562 次迭代,序列宽度为 512)。
我们将培训时间从 3 天减少到大约 100 分钟。 我们将批量大小推到了 的硬件限制。 小于 32768(序列宽度 512)的批量大小将导致 耗尽显存。
我们实现了 76.7% 的微弱缩放效率(49.1 倍加速,64 倍估计资源)。 由于我们在 上使用同步数据并行进行分布式训练,因此存在跨互连传输梯度的通信开销。 梯度的大小与训练模型相同。
混批训练
如前所述,BERT预训练包括两个阶段:
(1) 前 9/10 个 epoch 使用 128 的序列宽度,
(2) 最后1/10 epoch使用512的序列宽度。
对于第二阶段,由于内存限制, 上的最大批大小为 32768,因此我们在批大小达到 32768 时停止第二阶段。
对于第一阶段, 上的最大批量大小为 . 此外,当我们将批量大小从 65536 降低到 65536 时,我们没有看到加速,所以当第一阶段批量大小达到 65536 时我们停止了。
此前,史密斯等人。 还研究了混批训练。 此外,他们在训练期间减少了批量大小,而我们减少了批量大小。
能否自始至终充分利用硬件资源。 史密斯等人的研究。 只有在最后阶段才能充分利用硬件资源。 减小batch size可以预热和稳定优化过程,而减小batch size会给优化过程带来混乱谷歌优化,导致训练不收敛。
在实验中,我们找到了一种方法来帮助稳定第二阶段优化。 由于我们切换到不同的优化问题,因此有必要重新预热优化过程。 在第二阶段,我们不提高学习率,而是从零开始降低学习率(重新热身)。
通过这种改变,我们只需要8599次迭代,就可以在76分钟左右完成BERT训练,实现了101.8%的weak (weak),速度提升了65.2倍,使用了预估资源的64倍。
推理
大批量技术是推动神经网络深度训练的关键。 在本文中,我们提出了一种同时支持-wise 和 layer-wise 的 LAMB 优化器。 LAMB 是一种通用优化器,适用于小批量和大批量。 通过使用 LAMB,我们可以在不损失准确性的情况下将 BERT 预训练的批量大小扩展到 64K。 我们将 BERT 的训练时间从 3 天减少到 76 分钟左右,并将批量大小推到了 的硬件限制。 我们正在研究 LAMB 优化器的理论剖析。