【文献阅读】Optimal Brain Compression A Framework for Accurate Post-Training Quantization and Pruning
本文提出了一种名为"最优脑压缩"(OBC)的新型训练后神经网络压缩框架,能够高效统一地处理权重剪枝和量化问题。该框架基于经典最优脑外科医生(OBS)方法,通过创新算法将其计算复杂度从O(d⁴)降低到O(d·d_col²),使其适用于现代大规模神经网络。实验表明,OBC在图像分类、目标检测和语言建模任务中显著优于现有训练后方法,并能实现剪枝与量化的复合压缩。例如,在GPU上实现1

最优脑压缩:一种用于精确训练后量化与剪枝的框架
奥地利科学与技术研究所
黎世联邦理工学院
奥地利科学与技术研究所 & Neural Magic 公司
摘要
我们研究了深度神经网络(DNNs)在具有挑战性的单步 / 训练后场景下的模型压缩问题。在该场景中,我们给定一个训练好的高精度模型,必须在不进行任何重训练的情况下,仅基于少量校准输入数据对其进行压缩。鉴于新兴软件和硬件对通过剪枝和 / 或量化压缩的模型提供了加速支持,该问题已受到广泛关注,且针对这两种压缩方法已分别提出了性能优良的解决方案。
在本文中,我们提出了一种新的压缩框架,该框架在统一设置中涵盖了权重剪枝和量化,具有时间和空间效率,并且显著提升了现有训练后方法的实际性能。在技术层面,我们的方法基于经典最优脑外科医生(OBS)框架 [勒库恩、登克和索拉,1990] 的精确且高效实现,并将其扩展到适用于现代深度神经网络规模的权重量化。从实际应用角度来看,我们的实验结果表明,该框架能够显著改善现有训练后方法的压缩 - 精度权衡,并且能够在训练后场景中实现剪枝和量化的精确复合应用。
1 引言
深度学习在多个领域解决挑战性任务方面取得了令人瞩目的近期进展,但与此同时,执行此类模型的参数数量和计算成本也大幅增加。一个自然的结果是,人们越来越致力于通过模型压缩来降低这些成本。模型压缩的两种最流行方法是剪枝(通过将神经网络权重设为零来移除权重)和量化(降低存储和处理神经网络权重及激活值的精度)。
已有数百种此类剪枝和量化方法被提出并分析 [17, 11],其总体目标是获得深度神经网络(DNNs)的高效变体,在最大化压缩率的同时保持精度。尽管取得了令人瞩目的进展,但压缩仍然是一个繁琐的过程:剪枝和量化阶段通常独立进行,并且压缩后恢复模型精度往往需要对压缩模型进行部分甚至完整的重训练。
另一种具有挑战性的场景是训练后压缩设置 [31, 24, 19, 25]。在该场景中,我们给定一个训练好但未压缩的模型以及少量校准数据,必须通过单步压缩(即一次压缩步骤)生成精确的压缩模型,且无需重训练,计算成本也有限制。这一场景的提出受到了 MLPerf 推理基准测试 [37] 等实际应用场景的推动,也是本文关注的重点。
基于权重剪枝的压缩始于勒库恩等人的开创性工作 [23],哈西比和斯托克 [13] 对其进行了补充,他们提出了一种名为最优脑外科医生(OBS)的数学框架,通过利用二阶信息来选择从训练好的神经网络中移除的权重集合(我们将在第 3 节中描述他们的方法)。近期的研究进展(例如 [6, 40, 39, 10])表明,通过引入数值方法来近似 OBS 所需的二阶信息(适用于现代模型的海量参数规模),OBS 能够实现深度神经网络规模下的最先进压缩。然而,这些方法不适用于训练后场景,因为它们需要逐步剪枝以及大量重训练才能恢复良好的精度。
训练后压缩的标准替代方法是将压缩任务分解为逐层子问题:基于校准数据的层输入和输出子样本,为每个层确定压缩权重的近似值。这一系列工作(例如 [42, 31, 19])为由此产生的逐层权重量化问题引入了优雅的求解器,实现了训练后量化的最先进结果。最近,AdaPrune [18] 表明该方法也可有效应用于训练后权重剪枝。
在这一背景下,一个自然的问题是:能否将现有的剪枝和量化方法统一起来,以涵盖训练后场景中的两种压缩类型,从而使深度神经网络压缩更简单,且有望更精确?这一问题也具有实际意义,因为 GPU 和 CPU 平台现在都联合支持稀疏和量化格式 [30, 35],并且正如我们通过实验所展示的,由此产生的模型可以实现复合加速。
贡献
在本文中,我们提供了一种用于通过剪枝或量化进行压缩的数学框架,该框架在具有挑战性的训练后压缩设置中实现了最先进的精度-压缩权衡。我们的框架从上述逐层压缩问题出发,将针对剪枝或量化定义的全局压缩任务,基于层在校准数据上的行为,首先分解为逐层子问题。具体而言,给定一个由权重\( w_{\ell} \)定义的层\( \ell \)和层输入\( x_{\ell} \),我们的目标是找到权重的压缩版本\( \widehat{w}_{\ell} \),在对\( \widehat{w}_{\ell} \)施加固定压缩约束的情况下,最小化相对于未压缩层的输出差异(通过原始层和压缩层在样本输入上的平方误差来衡量),即\( \left\|W_{\ell} X_{\ell}-\widehat{W}_{\ell} X_{\ell}\right\|_{2}^{2} \)。
尽管针对稀疏性或量化约束最优地解决该问题是NP难的[2, 31],但它是所有最先进训练后压缩方法(无论是剪枝[18, 9]还是量化[31, 18, 24])的关键步骤。一旦逐层解决了该问题,就可以通过组合逐层解决方案来获得全局问题的解决方案,这对于非均匀压缩(例如[15, 9])尤其方便。因此,已有多种针对该问题的近似方法被提出[31, 19, 18]。
我们表明,在解决逐层压缩问题时仍有显著的改进空间。大致而言,我们的方法是将OBS框架专门应用于上述平方误差公式:在这种情况下,该框架理论上可以产生精确的贪心解决方案,但直接实现将具有不可行的\( \Theta(d^{4}) \)计算成本(其中d是层维度)。我们的主要技术贡献是一系列算法,这些算法在不进行任何近似的情况下,将计算成本降低到\( O(d \cdot d_{col}^{2}) \)(其中\( d_{col} \)是权重矩阵的列维度)。在实践中,这些改进足够显著,使我们能够实现精确的OBS贪心解决方案——每次剪枝一个权重,并在每个步骤后更新所有剩余权重——对于具有数千万参数的现代深度神经网络,仅需在单块GPU上就能在合理时间内完成。我们在https://github.com/IST-DASLab/OBC提供了我们方法的高效实现。
反过来,这一算法进展使我们能够将OBS方法应用于量化。由此产生的算法称为最优脑量化器(OBQ),它根据权重对损失增加的影响,逐个迭代地量化权重,然后对剩余未量化的权重进行闭式更新,进一步降低损失。该算法高效且统一地解决了剪枝和量化这两个问题——我们将这个统一框架称为最优脑压缩器(OBC)。
实验结果
我们将 OBC 应用于标准任务和模型,包括图像分类、目标检测和语言建模应用。首先,我们表明,我们的框架为逐层压缩问题提供了显著更优的解决方案,这使得剪枝和量化的端到端压缩模型相对于相应的最先进技术具有更高的精度,且往往优势显著。其次,我们表明,我们的剪枝和量化方法可以复合使用,取得了令人惊讶的优异结果:对于 GPU 支持的复合压缩 [30],我们实现了 12 倍的理论运算量减少,而精度仅下降 2%;对于基于 CPU 的稀疏感知运行时 [35],我们实现了 4 倍的实际运行时加速,而精度仅下降 1%。这些结果共同首次表明,训练后压缩可以与完整重训练相竞争。
2 相关工作
最优脑外科医生(OBS)
经典的 OBS 框架 [23, 13] 最初应用于具有数百个权重的网络;最近,WoodFisher [39] 等方法通过使用 Hessian 的块对角 Fisher 近似,使该方法在深度神经网络上的计算可行,而后续方法引入了更高效、更通用的算法来处理逆 Fisher 矩阵 [10],或为特定模型家族定制了这种近似 [21]。早期名为逐层 OBS(L-OBS)[6] 的工作受到 K-FAC 近似 [29, 12] 的启发:L-OBS 并非针对全局目标,而是针对二次逐层损失近似 OBS 框架,同时基于单次 Hessian 计算剪枝所有权重。在较高层面上,我们的方法与之类似,都是逐层应用 OBS;然而,我们的 OBS 应用是精确的 —— 每次剪枝一个权重,并在每次剪枝步骤后精确重新计算 Hessian。这通过多种新的算法思想实现了计算可行性,并且相对于 L-OBS 取得了显著改进的结果。此前的剪枝工作考虑的是需要大量微调的设置。相比之下,我们关注的是训练后场景,其中仅提供少量校准数据。
训练后量化
该场景主要针对量化进行研究,大多数最先进方法通过逐层压缩实现。具体而言,BitSplit [6] 逐位优化量化权重;AdaRound [31] 通过基于梯度的优化(带有鼓励权重向量化网格点移动的退火惩罚项)找到权重舍入策略;AdaQuant [19] 放松了 AdaRound 的约束,允许权重在量化感知优化过程中通过直通估计 [33] 进行调整;BRECQ [24] 表明,通过将二阶信息整合到逐层损失中,并联合优化相关层的手工设计块,可以进一步提高精度。
AdaRound、AdaQuant 和 BRECQ 的一个关键步骤是按顺序增量量化层,以便早期层累积的误差可以通过后期层的权重调整来补偿。这显著提高了性能,但降低了灵活性 —— 每当希望更改某个层的压缩参数时,可能需要重新执行整个过程。相反,我们的目标是每个层的独立压缩,使最终模型可以简单地由逐层结果 “拼接” 而成。尽管在每个层上独立运行,但我们发现,在修正批量归一化等基本统计信息后,我们的方法在均匀量化方面的性能与顺序方法相当。
训练后稀疏化
AdaPrune [18] 表明,逐层方法也可有效应用于训练后剪枝,该方法将权重剪枝为 GPU 支持的 N:M 模式 [45]。AdaPrune 首先根据权重大小 [46] 丢弃参数,然后重新优化剩余权重以重建压缩前的校准集输出。这与 [16, 8] 类似,它们也对剩余权重进行逐层重新优化。后续工作 [9] 指出,通过执行更频繁的剪枝 / 优化步骤,可以进一步改进 AdaPrune 的结果。我们的算法将这一思想推向极致 —— 在每次剪枝单个权重后执行完整的重新优化,同时保持计算可行性。我们还使用了更复杂的权重选择指标,该指标整合了二阶信息。最后,[9] 还引入了全局 AdaPrune,这是一种在逐层 AdaPrune 结果之上应用的更昂贵的全局优化步骤,可以带来额外的精度提升。这也可应用于我们的剪枝模型。
非均匀压缩
一个相关的实际问题是:如何在给定资源约束(如延迟或能耗)的情况下,对不同层进行压缩以最大化精度。现有方法大致可分为基于搜索的方法和基于求解器的方法。前者(例如 AMC [15] 或 HAQ [41])直接通过强化学习或遗传编程 [43] 等方式搜索逐层压缩策略;后者(例如 HAWQv3 [44] 或 AdaQuant [19])构建整体问题的松弛版本,然后精确求解。我们在此关注基于求解器的方法,因为当与精确的独立逐层压缩方案结合时,它们可以快速适应不同场景;然而,我们的技术也可能对基于搜索的方法感兴趣。具体而言,我们使用 AdaQuant [19] 的问题表述,并将 SPDY [9] 的动态规划算法应用于该表述,即使每层有大量可能的选择,也能实现快速求解。
3 问题定义与背景
逐层压缩问题
遵循训练后压缩的先前工作(例如[31, 19]),我们将问题定义如下。在数学上,我们将层\( \ell \)建模为作用于输入\( x_{\ell} \)的函数\( f_{\ell}(X_{\ell}, W_{\ell}) \),其参数为权重\( W_{\ell} \)。逐层压缩的目标是找到\( W_{\ell} \)的“压缩”版本,使其性能尽可能接近原始权重。更正式地说,压缩权重\( \widehat{W}_{\ell} \)应最小化预期的层输出变化(通过某种损失衡量),同时满足通用压缩约束(我们用\( C(\widehat{W}_{\ell})>C \)表示,该约束将根据压缩类型进行定制):
\[ argmin_{\hat{W}_{\ell}} \mathbb{E}_{X_{\ell}} \mathcal{L}\left(f_{\ell}\left(X_{\ell}, W_{\ell}\right), f_{\ell}\left(X_{\ell}, \hat{W}_{\ell}\right)\right) subject to \mathcal{C}\left(\hat{W}_{\ell}\right)>C . (1) \]
对层输入\( X_{\ell} \)的期望通常通过对少量N个输入样本取平均值来近似。这种低数据设置是逐层压缩的主要应用场景之一。此外,大多数工作[42, 31, 19]专注于压缩线性层和卷积层(可展开为线性层),因为它们在实践中广泛存在,并使用平方损失来衡量近似误差。该损失定义可以通过一系列近似从二阶信息推导得出(详见[31])。此外,这种近似方法已被证明在许多应用中表现良好[31, 19, 9]。
我们也遵循这些惯例,并使用以下正式表述的特定逐层压缩问题:权重\( w_{\ell} \)是一个\( d_{row} × d_{col} \)矩阵(对于卷积层,\( d_{col} \)对应于单个滤波器中的权重总数),输入\( x_{\ell} \)的维度为\( d_{col} × N \):
\[ argmin_{\hat{W}_{\ell}} \quad\left\| W_{\ell} X_{\ell}-\hat{W}_{\ell} X_{\ell}\right\| _{2}^{2} s.t. \mathcal{C}\left(\hat{W}_{\ell}\right)>C . (2) \]
最优脑外科医生(OBS)框架
OBS框架[23, 13]考虑的是精确剪枝训练好的稠密神经网络的问题。它从给定点的泰勒近似(假设梯度可忽略)出发,提供了用于选择要移除的最优单个权重以及补偿该移除的剩余权重最优更新的显式公式。更具体地说,设H表示给定(稠密)模型处损失的Hessian矩阵。则导致损失增加最小的要剪枝权重\( w_{p} \)以及剩余权重的相应更新\( \delta_{p} \)可计算如下:
\[ w_{p}=argmin_{w_{p}} \frac{w_{p}^{2}}{\left[H^{-1}\right]_{p p}}, \delta_{p}=-\frac{w_{p}}{\left[H^{-1}\right]_{p p}} \cdot H_{:, p}^{-1}, (3) \]
其中\( [H^{-1}]_{pp} \)表示逆Hessian的第p个对角元素,\( H_{:, p}^{-1} \)是其第p列。
用于逐层剪枝的 OBS
我们现在将该框架实例化到上述定义的逐层剪枝问题中。首先,公式(2)中的损失是二次的,并且由于我们的起点是实现最小损失 0 的稠密权重,OBS 框架的假设完全满足,这意味着其公式对于该特定问题表述是精确的。因此,迭代 OBS 框架以每次移除一个权重,将为逐层剪枝问题产生精确的贪心解决方案,因为它在每个步骤都做出(局部)最优决策。尽管这种贪心方法不能保证收敛到全局最优,但对于处理太大而无法通过精确方法处理的问题实例非常有效。
4 稀疏性的最优贪心求解器
显然,应用OBS框架的真实形式(即使用公式(3)中的精确公式每次剪枝一个权重)的计算量非常大。Hessian矩阵H是一个\( d × d \)矩阵(其中\( d = d_{row} \cdot d_{col} \)),存储和计算该矩阵本身就成本高昂。此外,在\( O(d) \)个步骤中的每个步骤都需要更新和求逆该矩阵,计算复杂度为\( \Theta(d^{3}) \)。显然,\( O(d^{4}) \)的总运行时间对于剪枝现代神经网络的大多数层来说效率太低,因为d通常≥10⁵,对于某些层甚至≥10⁶。然而,正如我们将要展示的,实际上可以将该过程的总体成本降低到\( O(d_{row} \cdot d_{col}^{3}) \)时间和\( \Theta(d_{col}^{2}) \)内存,这使得在单块NVIDIA RTX 3090 GPU上,仅需一个多小时就能剪枝中等规模模型(如ResNet50)的所有层。我们强调,我们引入的技术是精确的;与先前工作[6, 39]不同,我们不依赖任何近似。
ExactOBS 算法
下面,我们将逐步介绍OBS框架在逐层压缩问题中的高效实例化,我们称之为ExactOBS。首先,我们将公式(2)中的矩阵平方误差重写为权重矩阵中每行的平方误差之和。由于我们始终处理固定层\( \ell \),为简化符号,我们省略下标\( \ell \)。目标则等价于\( \sum_{i=1}^{d_{row }}\left\|W_{i,:} X-\widehat{W}_{i,:} X\right\|_{2}^{2} \)。
这种误差表述方式清楚地表明,移除单个权重\( [W]_{ij} \)仅影响相应输出行\( Y_{i,:}=W_{i,:} X \)的误差。因此,不同行之间不存在Hessian交互,因此只需处理对应于每个\( d_{row} \)行的单个\( d_{col} × d_{col} \) Hessian即可。此外,由于稠密层输出\( Y=W X \)是固定的,每行的目标具有标准最小二乘形式,其Hessian由\( H=2 X X^{\top} \)给出。
尽管这一观察已经降低了计算复杂度,但仍存在两个关键挑战:(a)将OBS应用于每行仍需要\( O(d_{col} \cdot d_{col}^{3}) \)时间,对于大型层来说速度太慢;(b)我们需要快速访问所有\( d_{row} \)行的Hessian逆,因为我们希望在每个步骤中剪枝整个矩阵中得分最低的权重,而不仅仅是每行中的权重。特别是(b)需要\( O(d_{row} \cdot d_{col}^{2}) \)的GPU内存,这可能是不可行的。
步骤 1:处理单行
我们首先描述如何高效地从具有\( d_{col} \)个参数的单行中剪枝权重。为简化起见,我们将该行表示为w,对应的Hessian为H。该过程的完整算法如算法1所示;下面我们提供详细描述。核心思想是避免在每个步骤中进行完整的\( \Theta(N \cdot d_{col}^{2}) \)计算和\( \Theta(d_{col}^{3}) \)的H求逆。前者很容易实现,因为权重本身不参与\( H=2 X X^{\top} \)的计算,因此带有剪枝掩码M的权重的Hessian \( H_{M} \)仅由完全稠密版本H中的相应行和列组成。因此,我们只需计算一次H(实际上所有行的H都相同),然后根据需要从中提取对应于M的行和列。
关键的是,这一技巧不适用于逆矩阵,因为\( (H_{M})^{-1} \neq (H^{-1})_{M} \)。然而,利用移除一个参数p只需从H中删除相应行和列这一事实,我们实际上可以通过单次高斯消元直接更新逆矩阵以移除参数p,成本为\( \Theta(d_{col}^{2}) \)。以下结果(其证明见附录)对此进行了形式化。
引理1(行和列移除):给定可逆的\( d_{col} × d_{col} \)矩阵H及其逆矩阵\( H^{-1} \),我们希望高效计算移除行p和列p后的H的逆矩阵(记为\( H_{-p} \))。这可以通过以下公式实现:
\[ H_{-p}^{-1}=\left(H^{-1}-\frac{1}{\left[H^{-1}\right]_{p p}} H_{:, p}^{-1} H_{p,:}^{-1}\right)_{-p}, (4) \]
该公式对应于在\( H^{-1} \)中对行p和列p执行高斯消元,然后将其完全删除。其时间复杂度为\( \Theta(d_{col}^{2}) \)。
由此产生的伪代码如算法1所示。在该算法中,我们利用以下事实避免不断调整\( H^{-1} \)的大小(以及相应地更改索引):在通过引理1消除行p和列p后,它们对未来的任何计算都没有影响(因为它们为0,且非零对角元素不再被访问)。可以验证,该算法将OBS应用于W的单行,每步成本为\( \Theta(d_{col}^{2}) \),因此剪枝k个权重的总时间为\( \Theta(k \cdot d_{col}^{2}) \)。
算法 1:根据 OBS,在O(k⋅dcol2)时间内从行 w 中剪枝 k ≤ dcol 个权重,其中逆 Hessian 。
plaintext
M = {1, ..., dcol}
for i = 1, ..., k do
p ← argminₚ∈M [wₚ² / (H⁻¹)ₚₚ]
w ← w - (H⁻¹)∶,ₚ · [wₚ / (H⁻¹)ₚₚ]
H⁻¹ ← H⁻¹ - (H⁻¹)∶,ₚ · (H⁻¹)ₚ,∶ / (H⁻¹)ₚₚ
M ← M - {p}
end for

