一篇读懂模型剪枝:比量化更激进的结构化压缩

剪枝与量化:两条压缩路线的本质区别

一个把权重置零,一个把权重变窄

压缩一个大模型的所有技术都可以归入两个正交的轴:把数值变窄(量化,int8/int4 甚至更低比特)与把参数变少(剪枝,把某些权重直接置零或整列删除)。两者可以叠加——一个 4-bit 的 50% 稀疏模型理论压缩率是两者的乘积。但它们的工程性质完全不同:量化在权重数值精度上做文章,硬件支持已经成熟(int8/int4 的 GPU 反量化矩阵乘在主流推理引擎里都是一等公民),因此成为生产标配;剪枝则要看稀疏的形状——非结构化稀疏(任意位置置零)在 GPU 上几乎无法加速,因为稠密矩阵乘硬件根本不为随机零值省时间,只有特定模式(如 2:4)或结构化剪枝(整行、整列、整个注意力头、整层 FFN 删除)才能真正兑现推理加速。

这条区别决定了本文的叙事主线:剪枝的价值从来不在「省显存存权重」(量化更便宜),而在减少实际计算量——删掉的参数不再参与矩阵乘,FLOPs 真实下降。理解这一点后,评估任何剪枝工作的正确框架就清晰了:压缩了多少 FLOPs、以多少质量损失为代价、加速是否在真实硬件上可测量。

稀疏性的真实收益边界

先把收益数字放在桌面上。非结构化稀疏在 GPU 上理论上有加速潜力(跳过零值计算),但真实负载里稀疏模式不规则导致访存与核函数调度开销吃掉大部分收益,端到端通常不到 1.2 倍,不值得为此放弃稠密 kernel 的高度优化。半结构化的 2:4 稀疏(每 4 个连续权重里 2 个非零)是 NVIDIA Ampere 起硬件直接支持的格式,sparse tensor core 宣称理论峰值翻倍,实测端到端加速在 1.3 到 1.5 倍之间(权重加载与激活计算不稀疏,吃掉一部分)。结构化剪枝的加速与删除比例成正比:删 25% 的通道接近 1.25 倍的计算减少,删一半注意力头接近一半的注意力 FLOPs——这是唯一能「承诺」加速的路线,代价是删结构比删单个权重的质量损失更难控制。

非结构化剪枝:SparseGPT 与 Wanda

SparseGPT:把剪枝写成一个逐层回归问题

非结构化剪枝在 BERT 时代的方法(magnitude pruning 全局按绝对值排序置零)在 LLM 上全线失效:大模型权重的绝对值大小与重要性弱相关。真正的突破是 SparseGPT(Frantar 与 Alistarh,ICML 2023,arXiv 2301.00774)。它把「剪掉哪些权重」写成 Optimal Brain Surgeon 式的最小化问题:对每一层,删除权重集合 S 后的输出误差最小化,利用海森矩阵的逆解析求解——删一个权重的最优补偿是把误差按海森逆矩阵加权摊给同行剩余权重,每个被删的权重都伴随一次全行的数值微调。由于海森矩阵可以由层输入的协方差闭式构造(不需要反向传播),整个过程是纯前向的逐层流水。

实操数字是这篇工作最惊人的部分:对 1760 亿参数的 BLOOM,在单张消费级 GPU 上数小时内剪到 50% 稀疏度,困惑度上升不到 0.25;60% 稀疏度仍可用,70% 开始明显崩坏。对比之下,同稀疏度下的 magnitude pruning 困惑度早已不可收敛。SparseGPT 证明了 LLM 里存在「几乎免费」的 50% 非结构化稀疏——免费指的是质量,不是速度(如前所述非结构化稀疏在 GPU 上换不来真实加速),它的真实用途是与其他方法叠加、以及在支持稀疏的专用硬件上的前景储备。

Wanda:一行公式的智慧

SparseGPT 之后,Wanda(Pruning by Weights and Activations,Sun 等人,2023,arXiv 2306.11695)给出了一个极简得多的答案:权重重要性 = 权重的绝对值 × 对应输入激活的范数,即 |W_ij| × ||X_j||。全局按这个分数排序,砍掉最小的 50%,不做任何补偿更新。直觉来源是对层输出误差的一阶近似:权重 w_j 对输出的贡献是 w_j·x_j,删除它的代价上界由权重幅度与激活幅度的乘积决定——激活范数大的通道(信息流量大)删除代价高,这个信息 magnitude pruning 完全没利用。结果是这个一行公式在 50% 稀疏度上与 SparseGPT 相当(LLaMA-7B 上 perplexity 差距在 0.1 以内),在 60% 以上稀疏度略逊,但实现零门槛、无超参、速度比 SparseGPT 快一个数量级。工程结论明确:非结构化剪枝首选 Wanda 做基线,需要极限稀疏度再上 SparseGPT。

