【论文】AMC:AutoML用于移动设备上的模型压缩和加速

article/2024/4/20 16:02:41

摘要

模型压缩是在计算资源有限且功率预算紧张的移动设备上高效部署神经网络模型的有效技术。传统的模型压缩技术依赖于手工制作的特性,需要领域专家在模型大小、速度和精度之间进行权衡,以探索大的设计空间,这通常是次优和耗时的。在本文中,我们提出了用于模型压缩的AutoML(AMC),它利用强化学习来有效地采样设计空间,并可以提高模型压缩质量。我们以完全自动化的方式实现了最先进的模型压缩结果,无需任何人力。在4×FLOP减少的情况下,我们在ImageNet上为VGG-16实现了比手工制作的模型压缩方法高2.7%的精度。我们将这种自动按钮压缩管道应用于MobileNet-V1,在GPU(Titan Xp)上实现了1.53倍的加速,在Android手机(Google Pixel 1)上实现1.95倍的加速。

1简介

在许多机器学习应用(例如,机器人、自动驾驶汽车和广告排名)中,深度神经网络受到延迟、能量和模型大小预算的限制。已经提出了许多工作来通过模型压缩来提高神经网络的硬件效率[26,19,22]。模型压缩技术的核心是确定每个层的压缩策略,因为它们具有不同的冗余度,这通常需要手工制作的启发式算法和领域专家来探索模型大小、速度和准确性之间的大设计空间。设计空间如此之大,人类的启发式通常是次优的,而人工模型压缩是耗时的。为此,我们的目标是自动找到任意网络的压缩策略,以实现比人类策略更好的性能。

        由于深度神经网络中的层以未知的方式关联,因此确定压缩策略非常重要。随着网络的深入,这个问题也具有指数级的复杂性,这是不可能用暴力方法解决的。强化学习方法已被广泛认可为具有比随机探索更好的样本效率,并获得更好的解决方案。因此,我们提出了用于模型压缩的AutoML(AMC),它利用强化学习来有效地采样设计空间,并大大提高模型压缩质量。图1说明了我们的AMC引擎。当压缩网络时,我们的AMC引擎自动完成了这一过程,并将压缩管道从人工劳动中解放出来,而不是依靠人类经验或手工制作的启发式方法。

        我们观察到,压缩模型的精度对每个层的稀疏性非常敏感,需要细粒度的动作空间。因此,与在离散空间上搜索不同,我们提出了一种具有DDPG[32]代理的连续压缩比控制策略,以通过试验和错误进行学习:惩罚精度损失,同时鼓励模型收缩和加速。演员-评论家(actor-critic)结构也有助于减少差异,促进更稳定的训练。具体来说,我们的DDPG代理以分层方式处理网络。对于每个层L_t,代理接收层嵌入s_t,该层嵌入st编码该层的有用特性,然后输出精确的压缩比。在用at压缩层L_t之后,代理移动到下一层L_{t+1}。在所有层被压缩的情况下,修剪模型的验证精度在没有微调的情况下进行评估,这是微调精度的有效代表。这种简单的近似可以提高搜索时间而不必重新训练模型,并提供高质量的搜索结果。

        策略搜索完成后,对最佳探索模型进行微调,以获得最佳性能。

        我们针对不同的场景提出了两种压缩策略搜索协议。对于延迟至关重要的人工智能应用程序(例如,移动应用程序、自动驾驶汽车和广告排名),我们提出了资源受限压缩,以在给定最大硬件资源量(例如,FLOP、延迟和模型大小)的情况下实现最佳精度,我们提出了保证精度的压缩,以实现最小的模型而不损失精度。

        我们通过约束搜索空间来实现资源受限压缩,其中动作空间(修剪比率)受到约束,使得代理压缩的模型始终低于资源预算。对于精度保证的压缩,我们定义了一个报酬,它是精度和硬件资源的函数。通过此奖励功能,我们能够在不损害模型准确性的情况下探索压缩的极限。

        为了证明广泛和普遍的适用性,我们在多个神经网络上评估了AMC引擎,包括VGG[45]、ResNet[21]和MobileNetV1[23],我们还测试了压缩模型从分类到对象检测的泛化能力。大量实验表明,AMC比手工制定的启发式策略提供了更好的性能。对于ResNet-50,我们将专家调整的压缩比[16]从3.4倍推至5倍,而不损失精度。而且,我们将MobileNet-V1[23]的FLOP降低了2倍,达到了70.2%的最高精度,这是在比0.75 MobileNet-V1更好的帕累托曲线上,并且我们在Titan XP上实现了1.53倍的加速,在Android手机上实现了1.95倍的加速。

