深度学习模型轻量化(下)

2.4 蒸馏

2.4.1 蒸馏流程

蒸馏本质是student对teacher的拟合,从teacher中汲取养分,学到知识,不仅仅可以用到模型压缩和加速中。蒸馏常见流程如下图所示

  1. 老师和学生可以是不同的网络结构,比如BERT蒸馏到BiLSTM网络。但一般相似网络结构,蒸馏效果会更好。

  2. 总体loss为 soft_label_loss + hard_label_loss。soft_label_loss可以用KL散度或MSE拟合

  3. soft label为teacher模型的要拟合的对象。可以是模型预测输出,也可以是embeddings, 或者hidden layer和attention分布。

针对软标签的定义,蒸馏的方案也是百花齐放,下面分享两篇个人认为非常经典的文章。

2.4.2 distillBERT

DistillBERT: A distilled version of BERT: smaller,
faster, cheaper and lighter

DistillBERT由大名鼎鼎的HuggingFace出品。主要创新点为:

  1. Teacher 12层,student 6层,每两层去掉一层。比如student第二层对应teacher第三层

  2. Loss= 5.0 * Lce+2.0 * Lmlm+1.0 * Lcos

·
Lce: soft_label 的KL散度

·
Lmlm: mask LM hard_label
的交叉熵

·
Lcos:hidden state 的余弦相似度

DistilBERT 比 BERT 快 60%,体积比 BERT 小 60%。在glue任务上,保留了 95% 以上的性能。在performance损失很小的情况下,带来了较大的模型压缩和加速效果。

2.4.3 TinyBERT

TinyBERT: Distilling BERT for Natural Language
Understanding

总体结构

重点来看下 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 框架层加速

3.1 手机端AI能力

目前移动端AI框架也比较多,包括谷歌的tf-lite,腾讯的NCNN,阿里的MNN,百度的PaddleLite,
小米的MACE等。他们都不同程度的进行了模型压缩和加速的支持。特别是端上推理的加速。这个可以参考“手机端AI性能排名“。

3.2 端侧AI框架加速优化方法

个人总结的主要方法如下,可能有遗漏哈,各位看官请轻拍:

  1. 基于基本的C++编译器优化。

a. 打开编译器的优化选项,选择O2等加速选项。

b. 小函数内联,概率大分支优先,避免除法,查表空间换时间,函数参数不超过4个等。

  1. 利用C,而不是C++,C++有不少冗余的东西。

  2. 缓存优化

a. 小块内存反复使用,提升cache命中率,尽量减少内存申请。比如上一层计算完后,接着用作下一层计算。

b. 连续访问,内存连续访问有利于一次同时取数,相近位置cache命中概率更高。比如纵向访问数组时,可以考虑转置后变为横向访问。

c. 对齐访问,比如224224的尺寸,补齐为256224,从而提高缓存命中率。

d. 缓存预取,CPU计算的时候,preload后面的数据到cache中。

  1. 多线程。

a. 为循环分配线程。

b. 动态调度,某个子循环过慢的时候,调度一部分循环到其他线程中。

  1. 稀疏化

a. 稀疏索引和存储方案,采用eigen的sparseMatrix方案。

  1. 内存复用和提前申请

a. 扫描整个网络,计算每层网络内存复用的情况下,最低的内存消耗。推理刚开始的时候就提前申请好。避免推理过程中反复申请和释放内存,避免推理过程中因为内存不足而失败,复用提升内存访问效率和cache命中率。

  1. ARM NEON指令的使用,和ARM的深度融合。NEON可以单指令多取值(SIMD),感兴趣可针对学习,这一块水也很深。

  2. 手工汇编,毕竟机器编译出来的代码还是有不少冗余的。可以针对运行频次特别高的代码进行手工汇编优化。当然如果你汇编功底惊天地泣鬼神的强,也可以全方位手工汇编。

  3. 算子支持:比如支持GPU加速,支持定点化等。有时候需要重新开发端侧的算子。

4 硬件层加速

硬件层加速比较硬核,小编就连半瓢水都达不到了,为了保证整个方案的全面性,还是硬着头皮东施效颦下。目前AI芯片厂家也是百花齐放,谁都想插一脚,不少互联网公司也来赶集,如下图所示。

AI 芯片目前三种方案。GPU目前被英伟达和AMD牢牢把控。ASIC目前最火,TPU、NPU等属于ASIC范畴。

5 总结

本文对深度学习模型压缩和加速的几类常用的方法进行了介绍。

参考文献

  1. ALBERT: A Lite BERT for Self-supervised Learning of
    Language Representations

  2. MobileNets: Efficient Convolutional Neural Networks for
    Mobile Vision Applications

  3. Are Sixteen Heads Really Better than One?

  4. DistillBERT: A distilled version of BERT: smaller, faster,
    cheaper and lighter

  5. TinyBERT: Distilling BERT for Natural Language
    Understanding

  6. 手机端AI性能排名