步骤 2:联合考虑所有行
将OBS框架应用于完整权重矩阵W(而非仅独立应用于每行)需要快速访问所有\( d_{row} \)行的逐行逆Hessian,以便在每个步骤中选择总体剪枝得分最低的权重。然而,在GPU内存中存储\( d_{row} \)个大小为\( d_{col} × d_{col} \)的矩阵可能成本过高;虽然可以将部分Hessian卸载到主内存,但这可能导致大量昂贵的内存传输。然而,由于行之间不存在Hessian交互,每行的最终压缩权重仅取决于该行中被剪枝的参数总数。类似地,剪枝某个权重所导致的损失变化仅取决于同一行中先前被剪枝的权重,这也意味着每行中权重的剪枝顺序是固定的。
这些见解的结果是,我们可以独立处理每行:按顺序剪枝所有权重,同时始终记录相应的损失变化\( \delta \tilde{L_{p}}=w_{p}^{2} / [H^{-1}]_{pp} \)。最后,我们知道所有d个权重的\( \delta L_{p} \),然后可以通过按顺序选择值最低的权重,简单地确定OBS在完整矩阵上会选择的全局掩码,仅需\( \Theta(d) \)的额外内存。我们注意到,一旦已知逐行掩码\( M_{i} \),就可以通过相应的组OBS公式[21]直接求解剩余权重的最优更新:\( \delta_{M_{i}}=H_{:, M_{i}}^{-1}((H^{-1})_{M_{i}})^{-1} w_{M_{i}} \)。在实践中,这将比简单地重新运行算法1中的迭代剪枝过程快得多。或者,如果有足够的CPU内存,可以将每行的完整剪枝轨迹(即每次单独剪枝步骤后的完整权重向量)保存在CPU内存中,最终只需重新加载对应于全局掩码的条目。这需要\( O(d_{row} \cdot d_{col}^{2}) \)的额外CPU内存,但避免了第二次计算以重建未剪枝的权重,因此速度更快。图1可视化了上述两种选择。

