image.png
论文地址:https://readpaper.com/pdf-annotate/note?pdfId=4660377700486103041&noteId=1566835976877181440

Abstract

我们考虑了一个问题,在具有挑战性的训练后中深度神经网络(dnn)的模型压缩问题,在这种情况下,我们得到了一个精确的训练模型,并且必须在没有任何再训练的情况下压缩它,仅基于少量的校准输入数据。这个问题已经变得流行起来,因为新兴的软件和硬件支持运行通过剪枝或者量化而压缩的模型,并且已经针对这两种压缩方法分别提出了性能良好的解决方案。在本文中,我们介绍了一种新的压缩框架,它在统一的设置中涵盖了权重修剪和量化,是时间和空间高效的,并大大提高了现有训练后方法的实际性能。在技术层面上,我们的方法是基于现代dnn规模上的经典Optimal Brain Surgeon(OBS)框架的第一个精确和有效的实现,我们进一步扩展到涵盖重量量化。这是由一系列可能具有独立利益的算法发展实现的。从实践的角度来看,我们的实验结果表明,它可以显著提高现有训练后方法的压缩精度权衡,甚至可以在训练后设置中实现剪枝和量化的准确联合应用。
我们考虑了在具有挑战性的后训练环境中深度神经网络(DNN)的模型压缩问题,在这种情况下,我们得到了一个精确的训练模型,并且必须仅基于少量校准输入数据,在不进行任何再训练的情况下对其进行压缩。考虑到新出现的软件和硬件支持执行通过修剪和/或量化加速模型的压缩,这个问题变得很普遍,并且针对这两种压缩方法分别提出了性能良好的解决方案。在本文中,我们介绍了一种新的压缩框架,它在统一的设置中包含权重修剪和量化,具有时间和空间效率,并大大改进了现有后训练方法的实际性能。在技术层面上,我们的方法是基于在现代DNN规模下首次准确有效地实现经典的最优脑外科医生(OBS)框架[LeCun,Denker,and Solla,1990],我们进一步扩展到权重量化。这是通过一系列可能具有独立兴趣的算法开发实现的。从实际角度来看,我们的实验结果表明,它可以显著改善现有后训练方法的压缩精度权衡,甚至可以在后训练环境中实现剪枝和量化的精确联合应用。

Introduction

最近,深度学习在解决多个领域具有挑战性的任务方面取得了令人印象深刻的进展,同时,执行此类模型的参数数量和计算成本也显著增加。一个自然的结果是,越来越多的人努力通过模型压缩来降低这种成本,而模型压缩的两种最流行的方法是修剪-通过将神经网络权重设置为零和量化来去除神经网络权数以百计的这种剪枝和量化方法已经被提出和分析,总的目标是获得有效的深层神经网络(DNN),在最大化压缩的同时保持精度。重,降低神经网络权重和激活存储和操作的精度。尽管取得了令人印象深刻的进展,但压缩仍然是一个费力的过程,因为剪枝和量化阶段通常是独立完成的,并且在压缩后恢复模型精度通常需要对压缩模型进行部分甚至全部重新训练。
相比之下,另一种但具有挑战性的场景是训练后的压缩设置 [31, 24, 19 , 25],其中我们给出了训练和未压缩的模型,以及非常少的校准数据,并且必须一次性生成准确的压缩模型,即单个压缩步骤,无需任何额外的重新训练。这就是我们在本文中关注的设置。
通过权重修剪进行压缩始于 LeCun 等人的开创性工作。 [ 23 ],辅以 Hassib 和 Stork [ 13 ],他们提出了一个称为最佳大脑手术 (OBS) 的数学框架,用于选择一组权重以通过利用二阶信息从经过训练的神经网络中删除。最近的进展,例如[6,39,38,10]表明OBS修剪框架的变体可以扩展到现代dnn。这种方法的变体在逐步修剪 CNN 甚至更大的语言模型方面实现了最先进的准确性。然而,这些方法并没有应用于训练后设置,因为它们需要逐步修剪和再训练,以恢复良好的准确性。在训练后压缩的背景下的标准是将任务分解为分层子问题,本质上为每一层找到一个压缩的权重近似,给定层输入和输出的子样本,从校准数据。这种方法几乎在整个一次性训练后量化工作线采用,例如 [41, 31, 19],然后为生成的逐层权重量化问题引入优雅的求解器。最近,AdaPrune [18] 表明这种方法对于训练后权重修剪也很有效。在这种情况下,一个自然的问题是,现有的剪枝和量化方法是否可以统一,以便在训练后设置中覆盖这两种类型的压缩,从而使 DNN 压缩更简单,有望更准确。这个问题也具有实际意义,因为 GPU 和 CPU 平台现在都共同支持稀疏和量化的格式 [30, 35],正如我们通过实验说明的那样,生成的模型可以通过复合加速执行。

contribution

在本文中,我们通过修剪或量化为压缩提供了一个数学框架,从而在具有挑战性的训练后压缩设置中导致最先进的准确性与压缩权衡。我们的框架从上面描述的分层压缩问题开始,根据校准数据上的层行为,首先将全局压缩任务(定义为修剪或量化)划分为分层子问题。具体来说,给定一个由权重 image.png和层输入 image.png定义的层 image.png,我们的目标是找到权重 image.png的压缩版本,该版本相对于未压缩层的输出差异最小,通过原始层和压缩层之间的平方误差测量,作用于样本输入 image.png,在image.png的固定压缩约束下。尽管针对稀疏或量化约束的最佳解决这个问题是 NP-hard [ 2, 31],但它是修剪 [18, 9] 和量化 [31, 18, 24 ] 的所有最先进的训练后压缩方法中的关键步骤。一旦在每一层得到解决,就可以通过组合逐层解决方案来获得全局问题的解决方案,这对于非均匀压缩很方便,例如 [15, 9]。因此,已经提出了几种解决这个问题的近似[31,19,18]。
我们表明,在解决逐层压缩问题时仍有显着的改进空间。粗略地说,我们的方法是将 OBS 框架专门用于上述平方误差公式:在这种情况下,该框架理论上可以产生精确的贪心解决方案,但直接实现方式有着不可行的 image.png计算成本(其中 d 是层维度)。我们的主要技术贡献是一系列算法,在没有任何近似值的情况下将这种计算成本降低到 image.png(其中 image.png是权重矩阵的列维度)。在实践中,这些改进足以使我们能够实现精确的 OBS 贪心 解决方案,该解决方案一次修剪一个权重,并在每个步骤之后更新所有剩余的权重,在合理的时间内,在单个 GPU 上,在具有数亿个参数的现代 DNN 的规模中。我们计划在未来发布我们算法的高效 PyTorch 实现。反过来,这种算法实施使我们能够将 OBS 方法应用于量化。最终的算法称为最佳脑量化器 (OBQ),一次迭代地量化权重,这取决于它们对损失增加的影响,之后它对剩余的未量化权重应用封闭形式更新,进一步减少损失。这有效地解决了这两个问题,并以统一的方式——我们将统一框架称为最佳脑压缩器 (OBC)。

