LLM-Pruner: On the Structural Pruning of Large Language Models 解读

📅 2026/7/23 22:56:22 👁️ 阅读次数 📝 编程学习
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 会真正改变模型结构,因此更接近真实小模型;但它也更依赖结构依赖分析和恢复训练,剪枝过重时生成质量更容易退化。