2.相关工作

        CNN压缩和加速。在通过压缩加速神经网络方面已经做了大量工作[20,19,34,12,18,17]。量化[55,10,41]和特殊卷积实现[36,48,29,3]也可以加快神经网络的速度。张量因子分解[30,15,27,35]将权重分解为轻量级块,例如[51,11,14]提出用截断SVD加速全连接层;Jaderberg等人[26]提出将层分解为1×3和3×1;Zhang等人[53]提出将层分解为3×3和1×1。通道修剪[40,24,1,38]从特征图中移除冗余通道。这些方法的一个常见问题是如何确定每个层的稀疏率。

        神经结构搜索和AutoML。许多使用强化学习和遗传算法搜索模型的工作[46,42,5,37]大大提高了神经网络的性能。NAS[57]旨在搜索可转移的网络块,其性能超过许多手动设计的架构[47,21,9]。Cai等人[6]提出通过网络转型加快探索[8]。在他们的启发下,N2N[2]将强化学习融入渠道选择。在表1中,我们展示了AMC引擎的几个优点。与之前的工作相比,AMC引擎优化了准确性和延迟,需要一个简单的非RNN控制器,可以用更少的GPU小时进行快速探索,并且还支持连续动作空间。

 图1。AutoML for Model Compression(AMC)引擎概述。左图:AMC取代了人类,使模型压缩完全自动化,同时性能优于人类。右:形成AMC作为强化学习问题。我们以逐层方式处理预训练的网络(例如MobileNet-V1)。我们的强化学习代理(DDPG)从层t接收嵌入s_t,并输出稀疏比a_t。用at压缩层后,它移动到下一层L_{t+1}。评估了所有层压缩的修剪模型的准确性。最后,作为准确性和FLOP的函数,奖励R被返回给强化学习代理。

 3.方法

我们在图1中概述了AutoML for Model Compression(AMC)引擎。我们的目标是自动找到每个层的冗余度,以稀疏性为特征。我们训练一个强化学习代理来预测动作并给出稀疏性,然后执行修剪。我们在修剪之后但在微调之前快速评估准确性,作为最终准确性的有效代表。然后,我们通过鼓励更小、更快、更准确的模型来更新代理。

3.1 问题定义

模型压缩是通过减少深度神经网络中每个层的参数数量和计算来实现的。有两类修剪:细粒度修剪和结构化修剪。细粒度修剪[19]旨在修剪权重张量中的单个不重要元素,这能够在不损失精度的情况下实现非常高的压缩率。然而,这样的算法会导致不规则的稀疏模式,并且需要专门的硬件(如EIE[18])来加快速度。细粒度结构化修剪[31]旨在修剪权重张量的整个规则区域(例如,通道、行、列、块等)。修剪的权重是规则的,可以使用现成的硬件和库直接加速。在这里,我们研究了收缩每个卷积和完全连接层的输入信道的结构化修剪。

我们的目标是精确地找出每个层的有效稀疏度,这在以前的研究中通常是手动确定的[38,31,22]。以卷积层为例。权重张量的形状是n×c×k×k,其中n,c是输出和输入通道,k是内核大小。对于细粒度修剪,稀疏度定义为零元素的数量除以总元素的数量,即#zeros/(n×c×k×h)。对于通道修剪,我们将权重张量收缩为n×c′×k×k(其中c′<c),因此稀疏性变为c′/c。

3.2带强化学习的自动压缩

AMC利用强化学习在行动空间上进行有效搜索。这里我们介绍强化学习框架的详细设置。

状态空间  对于每个层t,我们有11个表征状态s_t的特征:

 

其中t是层索引,内核的维度是n×c×k×k,输入是c×h×w。F LOPs[t]是层L_t的FLOP。Reduced是前几层中减少的FLOP总数。Rest是以下层中剩余FLOP的数量。在传递给代理之前,它们在[0,1]内缩放。这样的特征对于代理区分一个卷积层和另一个是必不可少的。

 

