Skip to main content

训练HuggingFace模型快两倍

利用自动填补和统一长度分批。针对以减少训练时间为目的的2+1优化,本报告总结了我们的14个实验+5个复现性实验。
Created on February 25|Last edited on July 12
本报告是作者Michaël Benesty 所写的 "Train HuggingFace Models Twice As Fast" 的翻译

​​Transformers减少训练时间的选项

本报告的目的是探究2种非常简单的优化,这些优化也许会显著减少Transformers库上的训练时间,而不会对准确率产生负面影响。

在一个众所周知的大型自然语言处理数据集上(X-NLI的法语部分),我们运行了21个实验+12个复现性实验,实验表明,仅使用现成的法语BERT模型(CamemBERT)、默认参数、一个消费级GPU加上这些优化,对于基准模型,我们能够达到最大长度128单词(token)、训练16分钟、81.5%的准确率,以0.5分的优势胜过不带优化的56分钟训练,以0.3分的优势胜过CamemBERT模型作者的该任务得分。

对于最大长度493单词,在同样的模型上进步更加明显,当把无优化训练时间4时38分缩减到全部优化情况下训练时间1时01分,仍然获得同样的分数。在大型模型上也达到了类似的训练时间缩减(对于长度128单词,从4时缩减至1时30分)

若要详细了解,请查看我们的Medium文章

我们在X-NLI法语部分运行了很多实验,都记录在了wandb

  • base(基准) Camembert模型:14次实验+5次复现性实验
  • large(大型) Camembert模型:7次实验+5次复现性实验

在每种情况(base/large),实验分为2组:

  • 一小批次的64个序列,每个序列包含最多128个单词(token);
  • 一小批次的2X8个序列,每个序列包含最多493个单词(token)。

正如该文章所述,128单词(token)的配置会造成训练集样本截断3%。

对于其中每一组,我们都考虑结合3种优化来加速训练:

  • 混合精度英伟达Apex,用gcc7编译);
  • 自动填补
  • 智能分批(那篇文章称之为“统一长度分批”,因为实验用这个烂名做的记录,我在本报告中沿用。)

如果你想亲自运行这些实验,源代码位于这个 Github gist

训练时间-基准模型-每批次2步,每步8序列,每序列

在报告的第一部分,我们把重点放在base(基准)模型上。

如果我们不对序列长度加以限制,3个选项都开启会使训练时间最短:混合精度、自动填补和智能分批,意味着其中每一项都起作用。

无论如何,每一个选项的效果不尽相同;到目前为止,自动填补的影响最大,如果数据集97%的序列长度小于128序列,对于这种数据集来说这是非常有意义的。智能分批对这种模式也有帮助,是第二重要选项。




Run set
6


训练时间-基准模型- 1批次1步,每步64序列,每序列128单词

当我们把长度限制在128单词,照样是3个选项都开启使训练时间最短:混合精度、自动填补和智能分批。

然而,混合精度的影响比之前更大了。

  • 单独混合精度比单独自动填补和智能分批快了4%。
  • 单独混合精度比混合精度与自动填补、智能分批结合慢34%。

Github gist完整代码 →




Run set
6


准确率-基准模型-所有配置

我们把所有配置放到一起分析,因为无论我们怎么分组,都没有出现单一趋势。这就是说速度优化对准确率没有明显影响。

首先,我们注意到所有分数居于0.810和0.820之间,考虑到这么多实验用了各种各样的模式,可以说差距非常小。

如果我们训练模型超过1周期(epoch),很有可能会看到更大的差距,但Camembert论文 所报告的10周期XNLI(法语部分)分数“仅”为0.812。

2种配置达到了最佳分数(0.820):

  • 1批次64序列,每序列128单词,只用自动填补;
  • 1批次16序列,每序列493单词,只用自动填补;

没有什么好理由来解释单独自动填补有助于提高准确率,我们觉得只是巧合。

要检验的其它选项就是,单独智能分批的影响与不开启任何选项的设置进行对比:

  • 1批次16序列,每序列493单词,不开启选项:0.814
  • 1批次16序列,每序列493单词,单独开启智能分批:0.816
  • 1批次64序列,每序列128单词,不开启选项:0.810
  • 1批次64序列,每序列128单词,单独开启智能分批:0.817

智能分批貌似对准确率有点儿正面影响。

Github gist完整代码→




Run set
14


3 tokens权衡准确率/训练时间-每批次8X2序列,每序列493单词




8X2 sequences 493 tokens
7


权衡准确率/训练时间-每批次64序列,每序列128单词




Run set
7


复现性实验-基准模型

我们用不同的种子重新运行了5次最快的设置(自动填补+智能分批+混合精度+最大长度128单词)。分数较稳定(处于0.813和0.819之间),对于这种模型,分数始终高于Camembert论文所报告的分数(0.812)。




Run set
6


大型模型实验

本报告第二部分针对于large(大型)模型(335M参数),而不是base(基准)模型(110M参数)。

在这种配置中,使用2080 TI GPU中的12Gb,最大步长比base(基准)模型小:

  • 对于最大长度128单词,步长为8,我们累积2步即达到一批次16个样本;
  • 对于最大长度493单词,步长为2,我们累积8步即达到一批次16个样本。

Medium文章所介绍的2种优化目的主要在于批次/步的生成。 因为该模型大了3倍,但我们用于测试的GPU大小限制在12Gb,步长更小。

如果不加优化,训练时间非常长(493单词长度需要15小时,128单词长度需要4小时)。加上所有优化,训练时间减少了,但仍然较长(493单词长度需要7小时,128单词长度需要1时30分)。

不管用什么配置(有或者没有优化),这里得到的1周期分数比那篇论文10周期+早停法得到的分数稍微低一点(最佳优化的large(大型)模型达到了0.856,而那篇论文报告为0.857)

训练时间-大型模型-每批次2步,每步8序列,每序列128单词




Run set
3


训练时间-大型模型-每批次4步,每步2序列,每序列493单词




Run set
3


复现性实验-大型模型




Run set
6


下一步

我们希望本文对大家有用,建议大家亲自运行这些实验,源代码位于这个 Github gist.。

大家可以关注我的Twitter @pommedeterre33.


Iterate on AI agents and models faster. Try Weights & Biases today.