Experimental Results

我们将OBC应用于标准任务和模型,包括图像分类、对象检测和语言建模应用程序。我们首先展示了我们的框架对分层压缩问题产生了显著更好的解决方案,相对于相应的最先进技术,这导致了用于修剪和量化的更高精度的端到端压缩模型,通常具有显著的优势。其次,我们展示了我们的修剪和量化方法可以混合使用,并获得了令人惊讶的强大结果:我们在理论操作中获得了12×reduction,对于gpu支持的复合压缩[30],精度下降了2%;对于基于cpu的运行时,实际运行时加速了4倍,精度仅下降了1%,同时支持稀疏性和量化[35]。这些结果首次表明,训练后压缩在精确度-加速权衡方面可以与完全再训练竞争.

Related Work

Optimal Brain Surgeon(OBS)

最佳脑外科医生
经典的OBS框架[23,13]于90年代首次提出,最初应用于数百个权重的网络。最近,WoodFisher[38]等方法通过使用Hessian的块对角线Fisher近似,使该方法在dnn计算上可行,而后续的M-FAC[10]方法引入了更有效和通用的算法来处理逆Fisher矩阵。最近的工作[21]将这种方法扩展到修剪权重组和大型语言模型(llm),并为此提出了一个显著改进的实现。
早期的工作,称为分层 OBS (L-OBS) [6],受到 K-FAC 近似 [29, 12] 的启发,并近似于 OBS 框架,而不是全局目标,但对于二次每层损失,同时还基于单个 Hessian 计算修剪所有权重。从较高的层面来讲,我们的方法是类似的,因为我们分层应用OBS;但是,我们应用OBS很精确,即一次修剪一个权重,并在每个修剪步骤后精确地重新计算剩余权重的Hessian。通过一些新的算法思想,这使得计算易于处理,并产生了相对于L-OBS的显著改进结果。所有这些先前关于通过二阶近似修剪的工作都考虑了广泛的微调设置。相比之下,我们将关注训练后的设置,其中只有少量的校准数据可用。

总结

从较高层面——

Post-Training Quantization

此设置主要被考虑用于量化,大多数最先进的方法通过执行逐层压缩来工作。具体来说,BitSplit [6] 按位优化量化权重,而 AdRound [ 31] 通过使用退火惩罚项通过基于梯度的优化来找到权重舍入策略,该惩罚项鼓励权重朝着量化网格上的点移动。AdaQuant [ 19 ] 放宽了 AdRound 约束,允许权重通过直通近似在量化感知优化期间发生变化 (5)。BRECQ [24] 建议通过将二阶信息集成到分层损失中并通过联合优化相关层的手工特征块来进一步提高准确性。AdaRound、AdaQuant和BRECQ的一个关键步骤是按顺序递增地量化层,这样早期层积累的误差就可以通过后期层的权重调整来补偿。这极大地提高了性能,但降低了灵活性,因为每当我们希望改变一个层的压缩参数时,整个过程可能需要重新进行。相反,我们针对每一层的独立压缩,允许最终模型简单地从分层结果“缝合”在一起。尽管在每一层独立运行,但我们发现,在校正 batchnorm 等基本统计数据后,我们的方法在统一量化方面的表现与顺序统计数据相当。

Post-Training Sparsification

分层方法也被证明对 AdaPrune [18] 进行训练后修剪是有效的,它将权重修剪到 GPU 支持的 N:M 模式。AdaPrune首先根据参数的大小[45]丢弃参数,然后重新优化剩余的权重来重建预压缩校准集输出。这类似于 [16, 8],它也对剩余的权重执行逐层重新优化。后续工作[10]指出,通过执行更频繁的修剪/优化步骤,可以进一步提高AdaPrune的结果。我们的算法将这个想法推向极限,在每个修剪的权重之后执行完全重新优化,同时保持计算上易于处理。我们进一步使用了一个更复杂的权重选择度量,它结合了二阶信息。最后,[10]还引入了全局AdaPrune,这是一种更昂贵的全局优化步骤,应用于分层AdaPrune结果之上,可以带来额外的精度增益。这也可以应用于我们的修剪模型。

Non-Uniform Compression

非均匀压缩
一个正交的实际问题是如何压缩不同的层以最大化给定资源约束(例如延迟或能量消耗)下的准确性。现有的方法可以大致分为基于搜索的方法和基于求解器的方法。前者,例如 AMC [ 15 ] 或 HEQ [ 40 ],通过例如强化学习或遗传编程 [42 ] 直接搜索分层压缩策略,而后者,例如 HAWQv3 [ 43 ] 或 AdaQuant [ ],构建一个整体问题的宽松版本,然后准确解决。我们在这里专注于基于求解器的方法,因为当结合准确的独立分层压缩方案时,它们可以快速适应不同的场景;然而,我们的技术也可能对基于搜索的方法感兴趣。具体来说,我们使用 AdaQuant [ 19 ] 的问题公式,我们应用 SBDY [10] 的 DP 算法来实现快速求解时间,即使每层有大量可能的选择。