图1 利用逐行结果的高效全局OBS
实现细节
在实践中,矩阵 H 可能并不总是可逆的,原因包括使用过少的数据样本或无效 / 线性相关的输入。前者通常可以通过使用增强数据扩展校准数据集来解决(额外的增强样本只需累积到 Hessian 中一次,因此成本很低);后者可以通过在求逆之前向 Hessian 添加一个小的对角阻尼项来防止。其次,算法 1 的直接 GPU 实现将执行大量小型 CUDA 调用,这可能成本高昂。可以通过使用批处理操作同时处理多个矩阵行来消除这种开销(更多细节请参见我们的示例实现)。最后,当应用于已稀疏的权重矩阵时,通过使用仅包含非零元素的权重 / Hessian 稠密版本,并在最后将剪枝结果映射回去,我们算法的复杂度可以与行密度的三次方成正比。
N:M 稀疏性
我们的方法可以轻松扩展到各种形式的半结构化稀疏性。例如,N:M稀疏模式[45](在每个M个连续权重的块中强制恰好有N个非零值),由于较新的NVIDIA硬件[30]对其提供支持,该模式正变得越来越流行。将我们的算法适配到该模式只需一个简单的更改:不再选择损失变化最小的权重,而是选择位于剪枝权重数<N的块中且损失变化最小的权重。我们注意到,在N:M模式中,所有行都具有完全相同的稀疏性\( 1 - N/M \),因此一旦达到该目标稀疏性值,就可以终止逐行剪枝。出于同样的原因,不需要前面描述的全局掩码选择步骤。因此,在这种情况下,我们的方法将更加高效。
块稀疏性
另一种实际相关的剪枝模式(特别是在CPU加速的背景下[7, 22])是块剪枝:零值仅出现在大小为c的连续块中(c通常是4或8等小数)。我们遵循最近的工作[21],该工作将OBS框架扩展到剪枝相连权重的小组,以考虑它们之间的相关性,分别使用以下公式计算目标块和权重更新:
\[ w_{P}=argmin_{w_{P}} w_{P}^{\top}\left(\left(H^{-1}\right)_{P}\right)^{-1} w_{P}, \delta_{P}=-H_{:, P}^{-1}\left(\left(H^{-1}\right)_{P}\right)^{-1} w_{P}, (5) \]
其中P表示对应于一个块的索引集。使用上述公式,并通过引理1对所有\( p \in P \)依次更新\( H^{-1} \),可以轻松将算法1适配为对块进行操作。尽管现在每行仅需\( d_{col}/c \)个步骤,但每次\( H^{-1} \)更新也需要\( O(c \cdot d_{col}^{2}) \)时间,因此总体渐近运行时间保持不变。额外的实际开销仅来自计算和乘法\( c × c \)矩阵\( ((H^{-1})_{P})^{-1} \)所产生的额外\( O(c^{2} \cdot d_{col}^{2}) \)项。
5 最优脑量化器(OBQ)
尽管经典的 OBS 框架 [23, 13] 启发了一系列关于深度神经网络剪枝方法的研究 [39, 10, 27],但迄今为止,它尚未被用于量化。现在我们表明,我们在前一节中的结果实际上可以通过一种我们称为最优脑量化器(OBQ)的方法,有效且准确地扩展到量化,其灵感来自 [23, 13]。
量化顺序与更新推导
在当前点w的梯度可忽略的标准假设下,OBS中用于选择要剪枝的最优权重\( w_{p} \)和相应更新\( \delta_{p} \)的公式,可以通过在约束\( \delta_{p} \)的第p个元素等于\( -w_{p} \)(这意味着在对w应用更新后,\( w_{p} \)为零)的情况下,编写局部二次问题来推导。该问题的拉格朗日函数如下:
\[ L\left(\delta_{p}, \lambda\right)=\delta_{p}^{\top} H \delta_{p}+\lambda\left(e_{p}^{\top} \delta_{p}-\left(-w_{p}\right)\right), (6) \]
其中H表示w处的Hessian,\( e_{p} \)是第p个标准基向量。然后,通过将导数\( \partial L / \partial \delta_{p} \)设为零,首先找到\( \delta_{p} \)的最优解,然后将该解代回L并求解λ,即可得到最优解(例如,参见[13, 39]中的示例)。
假设我们希望在固定宽度为Δ的网格上量化层中的权重,同时最小化损失。为了将OBS映射到量化投影,我们可以将公式(6)中的拉格朗日约束目标设置为\( (quant(w_{p}) - w_{p}) \)(其中\( quant(w_{p}) \)是量化给出的权重舍入值);然后,更新后\( w_{p}=quant(w_{p}) \)。
假设我们希望逐个迭代地量化权重,我们可以以类似的方式推导出在某个步骤中要量化的“最优”权重(以最小化损失增加为目标)以及对未量化权重的相应最优更新的公式:
\[ w_{p}=argmin_{w_{p}} \frac{\left( quant\left(w_{p}\right)-w_{p}\right)^{2}}{\left[H^{-1}\right]_{p p}}, \delta_{p}=-\frac{w_{p}-quant\left(w_{p}\right)}{\left[H^{-1}\right]_{p p}} \cdot H_{:, p}^{-1} . (7) \]
实际上,由于在所有推导过程中\( -w_{p} \)是一个常数,我们只需在最终结果中用\( (quant(w_{p}) - w_{p}) \)替换它即可。我们注意到,所得公式是标准OBS剪枝的推广——如果\( quant(·) \)始终将权重“量化”为0,则我们恢复原始形式。
全层量化
乍看之下,OBQ 可能显得有些特别,因为通常会量化层中的所有权重,不再留下需要更新的权重。同时,权重选择指标仅影响量化顺序,而不影响量化值。然而,当在我们前面描述的高效单次权重剪枝算法的背景下考虑 OBQ 时,这种观点会发生变化。具体而言,使用 OBQ,我们可以通过上述指标贪心选择当前 “最容易” 量化的权重,然后调整所有剩余未量化的权重以补偿这种精度损失,从而改变它们的值。然后,我们选择下一个要量化的权重,依此类推。这可能导致与最初通过舍入选择的量化分配不同的量化分配,并获得更好的整体量化结果。具体而言,为实现这一点,我们可以将(7)代入算法 1,以迭代方式量化给定层的权重,从而得到附录中类似的算法,本质上统一了剪枝和量化。
量化异常值
这种贪心方案的一个实际问题是,当应用于允许某些异常值(以实现大多数权重的更低误差)的量化网格时(这是当前的标准[4, 34]),可能会出现问题。由于这些异常值可能具有较高的量化误差,它们通常会被最后量化——此时可用的其他未量化权重很少,可能无法调整以补偿量化异常值所导致的大误差。当中间更新将某些权重进一步推到网格之外时,这种影响会变得更糟。我们通过一种简单但有效的启发式方法来防止这种情况:一旦出现异常值(例如,量化误差>Δ/2的权重,其中Δ是量化值之间的距离),就对其进行量化(这在每层中通常仅发生几次)。通过这种启发式方法,OBQ产生了一种高效的逐层量化方案,正如我们在下一节中的实验所展示的。最后,我们注意到,第4节中讨论的技术的OBQ版本具有相同的运行时和内存特性(除了图1中的全局步骤,这对于量化是不必要的)。
6 实验
目标、模型与数据集
为了证明我们方法的有效性和灵活性,我们考虑了几种不同的标准训练后压缩场景 [31, 19, 18]。我们首先考虑仅应用单一类型压缩的设置:具体而言,我们考虑针对给定 FLOP 目标的非结构化剪枝、全局 2:4 和 4:8 剪枝,以及均匀权重量化。此外,我们还研究了两个具有剪枝和量化复合应用的实际任务:一个是 GPU 场景(结合量化和 N:M 剪枝),另一个是 CPU 场景(结合量化和块剪枝)。我们使用以下模型和任务的变体:用于 ImageNet [38] 图像分类的 ResNet [14]、用于 COCO [26] 目标检测的 YOLOv5 [20],以及用于 SQuAD [36] 问答的 BERT [5]。我们的小型 BERT 模型(记为 BERT3 和 BERT6)分别对应于 BERT-base 的 3 层和 6 层小型变体,由 [21] 训练。附录包含额外的实验以及我们算法的运行时信息。
实验设置
我们所有的校准数据集都包含 1024 个随机训练样本。对于 ImageNet(我们使用大约 0.1% 的训练数据),我们额外应用标准的翻转和裁剪增强,将该数据集的大小人为增加 10 倍;其他任务不使用任何增强。尽管增强的效果通常较小,但对于我们的方法而言,添加增强非常廉价。对于 ResNet 模型,使用校准集中的 100 批 128 个样本(带有标准增强)重置批量归一化统计信息。对于其他模型,我们在所有归一化层之后应用均值和方差校正 [32, 1](以便校正参数可以轻松合并,且不产生额外成本),使用的样本批量大小为 128(对于 YOLO)和 512(对于 BERT)。我们发现,这对于 YOLO 而言比批量归一化调优更有效,而 BERT 模型没有批量归一化层。
当压缩到给定的 FLOP 或时间约束时,我们需要解决确定逐层压缩目标的问题 —— 这些目标应匹配约束,同时最大化精度。为了确定这些非均匀目标,我们遵循 [10] 的方法:首先收集一个 “模型数据库”,其中包含每个压缩级别(例如位宽或稀疏性设置)对应的每个层的(独立)压缩版本。为了构建联合稀疏和量化数据库,我们首先对层进行稀疏化,然后对剩余权重应用量化。接下来,类似于 [19],我们计算所有压缩级别的逐层校准损失(无增强),对应于恰好有一个层被压缩到某个级别的模型。然后,给定逐层 FLOP 或时间信息,我们建立 AdaQuant [19] 中描述的形式的约束逐层压缩问题,并使用 SPDY [10] 的动态规划算法求解。这返回最优的逐层压缩级别分配,然后我们可以通过两步过程轻松生成相应的模型:首先从数据库中拼接对应压缩级别的层,然后执行所讨论的统计校正以恢复额外的精度 [19]。
非结构化稀疏性
我们首先进行非结构化稀疏性实验,将其与全局幅度剪枝(GMP)[46]、近似逐层 OBS 方法 L-OBS [6] 以及训练后剪枝最先进方法 AdaPrune [18] 进行比较。作为合理性检查,我们在图 2 中检查了我们的方法在逐层平方误差方面是否提供了更好的结果 —— 将 ResNet18(RN18)模型的第一层剪枝到不同的稀疏性。在该指标中,ExactOBS 的性能远远优于 AdaPrune,而 AdaPrune 又显著优于其他两种方法。
接下来,在表 1 中,我们将注意力转向将各种模型剪枝到给定的 2 倍 - 4 倍 FLOP 缩减目标的实际问题,应用上述逐层目标稀疏性优化技术。我们的 ExactOBS 总体上表现最佳(除了 YOLOv5l 的 2 倍 FLOP 缩减 —— 所有方法在 mAP@0.5 方面表现相似),并且在 4 倍 FLOP 缩减时,与次优方法的差距甚至超过 1%。有趣的是,在难以剪枝的 BERT 模型上,ExactOBS 似乎是在较高缩减目标下仍能产生合理结果的唯一方法。对于 BERT 的 3 倍和 4 倍 FLOP 缩减(所有方法的性能下降都 > 2%),我们另外评估了我们的结果与更强大(但也更昂贵)的后处理方法全局 AdaPrune [10] 的兼容性。尽管这种全局优化技术能够恢复损失的精度,但 ExactOBS 模型仍分别保持 > 0.5% 和 > 2% 的 F1 优势(见表 5)。
表 1 不同 FLOP 缩减目标下的非结构化剪枝

