如果你曾经尝试在单张消费级 GPU 上运行像 Llama-2 这样最先进的大型语言模型 (LLM) 或像 Segment Anything (SAM) 这样的视觉模型,你一定深知其中的艰难。这些模型体量巨大。70 亿参数的模型通常是像样的桌面级 GPU 进行推理的上限,更不用说微调了。
为了高效部署这些模型,我们通常求助于剪枝 (Pruning) ——即移除不必要的权重以使模型更小、更快的过程。然而,这里有个陷阱。目前的“一次性 (one-shot) ”剪枝方法 (速度快且无需昂贵的重训练) 在移除 20% 或 30% 的权重时效果很好。但如果你试图将稀疏度推高到 50% 或 70% 以显著减小模型尺寸时,性能就会崩塌。
为什么会发生这种情况?我们如何在不需要 A100 集群的情况下解决这个问题?
在这篇文章中,我们将深入探讨一篇 CVPR 论文,题为 “ICP: Immediate Compensation Pruning for Mid-to-high Sparsity” (ICP: 面向中高稀疏度的即时补偿剪枝) 。 研究人员提出了一种巧妙的技术,平衡了一次性剪枝的速度与全量微调的准确性,使得在标准硬件上实现高稀疏度成为可能。
问题所在: 误差雪球效应
要理解解决方案,我们首先需要明白为什么现有方法在高稀疏度下会失效。
大多数高效的剪枝方法,如 SparseGPT 或 Wanda,都是基于“逐层”操作的。它们观察一层,找出哪些权重最不重要,将其移除,也许再对剩余权重做一点局部调整以最小化损失。然后它们移向下一层。
问题在于,这些方法在某种程度上是将各层独立对待的。它们没有充分考虑到第一层引入的一个微小误差可能会被第二层放大,然后被 third 层扭曲,以此类推。当数据到达网络末端时,累积的误差已经非常巨大。
ICP 的研究人员清晰地展示了这一现象。

在 图 1 中,你可以看到均方误差 (MSE) 随着网络深度的增加 (从第 15 层到第 23 层) 而累积。注意蓝线 (50% 稀疏度) 和绿线 (70% 稀疏度) 之间的区别。在更高的稀疏度水平下,误差不仅仅是线性增长;它是爆炸式增长。这表明,要让高稀疏度变得可行,我们需要在误差传播的源头将其截断。
解决方案: 即时补偿剪枝 (ICP)
ICP 的核心洞察简单而深刻: 如果你在一层中破坏了某些东西,就在下一层立即修复它。
传统的迭代剪枝 (如彩票假设) 是剪枝整个模型,然后微调整个模型。这可以修复误差,但需要巨大的 GPU 显存。另一方面,像 Wanda 这样的方法在剪枝时没有任何重训练,这节省了显存但忽略了误差漂移。
ICP 处于两者之间。它创建了一个包含两个块的“滑动窗口”。当它剪枝块 \(N\) 时,它立即使用块 \(N+1\) 来补偿损失。

如 图 2 所示,标准方法 (a) 顺序或同时剪枝所有块,块之间没有交互。在 ICP (b) 中,当块 \(t\) 被剪枝 (由剪刀表示) 后,算法会调整块 \(t+1\) 的权重 (由火图标表示) ,以适应块 \(t\) 变化的输出。这防止了“误差雪球”滚向更深层。
机制: 逐块补偿剪枝 (Block-wise Compensate Pruning)
让我们从算法角度详细拆解这是如何工作的。该方法专注于 Transformer 架构,该架构由堆叠的块 (包含注意力机制和前馈网络) 组成。
作者使用了一种他们称为逐块补偿剪枝的技术。以下是逐步逻辑:
- 滑动窗口: 想象一个覆盖两个块的窗口: Block \(i\) 和 Block \(i+1\)。
- 分流: 我们取校准数据 (一小部分样本) 并将其复制。
- 标准流 (Standard Stream) : 这是“理想”路径。数据通过未剪枝的 Block \(i\),然后通过原始的 Block \(i+1\)。这给了我们目标输出——即模型应该产生什么。
- 误差流 (Error Stream) : 这是“现实”路径。数据通过已剪枝的 Block \(i\)。由于移除了权重,这里的输出是有偏差/噪声的。
- 补偿: 我们获取已剪枝 Block \(i\) 的有偏差输出,并将其输入到 Block \(i+1\)。然后我们训练 (微调) Block \(i+1\) 的权重,使其输出与“标准流”的目标相匹配。
通过这样做,Block \(i+1\) 学会了“清理”剪枝 Block \(i\) 造成的混乱。网络实际上“忘记”了 Block \(i\) 受损,因为 Block \(i+1\) 已经调整了其内部处理以校正信号。

