【模型压缩】深度卷积网络的剪枝和加速(含完整代码)

pytorch深度学习入门(13)之-模型剪枝 prune.l1_unstructured(module, name="weight", amount=nWeightAmcount) #L1范数剪枝,既绝对值最小的权重移除prune.ln_structured(module, name="weight", amount=nFeatureAmcount, n=2, dim=0) #结构化剪枝,移除卷积核。 阅读详情

                                                                            Fly-AI竞赛服务平台 flyai.com

在开始学习之前推荐大家可以多在        FlyAI竞赛服务平台多参加训练和竞赛,以此来提升自己的能力。FlyAI是为AI开发者提供数据竞赛并支持GPU离线训练的一站式服务平台。每周免费提供项目开源算法样例,支持算法能力变现以及快速的迭代算法模型。

摘要: 记录一下去年12月份实验室的一个工作:模型的剪枝压缩,虽然模型是基于yolov3的魔改,但是剪枝的对象还是CBL层(即Conv Layer + BN Layer + LeakyReLU Layer),主要分布在Darknet骨干网中,因此我觉得可能有一些通 ...

 

记录一下去年12月份实验室的一个工作:模型的剪枝压缩,虽然模型是基于yolov3的魔改,但是剪枝的对象还是CBL层(即Conv Layer + BN Layer + LeakyReLU Layer),主要分布在Darknet骨干网中,因此我觉得可能有一些通用的参考价值。Visdrone2019数据集上的效果是在mAP几乎不掉点的情况下模型大小压缩为原来的15%,推理速度提高一倍。

 

剪枝顾名思义,就是通过一些算法或规则删去一些不重要的部分,来使模型变得更加紧凑,减小计算或者搜索的复杂度,一种典型的模型剪枝方法如下图:

它包括四个迭代步骤:

评估一个预先训练的深度模型中每个组件的重要性;

剔除对模型推理不重要的成分;

微调修剪模型,以弥补潜在的暂时性能下降;

对微调后的模型进行评估,确定修剪后的模型是否适合部署。为了防止过度剪枝,较好采用增量剪枝策略。

对一个深度卷积系的模型而言,剪枝操作之前需要对模型进行稀疏化训练,从而根据稀疏情况进行模型组件的选择,通常来说,稀疏化有四个粒度的稀疏方式,分别是weight-level,kernel-level,channel-level,layer-level。weight-level具有较高的灵活性和泛化性能,也能获得更高的压缩比率,但是它通常需要特殊的软硬件加速器才能在稀疏模型上快速推理。相反,layer-level稀疏化不需要特殊的包做推理加速,而channel-level稀疏化在灵活性和实现上做了一个平衡,它可以被应用到任何典型的CNN或者全连接层(将每个神经元看作一个通道)。 在我们的方案中,结合layer-level和channel-level,相当于是考虑两个角度去剪枝模型:模型变短(layer-level)和模型变窄(channel-level),它的具体思路如下:

 

通道剪枝:

和模型剪枝的通用算法类似,我们的通道剪枝流程如下:

根据模型的主体结构,我们会筛选出参与剪枝的CBL结构(即Conv Layer + BN Layer + LeakyReLU Layer)的集合,大部分分布于Darknet骨干网络,对于上采样upsample之前的一个CBL不参与剪枝(实验表明这个CBL对精度影响较大)。 如何去评估CBL集合中,每个channel的重要性呢?具体的做法是利用BN层中的缩放因子γ,在训练过程当中来衡量channel的重要性,将低于一个阈值的CBL层的channel进行删减,达到压缩模型大小,提升运算速度的效果。其中,阈值可以通过我们设定的裁剪比例(超参数,实验可调)进行排序截断得到。如下图:

左边为训练后的稀疏模型,中间一列是scaling factors,也就是BN层当中的缩放因子γ,当γ较小时(如图中0.001,0.003),所对应的channel就会被删减,得到右边所示的模型。在我们的算法在,先以全局阈值找出各卷积层的mask,然后对于每组shortcut,它将相连的各卷积层的剪枝mask取并集,用merge后的mask进行剪枝,这样对每一个相关层都做了考虑,同时它还对每一个层的保留通道做了限制。 如何去训练出这样的稀疏模型呢?一个简单的做法是对BN层在梯度回传的时候附加一个梯度,是只训练趋于稀疏化,具体做法可以反映在损失函数中,附加一个γ参数的L1正则项:

第一项是模型预测所产生的损失,第二项就是用来约束γ的,λ是权衡两项的超参。

 

稀疏训练策略

在我们的方案中,对BN参数进行稀疏训练我们提供三种策略:

 

恒定λ: 在整个稀疏过程中,始终以恒定的λ给模型添加额外的梯度,因为力度比较均匀,往往压缩度较高。但稀疏过程是个博弈过程,我们不仅想要较高的压缩度,也想要在学习率下降后恢复足够的精度,不同的λ最后稀疏结果也不同,想要找到合适的往往需要较高的时间成本。

 

全局λ衰减: 设定在epochs的0.5阶段λ衰减100倍。前提是0.5之前权重已经完成大幅压缩,这时对λ衰减有助于精度快速回升,但是相应的bn会出现一定膨胀,降低压缩度,有利有弊,可以说是牺牲较大的压缩度换取较高的精度,同时减少寻找λ的时间成本。当然这个0.5和100可以自己调整。注意也不能为了在前半部分加快压缩bn而大大提高λ,过大的λ会导致模型精度下降厉害,且λ衰减后也无法恢复。

 

局部λ衰减: 在epochs的0.5阶段开始对85%的通道保持原力度压缩,15%的通道进行λ衰减100倍。这个85%是个先验知识,是由策略一稀疏后尝试剪通道几乎不掉点的较大比例,几乎不掉点指的是相对稀疏后精度;如果微调后还是不及baseline,或者说达不到精度要求,就可以使用策略三进行局部λ衰减,从中间开始重新稀疏,这可以在牺牲较小压缩度情况下提高较大精度。

 

在代码中需要在训练的时候,获取需要考量prune层的index,在进行梯度的附加项:

CBL_idx, _, prune_idx=parse_module_defs2(model.module_defs)

BNOptimizer.updateBN(model.module_list, opt.s, prune_idx, epoch,opt, opt.sr_mode)

 

其中:

在这里插入代码片

def parse_module_defs2(module_defs):

    CBL_idx = []

    Conv_idx = []

    shortcut_idx = dict()

    shortcut_all = set()

    ignore_idx = set()

    for i, module_def in enumerate(module_defs):

        if module_def['type'] == 'convolutional':

            if module_def['batch_normalize'] == 1:

                CBL_idx.append(i)

            else:

                Conv_idx.append(i)

            if module_defs[i + 1]['type'] == 'route' and 'groups' in module_defs[i + 1]:

                ignore_idx.add(i)

 

        elif module_def['type'] == 'upsample':

            # 上采样层前的卷积层不裁剪

            ignore_idx.add(i - 1)

    prune_idx = [idx for idx in CBL_idx if idx not in ignore_idx]

 

    return CBL_idx, Conv_idx, prune_idx

 

