Pine 发自 凹非寺 量子位 | 公众号 QbitAI
单个GPU,只花一天时间,能把BERT训练成什么样?
(资料图片仅供参考)
现在,终于有研究人员做这件事了,在有限的计算条件之下看看语言模型的真实性能如何。
要知道在以往,大多数专业人员的关注点都在极端计算的条件下的语言模型性能。
但这样的语言训练模型环境,对很多研究人员和从业人员是不可能存在的。
因此这个单天单个GPU的挑战,就有网友称是一个最希望看到的基准。
连ViT作者,谷歌大脑研究员Lucas Beyer都发文推荐,称这是一个令人耳目一新的转变。
具体的过程和结果如何,一起来看看~
挑战过程
这次研究的目标也很明确,就是反其道行之:缩小语言训练模型的算力, 在有限的计算量的情况下如何达到BERT的性能水平 。
既然要缩小计算量,那第一步肯定是对模型作出一些限定。
这也还是之前提到的,限定时间和GPU个数:单天单个GPU。
关于GPU,研究人员分别选取了3个进行测试,即rtx2080ti、rtxa4000和rtxa6000,每个单元有4个CPU核和32GB内存。
在限定计算量之后,就要 对模型的其他参数进行一些调整,以进一步对BERT的实际适用性进行评估 。
这些调整包括 初始数据设置、模型架构、训练以及数据集 的改进。
并且在调整的过程中,整体基调都是围绕“实际使用”进行的,避免跳转到专业的设置,为此,研究人员将所有内容都保持在PyTorch框架的实现级别上。
先来说说 初始数据设置 ,这部分可以简单概括为以下几点:
将标记化的数据打包成长度为128的随机序列,不相关的片段用
删除< cls > 标记,因为在训练前训练中加入它并没有对性能产生多大影响;
将序列长度为64到96微小批量累积到大批量再处理。
然后是对 架构 的修改,下图显示了不同模型在随着token数量的增加MLM任务损失的变化。
结果很显然,一个模型损失的衰减很大程度地取决于模型的大小,而不是模型的类型。
并且,因为每个token的性能与模型大小之间的关系紧密耦合,若想通过改变Transformer模型的大小和类型来获得巨大性能增益是不太可能的。
不过对于同大小的所有模型,每个梯度效率是几乎保持不变的,因此可以在保证模型大小不变的情况下,选择能够通过快速搜索加速计算的架构。
具体的优化和其他调整如下:
减少注意力头的数量来降低梯度成本:禁用所有QKV偏差;
禁用所有线性层偏差,通过加速梯度计算,不会对模型大小产生明显影响;
实现比例正弦位置嵌入,相较于学习或非比例正弦嵌入有增量收益;
LN的预标准化比后LN更有益;
去除非线性头部并无影响。
接下来便要对 训练 进行设置,具体也就不再赘述,直接来看相关调整:
优化器依旧是Adam;
设定Learning Rate计划和批量大小;
丢掉Dropout环节。 (因为Dropout会导致每秒更新的净减少)
而在 数据集 方面,研究团队采用了两种基于数据的途径来更好地缩小规模,分别是 以各种方式过滤、处理或排序现有的数据 和 交换数据源 ,具体可以看下表。
性能接近最初的BERT
在调整完各种参数后,这个单卡一天的BERT性能到底如何?直接看看最终的数据!
在下游性能评估时是通过GLUE来进行的,下表能够看到在3个不同显卡上的得分,非常接近最初的BERT。
而当模型训练计算量为16倍时,即 (2天,在8个GPU) ,依旧是一样的数据和设置,最终得到的结果比最初的BERT提高了很多,达到了RoBERTa的性能水平。