EdgeBERT:极限压缩bert

这个世界上有两种极具难度的工程:第一种是把很平常的东西做到最大,例如把语言模型扩大成能够写诗写文写代码的 GPT-3;而另一种恰恰相反,是把很平常的东西做到最小。对于 NLPer 来说,这种 “小工程” 最迫在眉睫的施展对象非 BERT 莫属。

从 18 年那个 109M 参数的 BERT,到 52M 参数的蒸馏后的 DistilBERT,再到 14.5M 参数的蒸馏更多层的 TinyBERT,最后到 12M 参数的层级共享的 ALBERT,曾经那个在集群上加载参数都费劲的 BERT 现在甚至已经可以跑在手机平台上了。当我们为 BERT 的轻量化欢呼雀跃之时,有这样一群人站了出来——只是手机端可不够!他们的理想,是让 BERT 跑在物联网设备上,跑在低功耗芯片上,跑在我们能触及的每一个电子器件上!

这样一群来自哈佛 / 塔夫茨 / HuggingFace / 康奈尔的软件和硬件极客们,此刻已披上了法袍,化身为为 BERT 极限瘦身的炼金术士,向着这个看似不可能的目标添加着许多让人意想不到的配方…

论文题目:EdgeBERT: Optimizing On-Chip Inference for Multi-Task NLP

论文链接:https://arxiv.org/pdf/2011.14203.pdf

配方基底:ALBERT

出处:ALBERT: A Lite BERT for Self-supervised Learning of Language Representations(ICLR’20)

链接:https://arxiv.org/pdf/1909.11942.pdf

EdgeBERT 是在 ALBERT 的基础上进行优化的。

ICLR’20 上谷歌提出的 ALBERT 是目前最佳的 BERT 压缩方案。相比于过去利用知识蒸馏从原始 BERT 模型得到压缩模型(例如 DistilBERT [1]、TinyBERT [2])和利用浮点数量化得到压缩模型(例如 Q8BERT [3]),ALBERT 选择直接抛弃 BERT 的预训练参数,只继承 BERT 的设计思想。正所谓不破不立,继承 BERT 灵魂的 ALBERT 仅用 12M 参数就取得了和其他 BERT 变体相当的性能。

ALBERT 对 BERT 的设计采取了以下三点改进:

嵌入层分解:BERT 中,WordPiece 的嵌入维度和网络中隐藏层维度一致。作者提出,嵌入层编码的是上下文无关信息,而隐藏层则在此基础上增加了上下文信息,所以理应具有更高的维数;同时,若嵌入层和隐藏层维度一致,则在增大隐藏层维数时会同时大幅增加嵌入层参数量。ALBERT 因此将嵌入层进行矩阵分解,引入一个额外的嵌入层 E。设 WordPiece 词汇表规模为V,嵌入层维度为 E,隐藏层维度为 H,则嵌入层参数量可由 O(V x H)降低为O(V x E + E x H)。

参数共享:BERT 中,每个 Transformer 层参数均不同。作者提出将 Transformer 层的所有参数进行层间共享,从而将参数量压缩为仅有一层 Transformer 的量级。

上下句预测任务→句序预测任务:BERT 中,除语言模型的 MLM 任务外还进行了上下句预测任务,判断句 2 是否为句 1 的下一句,然而该任务被 RoBERTa 和 XLNET 等模型证实效果一般。作者提出将其替换为句序预测任务,判断句 2 和句 1 之间的句子顺序来学习文本一致性。

ALBERT 的设计相当成功,成为了压缩 BERT 的经典范例,而为了做到最极限压缩 BERT,以 ALBERT 作为起点确实是个不错的主意。ALBERT 已经如此强大,EdgeBERT 又能压到什么程度?作者一上来就用一张在 QQP 上的内存占用 / 运算量 / 性能比较图吊足了读者的胃口。(注意:纵坐标的内存占用量是对数刻度!)

在这里插入图片描述
本文对于 ALBERT 的利用除了作为初始化参数外,还在对下游任务做 fine-tune 时利用已经 fine-tune 好的 ALBERT 作为 teacher 进行知识蒸馏,来进一步提升模型性能。

初级配方:算法优化

