模型压缩整理2020.5.6

https://www.bilibili.com/video/BV1LE411Z76J?p=2

AI领域最有趣的老师李宏毅:模型压缩系列讲解

模型压缩

1、剪枝的理由

图片.png

图片.png

不用小的network直接训练是因为小网络难以训练,泛化性不好,提取特征不好,容易卡在局部特征,有论文表明只要模型够大,就能提取全局有效的特征。( [2019ICLR W](模型压缩_剪枝_彩票理论)The Lottery Ticket Hypothesis: Finding Sparse, Trainable Neural Networks,larger network is easier to optimize),讲到了大网络就像大乐透一样,买的多中的多,概率更大,随机初始化,都可以找到最好的结果,但是很小的模型,随机初始化参数,这组参数很可能找不到,优化的参数方向,小模型可能太小,但是有验证这个很小的模型随机参数初始化和大模型的一样,还是可以训练的,所以小的net有的可以训练起来有的训不起来。大的net实际包含更多的小的network组合有很多冗余 ,而剪枝过程是找到近似于大的网络中最有效的小的net,
2019 Rethinking the value of pruning 这篇论文和上一篇是矛盾的,小模型可以训练起来

所以用剪枝的方式,将训练好的大的网络,一点点减去不中的层,权重再finune,直到模型精度满足要求,不能一次减太多,不然finetune 不能恢复过来

剪枝的问题:
分为权重剪枝和neuron 剪枝问题
1、剪枝后结构不对成,网络很难实现,就算实现了,gpu 不好加速(矩阵的运算都会有问题),所以实际上不是直接删掉,只是需要权重weight 部分设置0,但是又有问题,实际模型大小并没有改变,如果是权重剪枝,可以丢掉甚至90%的参数,精度都没有降低很多

图片.png

2、所以剪枝的结构化剪裁会更合适

3、关键点,第一点重要性的衡量标准,第二点哪里裁剪多少,即sparsity ratio的确定

剪枝的补充

网络剪枝是网络的压缩和加速中一个重要的方向,自1989年LeCun提出以来,得到了迅速发展。现在主要分为2种方向:1)权重剪枝;2)滤波器剪枝。滤波器剪枝相对于权重剪枝有一系列优点,包括它可以得到规则的模型,由此减少内存消耗,并且加速网络的推断。

结构化剪枝又包含三种剪枝维度,输出通道剪枝(filter pruning),输入通道剪枝(channel pruning)和输出通道形状剪枝(filter shape/column pruning)

结构化剪枝:直接去掉整个kernel的结构化信息;

非结构化剪枝:考虑每个kernel的每个元素,删除kernel中不重要的参数;也称为稀疏剪枝。此为权重级别的

1、从network pruning的粒度来说,可以分为结构化剪枝(Structured pruning)和非结构化剪枝(Unstructured pruning)两类。早期的一些方法是基于非结构化的,它裁剪的粒度为单个神经元。如果对kernel进行非结构化剪枝,则得到的kernel是稀疏的,即中间有很多元素为0的矩阵。除非下层的硬件和计算库对其有比较好的支持,pruning后版本很难获得实质的性能提升。稀疏矩阵无法利用现有成熟的BLAS库获得额外性能收益。因此,这几年的研究很多是集中在structured pruning上。Structured pruning又可进一步细分:如可以是channel-wise的,也可以是filter-wise的,还可以是在shape-wise的。

————————————————

原文链接:https://blog.csdn.net/jinzhuojun/article/details/100621397

2、剪枝的有效性,剪枝和神经网络架构搜索(NAS),能渐渐走到一起,是因为发现,剪枝后的网络结构才是最重要的。一项最新研究发现,不管继不继承原始网络的权重,已剪裁的网络都可获得相同精度。

2018年论文《Rethinking the Value of Network Pruning》,推翻了一些剪枝的基础概念https://zhuanlan.zhihu.com/p/47349303