表 2 所有层(除第一层和最后一层)的半结构化 N:M 剪枝(+ 批量归一化调优)

表 3 所有层(除嵌入层)的半结构化 2:4 剪枝


图 2 ResNet18(RN18)的平方误差
N:M 稀疏性
接下来,我们研究我们的方法在通过 N:M 模式实现半结构化稀疏性方面的性能。具体而言,我们在 ResNet 模型上与 AdaPrune(带有批量归一化调优)[18] 的 4:8 结果进行比较(见表 2),并在 BERT 模型上进行 2:4 比较(见表 3)。我们强调,ExactOBS 在相当严格的 2:4 模式下(该模式已在 NVIDIA 硬件上得到良好支持),匹配甚至略微超过了 AdaPrune 的 4:8 结果。此外,在 BERT 模型的 2:4 比较中,ExactOBS 实现了 1-2% 的更高 F1 分数。
量化
此外,我们将 OBQ 的独立性能(批量归一化调优后)与最先进的顺序训练后方法 AdaQuant [19]、AdaRound [31] 和 BRECQ [24] 进行比较。我们对所有权重执行标准的非对称逐通道量化,使用作者的实现。我们在 Torchvision [28] ResNets 上重新运行所有方法,以确保统一的基线。OBQ 和 AdaRound 的量化网格通过 BRECQ 使用的相同 LAPQ [34] 程序确定。令人惊讶的是,我们发现,尽管是独立优化层,但 OBQ 在 4 位和 3 位量化时实现了与现有非独立方法非常相似(有时甚至略好)的精度。这表明,它非常适合混合精度应用 —— 在这些应用中,需要快速生成许多针对不同约束优化的非均匀模型(然而,我们注意到 ExactOBS 也可以顺序应用;见附录)。
表 4 所有层非对称逐通道权重量化的最先进训练后方法比较。我们标记方法是否为逐层(Lw.)或独立(Ind.)。