# Wanda 的核心:|W| * ||X||,十几行搞定 50% 稀疏
import torch

@torch.no_grad()
def wanda_prune(W, X, sparsity=0.5):
    # W: [out, in] 权重; X: [N, in] 校准集的层输入激活
    act_norm = X.norm(p=2, dim=0)            # 每个输入通道的激活范数 [in]
    score = W.abs() * act_norm               # 广播成 [out, in] 重要性
    thresh = torch.quantile(score.flatten(), sparsity)
    mask = (score > thresh).float()
    return W * mask, mask                    # 置零后的权重与稀疏掩码

2:4 半结构化:硬件给的折扣

介于两者之间的是 2:4 半结构化稀疏:每四个连续权重恰好两个非零,NVIDIA Ampere/Hopper 的 sparse tensor core 原生支持。实现上就是 Wanda 或 SparseGPT 打分后按每行每 4 元素组保留 top 2。质量上 2:4 比 50% 全局稀疏损失大(模式约束牺牲了自由度),LLaMA-7B 上 perplexity 上升从 0.3 到 1 点以上不等(视方法与校准集),端到端加速 1.3 到 1.5 倍。它的定位是「有确定硬件红利时的工程选择」,在稀疏感知训练(如 NVIDIA 的 ASP 流程,训练时周期性强制掩码)加持下损失可以收窄。

结构化剪枝:把矩阵真的变小

LLM-Pruner:什么结构值得删

结构化剪枝删除的是完整的功能单元:注意力头、FFN 的中间通道(等价于删 W1 的列与 W2 的行)、整层。LLM-Pruner(Ma 等人,2023,arXiv 2306.11695)回答了第一个关键问题:删什么损失最小。它的可剪性评估结合梯度信息(对校准样本计算每个结构单元的重要性,含一阶与二阶近似)与依赖图分析(剪掉一个头或通道后耦合参数一起删)。在 LLaMA-7B 上剪约 25% 参数后,配合 LoRA 式的短暂恢复微调,各 zero-shot 任务的性能保留约九成——说明 7B 模型里确实存在四分之一量级的结构冗余。结构化剪 25% 换来的是真实的推理加速与显存下降,这是与 Wanda 的 50% 非结构化稀疏不可直接比较的两笔账:后者省的是权重存储,前者省的是计算。

Sheared-LLaMA:剪枝加续训的正确姿势

结构化剪枝的天花板演示是 Sheared-LLaMA(Xia 等人,2023,arXiv 2310.06694):从 LLaMA2-7B 用定向结构化剪枝压出 2.7B 与 1.3B 模型——不是均匀剪,而是先根据目标形状求解一个约束优化(每层保留多少头、多少通道,使全局「可学习性损失」最小),再逐层按解剪枝,随后用 50B token 做恢复预训练(配合 specially 设计的 learning rate schedule 与数据混合)。结果在公开基准上,2.7B 的 Sheared-LLaMA 显著超过同等规模从头训练的 Pythia-2.8B 与 INCITE-3B,且训练成本(7B 权重复用 + 50B token 续训)远低于从零预训练(数 T token)。这条路线重新定义了小模型的获得方式:小模型可以是「剪出来的」,剪枝是加速预训练的手段而不只是压缩手段——这是数据高效训练视角下剪枝的最大价值。

flowchart TD
    A{压缩目标是什么} --> B[只要省显存存权重]
    B --> C[量化 GPTQ AWQ 优先]
    A --> D[要减少实际计算]
    D --> E{硬件支持稀疏格式}
    E -- Ampere 以上 --> F[2:4 半结构化 加速约 1.3 到 1.5 倍]
    E -- 通用 GPU --> G[结构化剪枝]
    G --> H[LLM-Pruner 选结构 加 LoRA 恢复]
    G --> I[有续训预算]
    I --> J[Sheared-LLaMA 式剪枝加 50B token 恢复]
    H --> K[验证: FLOPs 降幅与下游任务保持率]
    J --> K
    F --> K

与量化叠加:压缩率是乘法,损失是加法

