自Transformers诞生以来,紧随其后的是BERT,在几乎所有与语言相关的任务中,无论是问题回答,情感分析,文本分类还是文本生成,都占据着NLP的主导地位。与RNN和LSTM消失的梯度问题(不影响长数据序列的学习)不同,Transformers在所有这些任务上的准确性更高。RNN和LSTM不可扩展,因为它们必须考虑先前神经元的输出。
现在,《Transformers》的主要问题是它们在训练和推理方面都需要大量计算。虽然可以通过使用预先训练的语言模型(由Google,Facebook和OpenAI Large等大型公司开源)并在我们的数据集上进行微调来解决训练部分,但是这个解决方案并不完美。现在,后一个问题可以通过FastFormers解决,FastFormers是一组配方,可以在各种NLU任务上为基于Transformers的模型实现高效的推理时间性能。
“将这些建议的方案应用于SuperGLUE基准,与现成的CPU模型相比,能够实现9.8倍至233.9倍的加速。在GPU上,通过所介绍的方法,我们还可以实现最高12.4倍的加速。” -FastFormers
论文 FastFormers: Highly Efficient Transformer Models for Natural Language Understanding( arxiv.org/2010.13382)主要集中于为Transformer模型提供高效的推理,从而能够在大规模生产场景中进行部署。作者特别关注推理时间效率,因为它主要支配了生产部署的成本。在此文章中,我们将介绍本文所解决的所有问题和挑战。
那么,他们如何解决推理时间过长的问题?
他们主要利用三种方法,即知识蒸馏,结构化修剪和模型量化。
第一步是知识蒸馏,它可以减小模型深度和隐藏状态的大小,而又不影响准确性。
其次,结构化修剪可通过减少自我关注头的数量来缩小模型的尺寸,同时还努力保持准确性。
最后,模型量化可通过最佳利用硬件加速功能来加快模型执行速度。在CPU上,采用8位整数量化方法,而在GPU上,所有模型参数都转换为16位浮点数据类型,以最大程度地利用有效的Tensor Core。
深入研究
知识蒸馏:知识蒸馏是指通过逐步讲授一个较小的网络,确切地讲,使用一个已经受过训练的较大网络来做什么,来进行模型压缩的想法。虽然大型模型比小型模型具有更高的知识能力,但这种能力可能未得到充分利用。即使模型使用很少的知识能力,评估模型在计算上也可能同样昂贵。知识蒸馏将知识从大模型转移到小模型,而不会失去有效性。由于较小型号的评估成本较低,因此可以将其部署在功能较弱的硬件(如智能手机)上。
知识蒸馏方法:特别使用两种方法,即特定于任务的蒸馏和与任务无关的蒸馏。
在特定任务的蒸馏中,作者按照TinyBERT提出的程序将经过微调的教师模型提炼为较小的学生体系结构;在与任务无关的蒸馏方法中,作者直接对常规蒸馏模型应用微调以针对特定任务进行调整。
知识蒸馏的结果:在实验中,作者观察到当蒸馏为其他模型类型时,蒸馏模型不能很好地工作。因此,作者限制了我们的设置,以避免将Roberta模型提炼为BERT,反之亦然。下表中,通过验证数据集上的教师模型总结了有关任务的知识提炼结果。(学生称为蒸馏模型)
神经网络修剪:神经网络修剪是一种压缩方法,涉及从经过训练的模型中删除权重。在农业中,修剪会切断植物不必要的分支或茎。在机器学习中,修剪可以消除不必要的神经元或重量。神经网络修剪技术可以将经过训练的网络的参数数量减少90%以上,减少存储需求并提高推理的计算性能,而不会影响准确性。这有助于减小训练后的神经网络的大小或能耗,并有助于提高推理效率。修剪使网络更高效,更轻便。
结构化修剪方法:我们的结构化修剪方法的第一步是识别“多头注意”中最不重要的头和前馈层中最不重要的隐藏状态。
- 用于计算重要性分数的一阶方法,该方法利用一阶梯度信息而不是基于幅度的修剪。
- 在进行重要性分数计算之前,作者将掩码变量添加到每个注意头以进行头部的梯度计算。然后,作者在整个验证数据集上对模型进行正向和反向遍历,然后累积梯度的绝对值。这些累积的值然后用作重要度分数,我们将其用于分类头部和中间隐藏状态的重要度。
- 根据目标模型的大小,作者从网络中选择给定数量的顶部磁头和顶部隐藏状态。完成排序和选择步骤后,作者将重新分组并重新连接其余的头部和隐藏状态,从而使模型更小。修剪头部和隐藏状态时,作者在不同图层上使用相同的修剪率。这使得进一步的优化可以与修剪的模型无缝地协同工作。
- 在实验中,作者发现,经过修剪的模型经过另一轮知识蒸馏后,可以获得更高的准确性。因此,知识蒸馏再次应用于该模型。
模型量化:量化是指用于执行计算并以小于浮点精度的位宽存储张量的技术。量化模型对张量使用整数而不是浮点值执行部分或全部运算。这允许更紧凑的模型表示,并在许多硬件平台上使用高性能矢量化操作。
CPU上的8位量化矩阵乘法:与32位浮点算术相比,8位量化矩阵乘法带来了显着的加速,这归功于CPU指令数量的减少。
GPU的16位模型转换:V100 GPU支持Transformer架构的完整16位操作。同样,除了具有较小的值范围外,16位浮点运算不需要对输入和输出进行特殊处理。由于Transformer模型受内存带宽限制,因此这种16位模型转换带来了相当可观的速度提升。观察到大约3.53倍的加速,具体取决于模型设置。
除了应用的结构和数值优化外,作者还利用各种方式进一步优化计算,尤其是多处理优化和计算图优化。
综合结果
下表说明了以下结果的有效性
在本文中,作者介绍了FastFormers,它可以在各种NLU任务上为基于Transformer的模型提供有效的推理时间性能。FastFormers论文的作者表明,利用知识提炼,结构化修剪和数值优化可以大大提高推理效率。我们证明,这些改进最多可以提高200倍,并以节省22倍的计算量实现200倍以上的推理成本节省。
最后FastFormers源代码: https://github.com/microsoft/fastformers