Problem Definition and Background

The Layerwise Compression Problem

分层压缩问题
每一层都有一个激活函数image.pngimage.png代表每一层,image.png是每一层的输入,image.png是每一层的权重
逐层压缩的目标:找到一个image.png的压缩版本,尽可能与原始权重有相似的执行效果。
或者说:
压缩权重应该最小化预期的层输出变化,(这些变化由一些损失image.png衡量,同时满足一定的压缩约束,约束可以通用的指定image.png但是这将根据压缩类型进行定制)

image.png

层输入image.png的期望通常通过取一小组 N 个输入样本的平均值来近似。
这种低数据设置是分层压缩的主要应用之一。此外,大多数工作[41,31,19]集中压缩线性层和卷积层,这些层可以展开成线性层,因为这些在实践中很普遍,而且使用平方损失来测量近似误差。损失的定义可以从二阶信息中通过一系列近似得到:请参阅[31]以获得精确的推导。此外,这种近似方法已被证明在许多应用中工作良好[31,19,9]。

我们的工作也是如此
image.png
image.png(例如卷积层 image.png对应单个过滤器中的权重的数量)
image.png

The Optimal Brain Surgeon (OBS) Framework.

OBS框架[23,13]考虑了精确修剪训练过的密集神经网络的问题。它从给定点的泰勒近似开始(假设梯度可以忽略不计),并为要删除的最佳单个权重提供明确的公式,以及补偿删除的剩余权重的最佳更新。更准确地说,设H表示给定(密集)模型的损失的Hessian矩阵。
image.png
image.png:逆Hessian的第p个对角线项
image.png:它的第p列

OBS for Layer-Wise Pruning.

我们现在将为上面定义的逐层修剪问题实例化这个框架。
首先,等式 (2) 中的损失是二次的,由于我们的起点由密集权重给出,实现了 0 的最小损失,因此完全满足 OBS 框架的假设,这意味着它的公式对于这个特定的问题公式是准确的不理解。因此,迭代 OBS 框架一次删除一个权重将为逐层修剪问题产生精确的贪心解决方案,因为它在每一步采用(局部)最佳决策。虽然这种贪心方法不能保证收敛到全局最优,但这种方法对于处理太大而无法由精确方法处理的问题实例非常有效。

An Optimal Greedy Solver for Sparsity

稀疏性的最佳贪婪求解器
显而易见的挑战是应用OBS框架的真实形式,即使用(3)中的精确公式一次修剪单个权重,在计算上要求很高。
Hessian H是一个d × d矩阵,其中image.png,它的存储和计算成本已经很高。此外,这个矩阵需要在每个image.png步进行更新和倒置,计算复杂度为image.png。显然,image.png总运行时间对于修剪现代神经网络的大多数层来说太低效了,因为d通常≥image.png,甚至对几个层≥106。然而,正如我们现在将展示的那样,实际上可以将这个过程的总体成本降低到image.png时间和image.png内存,使其足够有效,例如,在单个NVIDIA RTX 3090 GPU上,在一个小时多一点的时间内修剪一个中型模型(如ResNet50)的所有层.我们强调我们所介绍的技术是精确的;与以前的工作[6,38]不同,我们不依赖任何近似值。

The ExactOBS Algorithm

首先,我们将(2)中的矩阵平方误差重写为权重矩阵中每一行的平方误差之和。因为我们总是在处理一个固定的层,所以我们去掉了下标,以简化符号。
image.png
这种损失书写的方式清楚地表明,删除单个权重image.png只影响对应的输出行image.png的损失。
因此,不同行之间不存在黑森交互,并且也因此仅使用与每个行相对应的单个image.png Hessian 就足够了。此外,由于密集层输出 Y = WX 是固定的,每行的目标具有标准最小二乘法形式,其 Hessian 由 image.png给出不理解。
尽管这一观察结果已经降低了计算复杂度,但仍然存在两个关键挑战:

  1. 将 OBS 应用于每一行仍然花费 image.png时间,这对于一些大层来说太慢了
  2. 我们需要快速访问所有 image.png 行的 Hessian 逆,因为我们希望修剪整个矩阵的最小分数权重,而不仅仅是每一步的每一行。( 需要 image.png 内存,这可能是不可行的)
Step1:Handling a Single Row(处理一行)

我们首先描述如何使用image.pngparameters有效地从单行删除权重。为了简单起见,我们用w和对应的黑森H来表示这样一行。
image.png
(在总时间image.png剪去k个权重从w中,根据OBS应用,使用海森矩阵的逆image.png。讲索引保存到M中,进行k个循环,即减去k个索引,此处海森矩阵、海森矩阵的逆是已知的,)
关键思想是避免在每一步中对H进行完整的Θ(N·d2col)计算和Θ(d3col)反转。前者比较简单,权重本身不会参与image.png的计算。因此,image.png(表示Hessian矩阵,该矩阵带有修剪掩码M的权重)表示Hessian矩阵简单地由全密集型版本H中相应的行和列组成。因此,我们只需要计算一次H(实际上对所有行都是一样的),然后我们可以根据需要提取与M对应的行和列。
关键的是,这个技巧不适用于逆,因为image.png
然而,利用删除一个参数p只是从H中删除相应的行和列这一事实,我们实际上可以更新逆函数来直接删除参数p,使用高斯消去的单一步骤,代价为Θ(d2col)。下面的结果,其证明在附录中,形式化了这一点。

公式一:

image.png
给一个可逆矩阵image.png,要有效计算出image.png的逆矩阵。这对应于在H−1中对p行和p列进行高斯消去,然后完全删除它们。这具有image.png时间复杂度
(H的逆矩阵,其中p行与p列被删除,通过image.png来代表)
得到的伪代码显示在算法1中,其中我们避免不断地调整H−1的大小(并相应地改变索引),利用这样一个事实,即行和列p在被引理1消除后对任何未来的计算都没有影响,因为它们是0(并且不再访问非零对角线元素)。
可以检查该算法将OBS应用于W的单行,每步成本为image.png,因此image.png修剪k个权重的总时间。