实验表明,从头开始训练小修剪模型几乎总能达到与典型的“训练-剪枝-微调”流程获得的模型相当或更高的精度。这改变了我们对过度参数化的必要性的理解,进一步证明了自动剪枝算法的价值,可以用来寻找高效的架构,并为架构设计提供指导。

3、旷视研究院提出MetaPruning:基于元学习和AutoML的模型压缩新方法

4、这一元学习方法有以下优势:1)它比一般的 pruning baselines 精度高很多,比其他基于 AutoML 的通道剪裁方法精度更高或更好;2)它可根据不同的约束做灵活的优化而无需额外的超参数;3)它可高效裁剪类似于 ResNet 一样带有 short-cut 的网络结构;4)整个 pipeline 极其高效。

5、目前剪枝比(sparsity ratio 和 pruning rate) ,

2019****闲话模型压缩之网络剪枝(Network Pruning)篇综述:https://blog.csdn.net/jinzhuojun/article/details/100621397Sparsity Ratio****部分讲解很好

预定义(predifined)和自动(automatic)两种方式 ,

预定义(predifined)人工修改网络如mobilenet,直接训练,或者根据层的属性为每层设置最适合的sparsity ratio才是最优的,这种为每层专设的称为local sparsity,相对地前面那种就称为global sparsity。

(automatic)方法会根据所有的layer信息由pruning算法确定每层裁剪比例,就是相对于第一种方法自动找到最优结构的组合,不是提前自己设定一个确定的精简网络,自动找到每层的最优sparsity ratio

2、知识蒸馏

效果作用不是很大

通常认为,大的网络更好train,小的网络不好trian,

但是目前仍有争议,因为也有很多反例,小的网络也可以

为什么跟着教师网络,会更好的学习:

会额外告诉学生网络更多的信息,例如1不仅仅只有1的信息,还和7很类似的信息

所以没有学习7的信息,它也能知道7的一点信息

最终学习是一系列模型的平均(ensemble [ɒnˈsɒmbl]),学习到的一个平均model,学生网络

图片.png

知识蒸馏softmax 有一个超参数,就是T,作用提高小输入的值,由类似1000结果变成0.7 0.1 0.1 0.1的结果,像标签平滑类似
,是的softmax 不同输入之间的输出拉近一点

图片.png

3、参数量化

结论:
a1 二值权重网络(BWN)是一种只针对神经网络系数二值化的二值网络算法
a二值神经网络BNN只在小规模数据集上取得了较好的准确性,在大规模数据集上则效果很差,在bwn基础上,BNN要求不仅对权重做二值化,同时也要对网络中间每层的输入值进行二值化。
B XNOR-net同或网络是一种针对CNN的简单、高效、准确近似方法,网络在大规模数据集上的效果取得了巨大进步,其中在ImageNet上的正确性只比全精度的相同网络低十个百分点。但是,在很多复杂任务中,这一结果依然不能满足生产生活的需要。
C TWN三值权重网络与BWN相当,但是准确率却有着明显的提升。
D QNN(用少的bit表示一个值,例如32bit用16bit 表示一个值),软件上的实现和BNN比较没有优势,硬件上针对AI专用芯片的开发,芯片开发可以设计各种位宽的乘法器,因此将神经网络中32位的全精度数据可以被处理成6位或8位的浮点数

1、用少的bit表示一个值,例如32bit用16bit 表示一个值
2、Weight clustering
分群方法多种,加入是kmean 颜色分成四部分如下权重,取得平均值,不够精准,但是network可以小很多
3、第二步的基础上,进一步压缩,更多出现的cluster用少bit,表示,反之,用多bits 表示
用到的哈夫曼编码

图片.png

1、极致,只用±1,binary weights,表示权重

量化模型(Quantized Model)是一种模型加速(Model Acceleration)方法的总称,包括二值化网络(Binary Network)、三值化网络(Ternary Network),深度压缩(Deep Compression)等

4、模型结构的修改

例如 DW可分离卷积,+1*1 卷积,修改原始的卷积,新的更小的网络架构