深度学习模型轻量化(下)相关推荐

  1. 深度学习模型轻量化(上)

    深度学习模型轻量化(上) 移动端模型必须满足模型尺寸小.计算复杂度低.电池耗电量低.下发更新部署灵活等条件. 模型压缩和加速是两个不同的话题,有时候压缩并不一定能带来加速的效果,有时候又是相辅相成的. ...

  2. 深度学习之轻量化网络

    人工智能大力发展的趋势下,移动端和嵌入式设备上部署是迫切需求,由于现如今模型越来越深,越来越大,所以轻量化是有必要的. 轻量化网络要做什么呢?在尽量保持精度的前提下,从体积和速度两方面对网络进行轻量化 ...

  3. 【深度学习】轻量化CNN网络MobileNet系列详解

    深度学习100问 Author:louwill Machine Learning Lab MobileNet系列作为轻量级网络的代表,使得CNN轻量化和移动端的部署成为可能.MobileNet系列目前 ...

  4. 大模型轻量化技术调研

    笔记,仅供参考,未完 大模型轻量化技术调研 1. 调研论文 1.1 汇总 1.2 详细介绍 MODEL COMPRESSION VIA DISTILLATION AND QUANTIZATION LO ...

  5. 4个提高深度学习模型性能的技巧

    点击上方"AI遇见机器学习",选择"星标"公众号 原创干货,第一时间送达 深度学习是一个广阔的领域,但我们大多数人在构建模型时都面临一些共同的难题 在这里,我们 ...

  6. PyTorch 深度学习模型压缩开源库(含量化、剪枝、轻量化结构、BN融合)

    点击我爱计算机视觉标星,更快获取CVML新技术 本文为52CV群友666dzy666投稿,介绍了他最近开源的PyTorch模型压缩库,该库开源不到20天已经收获 219 颗星,是最近值得关注的模型压缩 ...

  7. 深度学习模型压缩(量化、剪枝、轻量化结构、batch-normalization融合)

    "目前在深度学习领域分类两个派别,一派为学院派,研究强大.复杂的模型网络和实验方法,为了追求更高的性能:另一派为工程派,旨在将算法更稳定.高效的落地在硬件平台上,效率是其追求的目标.复杂的模 ...

  8. 对深度学习模型的轻量化处理

    前言 模型的压缩技术是指对深度学习模型进行压缩以减小其大小和计算量,以便在资源有限的设备上部署.常用的压缩技术包括模型剪枝.量化.低秩分解等,下面分别简单的介绍一下. 正文 模型剪枝(Model Pr ...

  9. 深度学习模型压缩与加速技术(二):参数量化

    目录 总结 参数量化 参数量化定义 参数量化特点 1.二值化 二值化权重 二值化权重与激活函数 2.三值化 3.聚类量化 4.混合位宽 手工固定 自主确定 训练技巧 参考文献 深度学习模型的压缩和加速 ...

最新文章

  1. 大数据开发套件—调度运维常见问题
  2. Android Studio的快捷键图文并茂
  3. 每天进步一点点《ML - 支持向量机》
  4. QT获取本机IP,本地IP
  5. SAP License:物料账错误描述与解决办法
  6. 工程思想——继电器特性抖动处理
  7. Rsync 实现远程同步
  8. 专业术语常用名词缩写中英文对照
  9. linux下输入法终极解决方案
  10. 参数化CFAR的FPGA实现
  11. 5. 块定义(AttributeDefinition)
  12. 瀚高数据库开启Oracle兼容模块
  13. 河狸家半年值10亿是因为重度垂直
  14. iOS 2020 开发者账号 身份验证步骤
  15. L2正则化和collection,tf.GraphKeys
  16. 关于抖音抓包的一些分析和抖音视频批量下载
  17. django Auth用户登录
  18. Python 数据获取(五)—— 获取客户端渲染方式数据
  19. 利用Word2007查拼音(亲自实践)
  20. Android 高仿QQ 好友分组列表

热门文章

  1. 大数据与数据挖掘考试题_北京2020届中考物理出题策略大揭秘!
  2. 2022-2028年中国热塑性聚酯PBT工程塑料行业市场全景调查及发展趋势分析报告
  3. snagit屏幕截图转pdf
  4. LeetCode简单题之最小绝对差
  5. LeetCode简单题之杨辉三角
  6. Linux 内核,30 年C 语言将升级至 C11
  7. AI 芯片的分类及技术
  8. 如何使用Intel vtune profilier?
  9. IaaS、PaaS 和 SaaS:云服务模型概述
  10. Android进程间通信的方式