Step 2: Jointly Considering All Rows.联合考虑所有行

将OBS框架应用于整个权重矩阵W,而不仅仅是独立地应用于每一行,需要快速访问所有drow维度以行为主逆Hessians,以便在每一步中选择整体修剪得分最小的权重。然而,在GPU内存中存储大小为dcol × dcol的drow矩阵可能过于昂贵;虽然可以将一些hessian卸载到主存中,但这可能会导致大量昂贵的内存传输。但是,由于行之间没有Hessian相互作用,因此每行的最终压缩权值仅取决于其中修剪的参数总数。类似地,修剪某些权重所引起的损失变化仅取决于同一行中先前修剪的权重,这也意味着每行中修剪权重的顺序是固定的。

这些见解的结果是,我们可以独立地处理每一行,按顺序修剪所有权重,同时始终记录损失image.png的相应变化。最后,我们知道所有d权重的δLp,然后可以简单地确定OBS在完整矩阵上选择的全局掩码,方法是按顺序选择具有最低值的权重,只需要Θ(d)额外的内存。
我们注意到一旦每一行的掩码image.png已知,我们可以通过相应的组OBS公式image.pngimage.png表示除以外的所有索引)直接求解剩余权重的最优更新。在实践中,这将比简单地重新运行算法1中的迭代修剪过程快得多。或者,如果有足够的CPU内存可用,可以在CPU内存中保留每一行的完整修剪轨迹,即每个单独修剪步骤之后的完整权重向量,最终只需重新加载与全局掩码对应的条目。这需要O(drow·d2col)额外的CPU内存,但避免了第二次计算来重建未修剪的权重,因此会更快。
image.png
(初步理解该图:给一个密集权重矩阵,针对每一行的权重进行三步操作,每一步修剪一个权重从而计算一个损失变化,最后得到全局掩码,通过全局掩码得到修建后的权重矩阵。如果想要更少的计算,需要保存Pruning Traces得到的矩阵,即加载保存到trace elements,如果内存有限就需要从头开始处理没有修剪的矩阵)

Implementation Details 实现细节

在实践中,矩阵H可能不总是可逆的,比如以下原因:1. 使用了太少的数据样本 2. 使用了失效/线性相关输入
前者通常可以通过使用扩充来扩展校准数据集来解决(额外的扩充样本只需要累积到海森中一次,因此包含起来非常简单),而后者可以通过在对海森中进行反转之前向海森中添加一个小的对角阻尼项来防止。
其次,对算法1的一个直接GPU应用讲执行大量小的CUDA调用,这个代价是很大的。这种开销可以通过使用批处理操作同时处理多个矩阵行来消除。
最后,当应用一个已经稀疏化的权重矩阵时,算法的复杂度可以与行密度成立方的比例,通过使用非零元素组成的权重/Hessians的密集版本,并在最后将修建结果映射回去。

N:M Sparsity

我们的方法可以很容易扩展到各种半结构稀疏化的形式。这包括N:M稀疏模式,它在M个连续权重的每个块中强制执行N个非零值,并且由于在较新的NVIDIA硬件上的支持而变得越来越流行。使我们的算法适应这种模式只需要一个简单的改变:我们不选择损失变化最小的权重(指的是不选择损失变化最小的权重去剪掉,一般损失变化最小的权重应该剪掉,因为这个对损失变化不怎么影响),而是选择在一个< N个修剪权重的块中损失变化最小的权重。我们注意到,在N:M模式中,所有行都具有完全相同的稀疏度1−N/M,因此我们可以在达到这个目标稀疏值后立即终止逐行修剪。出于同样的原因,不需要前面描述的全局掩码选择步骤。因此,我们的方法在这种情况下会更有效。

稀疏度

1-N/M :表示M个连续权重中,零值的概率,表示稀疏度。稀疏度越大,零值越多。

什么是N:M

reference:https://zhuanlan.zhihu.com/p/409316754
所谓的N:M稀疏,指的是每M个连续的权重中,最多只有N个非零值。
该约束表示为:
v2-f3aafaa1389d0fe6fe2c4d722d565b35_b.jpg
其中 ξ 是第N个最大的权重。

Block-Sparsity

另一种实际相关的修剪模式,特别是在CPU加速上下文中,is block-pruning,0只出现在大小为c的连续块中,通常是4或8这样的小数字。我们遵循最近的工作[21],它扩展了OBS框架,以修剪小组的连接权重,以解释它们之间的相关性,分别使用以下公式对目标块和权重更新
image.png
P——对应于一个块的索引集
算法1可以很容易地适用于使用上述方程的块,并对所有p∈p依次通过引理1对H−1进行更新。
尽管现在每一行仅仅有image.png步,每一个对image.png的更新也花费image.png的时间,并且所以总体的渐近运行时间保持不变。额外的实际开销仅仅来自于额外的image.png项,是c × c矩阵image.png计算和相乘的结果。

The Optimal Brain Quantizer (OBQ)

虽然经典的OBS框架[23,13]启发了一长串dnn修剪方法的工作[38,10,27],但到目前为止,它还没有用于量化。我们现在证明,通过一种我们称之为最佳大脑量化器(OBQ)的新方法,我们上一节的结果实际上可以以一种有效而准确的方式扩展到量化。

The Quantization Order and Update Derivations.

量化顺序和更新推导
在当前点 w 的梯度可以忽略不计的标准假设下,要修剪的最佳权重的 OBS 公式和相应的更新 δp 可以通过在 δp 的元素 p 等于 -wp 的约束下写入局部二次问题来导出,这意味着在应用更新 w 之后 wp 为零。这个问题有以下拉格朗日不理解
image.png
H表示w处的Hessian矩阵
ep 是第 p 个规范基向量
然后通过首先将导数∂L/∂δp设置为零,然后将这个解代入L,求解λ,得到最优解

