总体结构
重点来看下 TinyBERT,它是由华为出品,非常值得深入研究。TinyBERT 对 embedding 层,transformer层(包括hidden layer和attention)和 prediction 层均进行了拟合。如下图所示。
TinyBERT 蒸馏过程
其中Embeddings采用MSE, Prediction采用KL散度, Transformer层的hidden layer和attention,均采用MSE。loss如下
其中m为层数。
效果分析
表2: glue任务上的performance。在glue任务上,可达到bert-base的96%,几乎无损失。表3: tinyBERT模型大小和推理速度。缩小7.5倍,加速9.4倍。压缩和加速效果十分明显。
消融分析
表6:分析embedding、prediction、attention、hidden layer软标签作用,其中attention和hidden layer作用最大。这个也很好理解,transformer层本来就是整个BERT中最关键的部分。
表7:分析老师学生不同层对应方法的效果,uniform为隔层对应,top为全部对应老师顶部几层,bottom为全部对应老师底部几层。Uniform效果明显好很多。这个也很好理解,浅层可以捕捉低阶特征,深层可以捕捉高阶特征。全是低阶或者高阶显然不合适,我们要尽量荤素搭配。
3.1 手机端AI能力
目前移动端AI框架也比较多,包括谷歌的tf-lite,腾讯的NCNN,阿里的MNN,百度的PaddleLite, 小米的MACE等。他们都不同程度的进行了模型压缩和加速的支持。特别是端上推理的加速。 这个可以参考“手机端AI性能排名“。
3.2 端侧AI框架加速优化方法
个人总结的主要方法如下,可能有遗漏哈,各位看官请轻拍:
利用C,而不是C++,C++有不少冗余的东西。
缓存优化
多线程。
稀疏化
内存复用和提前申请
ARM NEON指令的使用,和ARM的深度融合。NEON可以单指令多取值(SIMD),感兴趣可针对学习,这一块水也很深。
手工汇编,毕竟机器编译出来的代码还是有不少冗余的。可以针对运行频次特别高的代码进行手工汇编优化。当然如果你汇编功底惊天地泣鬼神的强,也可以全方位手工汇编。
算子支持:比如支持GPU加速,支持定点化等。有时候需要重新开发端侧的算子。
硬件层加速比较硬核,小编就连半瓢水都达不到了,为了保证整个方案的全面性,还是硬着头皮东施效颦下。目前AI芯片厂家也是百花齐放,谁都想插一脚,不少互联网公司也来赶集,如下图所示。
AI 芯片目前三种方案。GPU目前被英伟达和AMD牢牢把控。ASIC目前最火,TPU、NPU等属于ASIC范畴。
这篇文章我们对深度学习模型压缩和加速的几类常用的方法进行了介绍,如果有读者对模型压缩加速也感觉兴趣的话,欢迎一起来讨论。