外观
剪枝与稀疏化
概念定义:去掉模型里"不干活"的部分
**剪枝(Pruning)**指把神经网络中不重要的权重或结构置零/移除,让模型变小变快。它的灵感来自生物大脑——发育过程中神经元连接会"修剪"以提升效率,机器学习也可以如法炮制。
理解剪枝的两个关键认知:
- 模型经常是过参数化的——很多权重对最终输出贡献极小(接近 0),删掉它们对精度几乎无损;
- 稀疏 ≠ 加速——把 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%",听起来很美——但实测速度反而变慢。原因:
- 普通 GPU kernel 不支持稀疏 matmul,密集矩阵算反而快;
- 稀疏存储(CSR)有间接索引开销;
- 量化稀疏需 hardware-aware(如 NVIDIA 2:4 sparse tensor core,见下文)才能加速。 剪枝论文的"加速"经常是软件模拟,工程上要谨慎。
二、Lottery Ticket 假说
彩票假说(Frankle & Carbin, 2018):一个训练好的密集网络里,藏着一个稀疏的"中奖子网络"(winning ticket)——只要这个子网络的初始权重和原网络一致,单独训练就能达到原网络精度。
text
原网络训练 → 剪枝(保留 mask) → 重置未保留权重到初始值 → 重新训练
↑
仍能达到原精度 → 这是中奖子网络意义:
- 证明模型过参数化——大量权重是"冗余备份";
- 改写剪枝思路——不是"训练后砍掉差的",而是"找出初始化时已经中奖的子网络";
- 扩展: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 上传统剪枝遇到困难:
- 模型大,"剪-微调"循环太贵;
- 微调数据封闭(GPT 系列无法重训);
- 结构化剪枝破坏预训练好的 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 Core | H100/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(纯前向)。
延伸阅读
- 量化基础——压缩三件套的"减字节"手段
- 权重量化与混合精度——与剪枝叠加的工程路径
- 知识蒸馏——压缩三件套的"训练侧"武器
- 算子融合与自定义核——稀疏 matmul 的 kernel 实现
- GPU 体系结构与优化——Sparse Tensor Core 的硬件细节
- llama.cpp 案例研究——CPU 上的稀疏推理
- 核心论文清单——Lottery Ticket/Wanda/ShortGPT 论文
参考资料
- Frankle & Carbin. The Lottery Ticket Hypothesis: Finding Sparse, Trainable Neural Networks(ICLR 2019) —— Lottery Ticket 原始论文
- Han et al. Learning both Weights and Connections for Efficient Neural Networks(NeurIPS 2015) —— 经典幅值剪枝
- Mishra et al. Movement Pruning: Adaptive Sparsity by Fine-Tuning(NeurIPS 2020) —— Movement Pruning 论文
- Sun et al. Wanda: Pruning LLMs by Weights and Activations(ICLR 2024) —— LLM 上的纯前向剪枝
- Ma et al. LLM-Pruner: On the Structural Pruning of Large Language Models(NeurIPS 2023) —— LLM 结构化剪枝
- Men et al. ShortGPT: Layers in Large Language Models are More Redundant Than You Expect(2024) —— LLM 层剪枝
- NVIDIA 2:4 Structured Sparsity Documentation —— 2:4 硬件稀疏官方文档
- Kwon et al. Sparse GPU Kernels for Masking and Point-Error-Correcting(SC23) —— 稀疏 kernel 工程实现