Skip to content

剪枝与稀疏化

本页速览 剪枝是把不重要的权重或结构去掉——让模型变小变快。本文讲透非结构化 vs 结构化剪枝、Lottery Ticket 假说、幅值/迭代/Taylor/Movement 剪枝算法、NVIDIA 2:4 结构化稀疏,以及 LLM 时代的 Wanda/LLM-Pruner。

剪枝与稀疏化

概念定义:去掉模型里"不干活"的部分

**剪枝(Pruning)**指把神经网络中不重要的权重或结构置零/移除,让模型变小变快。它的灵感来自生物大脑——发育过程中神经元连接会"修剪"以提升效率,机器学习也可以如法炮制。

理解剪枝的两个关键认知:

  1. 模型经常是过参数化的——很多权重对最终输出贡献极小(接近 0),删掉它们对精度几乎无损;
  2. 稀疏 ≠ 加速——把 50% 权重置零,模型精度可能没掉,但 GPU 不会自动加速稀疏矩阵乘法。只有结构化稀疏 + 硬件支持才能换真实加速

剪枝与量化蒸馏合称模型压缩三件套,三者在 LLM 时代被重新审视——LLM 体量大但 fine-tune 贵,PTQ 量化成了主流,剪枝退居次要地位,但仍在特定场景(边缘部署、极致压缩)有用武之地。

一、非结构化 vs 结构化剪枝

剪枝的根本分野——置零的颗粒度

类型置零颗粒度稀疏率加速适用
非结构化剪枝单个权重90%+ 仍可用软件支持才加速精度优先、研究
结构化剪枝整行/通道/head/层30-70%硬件原生加速速度优先、部署

非结构化剪枝

把单个权重置零,模型在数学上变稀疏(W 矩阵很多 0),但形状不变——还是同一个 shape 的张量。

text
原权重矩阵:           剪枝后(非结构化):
1.2  -0.5  0.8        1.2   0    0.8
0.3   0.7 -0.1         0   0.7   0
-0.9  0.2  0.4        -0.9   0   0.4
  • 优势:精度保留极好(剪 90% 仍能跑);
  • 劣势:GPU 没法加速——稀疏矩阵乘法要专门 kernel,普通 cuBLAS 不支持;CUDA 上的稀疏存储 CSR/CSC 还要元数据,反而变慢。

结构化剪枝

整行/整列/整个 channel/整个 head 一起置零或删除,模型形状变小

text
原权重矩阵 (3×3):       结构化剪枝(删第 2 列)后 (3×2):
1.2  -0.5  0.8         1.2  0.8
0.3   0.7 -0.1         0.3 -0.1
-0.9  0.2  0.4        -0.9  0.4
  • 优势:模型真正变小、变快——直接用 cuBLAS/普通 kernel 就加速;
  • 劣势:精度损失大(删错了通道精度崩);
  • 主流方向:channel 剪枝(CV)、head 剪枝(Transformer)、layer 剪枝(深层网络)。

90% 稀疏但没快——为什么

很多论文报"剪 90% 权重精度只掉 1%",听起来很美——但实测速度反而变慢。原因:

  1. 普通 GPU kernel 不支持稀疏 matmul,密集矩阵算反而快;
  2. 稀疏存储(CSR)有间接索引开销;
  3. 量化稀疏需 hardware-aware(如 NVIDIA 2:4 sparse tensor core,见下文)才能加速。 剪枝论文的"加速"经常是软件模拟,工程上要谨慎

二、Lottery Ticket 假说

彩票假说(Frankle & Carbin, 2018):一个训练好的密集网络里,藏着一个稀疏的"中奖子网络"(winning ticket)——只要这个子网络的初始权重和原网络一致,单独训练就能达到原网络精度。

text
原网络训练 → 剪枝(保留 mask) → 重置未保留权重到初始值 → 重新训练

                                          仍能达到原精度 → 这是中奖子网络

意义:

  1. 证明模型过参数化——大量权重是"冗余备份";
  2. 改写剪枝思路——不是"训练后砍掉差的",而是"找出初始化时已经中奖的子网络";
  3. 扩展:late resetting(保留训练若干步后的权重而非初始权重)让大模型也能找到中奖子网络。

但 LLM 时代彩票假说遇冷——LLM 太大,"训练-剪-重训"成本太高,子网络搜索几乎不可行。

三、剪枝算法家族

1. 幅值剪枝(Magnitude Pruning)

最简单——按权重绝对值排序,把小的置零。理论依据:小权重对输出贡献小。

text
score(w) = |w|   # 权重幅值
threshold = percentile(|w|, sparsity_ratio)
mask = (|w| > threshold)
W_pruned = W * mask
  • 优势:实现简单,无需梯度信息;
  • 劣势:幅值大不等于重要(梯度大的小权重也很关键);
  • 现状:基线方法,仍是工业界默认起点。

2. 迭代剪枝(Iterative Pruning)

一次剪太多精度崩,分多次剪:

text
训练 → 剪 10% → 微调恢复 → 剪 10% → 微调恢复 → ... → 达到目标稀疏率

每次剪完微调一下,模型从"剩余权重"中重新分配重要性——比一次性剪 50% 精度好得多。

3. Taylor 剪枝(一阶重要性)

用梯度信息评估权重重要性:

text
score(w) = |w · ∂L/∂w|   # 权重 × 梯度,近似"删掉它损失涨多少"

理论依据:删掉权重 w 引起的损失变化 ≈ w · ∂L/∂w(Taylor 一阶展开)。比幅值更准,但要跑前向反传算梯度。