模型压缩加速的综述

https://zhuanlan.zhihu.com/p/67871864

最新有效代码工作:

1.1

2017 论文Channel Pruning for Accelerating Very Deep Neural Networks》中在进行channel pruning后,直接通过least square来得到最小化特征重建精度下的新参数,因此不需要fine-tuning来恢复精度,是一种inference-time pruning方法。它的好处是pruning过程不需要训练环境。

但是这种方法,人工加入的限定太多,而且引入了很多调节参数,调整和优化都麻烦,实用性不强。而且文章开头说不需要retrain,其实还是pruning之后再来finetune一下效果比较好。

1、【论文笔记】AMC:AutoML for Model Compression and Acceleration on Mobile Devices

有代码链接2018

论文:https://arxiv.org/abs/1802.03494 代码:https://github.com/mit-han-lab/amc-release

本篇论文是MIT韩松老师组提出的一种模型压缩方法,其核心思想是使用强化学习技术来实现自动化压缩模型。目前对于领域问题的解决方案通常采取人工压缩模型,手工压缩方法需要相关领域的专家知识,需要人工在推理速度,大小与准确率之间权衡,因此人工压缩难以得到最优的压缩策略。与人工设计模型相比使用强化学习的产生压缩策略从数据出发能够找到更合适的压缩策略。该篇文章讲FLOPs减少4倍的情况下,对VGG-16模型压缩,比人工压缩策略策略高2.7%的精度。并将这种方法应用到更适合移动端设备的Mobilenet模型上,使模型更加轻量化。

————————————————

版权声明:本文为CSDN博主「shura_R」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/qq_30615903/article/details/102588437