class BNOptimizer():

    '''

    稀疏训练

    mode==1: 恒定s给bn回传添加额外梯度

    mode==2: 全局s衰减,前50%epoch恒定s,后50%恒定s*alpha

    mode==3: 局部s衰减:前50%epoch恒定s,后50%中,对percent比例的通道保持s,1-percent比例的通道衰减s*alpha

    '''

    @staticmethod

    def updateBN(module_list, s, prune_idx, epoch,opt=None,mode = None,percent = 0.85, alpha = 0.01):

        if mode == 1:

            for idx in prune_idx:

                bn_module = module_list[idx][1]

                bn_module.weight.grad.data.add_(s * torch.sign(bn_module.weight.data))  # L1

        elif mode ==2:

            s = s if epoch <= opt.epochs * 0.5 else s * alpha

            for idx in prune_idx:

                bn_module = module_list[idx][1]

                bn_module.weight.grad.data.add_(s * torch.sign(bn_module.weight.data))  # L1

        elif mode == 3:

            if opt.sr and opt.prune==1 and epoch > opt.epochs * 0.5:

                idx2mask = get_mask2(module_list, prune_idx, percent)

            if idx2mask:

                for idx in idx2mask:

                    bn_module = module_list[idx][1]

                    # bn_module.weight.grad.data.add_(0.5 * s * torch.sign(bn_module.weight.data) * (1 - idx2mask[idx].cuda()))

                    bn_module.weight.grad.data.sub_((1-alpha) * s * torch.sign(bn_module.weight.data) * idx2mask[idx].cu

层剪枝:

层剪枝是在之前的通道剪枝策略基础上衍生出来的,在通道剪枝后进行层剪枝操作。针对每一个Darknet的shortcut层前一个CBL进行评价,对各层的γ均值进行排序,取最小的N层(N是实验中可调的超参数)进行层剪枝。为保证Darknet结构完整,这里每剪一个shortcut结构,会同时剪掉一个shortcut层和它前面的两个卷积层。Darknet中有23处shortcut,剪掉8个shortcut就是剪掉了24个层,剪掉16个shortcut就是剪掉了48个层,总共有69个层的剪层空间。

 

微调精度恢复训练:

在进行通道剪枝和层剪枝之后,一般精度都会有不同程度的下降,这取决于剪枝的力度,但一般都可以通过微调剪枝之后的模型后再训练进行精度恢复,由于剪枝后的模型更加简单,所以往往在任务目标不那么复杂的情况下,具有更好的泛化性能(即剪枝前的模型可能过拟合于任务的数据集,而剪枝并且微调训练后的模型精度可能表现的更好,这在我们的实验中是有体现的)。即使是微调训练精度恢复不上去,依然可以采用知识蒸馏技术,将剪枝前的模型作为教师模型,引导剪枝后的学生模型进行蒸馏训练。需要强调的是,蒸馏在这里只是辅助微调,如果注重精度优先,剪枝时尽量剪不掉点的比例,这时蒸馏的作用也不大;如果注重速度,剪枝比例较大,导致模型精度下降较多,可以结合蒸馏提升精度。或者如果微调后精度能很好的恢复上去,也不要采用蒸馏策略,因为蒸馏策略会限制学生网络的精度上限,且蒸馏训练会需要更大的GPU内存来实现,增加了实验的成本。

 

github代码开源在:

github链接:https://github.com/lixiangwang/model_prune_yolov3

 

 

Channel Pruning:用于加速深度神经网络的通道剪枝方法 我们介绍了一种新的通道剪枝方法,用来加速非常深的卷积神经网络。给定一个训练过的CNN模型,我们提出来一种迭代式的两步骤算法,通过基于通道选择的LASSO回归和最小二乘法重建来有效地修剪每一层。我们进一步将这个算法扩展到多层、多分支的情况。该方法减少了积累误差,提高了与各种体系架构的兼容性。 阅读详情

相关推荐

Soft Filter Pruning(SFP)算法笔记

论文:Soft Filter Pruning for Accelerating Deep Convolutional Neural Networks 论文链接:https://www.ijcai.org/proceedings/2018/0309.pdf 代码链接:https://github.com/he-y/soft-filter-pruning 这篇是IJCAI 2018的关于模型加速...

AI之路 9861

深度学习模型压缩与加速理论与实战(一):模型剪枝

记录以下最近实验室的工作:模型的压缩和加速,虽然针对的是yolov3,但是剪枝的对象还是CBL层(即Conv Layer + BN Layer + LeakyReLU Layer),因此我觉得可能有一些通用的参考价值。 文章目录通道剪枝:稀疏训练策略层剪枝:微调精度恢复训练:github 剪枝顾名思义,就是通过一些算法或规则删去一些不重要的部分,来使模型变得更加紧凑,减小计算或者搜索的复杂度,一种典型的模型剪枝方法如下图: 它包括四个迭代步骤: 评估一个预先训练的深度模型中每个组件的重要性; 剔除对.

贝壳er的博客 3909

【CNN优化加速】01模型压缩基础:常见策略、卷积相关概念

模型轻量化相关内容

ShiTianlei的博客 4312

神经网络模型压缩方法

神经网络模型压缩方法( flask API、onnx、ncnn在嵌入式、流媒体端口应用)

zhaohaobingniu的博客 4373

[网络压缩](IJCAI-18)yanwei fu ——Soft Filter Pruning (IEEE TIP)yanwei fu——PSFP (arXiv)yanwei fu——SCSP

Soft Filter Pruning for Accelerating Deep Convolutional Neural Networks   这篇文章提出SFP算法,并和HFP做对比。HFP按照某种指标对不符合指标的filter(卷积核),进行剪枝,即置零,然后做fine-tune,fine tune的时候网络中就不包含那些被剪掉的filter。在后面的迭代中,剪枝的filter是固定的...

qq_39434776的博客 888

模型压缩算法国内外研究现状综述

剪枝类型参考文章评估指标简介参数驱动[99][100][101][102]基于权值的L1/L2范数[103][104][105]基于BN层的γ参数[106][107]基于BN层的γ参数衍生的缩放因子[108]基于卷积核的谱聚类[109]基于卷积核的几何中位数[110]基于卷积核的相似度数据驱动[111]基于后一层的统计信息[112][113][114]基于激活值最小重构误差[115]基于剪枝前后特征图熵值大小[116]

Joejwu的博客 3425

【荐读 IEEE TRO】深度卷积神经网络的结构化剪枝综述

题目:[Structured Pruning for Deep Convolutional Neural Networks: A Survey (https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=10330640) 深度卷积神经网络的结构化剪枝综述 作者:Yang He;Lingao Xiao 摘要 深度卷积神经网络(CNNs)的显著性能通常归因于其更深和更宽的架构,但这也带来了显著的计算成本。因此,剪枝神经网络引起了广泛关注,因为它

小白学视觉 2046

深度学习技巧应用5-神经网络中的模型剪枝技巧

模型剪枝是一种常用的深度学习模型优化技巧,其目的是通过去除模型中一些不必要的参数或节点,从而提高模型的运行效率和准确性。同样的,模型中的参数如果过多,会降低模型的训练速度和推理速度,同时也可能会过拟合数据。在模型剪枝中,我们对模型中的一些参数做出修改,使得它们的影响减少,从而降低整个模型的冗余度。大家好,我是微学AI,今天给大家带来深度学习技巧应用5-神经网络中的模型剪枝技巧,模型剪枝是深度学习中的一个重要的技巧应用,用好了可以简化模型已经提高模型推理深度。1.部分权重参数被裁剪掉了,模型的稀疏性增加。

微学AI的博客 1727

Gate Decorator:加速深度卷积神经网络的全局滤波器剪枝方法

Gate Decorator:加速深度卷积神经网络的全局滤波器剪枝方法 项目介绍 Gate Decorator 是一个用于加速深度卷积神经网络(CNN)的开源项目,由Zhonghui You等人在NeurIPS 2019上发表的论文《Gate Decorator: Global Filter Pruning Method for Accelerating Deep Convolutional Ne...

gitblog_00855的博客 1146

深度学习剪枝

一般来说,神经网络层数越深、参数越多,所得出的结果就越精细。但与此同时,问题也来了:越精细,意味着所消耗的计算资源也就越多。这个问题怎么破?这就要靠剪枝技术了。言下之意,把那些对输出结果贡献不大的参数剪掉。这项技术可追溯至深度学习大神Yan LeCun在1990年的研究。本文除了对各类剪枝技术进行详解,还会以案例的形式来进行实验实操:修剪一个基于VGG-16模型的猫狗分类器。这个案例结果证明,剪枝...

jacke121的专栏 4万+

AI智能体赋能Cypress:自动化前端测试的新范式

自动化测试是现代软件工程保障质量的核心实践,其原理是通过脚本模拟用户操作,对软件功能进行验证。随着大语言模型(LLM)和智能体(Agent)技术的发展,测试自动化正迈向智能化新阶段。智能体能够理解自然语言描述的测试需求,并自主规划、执行测试步骤,这为应对前端UI频繁变更、测试用例维护成本高等挑战提供了新思路。在工程实践中,将Cypress这一流行的前端测试框架封装为智能体可调用的标准化技能(Skill),是实现这一愿景的关键。通过设计清晰的交互协议和状态管理机制,智能体可以像人类测试工程师一样“感知”页面状

weixin_33726318的博客 686

深度学习网络模型压缩剪枝详细分析

一.简介 1.背景 深度学习让计算机视觉任务的性能到达了一个前所未有的高度。但,复杂模型的同时,带来了高额的存储空间、计算资源消耗,使其很难落实到各个硬件平台。 为了解决这些问题,压缩模型以最大限度地减小模型对于计算空间和时间的消耗。 2.理论基础 必要性:目前主流的网络,如VGG16,参数量1亿3千多万,占用500多MB空间,需要进行300多亿次浮点运算才能完成一次图像识别任务。 可行性:在深度卷积网络中,存在着大量冗余地节点,仅仅只有少部分(5-...

张伟的专栏 4625

sap销售发货的流程_SAP销售订单发货后如何实现发票的自动创建?

问SAP销售订单发货后如何实现发票的自动创建?答业务场景有些快消零售企业,SAP系统单据量大,单据金额少,一般在销售发货后即可确认收入。此时无需人工在系统内操作VF01或者VF04进行开票操作,可将该操作设置成后台作业进行自动批量开票,具体操作如下:1、定义任务:VF06输入完以上信息,点击保存进入以下界面:说明:当前日期的意思是“开票的日期”等于“系统电脑中的当前日期”当前日期+/-...

weixin_42358409的博客 3364

【YOLOv7/YOLOv5系列算法改进NO.49】模型剪枝、蒸馏、压缩

网络模型轻量化方法之剪枝、蒸馏、压缩,适应于需要轻量化模型对检测速度有要求的朋友。

m0_70388905的博客 1万+

BU61580芯片实战:手把手教你配置1553B通信的BC端寄存器(含代码解析)

本文详细解析了BU61580芯片在1553B通信中的BC端寄存器配置方法,包括关键寄存器功能映射、初始化代码解析及回环测试实现。通过实战案例和代码示例,帮助开发者快速掌握1553B通信的核心技术,提升系统稳定性和通信质量。

a1b2c的博客 224

HWSD2.0土壤数据处理实战:从下载到属性提取全流程解析

本文详细解析了HWSD2.0全球土壤数据库从数据下载、属性筛选到GIS空间连接与提取的全流程实战方法。重点介绍了如何利用ArcGIS Pro等工具,将土壤单元编码与黏粒含量等属性表关联,最终生成全球土壤属性专题栅格图,为农业规划与生态研究提供关键数据支撑。

weixin_29214691的博客 610

《datawhale2411组队学习 模型压缩技术7:NNI剪枝》

在线阅读NNI文档NNI(Neural Network Intelligence)是一个开源的自动机器学习(AutoML)工具,由微软亚洲研究院推出。它可以帮助用户自动化地进行超参数调优、神经网络架构搜索、模型压缩和特征工程等任务。NNI 支持多种深度学习框架,如PyTorch、TensorFlow等,并且可以在多种训练平台上运行,包括本地机器、远程服务器、Kubernetes等。NNI剪枝方法描述参考论文基于权重元素的绝对值,对每个权重元素按指定比例进行剪枝。使用最小 L1 权重范数修剪输出通道。

qq_56591814的博客 1592

WPS用户看过来:避开格式错乱坑,用WPS Office完美制作红头文件(2024最新版)

本文详细解析了WPS Office与Word在红头文件制作中的核心差异,提供了2024年最新版的零误差实战指南。从字体处理、页面布局到红头制作关键步骤,帮助用户避开格式错乱坑,确保跨设备显示一致。特别针对WPS用户优化,解决字体丢失、版式错位等常见问题。

weixin_26800111的博客 217

[2018IJCAI F] (模型压缩_剪枝_通道剪枝)Soft Filter Pruning for Accelerating Deep Convolutional Neural Networks

论文:Soft Filter Pruning for Accelerating Deep Convolutional Neural Networks (SFP) 论文链接:https://www.ijcai.org/proceedings/2018/0309.pdf 代码链接:https://github.com/he-y/soft-filter-pruning 这篇是IJCAI 2018的关...

JY丫丫 926

基于Simulink的异步电机参数在线辨识与自适应控制仿真

本文基于Simulink平台,详细介绍了异步电机参数在线辨识与自适应控制系统的仿真实现。针对异步电机运行中参数时变问题,采用模型参考自适应系统(MRAS)实时辨识转子电阻和互感,并结合自适应PI控制策略动态调整控制器参数。通过搭建完整的矢量控制(FOC)仿真模型,验证了系统在稳态辨识、参数摄动和动态响应等工况下的性能:参数辨识误差<1.2%,转速跟踪误差<20rpm,动态响应时间<10ms。文章还提供了详细的Simulink建模步骤、核心代码实现及性能分析,为高级电机控制系统的设计与优化提

amy_mhd的博客 73

倍福EL5101模块连接编码器

1、 EL5101模块简介:EL5101为单通道增量型编码器计数模块,一共有EL5101-0000、EL5101-0010、EL5101-0011、EL5101-0090(尚未供货)四种型号,其中EL5101-0000比较常用,本例使用EL5101-0000连接增量型编码器 2、 硬件外观和接线 在这里插入图片描述 3、 指示灯说明 4、和编码器连接的案例 ......

weixin_41883890的博客 6501

深度神经网络模型压缩与加速研究综述

深度神经网络模型压缩与加速研究综述 前言 深度卷积神经网络(CNNs)近年来在许多视觉识别领域取得了巨大的成功。然而,现有的深度神经网络模型在计算上是昂贵的且内存是密集型的。这限制了他们在低配置的硬件上的运行。因此,在不显著降低模型性能的情况下,在深度网络中进行模型压缩和加速是一种自然的思路,在这篇博客里讲会大致的想你介绍这个领域内的技术,综述了近年来发展起来的压缩和加速CNNs模型的先进技术。...

python_LC_nohtyp的博客 2325

美特CRM mcc_login.jsp存在SQL注入漏洞

MetaCRM 是一种现代化的客户关系管理(CRM)平台,旨在通过集成和自动化的方式帮助企业管理与客户的关系,提高销售和服务效率。MetaCRM 的功能和特性通常涵盖了多个领域,包括销售、营销、客户服务、数据分析和自动化工具。

缘梦未来的博客 808

模型剪枝方法:通过网络瘦身学习高效的卷积网络

​ 深度卷积神经网络 (CNN) 在许多实际应用中的部署在很大程度上受到其高计算成本的阻碍。在本文中,我们为CNN提出了一种新颖的学习方案,以同时1) 减小模型大小;2) 减少运行时内存占用;3) 在不影响准确性的情况下,减少计算操作的次数。这是通过以一种简单但有效的方式在网络中实施通道级稀疏性来实现的。与许多现有方法不同,所提出的方法直接适用于现代CNN架构,将训练过程的开销降至最低,并且不需要为生成的模型使用特殊的软件/硬件加速器。我们称我们的方法为网络瘦身。

ManiacLook的博客 5354

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

上一篇: 【企业级NLP赛事】正式开赛
下一篇: FlyAI人工智能社区参赛指南—用户体验版
iFlyAI
博客等级 码龄9年 238粉丝 134原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值