图 3(a) 可视化了这个滑动窗口。你可以看到“标准流” (上方路径,具有干净、未剪枝的权重) 为“误差流” (下方发生剪枝的路径) 生成标签。关键在于,这每次只需要将一两个块加载到 GPU 显存中,与全模型微调相比,极大地降低了显存占用。
稀疏度重排 (Sparsity Rearrangement)
剪枝掉模型 50% 的权重并不意味着你应该对每一层都精确地剪掉 50%。模型的某些部分比其他部分更冗余。作者引入了两种重排策略来优化“动刀”的位置。
1. 块间重排 (Inter-Block Rearrangement)
“在下一层修复”的策略有一个缺陷: 最后一个块怎么办?
如果你剪枝模型的最后一个块 (Block \(n\)) ,就没有 Block \(n+1\) 来补偿误差了。因此,最后一个块中的误差是永久性的。为了缓解这个问题,作者建议将部分剪枝负担从最后一个块移走,并分配给前面的块 (因为前面的块可以被补偿) 。
最后一个块的稀疏度 (\(P_{B^n}\)) 计算如下:

这里,\(\alpha\) 是一个参数 (通常在 0.6 到 0.9 之间) 。如果 \(\alpha < 1\),则最后一个块的剪枝量少于目标稀疏度 \(s\)。
从最后一个块“节省”下来的权重随后被添加到所有先前块的剪枝目标中 (\(P_{B^j}\)):

这确保了被移除参数的总数保持不变,但关键的最后一层得到了保护。
2. 块内重排 (Intra-Block Rearrangement)
在一个 Transformer 块内部,并非所有层都是生而平等的。一个块通常包含:
- Q, K, V 矩阵: 这些驱动自注意力机制。它们在数学上位于块的“深处”。
- 输出投影和前馈 (FC) 层: 这些更靠近块的输出端。
作者意识到,Q、K 和 V 矩阵中的误差更难补偿,因为它们在离开该块之前还要经过复杂的非线性注意力操作。然而,第二个全连接层 (fc2) 就在出口处。调整 fc2 要容易得多。
因此,他们通过减少剪枝量来保护 Q、K、V 矩阵:

并通过更激进地剪枝 fc2 层来进行补偿:

这里,\(\beta\) 控制这种转移。这种“块内”策略确保了最敏感的内部机制 (注意力) 被保留,而鲁棒性较强的输出层承担了更多剪枝任务。
图 3(b) 突出显示了这些层。Q、K 和 V 权重 (内层) 与外层被区别对待,以最大化补偿的有效性。
实验结果
这个理论在实践中站得住脚吗?研究人员在单张 NVIDIA RTX 3090 上,对大型语言模型 (OPT, Llama-2) 和视觉模型 (SAM) 测试了 ICP。
语言模型性能
让我们看看 OPT-125M 模型在 Wikitext-v2 数据集上的表现。困惑度 (PPL) 越低越好。

