深度学习模型压缩与加速概况

参考:一文深入 - 深度学习模型压缩和加速 - 知乎

目前的深度学习模型的训练都是在云端的服务器上面进行的,例如在GPU等功耗,资源消耗较大的设备。这是毋庸置疑的。不过对与深度学习的应用,也就是推理。目前有几种落地方式。

一种是云端推理,模型推理过程在云端,将结果传输给端设备,应用场景可能有移动端编码视频传输到云端视频解码等。具体的落地设备方式有:NVIDIA的Tesla T4与寒武纪的MLU270等。这种方式都是针对的模型在云端服务器上推理的加速。如何看待寒武纪新一代人工智能芯片(疑似思元/MLU270)规格? - 知乎

另一种是物端推理,模型推理过程在移动端设备。具体的落地设备有:NVIDIA的TX2和以及边缘智能加速卡。

移动端的加速大概是从以下分析的几个方面进行。(猜测无论云端、物端都是从一下几个方面)

近年来深度学习模型在计算机视觉、自然语言处理、搜索推荐广告等各种领域,不断刷新传统模型性能,并得到了广泛应用。随着移动端设备计算能力的不断提升,移动端AI落地也成为了可能。相比于服务端,移动端模型的优势有:

  1. 减轻服务端计算压力,并利用云端一体化实现负载均衡。特别是在双11等大促场景,服务端需要部署很多高性能机器,才能应对用户流量洪峰。平时用户访问又没那么集中,存在巨大的流量不均衡问题。直接将模型部署到移动端,并在置信度较高情况下直接返回结果,而不需要请求服务端,可以大大节省服务端计算资源。同时在大促期间降低置信度阈值,平时又调高,可以充分实现云端一体负载均衡。

  2. 实时性好,响应速度快。在feed流推荐和物体实时检测等场景,需要根据用户数据的变化,进行实时计算推理。如果是采用服务端方案,则响应速度得不到保障,且易造成请求过于密集的问题。利用端计算能力,则可以实现实时计算。

  3. 稳定性高,可靠性好。在断网或者弱网情况下,请求服务端会出现失败。而采用端计算,则不会出现这种情况。在无人车和自动驾驶等可靠性要求很高的场景下,这一点尤为关键,可以保证在隧道、山区等场景下仍能稳定运行。

  4. 安全性高,用户隐私保护好。由于直接在端上做推理,不需要将用户数据传输到服务端,免去了网络通信中用户隐私泄露风险,也规避了服务端隐私泄露问题

移动端部署深度学习模型也有很大的挑战。主要表现在,移动端等嵌入式设备,在计算能力、存储资源、电池电量等方面均是受限的。故移动端模型必须满足模型尺寸小、计算复杂度低、电池耗电量低、下发更新部署灵活等条件。因此模型压缩和加速就成为了目前移动端AI的一个热门话题。模型压缩和加速不仅仅可以提升移动端模型性能,在服务端也可以大大加快推理响应速度,并减少服务器资源消耗,大大降低成本。结合移动端AI模型和服务端模型,实现云端一体化,是目前越来越广泛采用的方案。模型压缩和加速是两个不同的话题,有时候压缩并不一定能带来加速的效果,有时候又是相辅相成的。压缩重点在于减少网络参数量,加速则侧重在降低计算复杂度、提升并行能力等。模型压缩和加速是一个很大的命题,可以从多个角度优化。总体来看,个人认为主要分为三个层次:

  1. 算法应用层压缩加速。这个维度主要在算法应用层,也是大多数算法工程师的工作范畴。主要包括结构优化(如矩阵分解、分组卷积、小卷积核等)、量化与定点化、模型剪枝、模型蒸馏等。

  2. 框架层加速。这个维度主要在算法框架层,比如tf-lite、NCNN、MNN等。主要包括编译优化、缓存优化、稀疏存储和计算、NEON指令应用、算子优化等

  3. 硬件层加速。这个维度主要在AI硬件芯片层,目前有GPU、FPGA、ASIC等多种方案,各种TPU、NPU就是ASIC这种方案,通过专门为深度学习进行芯片定制,大大加速模型运行速度。

其中这三个层次的加速,难度逐渐增大,前面提到的落地设备就是一直做到了硬件层的加速,有自己的推理加速芯片,其次也有相应匹配的框架,框架种也实现了相应的算法。

算法层的加速:例如在nvidia的GPU上训练了一个模型,使用算法压缩加速后,模型由于是基于CUDA架构进行编译的,所以只能在支持CUDA架构的设备TX2或框架TFlite等上进行。除非在算法压缩的同时将模型转为其他的架构。算法层面是将模型自我进行压缩加速,而不是像2,3是在推理过程中对计算、读数据等进行优化的加速。

框架层的加速:

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

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

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

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

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

  5. 缓存优化

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

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

  8. 对齐访问,比如224 x 224的尺寸,补齐为256 x 224,从而提高缓存命中率

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

  10. 多线程

  11. 为循环分配线程

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

  13. 稀疏化

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

  15. 内存复用和提前申请

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

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

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

  19. 算子支持:比如支持GPU加速,支持定点化(框架层有些算子只支持浮点运算)等。有时候需要重新开发端侧的算子。

硬件层的加速:目前的深度学习是一种异构计算的方式,也就是系统中有2中不同的处理器,主处理器(CPU):负责的是主要流程控制和常规计算;协处理器(GPU,FPGA,ASIC等芯片):负责并行计算,速度快,低延时。

注:ASIC的主要应用场景是云端训练,推理和终端推理。

多多cite下https://arxiv.org/pdf/2011.03240.pdf
Channel Pruning via Multi-Criteria based on Weight Dependency

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值