在这里插入图片描述

  1. 基于熵的提前退出机制

出处:DeeBERT: Dynamic Early Exiting for Accelerating BERT Inference(ACL’20)

链接:https://arxiv.org/pdf/2004.12993.pdf

ALBERT 虽好,但 Transformer 太深了,算起来太慢,让他变浅一点怎么样?
ACL’20 的 DeeBERT 恰好就提出了一种动态的提前退出机制(Early Exit)。这一机制的设计是希望让简单的文本经过较少的运算,而复杂的文本经过更多的运算。

在这里插入图片描述
实现上,DeeBERT 向 n 层的 BERT 模型添加了 (n-1) 个 “出口层” 分类器(Early Exit Off-Ramps)。出口层分类器 f_i 被放置在第 i 和 i+1 层 Transformer 之间,作为判断第 i 层 Transformer 的信息是否足以进行推断的标志。进行推断时,从最底层的分类器开始逐层计算出口层分类器的熵,当某一层的出口层分类器熵小于某个阈值时,则将该出口层分类器结果作为模型结果,省去后续层的计算。
在这里插入图片描述
上图表现的是不同的熵阈值在 MNLI、QQP、SST-2、QNLI 四个数据集上的平均退出层数、理论运行时间节省和相应的准确度。添加提前退出机制后,在 Acc 损失 1 个百分点时,能够在这四个数据集上分别降低 30%、45%、54% 和 36% 的理论运行时间;在 Acc 损失 5 个百分点时,能将在这四个数据集上的理论运行时间的降低进一步降低至 44%、62%、78% 和 53%。

  1. 动态注意力范围

出处:Adaptive Attention Span in Transformers(ACL’19)

链接:https://arxiv.org/pdf/1905.07799.pdf

ALBERT 虽好,但 Attention 范围太广了,算起来太慢,让他变窄一点怎么样?

ACL’19 的 Adaptive Attention 提出的动态注意力范围正是试图通过这种方法减少注意力计算的。在 Transformer 的多头自注意力机制中,不同 head 对应的注意力范围并不一致,而让每一个 head 都对所有 token 进行注意力运算无疑增添了无用开销。为此,Adaptive Attention 为每一个 head 添加一个不同的 mask,使得每个 token 只能对周边的 token 计算注意力,从而降低矩阵运算的开销。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
3. 一阶网络剪枝

出处:Movement Pruning: Adaptive Sparsity by Fine-Tuning(NeurIPS’20)

链接:https://arxiv.org/pdf/2005.07683.pdf

ALBERT 虽好,但参数存起来占用的内存太长了,开销太大,让他变短一点怎么样?

这里的网络剪枝方式使用到了 NeurIPS’20 的一篇针对模型 Fine-tune 过程的剪枝算法。该论文的作者提出,传统的零阶网络剪枝(即给模型里的参数绝对值设定一个阈值,高于它的保留,低于它的置零)的方法并不适用于迁移学习场景,因为该场景下模型参数主要受原始模型影响,却需要在目标任务上进行 fine-tune 和测试,所以直接根据模型参数本身剪枝可能会损失源任务或目标任务的知识。与此相反,作者提出一种基于 Fine-tune 过程中的一阶导数进行剪枝的 Movement Pruning:尽可能保留 fine-tune 过程中更加偏离 0 的参数。

在这里插入图片描述
在这里插入图片描述
4. 零阶网络剪枝

出处:Deep Compression: Compressing Deep Neural Networks with Pruning, Trained Quantization and Huffman Coding(ICLR’16)

链接:https://arxiv.org/pdf/1510.00149.pdf

变短是变短了,但感觉这剪得还不够好啊,再换一种算法让它更短一点怎么样?

这种方法的做法非常简单:给模型里的参数设定一个绝对值阈值,绝对值高于它的保留,绝对值低于它的置零。由于方法实在太过简单,不用公式也能很容易理解的吧图片

在这里插入图片描述

一阶和零阶网络剪枝的效果对比如上图所示(MvP:一阶网络剪枝,MaP:零阶网络剪枝)。在参数稀疏程度更高时,一阶剪枝的效果更好,其他情况下是简单的零阶剪枝更有效。同时,研究还发现,当剪掉 95% 的嵌入层参数时,模型竟然在 4 个任务上都保持了至少 95% 的准确度。

  1. 动态浮点数量化