表 5 通过更昂贵的全局 AdaPrune(gAP)后处理,进一步改进表 1 中性能下降 > 3% 的结果。

BOP 约束的混合 GPU 压缩
现在我们考虑一个实际场景:给定一个训练好的模型和一些校准数据,我们希望压缩该模型以在 NVIDIA GPU 上高效推理 —— 该 GPU 支持 8 位和 4 位算术,并且还支持 2:4 稀疏性。因此,每层有 4 种可能的压缩选择:8 位权重 + 8 位激活(8w8a)、4w4a、8w8a+2:4 和 4w4a+2:4。与前一节不同,我们对权重执行对称逐通道量化(因为它具有更好的硬件支持);激活按张量非对称量化。然后,我们为各种 BOP(位数乘以 FLOPs)缩减目标生成混合精度配置,并在图 3 中可视化由此产生的压缩 - 精度权衡曲线。总之,以约 2.5% 的相对性能下降为代价,我们可以为 ResNets 实现 12-14 倍的 BOP 缩减,为更具挑战性的 YOLO 和 BERT 模型实现 7-8 倍的缩减(相对于可压缩层中的计算)。据我们所知,我们是第一个在训练后场景中考虑联合 N:M 剪枝和量化的研究。最近的工作 [3] 也研究了 ResNet18 的联合 4w4a+2:4 压缩,但在完整数据集上进行了 90 个 epoch 的(稀疏)量化感知训练(QAT),并报告了 67.33% 的精度。尽管不完全可比(我们保持第一层稠密,而他们的稠密基线精度高 0.94%,并使用 4:8 稀疏激活),但我们通过训练后 4w4a+2:4 压缩实现了类似的 67.20% 精度,这强调了我们的方法在联合稀疏化和量化方面的有效性。
时间约束的 CPU 压缩
最后,我们探索一个类似的场景,但目标是在 12 核 Intel Xeon Silver 4214 CPU 上实现实际的 CPU 推理加速 —— 使用 DeepSparse 推理引擎 [35, 22],该引擎支持联合 8 位量化和块大小为 4 的块稀疏性。在这种情况下,我们使用真实的逐层计时数据(批量大小为 64),如 [9] 中所述。每层有 30 个可用的块稀疏性目标,以剪枝 10% 剩余权重的步长递增,所有这些目标都进一步量化到 8 位。稠密 8 位模型的基准加速约为 2.7 倍,在此基础上,稀疏性加速大致呈乘法效应。图 2d 显示了 ResNet50 和几个(实时)加速目标的结果 —— 我们实现了 4 倍和 5 倍的(实际)加速,精度损失分别仅为 1% 和 2%。这些是该场景中的第一个完整训练后结果([10] 的作者仅执行了训练后 4 块剪枝,随后在整个 ImageNet 数据集上进行了 5 个 epoch 的 QAT),并且它们展示了非常令人鼓舞的精度 - 加速权衡。