假设有这样一种设置,我们希望在宽度为∆的固定网络上量化一层中的权重,同时最小化损失。为了将OBS映射到量化投影,我们可以将(6)中的拉格朗日约束的目标设置为(quant(wp)−wp),其中quant(wp)是量化给出的权重舍入;更新后,wp = quant(wp)。假设我们希望迭代量化权重,一次一个,我们可以推导出“最优”权重的公式,以使损失增加最小化,并以类似于上面讨论的方式对未量化的权重进行相应的最优更新:
image.png
事实上,由于−wp在所有推导过程中都是常数,所以我们可以在最终结果中用(quant(wp)−wp)代替它。我们注意到,得到的公式是用于修剪的标准OBS的推广,如果quant(·)总是将权重“量化”为0,那么我们恢复原始形式

Quantizing Full Layers.

乍一看,OBQ可能看起来很奇怪,因为人们通常会量化一个层中的所有权重。同时,权重选择度量只影响量化顺序,而不影响量化值。但是,在前一节中描述的高效的一次权重修剪算法的上下文中考虑OBQ时,这种观点会发生变化。具体来说,使用OBQ,我们可以贪婪地用上面的度量量化当前“最简单”的权重,然后调整所有剩余的未量化权重来补偿精度的损失,从而改变它们的值。然后我们选择下一个要量化的权重,依此类推。这可能导致量化赋值不同于最初通过舍入选择的赋值,并产生更好的整体量化结果。具体来说,为了实现这一点,我们可以将(7)代入算法1中,对给定层的权重进行迭代量化,从而得到附录中类似的算法,从而在本质上统一了修剪和量化。

Quantization Outliers.量化离群值

这种贪婪方案的一个实际问题可能会发生,特别是当应用于允许一些异常值的量化网格时,以便在大多数权重上实现较低的误差,这是目前的标准。由于这些异常值可能有很高的量化误差,当只有少数其他可用的未量化权重可以调整以补偿量化异常值所引起的大误差时,它们通常是最后量化的。当中间更新将一些权重推到网格之外时,这种影响会变得更糟。我们用一个简单但有效的启发式方法来防止这种情况:我们量化异常值(权重)当异常值出现时,当量化误差为>∆/2时说明异常值出现,(其中∆是量化值之间的距离),那么就量化异常值(比如权重异常值)(通常每层只发生几次)。使用这种启发式方法,OBQ产生了一个非常有效的分层量化方案,正如我们在下一节的实验中所演示的那样。最后,我们注意到第4节中讨论的技术的OBQ版本具有所有相同的运行时和内存特征(排除图1中的全局步骤,这对于量化是不必要的)。

Experiments

Objectives, Models & Datasets.

为了证明我们方法的有效性和灵活性,我们考虑了几个不同的标准训练后压缩场景。我们从只应用单一类型压缩的设置开始:具体地说,我们考虑对给定的FLOP目标进行非结构化修剪,全局2:4和4:8修剪,以及均匀权重量化。此外,我们还研究了两个以联合剪枝和量化为特征的实际任务:将量化和N:M剪枝结合在一起的GPU场景,以及将量化和块剪枝结合在一起的CPU场景。我们使用以下模型和任务的变体:ResNet[14]用于Imagenet[37]上的图像分类,YOLOv5[20]用于COCO[26]上的对象检测,BERT[5]用于SQuAD[36]上的问题回答。我们用BERT3和BERT6表示的较小BERT模型分别对应于由[21]训练的BERT-base的较小的3层和6层变体。附录包含附加的实验以及我们算法的运行时信息。

Experimental Setup

我们所有的校准数据集由1024个随机训练样本组成。对于ImageNet,我们使用大约0.1%的训练数据,我们额外应用标准翻转和裁剪增强来人为地将数据集的大小增加10倍;其他任务不使用任何扩充。虽然增强的效果通常很小,但对于我们的方法来说,它们是非常便宜的。对于resnet模型来说,批标准化数据使用128个例子100个batches来重置,这些数据来自带有标准增强的校准集。对于其他模型,我们在所有的归一化层后应用均值和方差在单一batch有着128size for YOLO and 512 for BERT(因此校正参数可以很容易地合并,没有额外从成本)。我们发现这对于YOLO来说比批标准化调优来说更有效,BERT模型没有batchnorm 层。
当压缩到给定的FLOP或时间约束时,我们需要解决识别每层压缩目标的问题,这些目标与约束匹配,同时最大限度提高精度。为了去识别这些非均匀目标,我们遵循[10]的方法:首先收集一个”模型数据库“,其中包含每个压缩级别(例如位宽或稀疏度设置)对应每个层的压缩版本。为了构建一个稀疏和量化的联合数据库,我们简单地先对层进行稀疏化,然后对剩余权重应用量化。接下来类似于[19],我们计算所有压缩级别的分层校准损失,对应于仅将一层压缩到特定级别模型。然后,给定分层FLOP或时序信息,我们建立AdaQuant[19]中描述的形式的约束分层压缩问题,并用SPDY[10]的动态规划算法求解。这将返回压缩级别的最佳每层分配,然后我们可以通过两步过程轻松生成相应的模型:首先从数据库中将相应压缩级别的层拼接在一起,然后进行讨的统计修正以恢复一些额外的精度。

Unstructured Sparsit

我们使用非结构化稀疏来开始我们的实验,和全局剪枝GMP相比,近似分层OBS方法L-OBS,和训练后剪枝最先进的方法AdaPrune,作为完整性检查,我们在图1中检查了我们的方法是否在分层平方误差方面提供了更好的结果,将ResNet18模型的第一层修剪为几个稀疏度。在这个指标中,Exact OBS表现最好,远远领先于AdaPrune,后者的表现明显优于其他两种方法。
image.png
[在图一中将ResNet18模型第一层修剪为几个稀疏度,检查在分层平方误差方面是否有好的结果,可以看到ExactOBS表现最好,远远领先于AdaPrune]
image.png
在该表中,我们将注意力转向修剪各个模型以达到一个给定的2-4倍的FLOP降低的实际问题,这个应用了上述提到的the per-layer target sparsity optimization technique技术。我们的ExactOBS通常表现最好,(除了YOLOv5l 2×,其中所有方法在mAP@0.5方面的性能相似)并且在4倍FLOP reduction方面与次优方法甚至有大于1%的差距。有趣的是,在难以修剪的BERT模型中,Exact OBS似乎是在更高的减少目标下仍然产生合理结果的唯一方法。对BERT 3×和4×来说,其中所有的方法的性能下降为>3%,我们额外评估了我们的结果与更强大(但也是更昂贵)后处理方法AdaPrune的兼容性。虽然这种全局优化技术能够恢复失去的精度,但是ExactOBS模型仍然分别保持了 >1% 和 >2.5%的F1优势。
F1值(F-Measure)综合评价指标F-Score,image.png
image.png

