一、论文基本信息

论文题目:SparseGPT: Massive Language Models Can Be Accurately Pruned in One-Shot

作者:Elias Frantar、Dan Alistarh

发表:ICML 2023

官方代码:IST-DASLab/sparsegpt。官方仓库说明它提供了 OPT、BLOOM 上的非结构化剪枝、N:M 半结构化剪枝,以及 sparse + quantized 压缩实验代码。(GitHub)

这篇论文的核心目标非常明确:

不重新训练、不微调,只用少量校准数据,一次性把超大语言模型剪到高稀疏率。

论文摘要中最重要的结论是:SparseGPT 可以把 GPT 类大模型剪到至少 50% sparsity,几乎不损失精度;在 OPT-175B 和 BLOOM-176B 上,SparseGPT 可以在 4.5 小时以内完成剪枝,并且在 60% 非结构化稀疏下仍然只有很小的 perplexity 增加。(arXiv)


二、这篇论文要解决什么问题?

LLM 参数量巨大,推理成本很高。以 OPT-175B、BLOOM-176B 这类模型为例,参数量达到千亿级,模型存储、显存占用、推理带宽和计算成本都非常高。

传统剪枝方法通常需要:

训练 dense 模型。

剪掉部分参数。

再训练或微调恢复性能。

但对 LLM 来说,这个流程成本太高。一个 100B+ 模型重新训练或大规模微调本身就非常昂贵,因此普通 pruning + retraining 流程不现实。

SparseGPT 要解决的问题就是:

能不能只用少量样本校准,不做 retraining,一次性把 LLM 中大量权重剪掉,并且保持模型困惑度和下游能力基本不变?

这就是标题里的 one-shot pruning


三、核心思想

SparseGPT 的核心思想是:

把每一层权重剪枝问题转化为一个局部稀疏重构问题:剪掉一部分权重后,尽量让该层输出保持不变。

也就是说,它不是直接问:

哪个权重绝对值小,就删掉哪个?

而是问:

如果我删掉某些权重,能不能同时调整剩余权重,让这一层在校准数据上的输出尽量接近原模型?

这个思想很关键。

普通 magnitude pruning 只看权重大小:

权重大,保留。

权重小,删除。

SparseGPT 则考虑输入激活分布和权重之间的耦合关系。一个权重小,不一定不重要;一个权重大,也不一定不能删。真正重要的是:

删掉它以后,该层输出误差会不会变大。

所以 SparseGPT 属于:

post-training pruning。

one-shot pruning。

second-order / Hessian-aware pruning。

layer-wise sparse reconstruction。

它剪的是 LLM 中线性层权重,不是 token、不是 layer、不是 attention head。


四、SparseGPT 剪的是什么?

SparseGPT 主要剪的是:

Transformer 中线性层的单个权重。

包括:

attention 里的 Q、K、V、O projection。

MLP / FFN 里的 up、gate、down projection。

它不剪:

token。

attention head。

Transformer layer。

hidden dimension。

KV cache。

所以 SparseGPT 本质上是 权重级非结构化剪枝

它也支持 N:M 半结构化稀疏,例如 2:4 或 4:8。论文和官方仓库都提到 SparseGPT 可以做 unstructured sparsity,也可以做 N:M sparsity,并且兼容量化。(arXiv)


五、为什么不能只用 magnitude pruning?

在小模型或 CNN 中,magnitude pruning 经常是一个强 baseline。但 LLM 的情况更复杂。

LLM 的线性层输入激活分布非常不均匀。有些通道激活很大,有些通道激活很小。一个权重是否重要,不能只看它自己的数值大小,还要看:

它连接的输入激活是否常出现。

它和同一行其他权重是否可以互相补偿。

删掉它后输出误差能不能被剩余权重修正。

举个直观例子:

一个权重数值不大,但它对应的输入通道在校准数据中经常出现且激活很强,那么删掉它可能影响很大。

反过来,一个权重数值较大,但对应输入激活很少出现,或者可以被其他权重补偿,那么它未必不可删。

所以 SparseGPT 不是简单剪小权重,而是使用近似 Hessian 信息来估计:

剪掉某个权重后,输出重构误差会增加多少。


六、SparseGPT 的数学目标怎么理解?

对某一层线性层,原始输出可以写成:

Y = W X

其中:

W 是该层权重。

X 是校准样本经过该层时的输入激活。

SparseGPT 要找到一个稀疏权重矩阵 Ŵ,使得:

Ŵ X 尽量接近 W X。

也就是让剪枝后该层输出尽量不变。

所以它的局部目标可以理解为:

在满足指定稀疏率的前提下,最小化该层输出重构误差。

这和很多 CNN 剪枝里的 reconstruction-based pruning 很像,但 SparseGPT 的难点是:LLM 的矩阵非常大,普通二阶剪枝或稀疏回归方法直接用会算不动。

SparseGPT 的贡献就在于,它设计了一个足够高效的近似解法,可以把这个思想扩展到 100B+ 参数模型。


七、为什么叫 Hessian-aware?

SparseGPT 用到的是输入激活的二阶信息。

对线性层的重构误差来说,关键矩阵近似是:

H = X Xᵀ

它可以看成这一层输入激活相关的 Hessian 近似。

如果某个输入方向方差很大,说明模型经常在这个方向上工作,相关权重被改动后输出误差会更明显。

如果某些输入方向相关性很强,那么删掉某个权重后,其他权重可以通过补偿更新来减少误差。

因此 SparseGPT 的重要性不是单个权重孤立计算,而是结合了:

权重值。

输入激活统计。

Hessian 逆矩阵中的补偿关系。

这也是它比简单 magnitude pruning 更准的根本原因。


八、Optimal Brain Surgeon 思想

SparseGPT 和经典的 Optimal Brain Surgeon, OBS 思想有关系。

OBS 的核心是:

删掉一个权重后,不是让其他权重不变,而是对剩余权重做最优补偿更新,使 loss 增加最小。

SparseGPT 把这个思想用到 LLM 的每一层线性权重上。

直观流程是:

选择一个要剪掉的权重。

根据 Hessian 逆矩阵估计剪掉它造成的误差。

把这个权重置零。

同时更新同一行其他未剪权重,补偿输出误差。

所以 SparseGPT 的关键不是“剪”,而是:

剪掉权重以后如何修正剩余权重。

这就是它能在 one-shot 设置下保持精度的原因。


九、为什么是 layer-wise?

SparseGPT 不是全模型一起优化所有权重,而是逐层处理。

流程大致是:

第一,收集校准数据在当前层的输入激活。

第二,对当前线性层计算近似 Hessian。

第三,对该层权重做稀疏剪枝和误差补偿。

第四,把剪枝后的输出继续传给下一层。

第五,处理下一层。

这种 layer-wise 方式有两个好处:

第一,内存可控。
如果对整个 175B 模型同时构造二阶信息,完全不可行。逐层处理只需要当前层的激活统计和权重。

第二,误差逐层传播更现实。
剪完前一层后,后一层看到的是剪枝模型产生的激活,而不是原 dense 模型激活。这样后续层可以在实际剪枝后的输入分布上继续压缩。

这也是 SparseGPT 能扩展到 OPT-175B、BLOOM-176B 的关键工程设计。


十、为什么可以只用少量校准数据?

SparseGPT 不需要训练集完整数据,也不需要反向传播更新整个模型。它只需要少量文本样本,用来估计每层输入激活分布。

这些校准样本的作用是:

收集 X。

估计 H = X Xᵀ。

让每层重构时知道模型真实输入分布。

所以 SparseGPT 的数据需求远低于微调。它不是通过大量训练恢复模型能力,而是通过局部二阶重构尽量保留原模型行为。

这就是 post-training pruning 的核心优势:

压缩成本低。

不依赖大规模训练资源。

适合已有大模型快速压缩。


十一、SparseGPT 的剪枝流程

SparseGPT 的流程可以理解为六步。

第一,加载预训练 LLM。

例如 OPT、BLOOM 这类 decoder-only Transformer。

第二,准备少量校准文本。