出处:AdaptivFloat: A Floating-point based Data Type for Resilient Deep Learning Inference(arXiv Preprint)

链接:https://arxiv.org/pdf/1909.13271.pdf

诶,怎么还有?网络的运算和存储过程从深度、宽度和长度进行了全方位的优化,模型还能再轻?

的确,到此为止,一般的炼丹师已经看着自己三维裁剪过的模型感到成就感满满了,但这距离让 BERT 跑遍所有设备的目标还差得远。以下的部分就要开始深入一般 NLP 工程师见不到的第四个维度——硬件维度了。在深入硬件优化之前,先来道偏软件的开胃菜,看看如何在浮点数量化上下手优化存储吧!

我们平时在考虑利用浮点数特性进行计算加速时,最先考虑的是使用 FP16 混合精度,虽然有效,但毕竟损失了信息,效果也多多少少会受影响。既想保留精度又想加速训练减小存储,那就只有深入底层,修改浮点数的表示方法了!

这正是 AdaptivFloat 的初衷:设计一种更加适合深度学习场景的浮点数数据类型。不过,要讲明白 AdaptivFloat 数据类型需要涉及到一些与机器学习无关的知识。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上图的结果中,Bit Width 是浮点数的总位数,后五行在模型中使用了 AdaptivFloat 并将指数偏移值限制为 3 个 bit。不比不知道,谁能想到修改个量化方式居然直接用 8bit 在四个数据集上都干翻了 FP32?!不仅节省了 3/4 的内存,还取得了更好的性能,或许这就是吹毛求疵挑战极限的极客们的浪漫?

高级配方:存储介质选择

光软件优化可不够!如果软件优化就够了的话,还买什么 SSD,换什么 GPU(不)

EdgeBERT 的目的,是尽可能降低边缘计算场景中使用 BERT 的推理延迟和耗能。为了最大限度地降低推理延迟,需要为网络中不同的组成部分根据其增删改查的需求选取符合最大效能的存储介质。

BERT 类模型的一大特点,在于它们都是预训练模型:这类模型并非开箱即用,而是需要在目标任务上 fine-tune 后才能使用。这使得这类模型天生地存在着两类存储需求:

嵌入层:保存了 Embedding 向量。EdgeBERT 在进行下游任务 fine-tune 时一般不对嵌入层进行修改。这类参数相当于只读参数,只对快速读取有较高要求,同时希望能够在掉电时依然保持原有数据来降低数据读写开销,因此适用耗能低、读取速度快的 eNVM(Embedded Non-Volatile Memory,嵌入式非挥发性记忆体)。本文选取的是基于 MLC 的 ReRAM,一种低功耗、高速度的 RAM。

其他参数:这些参数需要在 fine-tune 时进行改变。此处使用的是 SRAM(与计算机内存的 DRAM 不同,SRAM 更贵但功耗更低、带宽更高,常被用于制造 cache 或寄存器)

在这里插入图片描述
嵌入层用了 ReRAM 究竟能带来多大的影响?上图结果表明,仅仅是改变了嵌入层的硬件介质就能带来约的推理延迟降低,以及低至约的能耗降低!这对于边缘计算场景下简直是质变了!(为何 ReRAM 只有读,但 DRAM 那边却要算 DRAM 读 + SRAM 读 / 写呢?因为此处的 ReRAM 是特殊设计的只读结构,并且可以直接读入处理器进行运算。与此相反,DRAM,即电脑里一般使用的内存,需要经过基于 SRAM 的处理器 cache,所以读写开销需要加上这部分读写开销。)

合并结果

好了,所有的基础配方一个一个单独使用的结果已经出来了!那么,把它们全都加在一起能产生什么样的结果呢?
在这里插入图片描述
在这里插入图片描述
这张图展示了完全体 EdgeBERT 在四个数据集上的性能、运算量和内存占用。其中所有红点的实验配置参照上表(即 TABLE IV)。

在性能(准确度)相比 ALBERT 下降 1 个百分点时,EdgeBERT 能取得的内存降低和的推理速度;下降 5 个百分点时甚至能取得的推理速度。