图 3 (a)至(c)各种 BOP 缩减目标下的混合量化和 2:4 剪枝;(d)用于 CPU 推理时间加速的联合块剪枝和量化。
7 结论与未来工作
我们提出了一种用于解决逐层压缩问题的新高效精确方法,并在此基础上获得了训练后剪枝和量化的最先进压缩解决方案。我们的框架自然可以扩展到结构化剪枝,这实际上应该允许进一步优化,并且还应该与通过非结构化剪枝和量化进行的进一步压缩兼容。我们的结果表明,训练后压缩可能能够达到与昂贵得多的重训练方法相当的精度。我们计划在未来的工作中对此进行研究,特别是在更大规模语言模型等资源密集型模型的背景下。
附录
A.1 引理 1(行和列移除)的证明
证明:首先,我们观察到,通过减去[A]ij乘以列 i(记为A:,i)再除以相应的对角元素[A]ii,可以通过等效矩阵变换将行 i 中的元素 j(即[A]ij)设为 0(类似地,可以通过减去行 2 将列 i 中的元素设为 0)。因此,引理 1 对应于通过等效矩阵变换将Hpi−1和Hip−1(对于i=p)置零,或者换句话说,对一行和一列执行高斯消元。
接下来,我们将这些等效矩阵变换应用于明显等式H−1H=I的两边,最终得到以下AB=C形式的等式:A10⊤A40a0A20⊤A3⋅B1b4⊤B4b1bb3B2b2⊤B3=Ic4⊤0c1cc30c2⊤I.(8)
现在注意到,A 中被消除的行和列对应的 B 中的条目,由于它们总是乘以 0,因此不会影响 C 中的 I 和 0 块。因此,Ai块的矩阵必须是Bi块矩阵的逆,这正是我们想要计算的。
A.2 ExactOBS 全局步骤伪代码
本节以伪代码形式提供了第 4 节中描述的 ExactOBS 算法全局步骤的更多细节。
算法 2:设 P 是一个drow×dcol矩阵,存储 ExactOBS 在每行中剪枝权重的顺序;设 L 是相应损失变化δL的矩阵。则以下过程确定剪枝 k 个权重的全局 OBS 掩码。
Q = {(i, 0) | 1 ≤ i ≤ drow}
for k次 do
(i, j) ← argmin_{(i,j)∈Q} [L]_{i(j+1)} (若j < dcol,则为[L]_{i(j+1)},否则为∞)
Q ← Q - {(i, j)}
Q ← Q ∪ {(i, j + 1)}
end for
Q包含每行i中被剪枝元素的数量j,结合P即可得到掩码。
为了提高效率,集合 Q 可以实现为最小堆(例如)。最后,我们注意到,一种稍简单的方法是从 L 中选择 k 个最小元素,然后计算每行中被选择的元素数量 —— 在实践中,这通常会产生与算法 2 基本相同的结果,因为随着剪枝权重数量的增加,损失变化通常单调递增。
A.3 OBQ-ExactOBS 算法伪代码
ExactOBS 算法的 OBQ 版本如下所示;我们强调其与算法 1 中所示的剪枝变体 ExactOBS 的相似性。
算法 3:根据 OBS,在O(k⋅dcol2)时间内从行 w 中量化 k ≤ dcol 个权重,其中逆 Hessian 。
M = {1, ..., dcol}
for i = 1, ..., k do
p ← argminₚ∈M [(quant(wₚ) - wₚ)² / (H⁻¹)ₚₚ]
w ← w - (H⁻¹)∶,ₚ · [(wₚ - quant(wₚ)) / (H⁻¹)ₚₚ]
H⁻¹ ← H⁻¹ - (H⁻¹)∶,ₚ · (H⁻¹)ₚ,∶ / (H⁻¹)ₚₚ
M ← M - {p}
end for
A.4 进一步的实验细节
现在我们提供第 6 节中实验的一些额外细节。
偏差和方差校正
尽管我们应用于 YOLO 和 BERT 模型的偏差和方差校正步骤与 [32] 和 [1] 中描述的方案相似,但为了进一步明确,我们现在描述我们的确切过程:
- 从校准数据集中采样一个批次。
- 使用稠密模型对该批次执行推理,并在每个归一化层之后,记录每个通道(对于 CNN)/ 特征(对于 Transformer)在该批次上的均值μdenseℓ和标准差σdenseℓ。
- 使用压缩模型对该批次执行推理,并按照步骤 2 记录均值μcompℓ和标准差σcompℓ,同时通过以下方式对层输出Xℓ应用均值和方差校正:Yℓ=σcompℓσdenseℓ⋅(Xℓ−μcompℓ+μdenseℓ)(9)
- 将(9)合并到相应归一化层的仿射参数中。
我们注意到,在步骤 3 中计算压缩均值和方差时,至关重要的是已经应用了统计校正,以便正确考虑复合分布偏移。
非均匀稀疏性选择
我们用于确定逐层(非结构化或块)稀疏性值以达到特定总体预算(同时最小化精度损失)的方法,要求每层有一组离散的稀疏性选择。对于非结构化和块稀疏性,我们遵循 [10],选择一个网格,其中每个点剪枝相同比例的剩余权重 δ。因此,稀疏性选择si由下式给出:si=1−(1−δ)i.(10)
在这两种情况下,我们选择 δ=0.9,对应于剪枝 10% 的剩余权重。对于非结构化稀疏性,我们生成选择直到si>0.99;对于块稀疏性,直到si>0.95。我们注意到,选择这些稀疏性选项集是为了提供最大的灵活性。然而,在许多情况下,通过显著减少但更精心选择的选项(例如,利用以下事实:对于较低的 FLOP 缩减目标,通常永远不会选择非常高的稀疏性),可能能够实现类似的结果,从而减少所需的数据库存储。
激活量化
在我们针对 GPU 的量化 + 2:4 剪枝实验中,我们还量化了所有激活。这通过以下方式实现:对于每层的一个输入批次,使用与权重完全相同的程序(只是在张量级别而非通道级别)优化零点和量化尺度 —— 这与 BRECQ [24] 使用的相同 LAPQ [34] 程序。这再次针对每个层独立进行,相应的量化信息存储在模型数据库中,以便快速拼接。可能存在更先进的方案,例如重新优化权重以更好地匹配量化输入(见附录 A.8),但我们发现刚刚描述的简单程序已经表现得相当好。
A.5 运行时信息
本节提供了我们方法运行时的详细信息。此处报告的所有数字均基于我们的 PyTorch 实现,在单块 NVIDIA RTX 3090 GPU 上执行。带有全局步骤的剪枝运行使用图 1 中描述的 “较少计算” 变体。因此,一个包含许多剪枝级别的完整数据库可以在大约此处显示的非结构化和块剪枝运行时间内生成。
PTQ 运行时比较
我们首先比较现有最先进训练后方法在将 ResNet50 的所有层权重量化到 4 位时的运行时。所有计时均通过在相同硬件上执行作者的开源实现收集,结果如表 6 所示。
表 6 训练后量化方法的运行时间(分钟)