用这些文本跑一次前向,收集每层输入激活。

第三,逐层处理权重矩阵。

对于某一层线性矩阵,SparseGPT 计算输入 Hessian 近似。

第四,按块处理列。

为了节省显存和提高效率,它不会一次处理整个巨大矩阵,而是把权重列分块处理。

第五,剪掉指定比例权重,并更新剩余权重。

用二阶近似估计剪枝误差,并执行误差补偿。

第六,进入下一层。

整模型剪完后,不需要 retraining,直接评估 perplexity 或下游任务。


十二、One-shot 的含义

SparseGPT 的 one-shot 有两层含义。

第一,不做剪枝—微调—再剪枝—再微调的迭代流程。

传统 pruning 常常多轮剪枝,每轮之后微调恢复。SparseGPT 不这样做。

第二,不重新训练模型。

它只用校准数据做一次局部重构,剪完后直接得到稀疏模型。

所以 one-shot 不代表“随便剪一次”,而是:

用一次系统的 layer-wise 二阶重构过程完成全模型剪枝。

这是它对 LLM 压缩最大的意义。


十三、实验模型和数据

论文主要实验模型包括:

OPT 系列。

BLOOM 系列。

其中最大模型包括:

OPT-175B。

BLOOM-176B。

论文摘要明确说,SparseGPT 可以在 OPT-175B 和 BLOOM-176B 上运行,并在 4.5 小时以内完成;这在当时是首次展示 GPT 规模模型可被准确 one-shot 剪枝到高稀疏率。(arXiv)

评估指标主要包括:

perplexity。

zero-shot accuracy。

不同稀疏模式下的性能。

数据集包括 WikiText2、PTB、C4 subset 等,官方代码也提供了这些数据集上的 baseline 和 pruned model evaluation 脚本。(GitHub)


十四、主要实验结论

14.1 50% 非结构化稀疏几乎无损

论文最核心结论是:

大规模 GPT-family 模型可以被剪到至少 50% sparsity,而且不需要 retraining,精度损失很小。

这在 LLM 剪枝中非常重要。因为在 SparseGPT 之前,很多人认为千亿参数级语言模型很难 one-shot 剪枝,尤其是高稀疏率下 perplexity 会明显恶化。

SparseGPT 证明:只要使用二阶重构和误差补偿,50% 非结构化稀疏是可行的。


14.2 模型越大,越容易剪

SparseGPT 的一个重要经验结论是:

越大的模型,对同等稀疏率越鲁棒。

小模型剪到 50% 可能会有明显损失;但 OPT-175B、BLOOM-176B 这类超大模型在 50% 甚至 60% 稀疏下仍然比较稳。

直观原因是:

大模型过参数化更强。

权重冗余更多。

不同权重之间可补偿空间更大。

所以 LLM 剪枝和小模型剪枝不同:大模型虽然绝对规模巨大,但也可能更容易在相对比例上剪掉大量权重。


14.3 60% 非结构化稀疏仍然可用

论文摘要提到,SparseGPT 在大模型上可以达到 60% unstructured sparsity,perplexity 增加仍然很小;这意味着对于 175B 量级模型,超过 100B 权重可以在推理时被忽略。(arXiv)

这个结论很强,但需要注意:

“权重被忽略”不等于普通硬件上自动 2.5× 加速。

非结构化稀疏需要专门 sparse kernel 或稀疏硬件支持。否则在普通 dense matmul 中,即使权重为 0,也可能仍然按 dense 矩阵计算。


14.4 N:M 半结构化稀疏也可行,但更难

SparseGPT 也支持 2:4、4:8 这类半结构化稀疏。官方代码说明支持 unstructured、N:M 和 sparse + quantized SparseGPT compression。(GitHub)

N:M 稀疏更硬件友好。例如 NVIDIA Ampere 之后的稀疏 Tensor Core 对 2:4 稀疏有专门支持。

但半结构化稀疏比自由非结构化稀疏更受限制。因为模型不能任意选择全局最不重要的 50% 权重,而必须在每个小组里满足固定模式,例如每 4 个权重只能保留 2 个。

