LLM-Pruner: On the Structural Pruning of Large Language Models 解读
一、论文基本信息
论文题目:LLM-Pruner: On the Structural Pruning of Large Language Models
作者:Xinyin Ma、Gongfan Fang、Xinchao Wang
发表会议:NeurIPS 2023
官方代码:horseee/LLM-Pruner。官方仓库标注这是 NeurIPS 2023 论文代码,并说明方法目标是对 LLM 做 task-agnostic compression;仓库也给出了 3 个阶段:Discovery Stage、Estimation Stage、Recover Stage。(GitHub)
一句话先概括:
LLM-Pruner 是一种面向大语言模型的结构化剪枝方法。它不是像 SparseGPT / Wanda 那样把单个权重置零,而是删除一组相互依赖的结构单元,例如 FFN hidden neurons、attention 相关通道或更大的结构组,并通过 LoRA post-training 恢复性能。
二、它和 SparseGPT / Wanda 最大区别是什么?
前面你问过 SparseGPT 和 Wanda,它们主要属于:
非结构化权重剪枝。
也就是把权重矩阵里的某些单个标量权重变成 0。
LLM-Pruner 不一样。它的核心是:
结构化剪枝。
它会真正改变模型结构,删除某些神经元、通道、注意力相关维度或 layer/block 级结构。官方仓库也把 pruning strategy 分为block-wise、channel-wise、layer-wise等类型。(GitHub)
所以分类上可以这样写:
| 方法 | 剪枝对象 | 是否改变模型结构 | 是否需要恢复训练 |
|---|---|---|---|
| SparseGPT | 单个权重 | 否 | 否 |
| Wanda | 单个权重 | 否 | 否 |
| LLM-Pruner | 结构组 / 通道 / block / layer | 是 | 通常需要 LoRA post-training |
因此,LLM-Pruner 是结构化剪枝,不是非结构化剪枝。
三、这篇论文要解决什么问题?
大语言模型很大,部署、推理和再训练成本都很高。传统剪枝如果要依赖完整原始训练语料或大规模 retraining,对 LLM 来说非常困难。
论文的目标是两个:
第一,task-agnostic compression。
压缩后的 LLM 不能只适配某一个分类任务,而应尽量保留原模型作为多任务求解器的能力。论文摘要也明确说,它希望在 task-agnostic 方式下压缩 LLM,同时保留多任务求解和语言生成能力。(arXiv)
第二,减少对原始训练语料的依赖。
官方仓库说明,LLM-Pruner 只用50K Alpaca samples做 post-training,并强调剪枝约 3 分钟、post-training 约 3 小时这个高效流程。(GitHub)
所以它想解决的是:
能不能不用原始海量预训练语料,也不用完整重训,就把 LLM 的结构真正变小?
四、核心思想
LLM-Pruner 的核心思想是:
先自动发现 LLM 中哪些结构是相互耦合、必须一起剪的;然后用梯度信息估计每个结构组的重要性;最后删除不重要结构组,并用 LoRA 做少量恢复训练。
它的流程不是简单“看哪个 neuron 小就删掉”。因为 LLM 中的结构存在很多依赖关系:
删 FFN 中间维度时,up/gate/down projection 的对应行列必须一起处理。
删 attention head 或 attention channel 时,Q/K/V/O projection 之间也存在形状依赖。
residual connection 要求主干 hidden dimension 对齐。
某些结构不能单独删,否则张量维度会不匹配。
所以 LLM-Pruner 的重点是:
先找到“最小可删除结构组”,再进行重要性排序。
官方仓库把第一阶段称为Discovery Stage:发现 LLM 中复杂的 inter-dependency,并找到最小可删除单元 group。(GitHub)
五、为什么需要 Dependency Graph?
结构化剪枝最麻烦的地方不是“删哪个”,而是:
删了以后模型还能不能正常 forward。
在 CNN 里,剪一个 channel 通常要同步修改后续卷积层输入通道。Transformer / LLM 更复杂,因为同一个 hidden dimension 或 FFN neuron 会经过多个矩阵、残差、reshape、concat、attention head 等操作。
LLM-Pruner 使用类似 DepGraph 的思想来构建依赖关系。论文摘要中也提到,它会逐个检查模型中的 neuron,把它们作为 trigger 来识别 dependency groups,从而构建 LLM 的 dependency graph。(arXiv)
可以理解为:
Dependency Graph 告诉你:如果删 A,哪些 B、C、D 必须一起删。
例如在 LLaMA 的 MLP 里:
gate_proj 的某个 hidden neuron、up_proj 的对应 hidden neuron、down_proj 的对应输入通道,是一个耦合结构组。
如果只删其中一个,矩阵乘法维度就对不上。
所以 LLM-Pruner 剪的不是孤立参数,而是:
dependency group。
六、Estimation Stage:怎么判断结构组重要性?
发现可剪结构组之后,下一步是判断:
哪个 group 不重要,可以剪?
LLM-Pruner 使用基于梯度的 Taylor importance criterion。官方仓库里--pruner_type支持l1、l2、random、taylor,并说明 Taylor pruner 可选择vectorize、param_second、param_first、param_mix;默认param_mix会结合近似二阶 Hessian 和一阶梯度。(GitHub)
直观理解:
如果删除某个结构组后,loss 变化小,说明这个结构组不重要。
Taylor 方法就是用当前参数和梯度近似估计“删掉该结构会让 loss 变多少”。
和 Wanda 相比:
Wanda 用权重 × 激活范数,不需要反向梯度。
LLM-Pruner 用梯度/Taylor 信息,需要少量数据做前后向估计。
和 SparseGPT 相比:
SparseGPT 是权重级二阶重构。
LLM-Pruner 是结构组级重要性估计。
七、Recover Stage:为什么需要 LoRA 恢复?
结构化剪枝比非结构化剪枝更激进。
非结构化剪枝只是把权重置零,模型整体结构还在;而 LLM-Pruner 会真正删除神经元、通道或 block,模型容量明显减少。因此剪枝后通常需要恢复训练。
LLM-Pruner 采用LoRA post-training来恢复性能。官方仓库示例中使用 Alpaca-cleaned 50K 数据、LoRA rank 8、训练 2 个 epoch,并说明这是 Recover Stage。(GitHub)
这说明 LLM-Pruner 不是完全 training-free。
它的完整流程是:
结构剪枝很快。
然后用少量指令数据 + LoRA 做轻量恢复。
这样做的好处是:
不用全参数微调。
不用原始预训练语料。
恢复成本比完整重训低很多。
八、LLM-Pruner 剪的具体是什么?
它可以剪多种结构。根据官方代码说明,pruning strategy 包括:
block-wise pruning。
channel-wise pruning。
layer-wise pruning。(GitHub)
从原论文思想看,重点是 structural pruning,也就是删除耦合结构组。常见对象包括:
FFN intermediate neurons。
attention projection 中的相关 channel。
某些 block / layer 级结构。
但它不是单纯 head pruning,也不是单纯 FFN pruning,而是通过 dependency group 自动确定可删除单元。
所以它的剪枝粒度比 Wanda / SparseGPT 更粗,但比直接删整层更细。
九、LLM-Pruner 的三阶段流程
1. Discovery Stage
目标:发现结构依赖。
它会分析 LLM 计算图,找到哪些参数、通道、neuron 必须一起删除,构成最小可删除 group。官方仓库明确说这一步是发现 complicated inter-dependency 并找到 minimally-removable unit。(GitHub)
2. Estimation Stage
目标:估计每个 group 的重要性。
用 L1、L2、random 或 Taylor criterion 评估 group 对模型性能的贡献。Taylor 版本利用梯度和近似二阶信息,是论文更核心的选择。(GitHub)
3. Recover Stage
目标:恢复剪枝后性能。
用 LoRA 和少量数据做 post-training。官方仓库说明使用 50K Alpaca samples,并给出 LoRA post-training 命令。(GitHub)
十、它为什么适合 LLM?
LLM-Pruner 适合 LLM 的原因有三个。
第一,它是结构化剪枝,能真正减少模型尺寸。
SparseGPT / Wanda 只是产生稀疏矩阵,普通硬件不一定能加速。LLM-Pruner 删除结构后,权重矩阵维度会变小,理论上更容易在普通 dense kernel 上受益。
第二,它是 task-agnostic。
LLM 不是单一任务模型,不能只为了某个 benchmark 剪。论文明确强调压缩后模型应保留原始 LLM 的多任务求解能力。(arXiv)
第三,它不依赖原始训练语料。
官方仓库强调只用 50K Alpaca samples 做 post-training,而不是重新使用海量预训练语料。(GitHub)
十一、实验模型
论文在多个 LLM 上验证,包括:
LLaMA。
Vicuna。
ChatGLM。
arXiv 摘要明确写到,作者在这三个 LLM 上验证 LLM-Pruner,并展示压缩模型在 zero-shot classification 和 generation 中仍有较好的能力。(arXiv)
官方仓库后续还支持了更多模型,例如 Llama-2、Llama-3/3.1、BLOOM、Baichuan、TinyLlama 等;这些属于仓库后续实现扩展,不完全等同于原论文实验范围。(GitHub)
十二、实验结果怎么理解?
LLM-Pruner 的实验重点不是追求“剪完完全不掉 perplexity”,而是证明:
结构化剪枝后的 LLM 仍然可以保留较好的 zero-shot 和生成能力。
这和 SparseGPT/Wanda 的实验重点不同。
SparseGPT/Wanda 通常关注:
perplexity 在 50% unstructured sparsity 下掉多少。
LLM-Pruner 更关注:
剪掉结构后,模型是否仍能完成多任务推理和自然语言生成。
官方仓库也说明,剪枝和 post-training 之后会使用 lm-evaluation-harness 做评估。(GitHub)
仓库更新中还给出一个后续结果:通过较大规模语料 fine-tuning,LLaMA-5.4B 平均准确率达到 62.36%,接近原始 LLaMA-7B 的 63.25%。这个结果是仓库后续更新,不一定是原始论文主表中的核心设置。(GitHub)
十三、和 SparseGPT 的区别
SparseGPT:
非结构化剪枝。
剪单个权重。
不改变模型 hidden size / layer / head。
不需要恢复训练。
真实加速依赖稀疏 kernel。
LLM-Pruner:
结构化剪枝。
剪 dependency group。
改变模型结构。
通常需要 LoRA post-training。
更容易得到真实小模型。
所以如果你关心快速 one-shot 压缩且不训练,SparseGPT 更适合。
如果你关心得到一个结构上更小的 LLM,LLM-Pruner 更接近目标。
十四、和 Wanda 的区别
Wanda:
score = 权重幅值 × 输入激活范数。
剪单个权重。
不更新权重。
非常简单,默认非结构化。
LLM-Pruner:
基于 dependency graph 找结构组。
用梯度/Taylor 估计 group 重要性。
剪掉结构组。
用 LoRA 恢复。
所以 Wanda 是activation-aware unstructured pruning。
LLM-Pruner 是gradient-aware structural pruning。
两者压缩目标不同。
十五、和传统结构化剪枝的区别
传统结构化剪枝常常手工定义:
剪 FFN neuron。
剪 attention head。
剪 layer。
然后根据某个指标排序。
LLM-Pruner 更自动一些。它不是只手写某个结构,而是先通过 dependency detection 自动构建 dependency groups,再估计 group 重要性。官方仓库也强调 automatic structural pruning 是其目标之一。(GitHub)
这对 LLM 很重要,因为不同模型结构不同:
LLaMA 有 SwiGLU。
ChatGLM 架构和 LLaMA 不同。
Vicuna 基于 LLaMA,但微调后行为不同。
手工为每个模型写剪枝规则很麻烦。Dependency graph 的价值就在于减少人工结构分析成本。
十六、它是不是结构化剪枝?
是的,LLM-Pruner 是结构化剪枝。
更准确地说,它是:
task-agnostic structural pruning for LLMs。
它不是:
非结构化权重剪枝。
N:M 半结构化稀疏。
token pruning。
KV cache pruning。
纯 layer dropping。
它的核心是:
删除相互依赖的 structural groups,并通过轻量 post-training 恢复能力。
十七、方法优点
第一,剪枝后模型结构真的变小。
它不是保留原矩阵形状再置零,而是删除结构组,因此更接近真实小模型。
第二,考虑结构依赖。
Dependency discovery 可以避免剪完后张量维度不匹配。
第三,task-agnostic。
论文目标不是针对单一任务,而是尽量保留 LLM 的多任务能力和生成能力。(arXiv)
第四,数据需求较低。
官方设置只用 50K Alpaca samples 做 post-training。(GitHub)
第五,恢复成本较低。
官方仓库强调剪枝约 3 分钟、post-training 约 3 小时。(GitHub)
十八、方法局限
第一,不是完全 training-free。
结构化剪枝后通常需要 LoRA post-training。相比 Wanda / SparseGPT,恢复阶段成本更高。
第二,剪枝后生成质量可能不稳定。
官方仓库也在 limitations 中提到,当前压缩模型仍可能出现重复 token 或无意义输出,生成质量仍有提升空间。(GitHub)
第三,自动依赖识别并非对所有模型都完美。
仓库 limitations 提到,有些模型在 concat 和 view 操作后的 index mapping 仍不能自动识别,需要额外人工处理。(GitHub)
第四,结构化剪枝粒度较粗。
删除 neuron/channel/group 会直接减少容量,精度恢复比非结构化剪枝更难。
第五,剪枝比例过高时容易伤生成能力。
LLM 生成任务对模型容量和内部表征非常敏感,结构删得过多会带来明显退化。
十九、整体评价
LLM-Pruner 是 LLM 结构化剪枝方向的代表性工作。
它和 SparseGPT / Wanda 构成了 LLM 剪枝里的两条路线:
SparseGPT / Wanda:保持结构不变,把权重变稀疏。
LLM-Pruner:真正删除结构,让模型变窄或变小。
如果只看实现简单和无需训练,Wanda 更轻;如果只看 one-shot 精度,SparseGPT 很强;但如果目标是得到一个结构上缩小的 LLM,LLM-Pruner 的意义更直接。
它的核心贡献可以概括为三点:
第一,用 dependency graph 解决 LLM 结构化剪枝中的耦合问题。
第二,用梯度/Taylor 信息评估结构组重要性。
第三,用少量数据和 LoRA post-training 快速恢复压缩模型能力。
二十、一句话总结
《LLM-Pruner: On the Structural Pruning of Large Language Models》提出一种面向 LLM 的结构化剪枝框架:它先通过 dependency discovery 自动识别 LLM 中相互耦合、必须一起删除的最小结构组,再用梯度/Taylor 重要性估计选择低贡献 group 进行物理删除,最后通过少量 Alpaca 数据和 LoRA post-training 恢复模型能力。与 SparseGPT、Wanda 这类非结构化权重剪枝不同,LLM-Pruner 会真正改变模型结构,因此更接近真实小模型;但它也更依赖结构依赖分析和恢复训练,剪枝过重时生成质量更容易退化。