Embedding 经过裁剪后仅保留了 40%,使得存储进 eNVM 的嵌入层参数仅 1.73MB。

QQP 的 Transformer 参数被 mask 掉 80%,MNLI、SST-2、QNLI 的 Transformer 参数被 mask 掉 60% 后,性能可以仅下降 1 个百分点。

究极配方:硬件加速器

这是什么东西?来,给你展示一下谷歌给树莓派定制的 TPU 加速器 Coral:

在这里插入图片描述
EdgeBERT 专属的硬件加速器想来应该也是差不多的样子。

这一部分完全不是王苏的菜… 给各位上一张 EdgeBERT 加速器的硬件结构图:

在这里插入图片描述
感兴趣的各位可以去参照原文进行学习_(:з」∠)_

这个加速器有什么用呢?它是基于 EdgeBERT 的运算特点量身定做的加速器,能够把 fine-tune 好的 EdgeBERT 完整地装进去进行运算。至于运算效果,它们修改了模型图中 VMAC 序列(即进行矩阵运算的单元序列)长度,与 NVIDIA 的移动端 TX2 mGPU 进行了推理时间和耗能的对比:
在这里插入图片描述
本文中提出的硬件加速器能够为 EdgeBERT 带来相比于 baseline 硬件加速器的能耗降低,相比于英伟达 TX2 移动端 GPU 甚至能够带来的能耗降低!耗电大户 BERT 家族终于也有能被说 “省电” 的一天了!

总结

压缩 BERT 是一项研究,但极限压缩 BERT 则是一项不易完成的工程:无论是对 Transformer 模型的全方位裁剪,还是对硬件存储介质读写性能与容错的取舍,亦或是对专属硬件加速器的设计,单独拿出一项已足够艰难,将它们合在一起就不仅可能互相冲突,甚至还可能产生逆向优化。这篇文章通过大量的实验,测试了已有的几种优化方法在边缘计算场景下的性能,比较了不同优化方法之间的差别,分析了所有优化方法进行组合后的影响及效果,并进一步提出了专属的硬件结构,实现了对目前已有的最轻量 BERT 变体的即插即用。对于需要长待机、低功耗、短延迟的场景,例如智能家居或是其他需要 NLP 技术加持的物联网设备,或许我们真的能在不远的将来看到实体的类似 EdgeBERT 加速器的解决方案出现。

虽然我们对于可能带来更大变革的模型结构依然处在探索当中,但从当下实用的角度而言,用基于 Lottery Ticket Hypothesis[6]的 BERT 优化方法寻找一个更优的类 BERT 子结构依然是一个不错的课题,至少它能让更多人、更多时候、更多场景能够用上性能强大的预训练模型。本文中提到的这些优化方法是不是也给爱思考的你带来了什么启发呢?

https://mp.weixin.qq.com/s?__biz=MzA3MzI4MjgzMw==&mid=2650806805&idx=4&sn=4a356904e931334d3eaa7cbb51f3b69a&chksm=84e5de6bb392577d5a73c726590caabf034900e90e709c80eccc6e53e128a332e1808df58226&mpshare=1&scene=1&srcid=0114fb2F96KwO56sJC4IJOBt&sharer_sharetime=1610673987490&sharer_shareid=ad938198e7c1453de3019f515c855c6a&key=ff69355afd56518a3247a1644149d227b8bce5c9df9dbe51f3b17e614c710fac03f83e9d4ccda0cc910b7cb23d446c7d03e6b6b03a95bd2c181df8b481815762dd321fa5a0e3caace32de430594cbaaaa97128abaeba4ca9ab9e72325f67f23d5c8696f55643f21399d8553f733e1e00b676cd6d511f746745d74d667d7dfdb9&ascene=1&uin=MTk0ODYwODI2Mg%3D%3D&devicetype=Windows+10+x64&version=6300002f&lang=zh_CN&exportkey=Ae37qHjYq%2BzH3jTZVIfrUkw%3D&pass_ticket=xU9nO5ZDg9EM3GAMerffD%2BpFqLzXLQ3vDTL5jLQqhn86Pfu7VcD%2B0IvKP8QOaPNM&wx_header=0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值