BRECQ、AdaRound 和我们的方法 OBQ 都需要大约一小时才能完全量化 ResNet50—— 前两者略少,后者略多。同时,BitSplit 需要大约两倍的时间,而 AdaQuant 快 3 倍。然而,如表 4(以及表 9)所示,AdaQuant 的精度也明显低于其他方法。总之,ExactOBS 的运行时与现有训练后方法一致。通过定期缩小 Hessian(省略剪枝 / 量化权重的行 / 列)等额外优化,可能能够进一步提高实际速度。
不同压缩类型
接下来,我们研究 ExactOBS 应用于不同类型压缩问题的运行时。我们考虑一个小型模型(YOLOv5s)、一个中型模型(ResNet50)和一个大型模型(BERT)。我们工作中所有压缩类型的相应运行时如表 7 所示。
表 7 不同模型和压缩类型的 ExactOBS 运行时间(分钟)

总体而言,我们可以看到,量化和非结构化剪枝花费的时间大致相同 —— 这与相应算法非常相似的事实一致。相应地,2:4 剪枝和量化 2:4 剪枝模型的成本仅约为一半 —— 这同样符合预期,因为它们执行的工作量减半。对于 YOLO 和 BERT,块剪枝是最昂贵的压缩类型,这是由于处理额外的c×c块矩阵所产生的开销(见第 4 节)。有趣的是,对于 ResNet50,情况并非如此 —— 这可能与下一段中详细讨论的高度非均匀计算分布有关。总之,这些结果表明,我们的技术对于小型模型而言速度很快,即使对于 BERT 等较大模型,在单块 GPU 上也只需不到 2 小时即可完成。最后,我们注意到 ExactOBS 本质上是完全可并行化的,因此其运行时可以随着可用 GPU 数量的增加而线性扩展。
逐层运行时
最后,我们注意到,由于通过 ExactOBS 实现的 OBQ 的时间复杂度为O(drow⋅dcol3)(即与列维度的三次方成正比),因此总体运行时通常可能由少数特别大的层主导。例如,ResNet50 就是如此 —— 如图 4 所示,大约 75% 的总体运行时花费在最后一个块的 3×3 卷积上(展开时dcol≈4500),而这样的卷积总共只有 3 个。同时,大多数早期层的量化只需几秒钟即可完成。这意味着,在许多情况下,可以通过对少数几个瓶颈层应用更快但精度较低的方法,同时通过我们的技术在所有其他层上实现更精确的压缩,来显著减少总体压缩运行时。