在 表 1 中,查看 70% 稀疏度这一列。
- Magnitude Pruning (幅度剪枝,一种基础基线) 完全破坏了模型 (PPL: 3806) 。
- SparseGPT 达到 220.9。
- Wanda 达到 328.2。
- ICP (Ours) 保持了 65.20 的困惑度。
这是一个巨大的提升。当基线方法在 70% 稀疏度下退化成乱码时,ICP 保持了模型的功能性。这一趋势在像 OPT-1.3B 和 OPT-6.7B 这样更大的模型上也依然成立,ICP 始终优于竞争对手。
对于流行的 Llama 2-7B 模型在 Zero-Shot 任务 (模型未经过显式训练的推理任务) 上的表现,结果同样令人印象深刻。

在 表 3 中,在 70% 稀疏度下,ICP 达到了 46.94% 的平均准确率,相比之下 SparseGPT 为 41.79%,Wanda 为 34.34%。这个差距代表了一个可用的压缩模型和一个损坏模型之间的区别。
视觉模型性能
作者还将 ICP 应用于 Segment Anything Model (SAM) 。 这里的指标是交并比 (IoU) ——越高越好。

查看 表 4 (SAM-H 模型) 在 90% 稀疏度 (极度压缩) 下的数据:
- SparseGPT: 18.15% IoU
- Wanda: 1.20% IoU (彻底失败)
- ICP: 57.60% IoU
这个结果令人咋舌。Wanda 依赖于特定于语言模型的先验知识,因此在视觉任务中经常失效。然而,ICP 依赖于网络的结构 (块) 而非特定数据的统计特征,这使得它对视觉 Transformer 也非常有效。
内存与时间效率
学生和爱好者通常最关心一个指标: 这能在我的硬件上运行吗?
作者比较了修剪 OPT-6.7B 模型所需的 GPU 显存使用量 (峰值显存使用量或 PMU) 和时间。

表 9 带来了好消息:
- 内存: ICP 使用 7.8 GB 的峰值显存。这实际上比 SparseGPT (8.3 GB) 更低,且显著低于 Wanda (21 GB)。这意味着你可以在标准的 10GB 或 12GB 消费级 GPU 上修剪 7B 模型。
- 时间: ICP 比超快的 Wanda 慢 (1551秒 vs 143秒) ,但与 SparseGPT 相当。考虑到在高稀疏度下巨大的性能提升,等待约 25 分钟 (1551秒) 而不是 2 分钟,是大多数用户乐意接受的权衡。
调整参数 (消融实验)
最后,\(\alpha\) (块间) 和 \(\beta\) (块内) 这两个参数到底有多重要?

- (注: 参考图片组中提供的组合图 4) *
图 4 中的图表 (特别是图组内的 a, c, e, g) 显示:
- 敏感性: 性能对 \(\alpha\) 和 \(\beta\) 很敏感。例如,找到 \(\beta\) (块内重排) 的“甜蜜点”可以显著降低困惑度。
- 补偿轮次 (Compensation Epochs): 我们需要训练 Block \(i+1\) 多久来修复 Block \(i\)?图表 (g) 显示仅需 1 个 epoch 就足以获得大部分收益。训练 12 个 epoch 虽有轻微帮助,但边际收益递减很快。这也解释了该方法为何高效——它不需要漫长的训练循环。
结论
“ICP: Immediate Compensation Pruning” 这篇论文为大模型的民主化提供了一个令人信服的解决方案。通过认识到剪枝误差会传播并产生雪球效应,作者设计了一种方法,在误差扩散之前就在局部将其清理干净。
对于学生和研究人员来说,关键要点是:
- 逐块补偿: 你可以“逐块”微调模型以节省显存,同时仍能获得误差校正的好处。
- 稀疏度并非均匀: 你应该减少模型末端的剪枝量 (块间) 和注意力矩阵的剪枝量 (块内) ,以保留性能。
- 高稀疏度是可能的: 我们可以移除模型 50-70% 的权重并仍保持其功能,前提是我们能智能地补偿损失。
ICP 弥补了计算昂贵的全量微调与计算廉价 (但不准确) 的一次性剪枝之间的差距。它为你能在宿舍或家庭办公室的硬件上运行强大的 7B+ 参数模型铺平了道路。
](https://deep-paper.org/en/paper/file-2078/images/cover.png)