N:M Sparsity

我们通过N:M模式研究我们的方法在半结构稀疏性上的性能。具体来说我们比较了ResNet模型上AdaPrune与batchnorm调优的4:8结果
image.png
除第一层和最后一层外的所有层的半结构化N:M修剪(+ batchnorm调优)
和在BERT模型上的2:4结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DEc986bc-1673601367615)(null#averageHue=#f4f2f0&clientId=ua8d3372b-82ec-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=174&id=u7c2f8f49&margin=%5Bobject%200bject%5D&name=image.png&originHeight=217&originWidth=608&originalType=binary&ratio=1&rotation=0&showTitle=false&size=28925&status=done&style=none&taskId=ubfae67eb-7eaf-4b49-a38a-7a209033383&title=&width=486.4)]
半结构化2:4修剪除嵌入外的所有层
我们要强调的是,ExactOBS 与 AdaPrune的4:8结果相当,甚至略高于AdaPrune的4:8结果,而更严格的2:4模式已经得到了NVIDIA硬件的良好支持。
此外,在BERT模型的2:4比较中,ExactOBS的F1分数提高了1-2%。

Quantization

此外,我们将OBQ的独立性能(batchnorm调优后)与最先进的连续后训练方法AdaQuant,AdaRound和BRECQ进行了比较。我们执行所有权重的标准非对称每通道量化,使用了作者的实现。我们在Torchvision ResNets上重新运行所有的方法,以确保统一的基线。OBQ 和 AdaRound的量化网络是用与BRECQ使用的相同LAPQ 程序确定的。我们惊奇的发现,尽管独立地优化了层,OBQ获得了与现有的4位和3位非独立方法非常相似(有时甚至略好)的精度。这表明它很适合混合精度应用,需要去快速生成针对不同约束条件优化的多个非均匀模型。(然而,我们注意到ExactOBS也可以按顺序应用;见附件)

BOP-Constrained Mixed GPU Compression.

我们现在考虑一个实际的设置,我们有一个训练好的模型和一些校准数据,并希望压缩这个模型,以便在NVDIA GPU上进行有效的推理,NVDIA GPU支持8位和4位算法,同时还结合了2:4稀疏性。因此,每层有4种可能的压缩选择:8bit权重+8bit激活(8w8a),4w4a,8w8a+2:4和4w4a+2:4。与前一节不同的是,我们对权重进行了对称的每通道量化,因为它具有更好的硬件支持;激活是被每张量非对称量化。然后,我们为各种BOP(比特数乘以flops)降低目标生成混合精度配置,并将得到的压缩精度权衡曲线可视化在图中。
image.png

  • 总之,相对性能下降约2.5%的代价,我们可以实现ResNets的BOP降低1214倍,更有挑战性的YOLO和BERT模型(相对于可压缩层的计算)的BOP降低了78倍。
  • 与现有最好的独立分层修剪和量化方法组成的基准的附加比较可以在附录中找到。
  • 总之,这些结果表明,单个压缩类型的单个精度增益也转移到关节设置上。
  • (据我们所知,我们是第一个在训练后设置中考虑联合N:M修剪和量化的。最近的工作[3]也研究了ResNet18的联合4w4a + 2:4压缩,但在完整数据集上进行了90次(稀疏)量化感知训练(QAT),并得出了67.33%的准确性。虽然不是完全可比较的(我们保持第一层密集,其密集基线的精度提高了0.94%,并使用4:8的稀疏激活),但我们在4w4a + 2:4的后训练中实现了类似的67.20%的精度,这强调了我们的联合稀疏化和量化方法的有效性。)
BOP

比特数*flops(计算量)

Time-Constrained CPU Compression

最后,我们探索了一个类似的场景,但目标实际CPU执行在12-core Intel Xeon Silver 4214 CPU,DeepSparse推理引擎,它为联合8位量化和块大小为4的块稀疏性提供了加速。在这个例子中,我们使用真正的分层定时数据(for batchsize 64),in [9]。每层有30个可用的块稀疏性目标,在修剪剩余权重的10%的步骤中,所有的这些目标都进一步量化到8位。密集8位模型的基本加速度约为2.7×,其中稀疏加速的作用大致为乘法。图2d显示了ResNet50和几个(实时)加速目标的结果——我们分别以1%和2%的精度损失实现了4倍和5倍(实际)加速。这是在这种设置下的第一个完整的训练后结果([10]的作者只在训练后执行了4个块修剪,然后对整个ImageNet数据集进行了5次QAT),它们显示了非常令人鼓舞的准确性-加速权衡。

Conclusions & Future Work

我们提出了一种新的有效和准确的方法来解决分层压缩问题,并在此基础上获得了最先进的训练后压缩解决方案,用于修剪和量化。我们的框架应该可以自然地扩展到结构化剪枝,这实际上应该允许进一步的优化,并且还应该与通过非结构化剪枝和量化进行的进一步压缩兼容。我们的结果表明,训练后压缩可能能够达到与昂贵得多的再训练方法相当的准确性。我们计划在未来的工作中对此进行研究,特别是在资源密集型模型的环境中,例如非常大规模的语言模型。对于ResNet模型来说,批标准化数据使用100批次的128个样品从带有标准增加的校准集进行重置。

ExactOBS Global Step Pseudocode

more details
image.png

OBQ-ExactOBS Algorithm Pseudocode

image.png

偏差与方差校正步骤

虽然我们应用于YOLO和BERT模型的偏差和方差校正步骤与[32]和[1]中描述的方案类似,但我们现在描述了我们的确切过程,以进一步明确

  1. 从校准数据集中抽取一批样本
  2. 使用dense模型对此batch进行推理,并每一个normalization层后记录该batch中的each channel(for CNNs)/feature(for Transformers)中的平均值image.png和标准偏差image.png
  3. 使用compressed模型对此batch进行推理,并像步骤2那样记录平均值image.png和标准差image.png,同时也对层输出image.png应用均值和方差,进行校正

image.png

  1. 将上式嵌入到各自normalization归一化层中的仿射变换参数中。

note:
第三步中的统计校正是必要的,以便解释复合分布的变化不理解

复合分布

image.png
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rI8TOybZ-1673601367781)(null#averageHue=#faf9f9&clientId=u46979405-79fc-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=129&id=uef65854b&margin=%5Bobject%200bject%5D&name=image.png&originHeight=161&originWidth=1014&originalType=binary&ratio=1&rotation=0&showTitle=false&size=17347&status=done&style=none&taskId=u7227749c-0a66-4fb8-b674-06497137d2a&title=&width=811.2)]
image.png

仿射变换

image.png
reference:
https://blog.csdn.net/u011681952/article/details/98942207

Non-Uniform Sparsity Choices 非均匀稀疏性选择

我们用来确定每一层(unstructured or blocked)稀疏度值以达到某个总体预算有着最小精度损失的方法,需要每一层离散的稀疏度选择集。对于非结构化和阻塞稀疏性,我们遵循[10]并选择一个网格,其中每个点修剪相同的剩余权重δ的分数。
image.png
在这两种情况下,我们选择image.png,这对应于修剪剩余权重的10%。对于非结构化稀疏性,我们生成选项集直到image.png,对于块稀疏性,我们生成选项集直到image.png。我们注意到,选择这些稀疏选项集是为了允许最大的灵活性。然而,在许多情况下,类似的结果可能可以通过更少但更加仔细的选择(例如使用非常高的稀疏性通常永远不会选择较低的FLOP减少目标)选项和更少的数据库存储来实现。

Activation Quantization

在我们以gpu为中心的量化+2:4修剪实验中,我们还量化了所有激活。这是通过简单地优化每层输入的零点和量化scale值来实现的,使用的是与权重完全相同的程序,只是在张量级别而不是在通道级别(同样也是被BRECQ使用的LAPQ程序)。对于每一层,这同样是独立完成的,相应的量化信息存储在模型数据库中,以便快速拼接。对于更高级的方案,比如重新优化权重以更好地匹配量化输入是可能实现的,但是,我们发现刚才描述的简单过程已经工作的很好了。

runtime details

a single NVIDIA RTX 3090 GPU
PyTorch implementations

PTQ Runtime Comparison

对最先进的后训练方法进行运行时比较,将ResNet50的所有层的权重量化为4bits
image.png

  • BRECQ,、AdaRound、OBQ完全量化ResNet50都花费大院一个小时,前两个相对时间少一点,后者相对时间多一点。BitSplit花费大约两倍时间,同时AdaQuant却比之前三种快三倍。
  • 在以下两个表中显示,AdaQuant确实比其他方法低不少的精度。
  • 总之,ExactOBS的运行时间与现有的后训练方法基本一致。额外的优化,比如通过省略 剪枝或量化权重的行/列来定期缩小Hessian,可能会进一步提高实际速度。

image.png
image.png

Different Compression Types

ExactOBS应用于不同类型的压缩问题的运行时。
使用一个较小的模型(YOLOv5s)、一个适中的模型(ResNet50)、一个较大的模型(BERT)
下表列出本文所有压缩类型的相应运行时。
image.png

  • 总体来讲,我们可以看到量化和非结构化剪枝花费大约相同的时间。这与相应的算法非常相似的事实相吻合。
  • 2:4剪枝和量化一个2:4剪枝后的模型仅仅是一半的时间花销。这与他们只是执行了一半的工作相吻合。
  • 对于YOLO和BERT来说,块剪枝是花销最大的剪枝类型因为要处理额外的c × c 的block矩阵从而引起的额外的开销
  • 有趣的是,对于ResNet50来说,情况并非如此,这可能于高度不均匀的计算分布有关。(在下一段详细讨论)
  • 总体来说,这些结果表明,我们的技术对于小型模型是快速的,即使对于像BERT这样的大型模型也是相对高效的,在单个GPU上花费的时间不到2小时。最后,我们注意到ExactOBS本质上是完全可并行的,因此它的运行时间可以随着可用GPU的数量线性扩展。
Per-Layer Runtimes

由于通过ExactOBS实现的OBQ的时间复杂度为image.pngimage.png,即列维的立方,因此整个运行时往往会被几个特别大的层所主导。
例:

  • ResNet50,如图,大约75%的总运行时间花在最后一个块的3×3卷积上(展开时image.png),其中总共有3个。与此同时,大多数层在几秒内被量化。
  • 这意味着,在许多情况下,通过对少数瓶颈层应用更快但不太准确的方法,可以显著降低整体压缩运行时间,同时,通过我们的技术在所有其他层上实现更准确的压缩。

image.png

Multiple AdaPrune Iterations

多重AdaPrune迭代
虽然AdaPrune[18]在一个步骤中就可以确定了所有的权重,但[10]的作者发现,在更小的步骤中迭代这个过程通常可以显著提高性能,同时快速增加计算成本。我们的方法实现了该方案的极限,每个权重只有一个步骤。在本节中,我们将研究OBQ如何在不同数量的剪枝和完全重新优化步骤下与AdaPrune进行比较。
为了这个目的,我们在image.png步应用AdaPrune,将BERT修剪为均匀的75%稀疏性,就像[10]中的那样,所有修剪剩余权重的相同比例。
image.png

  • 我们的结果证实了[10]的发现,多次迭代AdaPrune可以显著改善结果,因为我们看到只需几次这样的“重新计算”,F1下降很快。
  • 然而,即使经过16个完整的迭代,其总体运行时间与ExactOBS相当,(迭代)AdaPrune模型的精度下降仍然比ExactOBS模型大≈70%,清楚地证明了我们方法的好处。

Independent Quantization Comparison

独立量化比较
(在我们主论文的均匀量化实验中(见表4),我们只将OBQ与最先进的顺序方法进行了比较,因为后者通常比独立的方法更准确。然而,为了完整起见,我们现在将OBQ与另外两种用于独立分层量化的方法进行比较:BitSplit[6]和AdaQuant[19])
(里我们考虑对称的每通道量化,因为这是BitSplit设计的量化模式。此外,我们比较了“原始”量化性能,这是在独立压缩后直接进行的,没有任何额外的统计校正。对比结果汇总于表9。)
image.png
正如预期的那样,OBQ在所有考虑的模型和位宽度上明显优于其他两种独立的方法;在3位的精度上有几个百分点的提升,在2位的精度上,它是唯一不会在没有任何统计校正的情况下完全崩溃的方法。

Sequential Quantization with OBQ

基于OBQ的序列量化不理解
虽然我们主要专注于OBC的独立应用,它可以快速拼接各种混合压缩模型,但也可以按顺序应用OBC,以类似的方式应用于最先进的训练后量化工作[31,19,24]。
虽然其他方法通过将密集模型输入Xdense替换为压缩模型Xcomp中的相应输入来简单地执行每层优化,但这对OBQ来说是不够的。
如果Hessian是在Xcomp上计算的,那么初始密度权重不再是局部最小值(梯度为0),因此违反了OBQ的一个关键假设。
幸运的是,这个问题可以通过线性回归image.png的封闭形式解重新优化新输入的密集权重来轻松解决,之后梯度再次为0,OBQ可以正确应用。我们注意到image.png是一个image.png矩阵,可以很容易地在多个批次中积累,类似于OBQ Hessian image.png,而不会增加内存消耗。
作为演示,我们将顺序OBQ应用于将ResNet18量化到各种位宽的任务(与主论文中表4中的设置相同),并在表10中报告结果。
有趣的是,对于4位和3位,结果基本上与独立版本相同(有batchnorm统计校正);只有对于2位设置,似乎有一个明显的好处,赶上了相应的BRECQ结果。对这一现象进行更详细的研究可能是未来工作的一个有趣方向。
image.png

Impact of ImageNet Data Augmentations

ImageNet数据增强的影响
正如在主要提交文本中所描述的,对于ImageNet实验,我们将我们的校准集与标准数据扩充了10倍。主要是为了保证ResNet50的全连通层对应的2048 × 2048 Hessian是满秩的(对于1024张图像则不是这样)和因此避免阻尼常数的超参数调优。另外也可以证明,与我们的方法结合使用增强是廉价的,这不是其他训练方法可以达到的,因为他们需要大量增加的内存(存储更多的激活)或运行时间(在每层优化中对每个批处理执行整个模型的完整推断)
我们现在研究这些增强对结果的影响,为此,在ResNet50的最后一层重新运行OBQ(在表4的设置中没有它们,但使用阻尼λ = 1(相对于Hessian中的值,这实际上是一个相当小的常数)。
数据增强的结果与原始结果比较的结果如下所示:
image.png
可以看出,使用和不使用数据增强之间的差异通常只有≈0.1 ~ 0.2%。但是,与我们的方法一起使用增强是非常便宜的(它们只需要累积到初始的每层Hessians一次),同时在一些情况下避免了阻尼超参数;因此我们在ImageNet实验中使用它们

Sensitivity to Random Seeds

对随机种子的敏感性
对于固定的校准数据集,ExactOBS算法具有确定性。
对于ResNet模型,通过应用于校准数据集的数据增强以及随机抽样批次的批量范数调优添加了少量的额外随机性
对于我们考虑的其他模型,除了校准数据集的初始采样之外,没有额外的随机性。
为了评估我们的方法的结果受这些随机因素的影响程度,我们将ResNet18量化为4bit(每个通道对称),并将ResNet50修剪为2:4模式,分别针对5个不同的种子,并报告表12中的平均标准偏差
image.png
综上所述,结果相对于随机种子的变异一般都很低,在这里< 0.1%,这与其他后期训练方法一致[31,24]。

Compound Compression Comparisons

复合压缩比较
在主要论文中,我们专注于量化和修剪的独立比较,因为现有的方法通常只设计用于单一压缩方法。在本节中,我们还提供了结合稀疏性和量化的GPU和CPU场景的复合比较。特别是,我们通过分别用最佳的独立分层修剪和量化方法AdaPrune和AdaQuant来替代混合设置中的OBC,构建了一个强大的基线。我们现在从图4、5和6的正文中提供了图2的所有实验的详细比较。
总之,正如预期的那样,第6节中实验所显示的单个压缩类型的精度改进也转移到组合设置中。更具体地说,对于主论文中强调的降低的目标范围,即ResNet模型为12−14×,其他模型为7−8×, OBC与AdaPruneQuant基准之间存在一致的0.5−1.5点差距。对于较低的BOP降低/推断时间加速目标,差距通常较小,这是预期的,因为只有较不敏感的层必须压缩到通常非常简单的8位水平。相比之下,对于需要对敏感层进行高压缩的最高目标,差距是最大的,因为这是OBC更精确的分层压缩效果变得特别明显的地方。
image.png
image.png
image.png

其他

Hessian矩阵

https://blog.csdn.net/qq_34886403/article/details/83589108
image.pngimage.png

掩码

https://www.jianshu.com/p/9268ac2c8e5f
什么是掩码?简单来说掩码就是一串二进制码。比如:00000101。就是个数字。掩码的作用是用来存储和操作“状态(State)”。大致用法和逻辑总结:

  1. 用二进制码存储状态,
  2. 通过位运算(&, |, ^, ~, >>, << 等)来操作状态。
失效相关
高斯消元法

https://blog.csdn.net/lzyws739307453/article/details/89816311

OBS

Optimal Brain Surgeon and General Network Prunng 1993.3
参考链接
https://blog.csdn.net/maqian5/article/details/90675598

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