4. Movement 剪枝(Movement Pruning)

不基于"当前幅值",基于"训练过程中幅值变化趋势":

text
score(w) = Σ_t  w_t · ∂L/∂w_t    # 累积"在朝零走还是离零走"

越走越远离 0 → 重要(保留);越走越接近 0 → 不重要(剪掉)。适合 fine-tune 阶段剪枝(如 BERT 微调时剪枝)。

算法选型速查

  • CV 模型:幅值剪枝 + 迭代微调,工程成熟;
  • Transformer 微调:Movement Pruning(适配 fine-tune);
  • LLM:幅值 + activation-aware(见 Wanda);
  • 追求极致稀疏:Taylor + iterative + Lottery Ticket。

四、NVIDIA 2:4 结构化稀疏

硬件支持

NVIDIA Ampere(A100)起的 Tensor Core 支持2:4 结构化稀疏(也叫 1:2 稀疏):每连续 4 个权重里恰好 2 个为 0,硬件加速 matmul 2 倍。

text
密集权重(每 4 个一组):
[1.2  0.5  0.8  0.3]   [0.4  0.9  0.1  0.7]   ...

2:4 稀疏后(每组留 2 个非零):
[1.2  0    0.8  0  ]   [0    0.9  0    0.7]   ...

                Tensor Core 用专用指令加速,matmul 2× 加速
  • 优势:真实硬件加速 2 倍(A100/H100 Sparse Tensor Core);
  • 局限:稀疏率固定 50%(2/4 = 50%),不能调;
  • 工具:NVIDIA sparsetrainer、PyTorch 2:4 稀疏支持。

2:4 稀疏的最佳搭配

2:4 稀疏 + INT4 量化:先用幅值剪枝做出 2:4 稀疏权重(损失 ~1%),再 INT4 量化(损失 ~1%)——总体显存 4×(量化)+ 算力 2×(稀疏)= 8× 总收益,精度损失 ~2%。在 H100 上是性价比极高的极致压缩路径。

其他结构化稀疏格式

  • 1:2 / 1:4 / 1:8:稀疏率更高但硬件支持少;
  • Block 稀疏:以 block 为单位稀疏(FlashAttention 稀疏版用);
  • head 稀疏:剪整个 attention head——LLM 上可行但精度风险大。

五、LLM 时代的剪枝

LLM 上传统剪枝遇到困难:

  1. 模型大,"剪-微调"循环太贵;
  2. 微调数据封闭(GPT 系列无法重训);
  3. 结构化剪枝破坏预训练好的 representation,精度退化严重。

于是出现了 LLM 专用剪枝方法:

Wanda(Pruning by Weights and activations)

  • 思路:评估权重重要性不只看幅值,结合激活幅值——|w| · ||x|| 大的权重才重要;
  • 优势:无需重训或微调,纯前向剪枝,几小时搞定 70B;
  • 稀疏率:50% 非结构化,精度损失 <2%;
  • 局限:非结构化 → 加速需 2:4 sparse 重排。

LLM-Pruner

  • 思路:依赖结构化剪枝 + LoRA 微调恢复;
  • 流程:找依赖关系 → 结构化剪枝 → LoRA 微调几百步 → 恢复精度;
  • 稀疏率:20-30% 结构化,损失 <5%;
  • 优势:剪的是整 head/MLP 维度,可硬件加速。

ShortGPT(Layer Pruning)

  • 思路:删除 Transformer 中冗余的整层——某些层输出和输入相似,可以跳过;
  • 稀疏率:删 25% 层,精度损失 <2%(LLaMA-2-70B 上验证);
  • 优势:删整层 → 模型深度变小 → 真实加速;
  • 局限:删错层精度崩,要计算层间相似度定删哪些。

LLM 剪枝的实用价值有限

LLM 时代 PTQ 量化几乎取代了剪枝

  • 量化(W4A16)压缩 4×,精度损失 ~1-3%,无需训练;
  • 剪枝 50% 后通常要 LoRA 微调才能恢复精度,压缩比例还可能不如量化。 什么时候用 LLM 剪枝
  • 显存极紧(边缘部署):量化 + 稀疏叠加;
  • 极致算力(H100 sparse tensor core):2:4 稀疏 + INT4;
  • 删整层(ShortGPT):模型深度变小有真实加速。 普通在线 LLM 服务,首选权重量化,剪枝为辅。

六、稀疏化与加速路径

不同稀疏率选不同加速路径:

稀疏率稀疏类型加速方式适用
50% (2:4)结构化NVIDIA Sparse Tensor CoreH100/A100,加速 2×
70-90%非结构化专用稀疏 kernel(如 DeepSparse)CPU 边缘部署
90%+极稀疏软件模拟研究场景
整层删除结构化模型变浅任意硬件
head 剪枝结构化模型变小任意硬件

七、权衡与取舍

  • 量化 vs 剪枝:LLM 推理首选量化(更便宜),剪枝为辅;CV 模型两者相当;
  • 结构化 vs 非结构化:部署优先结构化(真加速),研究精度优先非结构化;
  • 幅值 vs Taylor:精度优先选 Taylor,简单部署选幅值;
  • LLM 场景:PTQ 量化打头,2:4 稀疏叠加(量化 + 稀疏 8× 压缩);
  • 训练资源:能 fine-tune 用 iterative + LoRA 恢复;不能 fine-tune 用 Wanda(纯前向)。

延伸阅读

参考资料