所以一般来说:

非结构化稀疏精度更好,但硬件利用更难。

N:M 稀疏硬件更友好,但精度约束更强。

SparseGPT 的意义在于:它两者都能做。


十五、SparseGPT 和量化的关系

SparseGPT 还可以和量化结合。

官方代码说明支持 sparse + quantized compression。(GitHub)

这很自然,因为剪枝和量化压缩的是两个不同维度:

剪枝减少有效非零权重数量。

量化减少每个权重的比特数。

例如,一个模型可以先剪到 50% 稀疏,再把剩余权重量化到 4-bit 或 8-bit。这样可以同时降低:

存储。

显存带宽。

推理时权重加载成本。

不过实际加速仍取决于推理框架是否能同时高效支持:

低比特。

稀疏。

大矩阵乘法。


十六、SparseGPT 的真实部署意义

SparseGPT 论文中常说“100 billion weights can be ignored at inference time”。这句话很重要,但要正确理解。

它意味着:

从模型功能角度看,这些权重可以置零,不参与计算。

但它不必然意味着:

在普通 dense GPU 推理中立刻获得同等比例速度提升。

原因是:

非结构化稀疏矩阵乘法需要专门 kernel。

稀疏索引和不规则访存也有开销。

LLM 推理很多时候受 memory bandwidth、KV cache、batch size 影响。

如果框架仍按 dense 矩阵存储和计算,置零权重不会省时。

所以 SparseGPT 的主要价值首先是:

证明 LLM 权重存在可 one-shot 去除的大量冗余。

部署层面的速度收益还需要稀疏 kernel、N:M 稀疏硬件或稀疏推理框架配合。


十七、和 GPTQ 的关系

SparseGPT 和 GPTQ 很接近,因为它们都来自同一类思想:

用二阶近似做 post-training compression。

GPTQ 主要做 weight quantization:把权重量化成低比特,同时通过 Hessian 逆矩阵补偿量化误差。

SparseGPT 主要做 weight pruning:把部分权重置零,同时通过 Hessian 逆矩阵补偿剪枝误差。

两者共同点是:

都不需要完整 retraining。

都逐层处理。

都使用校准数据估计输入 Hessian。

都通过误差补偿更新剩余权重。

区别是:

GPTQ:权重还在,但数值低比特化。

SparseGPT:部分权重直接变成 0。

所以 SparseGPT 可以看成 GPTQ 式 post-training 二阶压缩思想在剪枝上的扩展。


十八、和 Wanda 的区别

Wanda 是另一个很重要的 LLM one-shot pruning 方法。它的思想更简单:用 weight magnitude × input activation norm 来打分,不做复杂二阶重构。

区别可以这样理解:

SparseGPT:二阶重构 + 权重补偿,精度更强但计算更复杂。

Wanda:activation-aware magnitude score,简单快速,不需要显式 Hessian 逆补偿。

SparseGPT 更像精细的 OBS/GPTQ 风格方法;Wanda 更像高效打分方法。

如果目标是最大限度降低 perplexity,SparseGPT 通常是强基线。

如果目标是实现简单、速度快、成本低,Wanda 这类方法更有吸引力。


十九、和传统 pruning 的区别

传统 LLM 或 NLP pruning 常见有几类:

Magnitude pruning:按权重大小剪。

Movement pruning:看 fine-tuning 时权重运动方向。

Structured pruning:剪 heads、FFN neurons、layers。

Lottery ticket / sparse training:训练过程中找稀疏子网。

SparseGPT 不属于这些传统路径。

它的定位是:

post-training one-shot unstructured pruning。

它不需要 fine-tuning,所以不同于 movement pruning。

它剪单个权重,所以不同于 head/layer/FFN structured pruning。

它从 dense pretrained model 出发,所以不同于 sparse training。

它使用二阶重构,所以明显强于简单 magnitude pruning。


二十、和 ViT 剪枝论文的关系

你前面看了很多 ViT 论文,例如 VTP、NViT、UVC、SViTE、ViT-Slim 等。SparseGPT 和它们有明显不同。

