内容纲要

这是微软的一篇论文,解决transformer参数量大导致的次奥率问题。

Transformer模型在NLU上被广泛应用。在各种任务上,模型变得越来越大,越来越好。 但是,由于与传统方法相比,Transferer模型在推理时效率不高,因此在计算上仍然具有挑战性。 在本文中,我们介绍了FastFormers,实现高效的推理时间性能。我们展示了如何谨慎地利用知识蒸馏,结构化修剪和数值优化可以导致推理效率的显着提高。与现成的CPU模型相比,我们可以将速度提高9.8倍至233.9倍。 在GPU上,我们使用所提出的方法还可以达到12.4倍的加速。

Introduction

为了解决transformer部署难的问题,我们提出fasttransomer。另外我们主要关注推理的时间效率。
主要是是使用三种方式:知识蒸馏,结构剪枝和模型量化。首先我们调查了各种知识蒸馏的技术,来显著减少模型的尺寸对于深度和隐藏层尺寸同时保留精确度。其次,我们使用结构化简直,来进一步减少模型的尺寸,通过减少自监督头的数量和中间的隐层状态,同时保证准确度。最后,我们研究模型量化,更快速的执行。在CPU上,8位的整数量化方法可以很好的利用最优的CPU指令:Vector Neural Network Instructions (VNNI)。在GPU上使用16位的浮点数进一步应用有效的tensor cores。更进一步的,通过使用onnxruntime库,复用多图节点实现图优化。另外,我们还研究了一些最优的设置,来充分利用CPU GPU资源。

知识蒸馏

知识蒸馏是训练学生模型以模仿较大教师模型的行为的过程。

蒸馏方法

作者使用两种蒸馏的方法:一种是特定任务的,另一种是任务无关的。在特定任务的,我们遵顼tinyBERT,蒸馏精调后的老师模型到小的学生模型;在任务无关的蒸馏方法中,我们直接应用fine-tuning在通用的蒸馏模型上到具体的任务。如图1所示:
file
使用soft-crossentropy function。
teacher模型,我们选择了12个堆叠层BERT和有着768个隐含层维度和12个自注意力头的RoBERTTa模型,这在BERT中被称为Base Size。使用开放集合下的预先蒸馏模型,作为对应的学生模型的初始化。这些预蒸馏的模型是通用的,和任务无关的模型。

蒸馏结果

不同模型类型会有不同的结果两个BERT模型的主要不同在于token(sub-word)嵌入。我们认为不同的输入嵌入空间会导致不同的输出嵌入空间,在不同的空间进行知识迁移不会很好。
file

结构剪枝

大多数此类方法侧重于随机修剪以减少参数数量,遵顼乐透彩票假设。尽管这能减少模型的size,但是在推到阶段并没有多大提升。因为它不关注如何使用计算资源。
DynaBERT提出了在Transformer体系结构的前馈层中修剪中间隐藏状态的方法,以及对这些经过修剪的注意力模块和前馈层进行重新连接的建议。
我们根据头的数量和前馈网络的隐藏状态大小来定义目标模型大小,并使用DynaBERT中提出的修剪/蒸馏方法作为模型压缩方法。

结构化剪枝

首先识别最不重要的头和隐含层。使用一阶方法来计算重要性分数,利用一阶梯度信息而不是使用基于剪枝的幅度。在计算重要性分数之前,为了头的梯度计算,我们加入了mask变量到每个注意力头。
接下来,我们在整个验证数据集上对模型进行正向和反向遍历,然后累积梯度的绝对值。
这些累积的值用作重要性分数,我们用它对头部和中间隐藏状态的重要性进行排序。根据目标模型的大小,我们从网络中选择给定数量的顶部磁头和顶部隐藏状态。 排序和选择步骤完成后,我们将重新分组并重新连接其余的头部和隐藏状态,从而生成更小尺寸的模型。 修剪头部和隐藏状态时,我们在不同图层上使用相同的修剪率。 这使得进一步的优化可以与修剪的模型无缝地协同工作。 在我们的实验中,我们观察到经过修剪的模型经过另一轮知识蒸馏后可以获得更高的准确性。 因此,我们将非修剪模型用作教师模型,并将修剪模型用作学生模型的初始化参数,从而又进行了一次知识蒸馏。

剪枝结果

file

低精度推理

CPU使用8位,GPU使用16位。
后面就是其他工程上的优化。

组合结果

file

最后修改日期:2020年11月17日

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。