图 4 ResNet50 各层 OBQ 的运行时间
A.6 多次 AdaPrune 迭代
虽然 AdaPrune [18] 在单个步骤中确定所有要剪枝的权重,但 [10] 的作者发现,在更小的步骤中迭代该过程通常可以显著提高性能,但计算成本会迅速增加。我们的方法通过为每个权重执行一个步骤,实现了该方案的极限。在本节中,我们研究 OBQ 与具有不同剪枝和完整重新优化步骤数的 AdaPrune 的比较。为此,我们通过在k=2i个步骤中应用 AdaPrune(如 [10] 所建议的,所有步骤剪枝相同比例的剩余权重),将 BERT 剪枝到均匀 75% 的稀疏性。
我们的结果证实了 [10] 的发现:多次迭代 AdaPrune 可以显著改善结果 —— 我们看到,仅需几次这样的 “重新计算”,F1 下降就会迅速减少。尽管如此,即使经过 16 次完整迭代(总体运行时与 ExactOBS 相当),(迭代)AdaPrune 模型的精度下降仍然几乎是 ExactOBS 的 2 倍 —— 这清楚地展示了我们方法的优势。
表 8 与具有不同剪枝 / 重新优化步骤数的 AdaPrune(AP)的 F1 下降比较

A.7 独立量化比较
在主论文的均匀量化实验中(见表 4),我们仅将 OBQ 与最先进的顺序方法进行了比较 —— 因为这些方法通常比独立方法精确得多。然而,为了完整性,我们现在另外将 OBQ 与其他两种也用于独立逐层量化的方法进行比较:BitSplit [6] 和 AdaQuant [19]。此处我们考虑对称逐通道量化 —— 这是 BitSplit 设计的量化模式。此外,我们比较 “原始” 量化性能,即独立压缩后直接的性能,不进行任何额外的统计校正。比较结果总结在表 9 中。
表 9 均匀对称逐通道权重量化

正如预期的那样,OBQ 在所有考虑的模型和位宽上都明显优于其他两种独立方法;在 3 位量化时,精度高出几个百分点;在 2 位量化时,它是唯一在没有任何统计校正的情况下不会完全失效的方法。
A.8 带有 OBQ 的顺序量化
虽然我们主要关注 OBC 的独立应用(这使得能够快速拼接各种混合压缩模型),但也可以以类似最先进训练后量化工作 [31, 19, 24] 的方式顺序应用 OBC。其他方法只需通过将稠密模型输入Xdense替换为压缩模型中的相应输入Xcomp来执行逐层优化,但这对于 OBQ 而言是不够的。如果 Hessian 是在Xcomp上计算的,那么初始稠密权重不再是局部最小值(梯度为 0),因此违反了 OBQ 的一个关键假设。幸运的是,这个问题可以通过以下方式轻松解决:通过线性回归的闭式解W⊤=(XX⊤)−1XY⊤为新输入重新优化稠密权重,之后梯度再次为 0,并且可以正确应用 OBQ。我们注意到,XY⊤是一个dcol×drow矩阵,类似于 OBQ Hessian 2XX⊤,可以轻松在多个批次上累积,而不会显著增加内存消耗。
作为演示,我们将顺序 OBQ 应用于将 ResNet18 量化到各种位宽的任务(与主论文表 4 中的设置相同),结果如表 10 所示。有趣的是,对于 4 位和 3 位量化,结果与独立版本(带有批量归一化统计校正)基本相同;仅在 2 位设置下,似乎有明显的优势 —— 赶上了相应的 BRECQ 结果。对这一现象的更详细研究可能是未来工作的一个有趣方向。
表 10 与顺序 OBQ 的比较

A.9 ImageNet 数据增强的影响
如主提交文本中所述,对于 ImageNet 实验,我们通过标准数据增强将校准集扩展了 10 倍。这主要是为了确保 ResNet50 全连接层对应的 2048×2048 Hessian 是满秩的(仅使用 1024 张图像时情况并非如此),从而避免对阻尼常数进行任何超参数调优。此外,这也应作为一个演示:增强与我们的方法结合使用时成本很低 —— 而对于其他训练后方法而言,情况并非如此,它们要么需要显著增加内存(存储更多激活),要么需要增加运行时(在逐层优化中对每个批次执行整个模型的完整推理)。
现在我们研究这些增强对我们结果的影响 —— 为此,我们重新运行 OBQ(在表 4 的设置中,但不使用增强,而是对 ResNet50 的最后一层使用阻尼λ=1—— 相对于 Hessian 中的值,这实际上是一个相当小的常数)。与原始结果的比较如表 11 所示。
表 11 数据增强的影响

可以看出,使用和不使用数据增强之间的差异通常仅为约 0.1-0.2%。尽管如此,增强与我们的方法结合使用时成本很低(它们只需累积到初始逐层 Hessian 中一次),同时在多种情况下避免了阻尼超参数;因此,我们在 ImageNet 实验中使用了增强。
A.10 对随机种子的敏感性
对于固定的校准数据集,ExactOBS 算法是确定性的。对于 ResNet 模型,校准数据集上应用的数据增强以及批量归一化调优(使用随机采样的批次)会添加少量额外的随机性;对于我们考虑的其他模型,除了校准数据集的初始采样外,没有其他额外的随机性。为了评估我们方法的结果受这些随机因素影响的程度,我们将 ResNet18 量化到 4 位(对称逐通道),并将 ResNet50 剪枝到 2:4 模式,每种情况使用 5 个不同的种子,并报告均值标准差,如表 12 所示。
表 12 OBC 结果的典型随机变化

总之,结果相对于随机种子的变化通常非常小(此处 <0.1%),这与其他训练后方法 [31, 24] 一致。
A.11 复合压缩比较
在主论文中,我们专注于量化和剪枝的独立比较,因为现有方法通常仅设计用于单一压缩方法。在本节中,我们另外提供了我们 GPU 和 CPU 场景的复合比较 —— 这些场景结合了稀疏性和量化。具体而言,我们通过在我们的混合设置中用最佳独立逐层剪枝和量化方法(分别为 AdaPrune 和 AdaQuant)替换 OBC,构建了一个强大的基线。现在我们在图 5、6 和 7 中提供了主论文图 3 中所有实验的详细比较。
总之,正如预期的那样,第 6 节实验中显示的单个压缩类型的精度改进也转移到了复合设置中。更具体地说,对于主论文中强调的缩减目标范围(ResNet 模型为 12-14 倍,其他模型为 7-8 倍),OBC 和 AdaPruneQuant 基线之间存在一致的 0.5-1.5 个百分点的差距。对于较低的 BOP 缩减 / 推理时间加速目标,差距通常较小 —— 这符合预期,因为仅需将不太敏感的层压缩到通常非常容易的 8 位级别以上。相反,对于最高目标(也需要对敏感层进行高压缩),差距最大 —— 因为在这些情况下,OBC 更精确的逐层压缩的效果变得特别明显。

图 5 ResNet 模型各种 BOP 缩减目标下的混合量化和 2:4 剪枝

图 6 BERT 模型各种 BOP 缩减目标下的混合量化和 2:4 剪枝

图 7 (a)和(b)YOLO 模型各种 BOP 缩减目标下的混合量化和 2:4 剪枝;(c)ResNet50 上实时 CPU 推理加速目标下的块稀疏性和量化
更多推荐

所有评论(0)