剪枝与量化可以叠加,但叠加的数学与直觉不同:压缩率相乘,质量损失近似相加。一个 int4 量化(约 4 倍压缩)加 50% 稀疏(2 倍压缩)的模型理论压缩率是 8 倍,但两边的质量损失会叠加——各自单独做时困惑度上升 0.2 与 0.3 的两个操作合起来,上升常常接近 0.5 甚至更多,因为在低比特表示下做权重置零,补偿的空间被量化噪声挤占。实测的经验区间:int4 之上加 2:4 稀疏,LLaMA-7B 级模型的困惑度上升通常比单独 int4 多 0.3 到 0.8,视方法与校准集而定。工程上的正确顺序是先剪后量:先在 fp16 权重上确定稀疏掩码并做补偿(此时数值精度高、补偿准确),再对稀疏化后的权重做量化校准;反过来先量化再剪枝,剪枝打分用的激活统计会被量化噪声污染。另一条实用建议:叠加方案必须重新验证长文本稳定性——量化对长上下文的伤害已经存在,剪枝的头部删除会进一步改变注意力分布,两者的复合效应在 8K 以上上下文里经常先崩。

三条压缩路线的最终分工

把剪枝放回压缩技术全景里做最后定位。量化是默认选项:硬件支持成熟、工具链完善、质量损失经过千锤百炼,任何「只想把模型变小」的需求从它开始。剪枝是算力选项:只有当瓶颈是计算(FLOPs、延迟)而不是存储时才值得引入,且优先结构化路线——非结构化稀疏的价值主要是研究性的(证明冗余度)与叠加性的(等待专用稀疏硬件普及)。蒸馏是上限选项:教师模型的输出分布给学生做软标签,压缩比不受结构约束,但需要完整的前向流水线与训练预算,工程复杂度最高。三者的交叉地带是当前的研究热点——Sheared-LLaMA 已经展示了「剪枝 + 续训」对「蒸馏」的部分替代(用更少的算力达到相近效果),而「量化感知剪枝」(剪枝打分时就考虑低比特表示的敏感性)正在把两个轴真正统一起来。对新项目务实的路线图:先量化交付,算力吃紧再结构化剪枝加恢复,最后在必须极限压缩时考虑蒸馏或剪枝蒸馏混合。

工程实践:校准集、恢复与验证

落地剪枝的三个实践要点。第一,校准集质量决定上限:SparseGPT 与 Wanda 都靠层输入的统计(协方差或激活范数)打分,校准集要与目标分布一致——用代码语料校准的剪枝模型写中文会额外受伤;几百条、覆盖领域多样的高质量样本比几万条随机网页更有效。第二,恢复微调是标配而不是可选:结构化剪枝后必须有恢复环节(全参微调几千 step 或 LoRA 数千 step,学习率取预训练的十分之一量级),跳过恢复的剪枝结果普遍比论文数字差很多——论文里的好成绩几乎都含恢复训练。第三,验证要分三层:perplexity 只反映语言建模质量,必须补下游任务集(推理、代码、指令跟随分开测)与长文本稳定性(剪枝对长上下文的伤害经常先在困惑度的长文档段显现);加速验证用真实引擎(TensorRT-LLM 或 vLLM 的对应支持)而不是理论 FLOPs 折算。

小结

剪枝与量化是压缩的两个正交轴,剪枝的独特价值在减少真实计算而非省存储。非结构化路线里,SparseGPT 用海森逆解析求解把 LLaMA 级模型剪到 50% 稀疏而困惑度几乎不动(BLOOM-176B 单 GPU 数小时完成),Wanda 用「权重幅度 × 激活范数」的一行公式达到相近效果且快一个数量级——但非结构化稀疏在通用 GPU 上换不来端到端加速,2:4 半结构化借硬件红利拿到 1.3 到 1.5 倍。结构化路线才给确定性的 FLOPs 下降:LLM-Pruner 证明 7B 模型有约四分之一的结构冗余可剪(配合恢复微调保留约九成性能),Sheared-LLaMA 把这条路线推到极致——7B 剪成 2.7B 再用 50B token 恢复预训练,超越从头训练的同级模型,把剪枝从压缩技术升格为省算力的训练技术。实践三原则:校准集对齐目标分布、恢复微调不可省、验证覆盖下游任务与长文本。剪枝的正确打开方式,是把它当作与量化互补的算力杠杆,在「计算受限」而非「存储受限」的场景里兑现价值。

← 返回资讯列表

读者留言

COMMENTS 暂无
仅本站原创文章开放留言 · 请勿留下手机号、邮箱等个人信息

还没有留言,来说第一句?