训练HuggingFace模型快两倍
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序列,对于这种数据集来说这是非常有意义的。智能分批对这种模式也有帮助,是第二重要选项。
训练时间-基准模型- 1批次1步,每步64序列,每序列128单词
当我们把长度限制在128单词,照样是3个选项都开启使训练时间最短:混合精度、自动填补和智能分批。
然而,混合精度的影响比之前更大了。
- 单独混合精度比单独自动填补和智能分批快了4%。
- 单独混合精度比混合精度与自动填补、智能分批结合慢34%。
Github gist完整代码 →
准确率-基准模型-所有配置
我们把所有配置放到一起分析,因为无论我们怎么分组,都没有出现单一趋势。这就是说速度优化对准确率没有明显影响。
首先,我们注意到所有分数居于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完整代码→
3 tokens权衡准确率/训练时间-每批次8X2序列,每序列493单词
权衡准确率/训练时间-每批次64序列,每序列128单词
复现性实验-基准模型
我们用不同的种子重新运行了5次最快的设置(自动填补+智能分批+混合精度+最大长度128单词)。分数较稳定(处于0.813和0.819之间),对于这种模型,分数始终高于Camembert论文所报告的分数(0.812)。
大型模型实验
本报告第二部分针对于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)