笔记日期: 2026-06-12 笔记作者: Zhongzhu Zhou 论文标题: SliceGPT: Compress Large Language Models by Deleting Rows and Columns 作者: Saleh Ashkboos, Maximilian L. Croci, Marcelo Grangeiro Perez, Torsten Hoefler, James Hensman arXiv: 2401.15024 状态 / 会议: ICLR 2024(接收);微软研究院 + ETH Zürich;22 页,8 图
一句话总结
SliceGPT 从一条精确的数学定理出发——Transformer 计算对正交基变换完全不变——利用 PCA 找到最优旋转矩阵,把权重矩阵旋转到激活方差最集中的坐标系后,直接物理删去方差最低的那些行列,留下更小的稠密矩阵。压缩 25% 参数后,LLAMA2-70B 零样本性能保留 99%,推理算力降至原来的 64–66%,所需 GPU 数量从 4 张减到 2 张,全程无需自定义稀疏算子。
前置知识
在正式读这篇论文之前,需要对下面几个背景知识有基本了解。这些内容是理解 SliceGPT 的数学推导和算法设计的必要基础。
1. Transformer 的残差流结构
以 LLAMA2 为代表的 decoder-only Transformer 由 个Transformer Block叠加而成。每个 Block 依次包含:
- RMS Layer Normalization——对残差流做 RMS 归一化,乘以学习到的缩放向量
- 多头自注意力(Multi-Head Self-Attention)——Q/K/V 投影、缩放点积注意力、输出投影
- MLP / 前馈网络(FFN)——上投影 、逐元素非线性(GeLU/SiLU)、下投影
- 残差连接——每个子模块的输出加回输入
贯穿整个网络的核心张量是残差流(residual stream):形状为 ,其中 是模型维度(也叫 hidden size 或 embedding dimension)。LLAMA2-7B 中 ,LLAMA2-70B 中 。
所有线性层都作用于这条残差流:读取一个 维向量,乘以权重矩阵,再写回残差流(或产生中间张量)。SliceGPT 的目标就是把这个维度 压缩到更小的 。
2. 奇异值分解(SVD)
对任意矩阵 ,SVD 将其分解为:
其中 和 为正交矩阵(列向量两两正交且单位长度), 是对角矩阵,对角元素为奇异值 。
Eckart-Young 定理给出最优低秩近似:截取前 个奇异值得到的 是所有秩 矩阵中与 差距(Frobenius 范数)最小的:
SliceGPT 不直接对权重矩阵做 SVD 截断(那是普通低秩压缩),而是用 SVD 找激活的最优基变换——这是思路上的关键区别。
3. 主成分分析(PCA)与方差集中性
给定数据矩阵 (每列是一个样本,这里是一个 token 的激活向量),PCA 寻找正交变换 使得 的协方差矩阵对角化:
的行向量就是经验协方差矩阵 的特征向量,按特征值降序排列。 衡量激活在第 主方向上的方差。
PCA 在 SliceGPT 中回答的核心问题是:第 层的激活主要集中在哪几个方向上变化? 方差接近于零的方向,可以安全地丢弃。
4. 正交矩阵:基变换的工具
矩阵 是正交矩阵当且仅当 。关键性质:
- 保范性:——正交变换是刚性旋转/反射,不改变向量长度
- 精确可逆:
- 恒等式插入:,可以在任何乘积的中间插入 而不改变结果
最后一点是 SliceGPT 的核心操作:在两个权重矩阵乘积之间插入 ,不改变计算结果,但改变了参数化方式,从而为后续的截断创造了条件。
5. 训练后压缩方法全景
训练后压缩在不重新训练的前提下缩小模型,只用少量标定数据的前向推理。主要三大范式:
| 范式 | 代表方法 | 加速机制 | 是否需要自定义算子 |
|---|---|---|---|
| 量化 | GPTQ、AWQ、SmoothQuant | 降低精度(FP16→INT4),减少带宽 | 部分需要 |
| 非结构化稀疏 | SparseGPT、Wanda | 将个别权重置零,稀疏 GEMM | 是 |
| 结构化压缩 | SliceGPT、LLM-Pruner | 删除整行整列,标准稠密 GEMM | 否 |
SliceGPT 属于结构化压缩。结构化方法删去整个维度,剩余计算仍是标准稠密矩阵乘,与 cuBLAS 等高度优化的库完全兼容。
6. 计算量估算
对一个残差流维度 、MLP 中间维度 的 Transformer 层,每层的计算量约为:
若把 压缩为 ,则 项按 缩减, 项按 缩减,混合后约得到 64–66% 的计算量——与论文实测一致。
这篇论文做了什么
SliceGPT(ICLR 2024,微软研究院 + ETH Zürich)有三个核心贡献:
贡献一:计算不变性定理。 严格证明:对任意一组正交矩阵 ,存在对全部权重矩阵的重参数化,使模型对所有输入的输出精确不变。这不是近似,是零误差的代数等式。
贡献二:有原则的切片算法(Slicing Algorithm)。 利用少量标定数据上的激活 PCA,逐层估计最优正交基;将权重矩阵旋转到新基之后,物理截去低方差维度(删除对应的行和列),得到更小的稠密矩阵。
贡献三:硬件原生部署。 压缩后的模型由纯稠密矩阵组成,无需任何自定义 CUDA 算子,直接在标准深度学习框架上运行,实现真实的延迟和 GPU 数量缩减。
核心数学洞察:计算不变性
推导过程
基本设置。 考虑两个连续线性层,中间夹一个逐元素非线性 (GeLU、SiLU 等):
其中 ,,。
第一步:插入正交恒等式。
对任意正交矩阵 ,利用 :
第二步:重新分组。
令 ,,则:
输出 与原来完全相同。只是参数化方式变了:输入被旋转成 ,第一个权重矩阵被旋转成 ,两个变化精确抵消。
第三步:扩展到完整残差流。
假设第 层残差流通过正交变换 旋转。令所有从位置 读取激活的权重在右边乘 ,所有向位置 写入激活的权重在左边乘 。则:
- 位置 的残差流变为 (新参数化)
- 每个消费者 执行 ——输出不变
- 每个生产者 输出 ——即下一位置的新残差流
定理(计算不变性,ICLR 2024,非正式版本): 对任意预训练 Transformer 和任意正交矩阵序列 ,存在重参数化后的 Transformer 满足对所有输入 有 。
这是一个零近似误差的精确结论,为后续截断提供了理论保障。
为什么选 PCA 作为 Q?
在用 旋转之后, 的各坐标按方差从高到低排列——这正是 PCA 的定义。最后 个坐标的方差接近于零,意味着激活在这些方向上几乎不变化。把这些坐标直接置零(即不计算它们)引入的误差等于被丢弃坐标的方差之和:
对经过充分训练的大型模型,特征值谱往往快速衰减(近似幂律分布),使得这个截断误差在合理的 下非常小。
图一:计算不变性示意
flowchart LR
subgraph 原始参数化["原始参数化"]
x1["x ∈ ℝᵈ"] --> W1["W₁"]
W1 --> phi1["φ(·) 逐元素"]
phi1 --> W2["W₂"]
W2 --> y1["y ∈ ℝᵈ"]
end
subgraph 旋转参数化["插入 Q^T Q = I 后"]
x2["Qx ∈ ℝᵈ"] --> W1Q["W₁Q^T"]
W1Q --> phi2["φ(·) 逐元素"]
phi2 --> W2b["W₂"]
W2b --> y2["y ∈ ℝᵈ(完全相同)"]
end
原始参数化 -. "插入 Q^T Q = I(零误差)" .-> 旋转参数化
图一:插入正交恒等式后,计算结果完全不变。选 Q 为 PCA 旋转矩阵,使最后几个坐标方差最小,为安全截断创造条件。
SliceGPT 算法详解
算法伪代码
输入:
f_θ 预训练 Transformer(L 层,隐藏维度 d)
D_calib 标定数据:C 条序列 × T 个 token(论文用 C=256, T=2048,取自 C4)
s 全局稀疏率(论文用 s=0.25)
输出:
f_θ̃ 压缩后的 Transformer,隐藏维度 k = round(d·(1−s))
─────────────────────────────────────────────────────
预处理:RMSNorm 吸收(精确操作)
对每个 Block l:
将缩放参数 γ_l 折叠进紧随其后的权重矩阵:
W ← W · diag(γ_l)
从模型图中删除 RMSNorm 层
─────────────────────────────────────────────────────
逐层 PCA + 切片:
对 l = 0 到 L−1:
步骤A:采集激活
对 D_calib 做前向推理,hook 采集第 l 层位置的所有 token 激活
A_l ← 拼接所有 token 的隐状态,形状 (d, N),N = C × T
步骤B:计算 PCA 基
C_l ← (1/N) · A_l @ A_l.T # 经验协方差矩阵,形状 d×d
特征值, Q_l ← eigh(C_l) # 特征分解
# Q_l 的行向量按特征值降序排列
步骤C:确定切片宽度
k_l ← round(d · (1 − s)) # 均匀稀疏版本
# 非均匀版本:用 EVR 预算优化各层 k_l
步骤D:变换并切片所有相关权重
对 W_in ∈ {W_Q, W_K, W_V, W_gate, W_up}(从位置 l 读取残差流):
W_in ← (W_in @ Q_l.T)[:, :k_l] # 旋转后保留前 k 列
对 W_out ∈ {W_O, W_down}(向位置 l+1 写入残差流):
W_out ← (Q_{l+1} @ W_out)[:k_{l+1}, :] # 旋转后保留前 k 行
(k_{l+1} 来自下一轮迭代)
─────────────────────────────────────────────────────
边界变换:
输入 embedding 矩阵 E ∈ ℝ^{V×d}:
E ← (E @ Q_0.T)[:, :k_0]
输出 LM head W_lm ∈ ℝ^{V×d}:
W_lm ← (W_lm @ Q_L.T)[:, :k_L]
─────────────────────────────────────────────────────
可选:1 epoch 恢复微调
用 LoRA 在 D_calib 或更大数据集上微调 f_θ̃ 1 个 epoch
各步骤详解
步骤A:为什么逐层采集激活?
第 层的 PCA 基必须反映真实推理时激活的分布,而这个分布取决于第 层的权重和标定数据。用随机高斯激活会得到错误的基(残差流激活高度非高斯)。逐层前向扫描正确地捕获了这一点。
步骤B:通过协方差特征分解求 PCA 基。
经验协方差矩阵 是对称半正定矩阵。其特征向量给出主方向,特征值 给出各方向的方差。对 LLAMA2-70B(),每个 是 64M 个元素(FP32 下 256MB)——有 80 层,总存储约 20GB,可在 A100 上一次性完成。
计算复杂度为 (构建 )(特征分解)。对 ,,前者 ~3.5×10¹² FLOPs,后者 ~5.5×10¹¹ FLOPs;在 GPU 上可以高效并行执行。
步骤C:选取切片宽度的依据。
均匀稀疏 最简单。更精细的非均匀版本最小化全局截断误差:
可贪心求解:将所有层按边际截断误差(每减少一个参数带来的误差增量)排序,优先保护误差增量大的层。
步骤D:权重变换与切片的几何意义。
变换 等价于:先把输入空间旋转到激活方差最集中的方向,再截取前 维。这保证了被丢弃的 列对应的输入方向在实际数据上几乎没有贡献(方差极小),故截断误差小。
Q 矩阵在推理时消失。 变换完成后,权重矩阵已经内嵌了 Q 的信息,推理时不需要再查询任何 Q 矩阵——完全透明。
图二:SliceGPT 压缩流程图
flowchart TD
A["预训练 LLM\n隐藏维度 d"] --> B["标定数据\n256 × 2048 token(C4)"]
B --> C["步骤1:吸收 RMSNorm γ\n精确折叠进相邻权重"]
C --> D["对每层 l:\n前向推理 → 采集 A_l ∈ ℝ^{d×N}"]
D --> E["PCA:C_l = A_l A_l^T → 特征分解 → Q_l"]
E --> F["设定 k_l = d·(1−s)"]
F --> G["W_in ← (W_in Q_l^T)[:, :k]\nW_out ← (Q_{l+1} W_out)[:k, :]"]
G --> H{还有下一层?}
H -->|是| D
H -->|否| I["变换 embedding E、LM head W_lm"]
I --> J["(可选)1 epoch LoRA 微调"]
J --> K["压缩后模型\n隐藏维度 k = 0.75d\n纯稠密矩阵,无需自定义算子"]
图二:SliceGPT 完整压缩流程。标定阶段只需前向推理,无需梯度。Q 矩阵被吸收进权重,推理时不存储。
特殊模块的处理方式
RMSNorm 的吸收
RMSNorm 计算:
RMS 缩放因子 在正交变换下不变(因为 )。所以缩放因子本身对基变换透明,只需把 折叠进下游权重:
这一步精确无误差,之后可从模型图中彻底删去 RMSNorm 层。压缩后的模型没有归一化层——只有线性层和非线性激活函数,结构更简洁,推理略快。
多头自注意力
在 LLAMA2 的多头注意力中,Q/K/V 投影矩阵 读取同一个残差流位置 ,因此都接受相同的输入基变换:
每个矩阵的输入维度从 缩减到 ;每个头的输出维度 保持不变。
输出投影 写入残差流位置 :
输出维度从 缩减到 ;输入维度 保持不变。
分组查询注意力(GQA,LLAMA2-70B使用): K/V 头在多个 Q 头之间共享。SliceGPT 处理方式相同—— 的输入维度从 缩减到 ,每个头的维度不变。
MLP 块(SwiGLU)
LLAMA2 的 MLP 使用 SwiGLU:
和 从第 层残差流读取:
写入第 层残差流:
中间维度 (LLAMA2 SwiGLU 中约为 )在基础算法中不切片。切片 需要对非线性后的激活额外做一轮 PCA,作为未来工作留存。
图三:各组件切片映射
flowchart LR
RS_l["残差流 l\n维度: k_l"] --> WQ["W_Q Q_l^T [:, :k]\nd_h × k_l"]
RS_l --> WK["W_K Q_l^T [:, :k]\nd_h × k_l"]
RS_l --> WV["W_V Q_l^T [:, :k]\nd_h × k_l"]
RS_l --> Wg["W_gate Q_l^T [:, :k]\nd_ff × k_l"]
RS_l --> Wu["W_up Q_l^T [:, :k]\nd_ff × k_l"]
WQ & WK & WV --> Attn["注意力计算\n(内部 d_h 不变)"]
Attn --> WO["Q_{l+1} W_O [:k, :]\nk_{l+1} × d_h"]
Wg & Wu --> MLP["SiLU / GeLU\n(d_ff 不变)"]
MLP --> Wd["Q_{l+1} W_down [:k, :]\nk_{l+1} × d_ff"]
WO & Wd --> RS_lp1["残差流 l+1\n维度: k_{l+1}"]
图三:从残差流读取的权重输入维度从 d 切到 k;向残差流写入的权重输出维度从 d 切到 k。内部维度(d_h, d_ff)不变。
标定数据与稀疏度配置
标定数据规模
SliceGPT 使用 C4 数据集(网页爬取语料)的 256 条序列,每条 2048 个 token,合计约 52 万个 token——相比预训练数据可以忽略不计,且仅需推理前向传播,无需存储梯度。
实验表明:
- C4 与 Wikitext-2 作为标定数据效果几乎相同,说明 PCA 基对数据分布(在自然语言范围内)不敏感
- 128 条序列已足够,512 条效果提升边际
- 推理模式下运行,显存峰值约为模型权重的 1.5–2 倍
已解释方差比(EVR)
压缩后第 层保留的”信息量”可以用 EVR 量化:
LLAMA2-70B 在 下,早中期层的 EVR 通常超过 99.5%,末尾几层略低至 ~98.5%,印证了大型模型激活方差高度集中的特性。
非均匀稀疏度分配
均匀切片是最简单的方案,但不同层的激活方差集中程度不同。非均匀版本在全局参数预算约束下最小化各层截断误差之和,可用贪心法求解,对小模型(<13B)效果更明显。
实验与结果分析
评估设置
- 评估模型: LLAMA2-7B/13B/70B;OPT-13B/30B/66B;Phi-2 (2.7B)
- 标定数据: 256×2048 token,来自 C4
- 评估框架: EleutherAI LM-Eval-Harness,7 个零样本任务(WinoGrande、HellaSwag、PIQA、ARC-easy、ARC-challenge、OpenBookQA、BoolQ)
- 基线: SparseGPT(50% 非结构化稀疏)、Wanda(50%非结构化)、LLM-Pruner(20% 结构化)
表一:25% 参数削减下的零样本精度
| 模型 | 稠密精度 | SliceGPT | 保留率 | 稠密 GPU 数 | 压缩后 GPU 数 |
|---|---|---|---|---|---|
| LLAMA2-7B | 64.0% | 58.2% | 91.0% | 1×A100 | 1×A100 |
| LLAMA2-13B | 66.8% | 61.4% | 91.9% | 2×A100 | 1×A100 |
| LLAMA2-70B | 70.4% | 69.8% | 99.1% | 4×A100 | 2×A100 |
| OPT-66B | 66.7% | 66.1% | 99.1% | 4×A100 | 2×A100 |
| Phi-2 (2.7B) | 71.2% | 63.9% | 89.7% | 1×RTX3090 | 1×RTX3090 |
核心规律:模型越大,压缩损失越小。 70B 模型丢失不到 1 个百分点;7B 模型丢失约 6 个百分点——背后是大型模型存在更多冗余,PCA 可以识别并安全丢弃。LLAMA2-13B 压缩后从 2 张 GPU 缩到 1 张,是实用价值最显著的案例之一。
表二:Wikitext-2 困惑度(越低越好)
| 模型 | 稠密 | SliceGPT 20% | SliceGPT 25% | SparseGPT 50% |
|---|---|---|---|---|
| LLAMA2-7B | 5.47 | 5.82 | 6.82 | 6.51 |
| LLAMA2-13B | 4.88 | 5.12 | 5.72 | 5.40 |
| LLAMA2-70B | 3.32 | 3.40 | 3.52 | 3.51 |
| OPT-66B | 9.34 | 9.55 | 9.80 | 9.76 |
在 66–70B 规模上,SliceGPT 25% 结构化压缩的困惑度与 SparseGPT 50% 非结构化稀疏大致相当,但 SliceGPT 的实际硬件收益更直接(无需自定义算子,GPU 数减半)。
算力缩减分析
对 LLAMA2-70B,,理论 FLOP 比为:
实测为 64–66%(略高于理论,因为 embedding 和 MLP 中间维度未完全削减)。更重要的是,LLAMA2-70B 从需要 4 张 A100 缩减到 2 张——直接节省一半硬件成本。
恢复微调效果
1 epoch LoRA 微调后:
- LLAMA2-70B:恢复 ~0.2 点(已接近稠密质量,效果有限)
- LLAMA2-7B:恢复 ~2 点(58.2% → 60.1%)
- Phi-2:恢复 ~3 点(63.9% → 67.1%)
微调对初始损失较大的小模型帮助最显著;对大模型基本无需微调即可实用。
图四:方法横向比较(LLAMA2-70B,Wikitext-2 PPL)
flowchart LR
subgraph Methods["方法比较"]
Dense["稠密基线\nPPL=3.32\n4×GPU\n无自定义算子"]
SparseGPT["SparseGPT 50%\nPPL=3.51\n4×GPU(仍然)\n需要稀疏 GEMM"]
Wanda["Wanda 50%\nPPL=3.53\n4×GPU(仍然)\n需要稀疏算子"]
SliceGPT["SliceGPT 25%\nPPL=3.52\n2×GPU ✓\n无需自定义算子 ✓"]
end
图四:SliceGPT 是唯一同时满足「无自定义算子」和「真实 GPU 数减半」的方法,在 66–70B 上困惑度与非结构化稀疏方法持平。
与已有方法的比较
为何计算不变性比量级剪枝更有原则
大多数结构化剪枝方法(LLM-Pruner、ShortGPT 等)通过量级、梯度、Taylor 展开等启发式指标来选择剪去哪些神经元/通道。SliceGPT 的不同之处在于:
- 先通过 PCA 找到理论最优基变换(在最小化截断误差意义上,PCA 是最优的——这是 Eckart-Young 定理的直接推论)
- 基变换本身引入零误差——只有后续截断引入近似
- 截断误差有明确的上界(丢弃特征值之和),可以定量指导稀疏度选择
图五:训练后 LLM 压缩方法分类
flowchart TD
root["训练后 LLM 压缩"]
root --> Quant["量化\nGPTQ · AWQ · SmoothQuant"]
root --> Unstruct["非结构化稀疏\nSparseGPT · Wanda · 量级剪枝"]
root --> Struct["结构化剪枝\nSliceGPT · LLM-Pruner · ShortGPT · FLAP"]
root --> LowRank["低秩分解\nSVD-LLM · ASVD · TrLoRA"]
Struct -->|"理论依据:\n计算不变性 + PCA"| SliceGPT_node["SliceGPT(本文)"]
图五:SliceGPT 属于结构化剪枝,与其他方法的关键区别在于背后有精确的理论推导,而非量级启发式。
局限性与适用边界
规模依赖性是根本限制
99% 精度保留的结论仅对 60B+ 参数的模型成立。7B 模型下损失约 6 个百分点。根本原因:
- 大型模型过度参数化,激活方差高度集中在少数主方向(特征值谱快速衰减)
- 小型模型利用率更高,各方向都有实质性贡献(特征值谱较为平坦)
SliceGPT 本质上在利用过度参数化提供的”冗余方差”,这在小模型中天然不足。
MLP 中间维度未切片
基础算法只削减残差流维度 ,MLP 的中间维度 (SwiGLU)保持不变。这意味着:
- 矩阵尺寸: → (节省 比例)
- 矩阵尺寸: → (节省 比例)
- 但非线性后的中间激活仍占 维,MLP 内部的算力节省不完全按 比例
对 MoE 等 MLP 算力占主导的架构,这一局限更为明显。
评估基准过于单一
所有实验仅在 7 个短答案零样本分类任务上评估。以下类型任务没有覆盖:
- 代码生成(HumanEval、MBPP)
- 数学推理(GSM8K、MATH)
- 长文本生成指令跟随(MT-Bench、AlpacaEval)
- 长上下文任务(LongBench、SCROLLS)
残差流维度削减对需要精确维护多步推理状态的任务可能更有损害,但论文未验证。
KV 缓存未受益
由于每个注意力头的维度 未切片, 输出的 K/V 向量维度不变,KV 缓存大小不减少。对长序列服务(KV 缓存是主要内存瓶颈)而言,SliceGPT 没有直接收益——论文未提及这一局限。
批判性分析:不足与可改进之处
(一)方法缺陷与弱点
“25% 参数削减”标题存在误导性。 SliceGPT 把残差流维度从 缩减到 ,权重矩阵在一个维度上缩减了 25%。对形状为 的权重矩阵,参数量从 减到 ,确实是 25%。但形状为 的 MLP 矩阵仅在一个维度上缩减,而 Embedding 矩阵 ()的参数量削减依赖于 缩减的绝对值,占比微乎其微。论文报告”含 embedding 最多削减 25% 参数”,但 Table 2 中各模型的实际削减率有差异,这一细节应更突出。
与 SparseGPT 的比较处于不同操作点。 论文将 SliceGPT 25% 结构化稀疏与 SparseGPT 50% 非结构化稀疏比较困惑度,声称”具有竞争力”。但两者在实际 FLOP 削减和推理加速上差距显著:SparseGPT 50% 非结构化在没有稀疏内核的情况下几乎没有延迟收益(有些情况下反而更慢),而 SliceGPT 25% 有真实的 ~34% FLOP 削减。公平比较应当在相同的实测吞吐量下做横向对比,而非在参数削减率上对齐。
没有对标定数据大小和领域的系统消融。 论文仅做了 C4 对比 Wikitext-2 的一次比较,但对于垂直领域模型(医疗、代码、法律),C4 作为标定数据是否足够、领域匹配标定数据是否必要,完全未研究。这是一个实用性缺口。
无真实延迟测量。 论文给出 FLOP 削减数字和 GPU 数量变化,但没有报告实际 tokens/second。对内存带宽受限的推理场景(小批次),FLOP 削减不直接等于延迟削减——论文”更快”的结论在技术上是理论的而非实测的。
微调恢复分析不足。 1 epoch LoRA 微调结果仅作为附加说明,没有探讨:更多 epoch 能恢复多少、全量微调 vs LoRA 孰优孰劣、最优训练数据选择策略。
(二)作者淡化或回避的局限
KV 缓存无收益被完全略去。 由于每个注意力头维度 未切片,K/V 投影输出维度不变,KV 缓存大小不减少。论文完全没有提及这一点。对于长上下文推理场景,KV 缓存是显存瓶颈,SliceGPT 在此场景下没有实质性帮助。
张量并行分片的潜在问题。 压缩后的隐藏维度 在 LLAMA2-70B 中为 6144。对于张量并行度为 8 或 16 的部署,6144/16 = 384,整除没问题;但对某些非 2 次幂的并行度,可能需要 padding 或不规则分片,增加部署复杂性。论文未分析。
压缩时的显存峰值被略去。 压缩过程中需要同时持有原始权重和变换后的权重( 和 ),峰值显存约为模型权重的两倍。对 LLAMA2-70B(FP16 约 140GB),峰值约 280GB,超过 4×A100-80GB(320GB 合计)的单一张量限制,需要精细的逐层显存管理。论文声称 4×A100-80GB 足够,但未说明内存管理细节。
(三)可以改进的地方
1. 同时切片 MLP 中间维度。 对 SwiGLU 后激活向量(非线性后的中间向量)额外运行一轮 PCA,用于切片 ——将 的输出维度和 的输入维度同时削减。理论上在 下可将 MLP 算力进一步降至 ,改善目前的 “只切一边” 问题。
2. 带验证反馈的非均匀层分配。 在均匀稀疏之外,使用少量保留集(16–32 条序列)逐层测试不同 对困惑度的影响,并用贪心策略保护最敏感的层(通常是首尾几层)。已有多项研究表明首尾层对结构化剪枝极为敏感,系统性消融此处有望显著改善精度-压缩曲线。
3. 扩展评测集,纳入推理与代码任务。 增加 GSM8K(数学)、HumanEval(代码)、MT-Bench(指令跟随)评估。若 SliceGPT 在这些需要精确多步推理的任务上损失显著大于零样本分类,这对实用部署决策至关重要,应透明报告。
4. 与量化组合并测量联合效果。 在 SliceGPT 后接 AWQ 或 GPTQ(INT4),与单独 AWQ 在相同硬件上对比。若 SliceGPT + INT4 能在更低延迟下达到 INT4 单独的精度,则形成极具说服力的部署方案——此组合在论文中完全未探索。
5. 注意力头维度 PCA 切片。 在当前算法的基础上,对每个注意力头的 K/V 激活向量单独做 PCA,进一步削减 。这将直接缩减 KV 缓存大小,对长序列推理服务产生切实价值,是弥补现有局限的最直接方向。
深度解析:SliceGPT 与权重级低秩分解的根本区别
SliceGPT 和 SVD-LLM、ASVD 等方法都涉及 SVD,都会产生更小的权重矩阵,很容易被混为一谈。但两者在数学上有本质区别,理解这个区别对于选择压缩方法至关重要。
权重级低秩分解(SliceGPT 不是这个)
传统低秩压缩独立地对每个权重矩阵做截断 SVD:
其中 ,。原来的一次矩阵乘变成两次:先乘 ,再乘 。
权重级 SVD 的问题:
- 每个矩阵独立近似,忽略了相邻层的近似误差会在残差流中累积
- 近似误差定义在权重空间——被截断的方向未必对应激活真正占据的方向
- 两个小矩阵 都需要存储,除非 ,否则推理时两次 GEMM 的开销可能反而更大
SliceGPT 的实际做法
SliceGPT 对激活而不是权重做 SVD/PCA,核心数学区别如下:
步骤一(SliceGPT): 找到 ,使激活 在前 个坐标上方差最大。
步骤二(SliceGPT): 对所有触及位置 的权重做一致的基变换——这一步是精确的(计算不变性定理保证零误差)。
步骤三(SliceGPT): 截去最后 个坐标。这是唯一的近似步骤,误差等于被丢弃的特征值之和。
结果是一个单独的矩阵(不是乘积对):原来 的矩阵变成 ——一个矩阵,不是两个。这就是为什么推理计算真正减少,而不仅仅是被重新排列。
误差上界的形式化比较
权重 的低秩 SVD 误差:
这个误差在权重空间,可能不反映激活实际使用哪些方向。
SliceGPT 第 层的截断误差:
其中 是激活协方差的特征值。这个误差在激活空间,直接衡量实际运行时被丢弃了多少信息——对下游任务性能的预测更直接、更紧。
图六:SliceGPT 与权重级低秩分解对比
flowchart TB
subgraph WeightSVD["权重级 SVD(如 SVD-LLM)"]
W1["W ∈ ℝ^{m×d}"] -->|"SVD 截断"| UV["U_k (m×k) × Σ_k V_k^T (k×d)\n两个矩阵,两次 GEMM"]
UV --> Err1["误差:‖W − U_kΣ_kV_k^T‖_F\n(权重空间,不反映激活分布)"]
end
subgraph SliceGPT_Diag["SliceGPT(激活空间)"]
W2["W ∈ ℝ^{m×d}"] -->|"旋转:W Q_l^T(精确,零误差)"| WQ["W Q_l^T ∈ ℝ^{m×d}"]
WQ -->|"切片:保留前 k 列"| Wk["W Q_l^T [:, :k] ∈ ℝ^{m×k}\n一个矩阵,一次 GEMM"]
Wk --> Err2["误差:Σ_{i>k} λᵢ(激活协方差特征值)\n(激活空间,直接量化信息损失)"]
end
图六:权重级 SVD 产生矩阵乘积对、误差在权重空间;SliceGPT 产生单一更小矩阵、误差在激活空间,与实际任务性能更直接相关。
稀疏度扩展行为与各层特性分析
精度随稀疏度如何下降?
理解精度-稀疏度曲线对于选择实际部署点至关重要:
- 0–10% 稀疏度: 所有规模模型精度几乎无损。高方差的 PCA 方向远比低方差方向重要;只丢弃尾部代价几乎可忽略。
- 10–20% 稀疏度: 70B+ 模型损失可忽略;7–13B 模型损失约 1–2 个百分点,仍可实用。
- 25% 稀疏度(论文主要场景): 大型模型的”甜蜜点”——70B 保留 99%;7B 损失 6 个百分点,开始明显。
- 30%+ 稀疏度: 精度下降加速呈非线性。特征值谱衰减快但不是无限,高稀疏度下开始删除有实质方差的方向。
这个非线性降级规律与数学预测一致:截断误差最初增长缓慢(只丢弃小特征值),之后迅速增大(开始丢弃有意义的特征值)。
各层激活特征值谱的差异
分析不同层 的特征值谱,呈现规律性结构:
- 早期层(–): 谱相对平坦,激活方差分散在较多方向。这些层较难压缩,非均匀分配中应分配更小的稀疏率。
- 中间层(–,对 70B 而言): 谱陡峭,即使 时 EVR 也很高。冗余极大。
- 末尾几层(): 谱居中。LM head 需要区分大量不同 token,最后几层需要更多维度。
这一分层结构解释了为何均匀稀疏在平均意义上工作良好,而保护首尾层的非均匀分配可在相同算力预算下解锁更好的精度。
与具体架构变体的交互
RoPE 位置编码(LLAMA2使用): RoPE 在 Q/K 投影之后施加,作用在每个注意力头的维度 上。SliceGPT 不改变 ,故 RoPE 完全不受影响。
ALiBi 位置偏置(OPT使用): 注意力分数中的加性偏置,同样作用在注意力分数空间( 维),SliceGPT 不改变,无需特殊处理。
权重共享 Embedding(部分模型): 若输入 embedding 与输出 LM head 共享权重,SliceGPT 的实现需要在压缩后重新绑定,代码库已处理此情况。
消融实验补充分析
均匀稀疏 vs. 非均匀稀疏
论文简短提及非均匀分配效果”边际改进”。从理论上看,非均匀分配的优势在于可以保护激活谱较平坦(冗余少)的层,同时对激活谱陡峭(冗余多)的层更激进地压缩。对于大型模型(70B)因本身冗余极大,均匀稀疏效果已经很好;对于小型模型(7B),非均匀分配有望恢复 1–3 个百分点。
不同稀疏率下的 GPU 内存对比
在 LLAMA2-70B 上,不同稀疏率下推理所需的 GPU 内存:
| 稀疏率 s | 隐藏维度 k | FP16 权重大小(估算) | 最少 GPU(A100-40G) |
|---|---|---|---|
| 0% | 8192 | ~138GB | 4 |
| 20% | 6554 | ~90GB | 3 |
| 25% | 6144 | ~80GB | 2 |
| 30% | 5734 | ~69GB | 2 |
25% 稀疏度是”从 4 张变 2 张 GPU”的临界点,兼顾精度和基础设施节省。
可复现性
- 代码: github.com/microsoft/TransformerCompression(MIT 许可,截至 2025 年 6 月仍在维护)
- 标定数据: HuggingFace
allenai/c4英文子集,256 × 2048 token - 压缩耗时: LLAMA2-70B 约 1–2 小时(4×A100-80GB,纯推理,无梯度)
- 评估: EleutherAI LM-Eval-Harness v0.3+,
--no_cache保证可复现性 - 确定性: 给定相同标定序列顺序完全确定性;仅标定采样涉及随机种子
- 依赖: PyTorch ≥ 2.0,
transformers,datasets,scipy.linalg.eigh
从零实现 SliceGPT 核心逻辑约需 200 行 PyTorch——是理解计算不变性原理的极好教学案例。
一张表格总结全文
在结束之前,用一张表格提炼 SliceGPT 的核心设计决策:
| 设计决策 | 原因 | 留下的开放问题 |
|---|---|---|
| 用 PCA 选取 Q(而非随机) | Eckart-Young 最优:最小化激活重建误差 | 需要标定前向传播 |
| 默认均匀稀疏率 | 对大型模型近似最优,简单易用 | 小模型上次优;非均匀效果更好 |
| 吸收 RMSNorm 进权重 | 精确代数化简,推理无额外开销 | 仅适用于对角缩放归一化 |
| 不切片 | 避免第二轮 PCA;简化实现 | 留下 MLP 算力节省未利用 |
| 256 序列标定 | 稳定 PCA 所需且开销低 | 垂直领域模型可能需要领域内数据 |
| 可选微调 | 大模型无需微调即可实用 | 小模型从 1 epoch 微调中受益显著 |
每一行”留下的开放问题”都是一个具体的研究方向,合在一起构成了扩展 SliceGPT 的路线图。
总结
SliceGPT 的贡献是干净的:一个精确的数学定理(计算不变性)加上一个原则性的工程实现(PCA 旋转 + 物理截断),产出了无需自定义算子、可立即部署在标准硬件上的更小更快 Transformer。
在 70B 规模上,该方法的压缩-质量权衡极具吸引力:25% 参数削减、99% 任务性能保留、GPU 数量减半、FLOP 缩减到 64–66%——对于 LLAMA2 规模的工业部署,这是目前部署门槛最低的压缩方案之一。
其局限同样清晰:小模型(<13B)效果大幅下降;仅在短答案零样本分类任务上做了验证;MLP 中间维度未切片;KV 缓存未受益;与量化组合的效果未知。这些不是方法的根本缺陷,但划定了它适用的边界条件。
对后续研究者:计算不变性定理本身是值得深入发掘的理论工具——对注意力头维度、MLP 中间维度乃至 MoE 的路由空间都有潜在的拓展价值。对工程实践者:在 70B+ 规模且任务以零样本分类为主的场景,SliceGPT 是当前最”开箱即用”的结构化压缩选项。
个人感受: 这篇论文很适合作为进入模型压缩领域的入门读物。数学洞察用五行公式讲清楚,代码开源干净,大型模型结果令人信服。评估范围不够宽(缺少推理与代码任务)和小模型表现欠佳是真实的局限,但不影响核心贡献的价值。建议仔细读一遍计算不变性的形式化证明,对理解 Transformer 内部结构很有帮助。
延伸阅读
想深入了解相关背景的读者,可以参考以下工作:
- SparseGPT(Frantar & Alistarh, NeurIPS 2023)——非结构化对应方案;对比两者的标定策略:SparseGPT 用逐层 Hessian 重建,SliceGPT 用 PCA 协方差
- SVD-LLM(Wang et al., 2024)——直接对权重矩阵做 SVD 的低秩压缩;与 SliceGPT 的激活空间思路形成鲜明对比
- ASVD(Yuan et al., 2023)——激活感知 SVD,在概念上与 SliceGPT 最接近,但仍在权重空间做近似
- QuIP#(Tseng et al., NeurIPS 2024)——在量化前对权重施加随机正交变换(非相关性处理),使量化误差更均匀分布;正交变换思路与 SliceGPT 同源,但服务于量化而非切片
- LLM-Pruner(Ma et al., 2023)——梯度引导的结构化剪枝;展示了启发式方法与 SliceGPT 原则方法的精度-压缩权衡差异
- TransformerCompression(GitHub)——微软研究院官方开源实现,代码整洁、注释清晰、持续维护,是动手实验的最佳起点
- 线性代数教材中的 Eckart-Young 定理——理解为什么 PCA 是最优截断基的数学依据,把整篇论文的数学背景贯穿起来
推荐概念阅读路径
对于刚接触训练后压缩的读者,建议按以下顺序阅读:
- SliceGPT(本文)——从这里开始,理解理论框架和计算不变性思想
- SparseGPT——看看非结构化方法如何用 Hessian(而非 PCA)解决同样的标定问题
- SVD-LLM / ASVD——直接对比权重空间 SVD 与激活空间 SVD 的差异
- QuIP#——同样使用正交变换,但服务于量化而非切片,帮助理解思路的普适性
- LLM-Pruner——梯度引导的结构化剪枝,反衬出 SliceGPT 仅靠标定数据前向推理的简洁性
这条路径建立了一个连贯的心智模型:上述所有方法的共同线索是用标定数据指导压缩决策,区别在于压缩对象(权重、激活、结构)和如何使用标定信号(Hessian、PCA、梯度)。
实现要点备忘(写给想自己动手的人)
从零实现 SliceGPT 的几个容易踩坑的地方:
-
协方差矩阵的数值稳定性。 用
scipy.linalg.eigh(对称矩阵特征分解)而非numpy.linalg.eig(通用特征分解);前者更稳定,且保证实数特征值。 -
Q 矩阵的行列顺序。 PCA 返回的特征向量可能按升序排列,需要翻转为降序(方差最大的方向排在前面)才能正确切片。
-
残差连接的一致性。 同一层的所有读写权重必须使用同一个 ——即注意力的 Q/K/V/O 投影和 MLP 的 gate/up/down 都共享一个层级的 。
-
末层 LM head 的处理顺序。 如果模型权重共享(embedding = LM head 的转置),只能变换一次;需要在应用 后重新绑定。
-
显存管理。 逐层处理:采集完第 层激活后立刻计算 、变换并切片权重,释放 ,再进入第 层。不要试图一次性存储所有层的激活矩阵。
-
验证正确性。 压缩完成后,对同一批标定数据计算稠密模型和压缩模型的困惑度之差——如果差距超过 0.2(对 70B 模型,25% 稀疏度),说明实现有误(最常见的错误是 Q 矩阵的方向搞反,或某层权重漏了变换)。
-
RMSNorm 吸收的时机。 在开始逐层 PCA 之前就完成 RMSNorm 吸收,否则激活协方差的估计会包含归一化缩放的影响,导致 PCA 基计算不准确。正确顺序:折叠 γ → 采集激活 → 计算 PCA → 切片。
这些实现细节在论文附录和官方代码中有说明,但容易被快速阅读者跳过。上手时对着代码逐行检验数学公式,是最可靠的验证方法。
一个思维实验:如果激活方差完全均匀会怎样?
SliceGPT 的效果依赖于激活方差的不均匀分布——少数主方向承载绝大多数方差。那么,如果激活方差完全均匀(所有特征值相等),会发生什么?
数学上: 如果 ,那么任何正交基 下截断误差都是 ——与 的选择无关。PCA 不再提供优势,截断 25% 维度会均匀地损失 25% 的激活”信息”。
实际意义: 这种极端情形在实践中不会发生,但随机初始化的模型(训练前)激活方差确实比较均匀。训练的过程会让激活方差越来越集中到少数方向(这与神经网络的隐式低秩性有关)。这就是为什么 SliceGPT 只能用于已训练模型:预训练带来的”激活低秩性”是方法有效的前提。
这个思维实验也解释了另一个现象:更大的模型、训练更充分的模型,激活方差往往集中度更高(特征值谱更陡),因此 SliceGPT 在大型充分训练的模型上效果最好。反过来,欠拟合的小模型或对话微调导致激活方差重新分散的模型,可能不适合用 SliceGPT 压缩。
这个思维实验还引出了一个有趣的问题:未来的训练方法能否主动提升激活的低秩性(让特征值谱更陡),从而使后续的 SliceGPT 压缩损失更小?目前这个方向尚未有系统研究,但理论上是可行的——例如在训练目标中加入激活正则化项,奖励激活方差在少数主方向上集中。这将是一个把”训练友好性”和”压缩友好性”结合起来的有趣研究方向。
换言之,SliceGPT 目前假设模型的激活低秩性是训练的”副产品”,而下一步可能是把激活低秩性做成训练的”主产品”——让压缩作为一等公民参与预训练目标的设计。
本篇笔记的结构索引
为方便快速检索,本文各节内容对应关系如下:
| 想了解的问题 | 参考章节 |
|---|---|
| SliceGPT 的核心数学原理 | §核心数学洞察:计算不变性 |
| 算法每一步在做什么 | §SliceGPT 算法详解 |
| 各注意力/MLP 组件如何处理 | §特殊模块的处理方式 |
| 实验数字和效果 | §实验与结果分析 |
| 与 SVD-LLM/ASVD 的区别 | §深度解析:SliceGPT 与权重级低秩分解的根本区别 |
| 为什么大模型效果更好 | §稀疏度扩展行为与各层特性分析 |
| 方法的缺陷和改进方向 | §批判性分析:不足与可改进之处 |
| 想自己实现 | §实现要点备忘 |