动作空间 大多数现有作品使用离散空间作为粗粒度的动作空间(例如,{64,128,256,512}用于通道数量)。细粒度的动作空间对于高精度的模型架构搜索来说可能不是问题。然而,我们观察到,模型压缩对稀疏度非常敏感,需要细粒度的动作空间,导致离散动作数量激增(第4.2节)。如此大的动作空间很难有效探索[32]。离散化也会打乱顺序:例如,10%的稀疏度比20%更强烈的,但远比30%更强烈的。

        因此,我们建议使用连续作用空间a∈(0,1],这可以实现更细粒度和精确的压缩。

DDPG代理 如图1所示,代理从环境中接收层Lt的嵌入状态s_t,然后输出稀疏比作为动作a_t。使用指定的压缩算法(例如,通道修剪),使用a_t压缩该层(四舍五入到最近的可行分数)。然后,代理移动到下一层L_{t+1},并接收状态s_{t+1}。在完成最后一层L_T之后,在验证集上评估奖励准确性并将其返回给代理。对于快速探索,我们在没有微调的情况下评估奖励精度,这是微调精度的一个很好的近似值(第4.1节)。

        我们使用深度确定性策略梯度(DDPG)来连续控制压缩比,这是一种非策略行动者-评论家(off-policy actor-critic)算法。对于勘探噪声过程,我们使用截断正态分布

 

 在开发期间,噪声σ被初始化为0.5,并在每次发作后呈指数衰减。

 根据Block-QNN[54],其应用了Bellman方程[50]的变体形式,在每一时代的每个过渡是(s_ta_t,R,s_{t+1}),其中R是网络压缩后的回报。在更新期间,减去基线奖励b以减少梯度估计的方差,这是先前奖励的指数移动平均值[56,6]:

 

 折扣系数γ设置为1,以避免过度优先考虑短期回报[4]。

 

 3.3 搜索协议

资源受限压缩通过限制动作空间(每个层的稀疏比),我们可以准确地达到目标压缩比。

根据[57,4,54],我们使用以下奖励:

该奖励不提供模型大小减少的激励,因此我们可以通过另一种方式实现目标压缩比:限制动作空间。以用于模型大小缩减的细粒度修剪为例:我们允许在前几层执行任意操作a;当我们发现预算不足时,我们开始限制行动a,即使在用最激进的策略压缩了以下所有层之后。算法1说明了该过程。(对于通道修剪,代码将更长但相似,因为删除L_T层的输入信道也将删除L_{t-1}的相应输出信道,从而减少两层的参数/FLOP)。再次注意,我们的算法不限于约束模型大小,它可以被其他资源替代,例如FLOP或移动设备上的实际推断时间。根据我们的实验(第4.1节),由于代理没有获得低于预算的激励,因此可以精确地达到目标压缩比。

 