上述论文在2020年论文中AAAI 2020 | 滴滴&东北大学提出自动结构化剪枝压缩算法框架,性能提升高达120倍,提出问题在哪(https://zhuanlan.zhihu.com/p/103257169),

(1)只采用了单一的输出通道(filter)剪枝维度;(2)为了得到稀疏化模型,其所采用的剪枝方法仅仅是在模型训练过程中引入一个静态的正则项;(3)更深层次的局限性在于其所采用的基于 DRL 框架的剪枝方法本质上与剪枝问题难以兼容。但由于 DRL 框架并不适合解决模型权重剪枝的超参数设置问题,AMC 研究的结果也佐证了这一观点,其结果中最高压缩率只有非结构化(non-structured)的 5 倍压缩倍率。

2、【模型压缩】MetaPruning:基于元学习和AutoML的模型压缩新方法

有代码链接2019

论文地址:https://arxiv.org/abs/1903.10258

开源代码:https://github.com/megvii-model/MetaPruning

MetaPruning 作为利用 AutoML 进行网络裁剪的算法之一,有着 AutoML 所共有的省时省力,硬件定制等诸多优势,同时也创新性地加入了先前 AutoML pruning 所不具备的功能,如轻松裁剪 shortcut 中的通道。

https://www.cnblogs.com/carsonzhu/p/11418536.html

3、ADAM-ADMM: A Unified, Systematic Framework of Structured…

ADMM,相比AMC不自动,第四篇论文主要以这个为基准修改进行

http://bit.ly/2M0V7DO代码 补充材料 http://bit.ly/2IBiNBk.  有代码

4、AAAI 2020 | 滴滴&东北大学提出自动结构化剪枝压缩算法框架,性能提升高达120倍,(https://zhuanlan.zhihu.com/p/103257169),

首次实现了目前最高效的深度神经网络自动化结构化剪枝的通用框架 AutoCompress

模型权重剪枝(weight pruning 可以结构化也可以不结构化)其中,结构化剪枝(structured pruning)作为能够真正在平台层面解决方法之一

首先,结构化剪枝包含三种剪枝维度,输出通道剪枝(filter pruning),输入通道剪枝(channel pruning)和输出通道形状剪枝(filter shape/column pruning)

没git代码公布,http://bit.ly/2VZ63dS 模型链接Google

还自己推出了自动压缩框架测试优于 优于 tensorflow lite TVM 框架

得到一个发现,

基于纯过滤器剪枝的结果进行“从头训练”时,可以恢复相似的精度。此时过滤器/通道修剪类似于查找较小的DNN模型。

当基于组合结构修剪的结果形成“从头开始训练”时,精度无法恢复,基本的见解是,组合剪枝不仅仅是训练较小的DNN模型,而是调整过滤器/内核形状。

在这种情况下,修剪后的模型代表了一个仅通过DNN训练无法实现的解决方案,即使已经给出了详细的结构。

图片.png

图片.png

1、CVPR 2020 (Oral) ,CVPR2020-HRank:Filter Pruning using High-Rank Feature Map

重新定义了剪枝规则,从实验效果来看,效率更高,与上述方法相比,用新的准则进行剪枝,方式简单一点,有源代码,

https://github.com/lmbxmu/HRank

#####################

【CVPR 2019 Oral】利用几何中位数(Geometric Median)进行模型剪枝基于滤波器的几何中位数的剪枝算法。我们提出的FPGM打破了以往的范数评价指标的局限性,并且达到了更好的性能

其novelty(新奇点)主要在于提出了一个新的筛选指标-几何中位数,然后加了求该指标理论推导,其他的如修剪流程和之前的流程完全相同,还是传统的基于规则的剪枝方法。(因此可以结合使用这一个筛选指标,但是工程本身不推荐

2、Filter Grafting for Deep Neural Networks

CVPR 2020 | 模型压缩新范式_滤波器嫁接技术

https://www.jianshu.com/p/a835eb8ce1d7

https://github.com/fxmeng/filter-grafting

下表展示了利用L1范数和熵值两种指标评价滤波器好坏后,嫁接策略的性能。从结果中可以看出,利用熵值有更好的性能,进一步说明了熵值是一种更优秀的评价滤波器好坏的准则。没有详细看,不是最好的工作,后期可看借鉴以下

图片.png

10、剪枝资料汇总

(1)https://github.com/NervanaSystems/distiller

这份代码整合了时下比较经典的压缩剪枝算法,当然也整合了本篇论文的AMC算法。设计模式思想体现的淋漓尽致,不愧为工业界的正经代码。拜读源码好几天,真的是被秀到了。想要用起这份代码还是需要一定功力的,如果只是paper做实验推荐官方开源的代码,在基础上进行修改还是比较容易的,因为功能比较单一注释也很友好通俗易懂

(2)https://github.com/he-y/Awesome-Pruning#2020

神经网络剪枝2017-2020,论文代码汇总基本优秀论文都在,但是cvpr 2020没有

(3)跟踪韩明老师的工作,模型压缩领域大牛,https://zhuanlan.zhihu.com/p/108096347

从算法到硬件部署,都有涉及。

图片.png

图片.png

三个步骤之后的压缩率可以达到类似如下的几十倍的压缩率,并且模型精度没有降低

图片.png

别人的一些经验说明
1、对于过参数化的高维度网络,我想大致只能是定性的讨论一下。首先,量化对性能的影响,其实本质是看网络对噪声的鲁棒性(量化相当于加上量化噪声),所以这个本质是考察系统的泛化能力。比较剪枝前后的网络泛化能力的差异,由于剪枝的结果本质上还是在原有配置附近,所以泛化能力不会有本质的优化,相反,剪枝减少了系统中的信息通道数目,实际上会导致系统的鲁棒性降低(剪枝前的网络由于过参数化会有大量备份或者平行互补的信息通道,更形象的图像是,网络是构建了一个河道来对水流进行导流,网络越大,河道越宽,导流能力越强,剪枝就是缩窄河道),所以剪枝会导致系统量化后性能更差一些

作者:匿名用户
链接:https://www.zhihu.com/question/353189956/answer/875010319
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

2、不同的网络层有不同的冗余性,因此对于精度的要求也不同,当前已经有许多的芯片开始支持混合精度。通常来说,浅层特征提取需要更高的精度,卷积层比全连接层需要更高的精度。如果手动的去搜索每一层的位宽肯定是不现实的,因此需要采用自动搜索策略。

1、部署问题,
(1)服务器部署:TensorRT是只能用在NIVDIA的GPU上的推理框架:
需求三:放到服务器上跑,要求吞吐和时延(重点是吞吐)此时已经要脱离训练框架,一般用TensorRT
这种应用在互联网企业居多,一般是互联网产品的后端AI计算,例如人脸验证、语音服务、应用了深度学习的智能推荐等。
由于一般是大规模部署,这时不仅仅要考虑吞吐和时延,还要考虑功耗和成本。所以除了软件外,硬件也会下功夫,比如使用推理专用的NVIDIA P4、寒武纪MLU100等。这些推理卡比桌面级显卡功耗低,单位能耗下计算效率更高,且硬件结构更适合高吞吐量的情况
软件上,一般都不会直接上深度学习框架。对于NVIDIA的产品,一般都会使用TensorRT来加速(我记得NVIDIA好像还有TensorRT inference server什么的,名字记不清了,反正是不仅可以加速前传,还顺手帮忙调度了)。TensorRT用了CUDA、CUDNN,而且还有图优化、fp16、int8量化等。反正用NVIDIA的一套硬软件就对了

需求一:简单的demo演示,只要看看效果的,像是学校里面的demo展示这种
caffe、tf、pytorch等框架随便选一个,切到test模式,拿python跑一跑就好,GUI显示,高级一点,可以用CPython包一层接口,然后用C++工程去调用
需求二:要放到服务器上去跑,但一不要求吞吐二不要求时延的那种,说白了还是有点玩玩的意思
caffe、tf、pytorch等框架随便选一个,按照官方的部署教程,老老实实用C++部署,例如pytorch模型用工具导到libtorch下跑

(2)移动端的部署:采用 腾讯ncnn,阿里的MNN,ncnn,tensorrt,mace,mnn
还有人推荐,tvm过人之处在于能够自动调优,这是ncnn,tensorrt,mace,mnn等不具备的。支持各种平台与开发,本人用过python,c++,java去调tvm的runtime,剩下的是,牛逼的代码功能,开源移动端框架速度不够——自己写一套。比如像商汤、旷世、Momenta都有自己的前传框架,性能应该都比开源框架好。只不过自己写一套比较费时费力,且如果没有经验的话,很有可能费半天劲写不好
2018年下半年,Intel公布了一套基于视觉推断与神经网络优化(Visual Inference and neural network optimization)的AI工具集OpenVINOOpenVINO实现了一套通用的API,可以混合调用CPU、GPU、Movidius NCS (Neural Compute Stick)和FGPA的算力来共同完成一次视觉推断。预先实现了一系列的功能库、OpenCL kernel等等,可以缩短产品面世时间,优化了OpenCV、OpenVX等的一些功能调用。也开源

(3)实际部署流程
嵌入式部署的场景来进行分析:
一般从离线训练到在线部署,我们需要依赖离线训练框架(静态图:tensorflow、caffe,动态图:pytorch、mxnet等),静态图工业部署成熟坑少,动态图灵活便捷、预研方便,各有各的好处;还需要依赖在线inference的框架(如阿里的MNN、腾讯的NCNN等等,
一般流程我分为如下几步,1、模型设计和训练 2、针对推断框架的模型转换 3、模型部署。虽然把整个流程分成三步,但三者之间是相互联系、相互影响的。首先第一步的模型设计需要考虑推断框架中对Op的支持程度,从而相应的对网络结构进行调整,进行修改或者裁剪都是经常的事情;模型转换也需要确认推断框架是否能直接解析,或者选取的解析媒介是否支持网络结构中的所有Op,如果发现有不支持的地方,再权衡进行调整。

作者:糖心他爸
链接:https://www.zhihu.com/question/329372124/answer/809058784
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 3
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值