VTP / NViT / ViT-Slim:
多数是结构化剪枝,目标是得到更小 dense 模型,方便真实加速。

SparseGPT:
主要是非结构化权重稀疏,目标是快速 one-shot 去除 LLM 中大量冗余权重。

ViT token pruning:
减少 token 数,不一定减少参数。

SparseGPT:
减少非零权重,不改变 token 数、layer 数、hidden size。

所以 SparseGPT 更适合放在:

LLM post-training pruning / weight sparsification。

而不是 ViT token pruning 或结构化压缩类别。


二十一、方法优点

第一,真正 one-shot。
不需要 retraining 或微调,对超大模型非常重要。

第二,适用于 100B+ 参数规模。
论文在 OPT-175B 和 BLOOM-176B 上完成剪枝,说明方法在工程上可以扩展到超大模型。(arXiv)

第三,精度保持强。
50% 非结构化稀疏下,大模型 perplexity 增加很小;60% 稀疏在大模型上也仍然可用。(arXiv)

第四,二阶误差补偿比 magnitude 更可靠。
它考虑输入激活统计和权重间补偿关系,而不是孤立看权重大小。

第五,兼容 N:M 稀疏和量化。
官方代码支持 unstructured、N:M 以及 sparse + quantized 压缩。(GitHub)


二十二、方法局限

第一,非结构化稀疏不一定直接带来真实加速。
没有稀疏 kernel 或稀疏硬件时,置零权重可能仍按 dense matmul 计算。

第二,仍然需要存储和处理稀疏索引。
非结构化稀疏虽然减少非零权重,但稀疏格式会引入 index overhead,实际存储收益取决于稀疏率和编码方式。

第三,不改变模型结构。
hidden size、层数、attention head 数都不变,所以 KV cache、activation shape 和通信模式基本不变。

第四,剪枝计算本身有成本。
虽然比 retraining 便宜很多,但 SparseGPT 需要逐层收集激活、计算 Hessian 近似和补偿更新。对 100B+ 模型仍然需要数小时级处理。

第五,极高稀疏率下性能会明显下降。
50% 通常比较稳,60% 在超大模型上仍可接受,但继续提高稀疏率会明显恶化 perplexity,尤其小模型更敏感。


二十三、整体评价

SparseGPT 是 LLM 剪枝方向的一篇里程碑论文。

它的重要性不只是提出一个剪枝算法,而是证明了一个此前并不确定的事实:

超大 GPT 类模型可以在不重新训练的情况下,被一次性剪掉大量权重。

这对 LLM 压缩意义很大。因为对千亿模型来说,retraining 太贵,fine-tuning 也不总是可行。SparseGPT 把压缩过程变成一个 calibration-based post-training procedure,大幅降低了 LLM 剪枝门槛。

它的核心技术路线可以概括为:

不是简单删小权重,而是做 layer-wise 二阶稀疏重构。

不是剪完就结束,而是剪一个权重后补偿剩余权重。

不是为了得到小 dense 模型,而是为了得到高稀疏权重矩阵。

所以它特别适合被放在:

LLM one-shot pruning。

post-training sparsification。

Hessian-aware compression。

这个方向后来也影响了 Wanda、SparseGPT variants、OWL、DSnoT 等一批 LLM 剪枝方法。


二十四、一句话总结

《SparseGPT: Massive Language Models Can Be Accurately Pruned in One-Shot》提出一种面向超大语言模型的 one-shot 权重剪枝方法:它将每个线性层的剪枝转化为稀疏重构问题,用少量校准数据估计输入 Hessian,并借鉴 Optimal Brain Surgeon 思想,在剪掉权重的同时对剩余权重做二阶误差补偿。SparseGPT 不需要 retraining,就能把 OPT-175B、BLOOM-176B 等 GPT 类模型剪到 50% 甚至 60% 非结构化稀疏,perplexity 增加很小;它的核心价值是证明 LLM 中存在可通过 post-training 二阶重构高效去除的大量权重冗余,但真实推理加速仍依赖稀疏 kernel 或 N:M 稀疏硬件支持。

更多推荐