精度保证压缩通过调整奖励功能,我们可以准确地找到压缩的极限,从而不会损失精度。我们根据经验观察到,误差与log(F LOP s)或log(#P aram)成反比[7]。基于此,我们设计了以下奖励函数:

 此奖励功能对错误敏感;同时,它为减少FLOP或模型大小提供了一个小的激励。根据我们在图4.1中的实验,我们注意到我们的代理会自动找到压缩的极限。

4.实验结果

 

对于细粒度修剪[19],我们以最小的幅度修剪权重。卷积层的最大稀疏比a_{max}设置为0.8,而全连接层的a_{max}则设置为0.98。对于通道修剪,我们使用最大响应选择(根据大小修剪权重[20]),并在修剪期间保留批归一化[25]层,而不是将它们合并到卷积层中。所有层的最大稀疏比amax设置为0.8。注意,手动上限a_{max}仅用于更快的搜索,可以简单地使用amax=1,这也会产生类似的结果。我们的actor网络µ有两个隐藏层,每个层有300个单元。最后一个输出层是一个sigmoid层,用于将动作信号限制在(0,1)内。我们的critic网络Q也有两个隐藏层,都有300个单元。动作arr包含在第二个隐藏层中。我们使用τ=0.01作为软目标更新,并以64作为批处理大小和2000作为回放缓冲区大小来训练网络。我们的代理首先使用恒定噪声σ=0.5探索100个世代,然后使用指数衰减噪声σ探索300世代。

 

 4.1 CIFAR-10和分析

 我们进行了广泛的实验,并充分分析了我们在CIF AR-10[28]上的AMC,以验证两种搜索协议的有效性。CIFAR数据集由50k训练和10k测试组成,测试了10个班级的32×32幅微小图像。我们将训练图像分成45k/5k训练/验证。在验证图像上获得准确度奖励。我们的方法计算效率很高:RL可以在一个GeForce GTX TITAN Xp GPU上在1小时内完成搜索。

FLOP约束压缩。我们在具有信道修剪的CIFAR-10上进行了FLOP约束实验。我们将我们的方法与图2中所示的三种经验策略[31,22]进行了比较:统一设置压缩比,分别对浅层和深层进行积极修剪。基于不同网络的稀疏分布,可以选择不同的策略。

        在表2中,我们向我们展示了使用奖励Rerr来准确地找到Plain-20和ResNet-56[21]的50%修剪稀疏率,并将其与经验策略进行比较。我们大大优于经验政策。AMC发现的最佳修剪设置不同于手工制作的启发式(图2)。它学习了瓶颈架构[21]。

精度保证压缩。通过使用R_{Param}奖励,我们的代理可以自动找到压缩的极限,具有最小的模型大小和很少的性能损失。如表2所示,我们在CIF AR-10上使用细粒度修剪压缩ResNet-50。我们在验证集和测试集上获得的结果都具有高达60%的压缩比,甚至精度稍高,这可能与修剪的正则化效应有关。

 4.2 ImageNet

在ImageNet上,我们使用训练集中的3000张图像来评估奖励功能,以防止过度拟合。在整个实验中,用224×224输入来测量实验数据。

推动细粒度修剪的极限。细粒度修剪方法基于单个连接对神经网络进行修剪,以实现权重和激活的稀疏性,这能够实现更高的压缩比,并且可以使用专用硬件(如[18,17,39])进行加速。然而,它需要迭代修剪和微调过程来实现良好的性能[20],而没有再训练的单镜头修剪将极大地损害大压缩率(例如4×)的预测精度,这不能为强化学习代理提供有用的监督。

        为了解决这个问题,我们按照[16]中的设置进行4次迭代修剪和微调实验,其中在每次迭代中将整个模型的总体密度设置为[50%、35%、25%和20%]。对于每个阶段,我们运行AMC以确定给定总体稀疏度的每个层的稀疏度比率。然后根据通用协议对模型进行修剪和微调30个时期。使用该框架,我们能够将ImageNet上ResNet-50的专家调整压缩比从3.4倍提高到5倍(见图4),而不会损失ImageNet上的性能(原始ResNet50的[前1名,前5名]准确度=[76.13%,92.86%];AMC修剪模型的准确度=[66.11%,92.89%])。每个阶段的每个层的密度如图3所示。峰值和峰值表明,RL代理自动学习以更大的稀疏度修剪3×3卷积层,因为它们通常具有更大的冗余度;而以较低的稀疏度修剪更紧凑的1×1卷积。图4提供了每个区块的密度统计数据。我们可以发现,AMC的密度分布与[16]的表3.8所示的人类专家的结果大相径庭,这表明AMC可以充分探索设计空间并以更好的方式分配稀疏性。

        敏感度较低的层被更积极地修剪。这种方法假设不同修剪层的误差可以线性地相加,根据我们的实验,这是不成立的。RNP[33]将所有卷积信道分组为4组,并训练RL代理根据输入图像决定4组。然而,动作空间非常粗糙(每层只有4个动作),并且无法减少模型大小。SPP[49]对每一层应用PCA分析,并将重建误差作为灵敏度度量,以确定修剪比率。这种分析是基于一个单层进行的,没有考虑层之间的相关性。我们还将我们的方法与原始的信道修剪论文(表3中的CP)进行了比较,在该论文中,人类专家仔细调整了修剪后的VGG-16[45]的稀疏率(跳过了conv5,conv4和剩余层的稀疏率为1:1.5)。表3中给出了修剪后VGG-16的结果。与我们的CIF AR-10实验(第4.1节)一致,AMC优于所有启发式方法超过0.9%,并且在没有任何人工劳动的情况下击败人类专家0.3%。

 

除了VGG-16,我们还测试了现代高效神经网络MobileNet-V1[23]和MobileNet-V2[44]上的AMC。由于网络已经非常紧凑,因此要进一步压缩它们要困难得多。减少模型通道的最简单方法是使用均匀通道收缩,即使用宽度乘数以固定比率均匀减少每层的通道。MobileNet-V1和MobileNet-V2都呈现了不同乘数和输入大小的性能,我们将修剪后的结果与相同计算的模型进行了比较。格式表示为统一(深度乘数-输入大小)。我们可以发现,我们的方法始终优于统一基线。即使对于当前最先进的高效模型设计MobileNet-V2,AMC仍然可以在相同的计算下将其精度提高1.0%(表3)。MobileNet-V1的帕累托曲线如图5a所示。

加速移动推理。近年来,移动推理加速引起了人们的关注。AMC不仅可以优化FLOP和模型大小,还可以优化推理延迟,直接使移动开发人员受益。对于所有的移动推理实验,我们使用TensorFlow Lite框架进行计时评估。

        我们修剪MobileNet-V1[23],这是一个由深度卷积和逐点卷积层组成的高度紧凑的网络,并测量我们可以在多大程度上提高其推理速度。之前使用手工策略修剪MobileNet-V1的尝试导致了显著的精度下降[31]:将MobileNet-V1修剪到75.5%的原始参数会导致67.2%的前1精度⋆,这甚至比原始的0.75 MobileNet-1更差(61.9%的参数,68.4%的前1准确性)。然而,我们的AMC修剪策略显著提高了修剪质量:在ImageNet上,AMC修剪的MobileNet-V1以285 MFLOP获得了70.5%的Top1准确率,而最初的0.75 MobileNet-V1以325 MFLOP达到了68.4%的Top-1准确率。如图5a所示,在减少2×FLOP的情况下,人类专家手工制定的策略的性能略低于原始MobileNet-V1。然而,使用AMC,我们显著提高了帕累托曲线,改善了原始MobileNet-V1的准确性MACs权衡。

 

通过将FLOP替换为延迟,我们可以从FLOP约束搜索转换为延迟约束搜索,并直接优化推理时间。我们的实验平台是搭载高通骁龙821 SoC的谷歌Pixel 1。如图5b所示,在相同精度下,我们大大减少了MobileNet-V1的推断时间。我们还比较了基于学习的策略和基于启发式的策略[52],AMC更好地权衡了准确性和延迟。此外,由于AMC使用微调之前的验证精度作为奖励信号,而[52]需要在每个步骤之后进行局部微调,因此AMC采样效率更高,需要更少的GPU时间进行策略搜索。

        我们在表4中显示了修剪模型的详细统计信息。用0.5×FLOP和0.5×推断时间搜索的模型被分析和显示。对于0.5×FLOP设置,我们在Google Pixel 1手机上实现了1.81×加速,而对于0.5×flop设置,我们精确地实现了1.95×加速,这非常接近实际的2×目标,表明AMC可以直接优化推断时间并实现准确的加速比。对于1×1卷积,我们实现了2.01倍的速度,但是对于深度卷积,由于计算通信比小,所以速度不太明显。AMC压缩模型也消耗更少的内存。在GPU上,我们还实现了高达1.5倍的加速,低于手机,这是因为GPU比手机具有更高的并行度。

泛化能力。我们评估了AMC在PASCAL VOC对象检测任务上的泛化能力[13]。我们使用压缩的VGG-16(来自第4.2节)作为Faster R-CNN的主干[43]。在表5中,在相同的压缩比下,AMC的mAP[0.5,0.95]比最好的手工修剪方法好0.7%。AMC甚至超过基线0.5%mAP。我们假设这种改进是因为RL代理发现的最优压缩策略也可以作为有效的正则化。 

 

 

5 结论

传统的模型压缩技术使用手工制作的特征,需要领域专家探索大的设计空间,并在模型大小、速度和精度之间进行权衡,这通常是次优的,并且耗费人力。在本文中,我们提出了用于模型压缩的AutoML(AMC),它利用强化学习来自动搜索设计空间,大大提高了模型压缩质量。我们还设计了两种新的奖励方案来执行资源受限压缩和精度保证压缩。Cifar和ImageNet上的MobileNet-V1、MobileNet-V2、ResNet和VGG已显示出令人信服的结果。该压缩模型从分类到检测任务具有很好的通用性。在谷歌Pixel 1手机上,我们将MobileNet-V1的推理速度从8.1 fps提高到16.0 fps。AMC有助于移动设备上高效的深度神经网络设计。


http://www.ngui.cc/article/show-862318.html

相关文章

carcard_3- c++的优势和现状以及未来发展(明白为什么用cpp)

文章目录initsummary适用领域优劣点C 语言认知各种语言底层的理解可以从事的岗位和要求的技术栈过去,现在和未来的发展趋势init summary 主要是对比了各种其他语言,明确了C在编译器上和底层内存模型的优势上建立了高性能低延时领域的绝对优势,但是在底…

Unity模型页签之Rig

Animation Type 动画类型 None 不存在动画 主要用于一些环境静态模型 Legacy 旧版动画类型 与Unity3.x及更早版本导入和使用动画 一般不使用 Generation:动画导入方法 Don’t Import:不导入动画 第2~4个选项:已禁用,勿使用 …

代码随想录算法训练营第59天|503.下一个更大元素II,42. 接雨水

503.下一个更大元素II 力扣题目链接 思路 单调栈循环数组 代码 class Solution { public:vector<int> nextGreaterElements(vector<int>& nums) {vector<int> res(nums.size(),-1);int count0;stack<int> st;for(int i0;i<nums.size()*2;i…

PAT——1084 外观数列

外观数列是指具有以下特点的整数序列&#xff1a; d, d1, d111, d113, d11231, d112213111, ...它从不等于 1 的数字 d 开始&#xff0c;序列的第 n1 项是对第 n 项的描述。比如第 2 项表示第 1 项有 1 个 d&#xff0c;所以就是 d1&#xff1b;第 2 项是 1 个 d&#xff08;对…

C++类与对象(上)

✅<1>主页&#xff1a;我的代码爱吃辣 &#x1f4c3;<2>知识讲解&#xff1a;C &#x1f525;<3>创作者&#xff1a;我的代码爱吃辣 ☂️<4>开发环境&#xff1a;Visual Studio 2022 &#x1f4ac;<5>前言&#xff1a;C的面向对象程序设计思想&a…

反向传播与梯度下降详解

一&#xff0c;前向传播与反向传播 1.1&#xff0c;神经网络训练过程 神经网络训练过程是&#xff1a; 先通过随机参数“猜“一个结果&#xff08;模型前向传播过程&#xff09;&#xff0c;这里称为预测结果 aaa&#xff1b;然后计算 aaa 与样本标签值 yyy 的差距&#xff…

从零开始的数模(十三)主成分分析

目录 一、概念 1.1线代知识补充 1.3主成分的命名与解释 1.4原理 1.5应用 ​编辑 二、基于python的主成分分析 2.1主要步骤 2.2.部分说明 2.3代码 完整代码 完整代码2 三、基于MATLAB的主成分分析 3.1算法步骤 ​编辑 3.2代码 完整代码 一、概念 1.1线代知识补充 …

python 两种方式,自动生成 requirements.txt 文件,再也不需要手动安装依赖了

本文收录于 GithubAndroidGuide&#xff0c;徐公&#xff0c;6 年大厂经验 前言 有一定 python 基础的人可能都知道&#xff0c;requirements.txt 文件是用来描述当前 python 项目所需要的依赖。 在工作当中&#xff0c;我们经常需要在不同的电脑运行 python 项目&#xff0c…

SQLite学习手册(一)

一、获取表的Schema信息&#xff1a; 1). 动态创建表。 2). 根据sqlite3提供的API&#xff0c;获取表字段的信息&#xff0c;如字段数量以及每个字段的类型。 3). 删除该表。 见以下代码及关键性注释&#xff1a; #include <sqlite3.h>#include <string&…

DPDK开发之KNI与内核交互的代码实现

KNI与内核交互的代码实现背景环境配置代码实现编译和执行总结背景 DPDK接管NIC之后&#xff0c;网卡接收到的网络数据都交由DPDK处理&#xff0c;但在开发过程中&#xff0c;我们可能只关注其中某一个协议&#xff0c;而其他协议并不需要我们处理&#xff1b;DPDK提供了KNI模块…