第 11 章 AI InfraGPU分布式训练

第 11 章 模型量化与压缩

第11章 模型量化与压缩

本章覆盖模型压缩的两条主线:以量化为主的数值压缩(权重与激活的 INT4/INT8/FP8 量化、KV Cache 量化)和以稀 疏、蒸馏为主的结构压缩,并给出主流方法的原理、性能基准与部署实践。量化误差的理论分析、各方法的实现机制与生 产环境选型是本章重点,分布式训练中的低精度优化不在本章展开。

11.1 量化数学基础

模型量化(Model Quantization)是将神经网络中高精度浮点参数(FP32/FP16/BF16)映射到低精度整数表示 (INT8/INT4/INT2)的过程,其核心目标是在可接受的精度损失范围内,显著降低模型存储、访存带宽和计算代价。量 化的数学本质是寻找一个映射函数 Q : R → Z,使得量化后的整数表示可以近似原始浮点值。

11.1.1 仿射量化与尺度变换

仿射量化(Affine Quantization)是最通用的量化形式,它将浮点值 r 映射为整数 q: r = s ⋅ (q − z) 其中 s 为尺度因子(scale),z 为零点(zero-point)。反量化(Dequantization)时通过该公式从整数恢复浮点近似值。 对应的量化公式为: q = clamp (round ( ) + z, qmin , qmax ) r s 对于 b 比特量化: •有符号(signed)范围:[−2 , 2 − 1],如 INT8 为 [−128, 127] b−1 b−1 •无符号(unsigned)范围:[0, 2 − 1],如 UINT8 为 [0, 255] b 尺度因子决定量化精度:s = 。尺度越大,量化步长越大,精度越低。因此在实践中最关键的决策是确定 r 和 rmax −rmin 的取值策略。 qmax −qmin min r max

11.1.2 对称与非对称量化

对称量化(Symmetric Quantization)设零点 z = 0,量化公式简化为 r = s ⋅ q。INT8 对称量化的有效范围是对称的 [−127, 127](-128 被排除以保持对称性)。优点是反量化计算简单(仅需乘法),硬件实现高效;缺点是强制零点为零对偏 置较大的分布(如 ReLU 输出为非负值)不够友好。 非对称量化(Asymmetric Quantization)的零点是任意整数,可充分利用整数范围。对 ReLU 后的激活值,可设 z = 0, q min = 0, q = 255,使用 UINT8 表示 [0, r ]。代价是反量化需要 s(q − z),增加一次减法和整数-浮点转换开销。 max max

11.1.3 量化粒度

量化粒度决定尺度因子的共享范围,直接影响精度与效率的权衡,各粒度对比如表11-1所示。 表11-1 量化粒度对比 粒度 Scale/Zero-point 数量 精度 计算效率 Per-Tensor 1 per tensor 最粗糙 最高,单次向量变换 Per-Channel 1 per output channel 适中 中等,逐通道变换 粒度 Scale/Zero-point 数量 精度 计算效率 Per-Group 1 per N elements (N=32/64/128) 最高 较低,更多变换操作 Per-Token 1 per token(激活值) 高 适合动态量化 Per-Group 量化(group_size=128)是现代 W4 权重压缩的事实标准,已被 GPTQ、AWQ 等方法广泛采用。Per- Channel 量化适合 W8 场景(如 SmoothQuant W8A8),粒度已足够精细。Per-Tensor 量化误差最大,仅适合精度容忍 度高或专用硬件优化的场景。

11.1.4 动态与静态量化

动态量化(Dynamic Quantization)在推理时根据实际输入动态计算激活值的量化参数(r , r )。PyTorch 中 torch.quantization.quantize_dynamic 即采用此策略。优点是无需校准数据,部署简单;缺点是在每个推理步都需 min max 要计算统计量,引入额外延迟,同时逐次计算尺度导致矩阵乘无法完全使用整数内核。 静态量化(Static Quantization)预先使用校准数据集统计激活值范围,确定固定的量化参数。推理时使用预计算的 scale 和 zero-point,可实现全整数计算流水线(INT8 matrix multiply + INT32 accumulation)。代价是需要代表性的校 准数据集,且对分布外输入鲁棒性较差。

11.1.5 校准方法

校准(Calibration)是确定激活值量化参数的关键步骤,主要有三类方法。 Min-Max 校准:直接在校准数据上统计激活值的全局最小值和最大值。简单快速,但对异常值(outliers)极为敏感,单 个异常值会撑大量化范围,导致大部分正常值的有效比特位数大幅减少。 基于 MSE 的校准(MSE-Based Calibration):在验证集上搜索最优的量化步长,使得量化前后输出的均方误差最小: arg min ∑(W xi − Q(W )Q(xi ))2 s i 其中 Q(⋅) 为量化函数。MSE 校准通常比 Min-Max 获得更低的量化误差,但计算开销更大,且需要访问原始模型进行多次 前向传播。 Percentile 裁剪:对于 INT8 量化,丢弃 [0, α] 范围之外的异常值,仅对 [0, α百分位] 范围内的值进行 Min-Max 校准。典型 的 α 取值为 99.9% 或 99.99%。这种策略在 LLM 量化中尤为有效,因为 LLM 的激活值和 Key-Value Cache 中普遍存在少 量极大异常通道。 量化误差分析:量化引入的误差可以建模为加性均匀噪声。对于 b 比特均匀量化,量化步长 Δ = ,量化噪声方差 rmax −rmin 为: 2b −1 Δ2 σq2 ≈ 当比特数从 FP16 的 11 位有效尾数(含隐含位)降到 INT8 时,在同一数值范围内的相对精度损失约为 2048/256 ≈ 8 倍。FP16 相比 INT8 的最大优势在于动态范围——5 位指数使其可覆盖约 10 到 65504 的数值范围,而 INT8 在给定 −8 scale 下仅有 256 倍的动态范围。但对于大语言模型,由于参数的高度冗余性,这种精度损失可以通过权重补偿技术(如 GPTQ 中的 Optimal Brain Quantization)在大粒度上被部分抵消。

11.1.6 数值示例

以 Llama-7B 的单个 Attention 层权重矩阵 W ∈ R 为例进行 INT4 Per-Group 量化(group_size=128): 4096×4096

  1. 将 W 按行分组(row-wise grouping),每行划分为 32 组、每组 128 个元素,全矩阵共 4096×32 = 131,072 组
  2. 对每组计算:r = max(∣W ∣), r = −r (对称量化) max group min max
  3. 计算 scale:s = r /7(INT4 signed 范围为 [−8, 7],对称量化实际使用 [−7, 7],排除 -8 以保持对称性) max
  4. 量化:q = clamp(round(W /s), −7, 7),存储为 4-bit 整数
  5. 推理时反量化:W^ = s ⋅ q,然后用 W^ 进行 FP16 矩阵乘 对于 INT8 对称量化(Per-Channel),scale 的典型值为 10 到 10 量级,量化后的 INT8 操作(如 NVIDIA Tensor Core −3 −2 的 mma 指令)吞吐量约为 FP16 的 2 倍。

11.1.7 量化与模型结构的关系

不同层对量化的敏感度差异显著。Attention 层的 Q, K, V 投影矩阵通常比 MLP 层的权重矩阵对量化更敏感,原因是 Attention 矩阵用于计算点积相似度,微小的数值扰动会被 softmax 放大。FFN 层具有较高的参数冗余度,量化引起的精 度下降通常可以通过训练后补偿技术(如 GPTQ、AWQ)有效缓解。Embedding 层和 LayerNorm 层通常保持 FP16/BF16 精度,不参与量化——这些层参数少但精度敏感度高,量化收益有限。 大型 Transformer 模型中,一个关键的现象是量化误差的累积效应:每层的量化误差在深层传播中可能被逐层放大。 SmoothQuant 通过数学变换将量化难度从激活值迁移到权重来应对这一问题;GPTQ 通过逐层权重补偿更新未量化的权 重来补偿量化误差。

11.2 GPTQ 逐层权重量化

GPTQ(Post-Training Quantization for Generative Pre-trained Transformers)由 Frantar 等人于 2022 年提出(发表 于 ICLR 2023),是当前最广泛应用的 LLM 训练后量化方法之一。GPTQ 能在 4 个 GPU 小时内将 175B 参数的模型量化为 INT4,同时保持极低的困惑度退化——OPT-175B 在 INT4 下仅增加约 0.3 的困惑度。

11.2.1 OBQ 背景

GPTQ 的数学基础源自 Optimal Brain Surgeon(OBS)和 Optimal Brain Damage(OBD)框架,核心思想是:在剪枝 或量化某一权重时,通过更新剩余权重来补偿该权重变化引起的输出损失。 考虑单层线性变换 y = W x,量化后的权重矩阵 W^ 与原始 W 之间的输出重构误差为: drow ^ x∥2 = ∑ ∥Wi,: x − W E = ∥W x − W ^ i,: x∥2 F i=1 由于每行输出是独立的,问题可分解为逐行处理。对第 i 行,量化 q 个权重造成的影响可以通过更新同一行中尚未量化的 权重来部分抵消: wq − quant(wq ) −1 δF = − ⋅ H:,q [H −1 ]qq 其中 H = 2XX + λI 是 Hessian 矩阵的近似,X 是经过该层的校准数据输入,λ 为阻尼项。 T OBQ 算法是逐个权重地量化和补偿,时间复杂度为 O(d ⋅ d )。对一个大模型层(如 d = 4096,d 3 ),逐权 row = 4096 重处理的 d 次迭代每行需 O(d ),总计 O(d ⋅ d ) 的复杂度在实践中不可行。 row col col 2 3 col col row col

11.2.2 GPTQ 核心算法

GPTQ 将 OBQ 的逐权重量化扩展为逐列批量化,同时对同一列的所有行权重执行量化和补偿,将复杂度降为 O(max(d , d ) ⋅ d )。算法核心流程如下: row col col

  1. 预计算 Hessian 矩阵:累积校准数据集 {x , …, x } 的激活值,计算 H = (2XX + λI) 1 N −1 T −1
  2. Cholesky 分解:对 H 进行 Cholesky 分解 H = LL ,避免显式矩阵求逆 −1 −1 T
  3. 按序逐列量化:遍历权重矩阵的每一列,先量化该列全部行权重并计算量化误差 Δ = W − W^ ,再对后续未量化列 :,q :,q j > q 执行补偿更新 W ← W + Δ ⋅ H /H q −1 −1 :,j :,j q q,j q,q 完整流程如图11-1所示。 Calibration Data Compute Hessian H Cholesky Decomposition H=LL^T

Loop Over Columns Quantize Current Column Output Quantized Weights Compute Quantization Err or Delta Update Remaining Colum ns 图11-1 GPTQ 逐层量化流程 Hessian 矩阵的数学意义:H 的逆对角线元素 H 度量了对第 q 个权重扰动引起的独立输出误差;H 度量了第 q 和 −1 −1 −1 第 j 个权重之间的耦合关系,用于补偿更新。 q,q q,j 阻尼项(Damping):H = 2XX + λ ⋅ diag(2XX )。阻尼系数 λ 通常取 0.01,一方面是防止 Hessian 矩阵奇异导致求 T T 逆失败,另一方面是补偿近似带来的数值不稳定。过大的 λ 会过度抑制补偿更新,导致量化精度下降。 列排序策略:GPTQ 可以选择按 Hessian 对角线的递减顺序处理列(即优先量化对输出影响最大的权重),也可以在量化 执行前用 OBS 代价函数重新排序。实践中发现,对 LLM 而言自然顺序即可获得足够好的结果,排序带来的增益通常不超 过 0.01 困惑度,而额外的重排开销较大。

11.2.3 块处理与内存效率

对 100B+ 参数模型的量化,H 矩阵大小为 d × d (如 Llama-70B 的 hidden_size=8192 的 FFN 中间层,H 尺寸 −1 −1 可达 28672 × 28672),内存占用过大。GPTQ 引入块处理(Block Processing)策略: col col •将权重矩阵按输出通道划分为多个块(如 128 个通道一组) •每个块拥有独立的 H ,大小为 d × B(B 为块大小) −1 col •块内执行完整的量化和补偿更新 •块间独立处理,无需全局 Hessian 块处理将 Hessian 内存从 O(d ) 降为 O(d ⋅ B),同时保持块内的精确补偿。对于 Llama-70B 的 INT4 量化 (group_size=128),块大小通常设为 128,Hessian 内存消耗约几百 MB,可在单 A100 GPU 上完成 70B 模型的全量 col col 化。

11.2.4 性能基准

GPTQ 在不同模型上的 INT4 量化效果如表11-2所示(以 WikiText-2 困惑度为指标,越低越好)。 表11-2 GPTQ-INT4 困惑度基准 模型 FP16 PPL GPTQ-INT4 PPL PPL Degradation

OPT-175B           8.34                                     8.68                      +0.34
Llama-7B           5.68                                     5.78                      +0.10
Llama-13B          5.09                                     5.18                      +0.09
Llama-70B          3.32                                     3.48                      +0.16
Llama-2-7B         5.47                                     5.54                      +0.07
Llama-2-13B        4.88                                     4.93                      +0.05
Llama-2-70B        3.31                                     3.50                      +0.19

GPTQ-INT4 将模型大小压缩约 4 倍,推理时反量化到 FP16 执行矩阵乘法,或将 INT4 权重与 FP16 激活值混合计算。 GPU 显存节省约 3.5-3.8 倍(权重 + 量化元数据),吞吐量提升约 1.5-2 倍(取决于 GPU 架构对 INT4 MMA 的原生支 持)。

11.2.5 与其他方法的关系

GPTQ 专注于权重量化,不直接处理激活值量化。结合 SmoothQuant 的激活值平滑变换后,GPTQ 也可以用于激活值量 化。AWQ 在 GPTQ 的基础上引入了激活值感知的权重缩放,进一步提升了校准精度。AutoGPTQ 库提供了 GPTQ 的完整 实现,支持 Llama、Bloom、GPT-NeoX、Falcon 等主流模型的 INT2/3/4/8 量化。

11.3 AWQ 激活值感知量化

AWQ(Activation-aware Weight Quantization)由 MIT HAN Lab 于 2023 年首次提出(发表于 MLSys 2024,获最佳论 文奖),揭示了 LLM 权重的重要非均匀性——不同通道对模型输出的影响存在数量级差异。AWQ 通过简单而巧妙的通道级 缩放(per-channel scaling)保留显著通道的精度,在 INT4 下取得接近 FP16 的效果,成为 LLM 推理部署的首选量化方 案之一。

11.3.1 通道重要性不均

AWQ 的动机来源于一个关键实验发现:在 LLM 的权重矩阵中,少量通道(约 1%)承载了极大的激活值,这些通道的权 重量化误差会被异常大的激活值显著放大。具体而言,假设某一输出通道的输入激活统计量 ∣x ∣ 异常大(相比其他通 道),则量化误差 ΔW 对输出 y 的贡献为 ∣ΔW ⋅ x ∣——即使 ΔW 很小,x 的放大效应也会使其成为主要误差源。 j :,j i :,j j :,j j 传统 GPTQ 对所有通道一视同仁地进行权重补偿,无法区分关键通道与非关键通道。AWQ 提出:若能识别出这些关键通 道并在量化前提升其权重精度等效表示,即可大幅降低量化损失。

11.3.2 等效缩放变换

AWQ 的核心思想是等效变换(Equivalent Transformation)。对于线性层 y = W x,引入每通道缩放因子向量 s ∈ R : din y = W x = (W ⋅ diag(s)) ⋅ (diag(s)−1 ⋅ x) 如果 s > 1,则权重 W 被放大(量化的相对误差减小),同时激活值 x 被等比缩小。这个变换在数学上是恒等的,但改 :,j 变了量化误差的分布——关键通道的权重被放大,量化精度获得提升,激活值中的相应通道被缩小但不引入额外误差(因 j j 为激活值尚未被量化)。 实际中,AWQ 同时考虑两个优化目标:

  1. 保护关键通道:s > 1,增大显著通道的量化有效比特 j
  2. 避免激活值饱和:缩小激活值不宜过度,否则激活值量化的动态范围变小

11.3.3 显著通道检测

AWQ 通过分析校准数据上的激活值分布确定每个通道的重要性。给定校准输入 {X },定义通道 j 的显著度: i saliencyj = mean(∣X:,j ∣) 选择 Top-k(k 通常取 1% 或 0.1%)的最大激活值通道作为关键通道。这些通道通常在 Attention 的 Q, K, V 投影和 FFN 的第一个线性层中(因为其输出直接流向非线性变换)。

11.3.4 缩放因子搜索

确定关键通道后,需为每个通道搜索最优缩放因子 s 。AWQ 采用网格搜索(Grid Search)策略: j

  1. 对关键通道:s 在 {α , α , 1, α , α} 中搜索,α 为超参数(通常取 2) j −1 −0.5 0.5
  2. 对非关键通道:s = 1(不缩放) j
  3. 评估每种配置下的输出重构误差,选择最优组合 AWQ 实际采用单一超参数 α 的快速网格搜索:缩放因子 s = (s ) ,其中 (s ) 为校准集中第 j 个输入通道激活值的平均 α 幅度,α 在 [0, 1] 区间内以网格大小 20(步长 0.05)搜索——0 表示不缩放,1 表示最激进的缩放。找到最优 α 后,先执 j X j X j 行缩放变换 W ← W ⋅ diag(s),再执行 GPTQ 或 RTN 量化,并对权重做最小化 MSE 的剪裁(Weight Clipping)。

11.3.5 与 GPTQ 的集成

AWQ 可与 GPTQ 无缝集成:先使用 AWQ 缩放保护关键通道,再使用 GPTQ 的逐列误差补偿完成量化:

  1. Forward pass on calibration data, compute per-channel activation mean
  2. Identify Top-1% salient channels
  3. Grid search for optimal scaling factor s
  4. Apply equivalent scaling to weights W: W_scaled = W . diag(s)
  5. Apply GPTQ quantization to scaled weights
  6. Adjust activation quantization parameters to match scaled distribution AutoAWQ 库实现了完整的 AWQ + GEMM 量化流程,支持 INT4/INT3 量化(group_size=64/128),最新版本已整合高效 推理后端(TinyChat、vLLM)。

11.3.6 性能对比

Llama-2-7B 在 WikiText-2 上的 INT4 量化结果对比如表11-3所示。 表11-3 INT4 量化方法对比 方法 PPL vs FP16 Degradation 量化加速比 FP16 (baseline) 5.47 0.00 1.0× RTN (Round-to-Nearest) 6.12 +0.65 2.0× GPTQ 5.54 +0.07 2.0× AWQ 5.52 +0.05 2.0× GPTQ + AWQ 5.50 +0.03 2.0× AWQ 的核心优势在于对极端异常通道的保护。在 Llama-70B 上,INT4 AWQ 相比 FP16 仅增加约 0.2 困惑度,内存从约 140 GB 降至约 35 GB,可在单块 A100-80GB 上运行,或在双 A100 上以显著更高的吞吐量提供服务。

11.3.7 关键超参数

AWQ 的量化质量受以下超参数影响: •group_size:量化组大小。越小精度越高但存储开销越大(group_size=32 时元数据占权重的约 13%; group_size=128 时占约 3%)。常用值为 64 或 128 •zero_point:是否使用非对称量化。对称量化(zero_point=False)更高效但精度略低 •version:AWQ 的不同版本,如 GEMM(对矩阵乘友好)和 GEMV(对向量-矩阵乘友好) •alpha:缩放因子搜索的基准值,通常取值 0.5 到 2.0 之间

11.3.8 硬件支持

NVIDIA TensorRT-LLM 原生支持 AWQ INT4 格式,利用 SM 90+(H100)上的 FP8 Tensor Core 进行加速解量化和 INT4 包装计算。vLLM 通过 --quantization awq 支持 AWQ 模型部署。SGLang 通过 AWQ GEMM kernel 支持 INT4 权重推 理。与 Triton 结合的自定义 AWQ Kernel 可在消费级 GPU(RTX 4090)上实现可观吞吐。 对于生产部署,AWQ 结合 FP16 KV Cache 实现端到端 INT4 推理,Llama-70B 在 A100 上可达到每秒 50+ token 的生成 速度(batch_size=1),远高于 FP16 部署的约 20 token/s。

11.4 SmoothQuant 激活值量化

SmoothQuant 由 NVIDIA 和 MIT 于 2022 年联合提出(发表于 ICML 2023),解决了一个长期困扰 LLM 量化部署的核心难 题:激活值的异常通道(activation outliers)。在拥有 100B+ 参数的 Transformer 中,激活值的某些通道会系统地出现 比平均值大 10-100 倍的极值,导致直接 INT8 量化激活值产生灾难性的精度损失。

11.4.1 激活值量化的挑战

对 Transformer 中某一层的输出激活值做统计分析,会发现一个模式化现象:在所有 token 的激活值上,特定几个通道 的绝对值始终远超其他通道。以 OPT-6.7B 为例,约 0.1% 的通道集中了激活值约 80% 的动态范围。这不是随机噪声,而 是模型内部表示的结构性特征。 直接 INT8 量化这些激活值面临两难: •若按全局最大值校准,异常通道将量化范围撑得过大,正常通道的有效比特位数严重不足 •若裁剪异常值,关键信息的丢失会显著影响模型输出质量 传统方法如 LLM.int8() 采用混合精度,对异常通道保留 FP16 计算、正常通道用 INT8,但混合精度破坏了全 INT8 计算流 水线的效率优势,且需要复杂的运行时通道选择逻辑。

11.4.2 量化难度迁移

SmoothQuant 的关键洞察是数学恒等式的威力。考虑单个线性层 Y = XW (X ∈ R T ×Cin ,W ∈ R Cin ×Cout ): Y = XW = (X ⋅ diag(s)−1 ) ⋅ (diag(s) ⋅ W ) 其中 s ∈ R 是一个平滑因子向量。这个变换在数学上严格等价,但改变了量化难度在 X 和 W 之间的分布: Cin •原始:X 中有异常通道 → 量化 X 困难,W 正常 → 量化 W 容易 •变换后:X 中的异常值被 s 压缩 → 量化 X 变容易;W 被 s 放大 → 量化 W 的难度增加 −1 由于权重矩阵的数值分布远比激活值均匀(权重通常呈正态分布或 high-kurtosis 尖峰分布,没有系统性异常通道),将量 化难度从激活值迁移到权重是高度明智的策略。权重对量化误差的容忍度远高于激活值——这正是 SmoothQuant 的核心 原理。

11.4.3 平滑因子选择

SmoothQuant 通过逐通道的最大值比例计算平滑因子: sj = max(∣Xj ∣)α / max(∣Wj ∣)1−α 其中 α ∈ [0, 1] 为迁移强度(migration strength): •α = 1.0:所有量化难度迁移到权重,激活值为零缩放(s = max(∣X ∣)) j j •α = 0.0:不向权重迁移任何量化难度,难度全部留在激活值一侧(s = 1/ max(∣W ∣),此时权重被逐通道归一化、激 活被放大,量化更难) j j •α = 0.5:均衡迁移,是最常用的默认设置 α 的具体取值对量化精度的影响如表11-4所示。 表11-4 平滑因子取值对比 α值 激活值 INT8 误差 权重 INT8 误差 推荐场景 α = 0.3 较高 较低 极大型模型(>100B),权重冗余度高 α值 激活值 INT8 误差 权重 INT8 误差 推荐场景 α = 0.5 中等 中等 通用场景,各项均衡 α = 0.7 较低 较高(但可接受) 小型模型或高精度要求

11.4.4 数学变换详解

以 Transformer 的标准前馈网络(FFN)为例: Y = SiLU(XW1 ) ⋅ W2 其中 X 是 LayerNorm 输出,W , W 是 FFN 的门控权重。SmoothQuant 的变换插入点为:

  1. LayerNorm 输出到 W :X = X ⋅ diag(s) , W = diag(s) ⋅ W ′ −1 ′ 1 1
  2. 同时将 s 的反向缩放吸收进下一个操作中,或传递给下一个线性层 对于 Attention 层,类似地在 QKV 投影前插入缩放变换。SmoothQuant 也可将缩放因子 s 融合进前一层的 LayerNorm 权重中,零额外推理开销: LayerNorm(X) ⋅ diag(s)−1 = LayerNorm′ (X)

其中 LayerNorm 的 γ 参数被调整为 γ = γ ⋅ s 。这种算子融合(operator fusion)是 SmoothQuant 实现端到端 INT8 ′ −1 推理的关键工程优化。

11.4.5 完整量化流水线

SmoothQuant 的完整工作流程如下:

  1. Use calibration data, compute per-channel max of activations and weights
  2. Compute per-channel smooth factor s_j per formula
  3. For each linear layer: a. Weight transformation: W' = diag(s) . W b. Fuse scaling into previous layer's output: adjust LayerNorm gamma
  4. Apply INT8 Per-Channel quantization to transformed weights
  5. Apply INT8 Per-Tensor quantization to transformed activations
  6. Inference: INT8 GEMM + INT32 accumulate + dequantize to FP16 output SmoothQuant 可无缝结合 GPTQ 和 AWQ。典型组合策略为:先用 SmoothQuant 处理激活值量化难度,再用 GPTQ 补 偿权重量化误差,最后用 AWQ 保护关键通道。三者协同可实现 W8A8(INT8 权重 + INT8 激活值)或 W4A8(INT4 权重
  • INT8 激活值)的高效推理。

11.4.6 性能结果

SmoothQuant 在多个模型族上的 W8A8 效果如表11-5所示(WikiText-2 PPL)。 表11-5 SmoothQuant W8A8 困惑度 模型 FP16 W8A8 SmoothQuant Degradation

OPT-6.7B                        10.86                         10.92                                      +0.06
OPT-13B                         10.13                         10.22                                      +0.09
OPT-30B                         9.56                          9.67                                       +0.11
OPT-66B                         9.34                          9.50                                       +0.16
Llama-7B                        5.68                          5.78                                       +0.10
BLOOM-176B                      —                             —                                          +0.05

W8A8 将模型大小压缩 2 倍(权重从 FP16 到 INT8),推理吞吐提升约 1.5-2 倍。在 NVIDIA A100 上,凭借 Tensor Core 的 INT8 MMA 指令,单 token 延迟可降至 FP16 的 55%-60%。

11.4.7 与其他方法的对比

激活值量化的技术演进路径如图11-2所示:从混合精度的 LLM.int8 走向全 INT8 的 SmoothQuant,再演进出与 GPTQ、 AWQ 组合的 W4A8 形态。 Technical Features Activation Quantization Capability Activation Outlier Handlin Math Transform Migration Zero-Cost Fusion Universal Compatibility LLM.int8 SmoothQuant GPTQ + SmoothQuant AWQ + SmoothQuant g W8A8 Mixed Precision W8A8 Full INT8 W4A8 W4A8 Optimal 图11-2 激活-权重量化技术演进路径 SmoothQuant 已集成进 TensorRT-LLM、FasterTransformer 和 vLLM 生态。在实际部署中,SmoothQuant + GPTQ- INT4 的组合可将 Llama-70B 部署在单个 A100-80GB 上,提供端到端全 INT8/INT4 混合推理能力。其核心价值不仅是压 缩率,更在于激活值的 W8 量化使得 GPU 的 Tensor Core INT8 吞吐得以充分利用(H100 的 INT8 Tensor Core 算力为 1979 TOPS(稠密),约为 FP16 稠密算力的两倍)。

11.4.8 QuaRot 与 SpinQuant

SmoothQuant 只是把激活异常搬到权重,当目标是 W4A4(权重与激活都量化到 4-bit)时仍不够。2024 年出现的旋转 类方法给出了更彻底的方案:利用随机化 Hadamard 变换或可学习正交矩阵 R(R R = I )对隐藏状态做旋转,由于旋 ⊤ 转在数学上恒等(y = W x = (W R)(R x)),但会把集中在少数通道的异常能量摊平到所有维度,使旋转后的激活近似各 ⊤ 向同性,从而适合均匀量化。 QuaRot(2024)用 Hadamard 矩阵作为固定旋转,可与 RMSNorm/权重离线融合而零推理开销,并对 KV Cache 一并 旋转,首次实现 Llama-2-70B 端到端 W4A4(含 4-bit KV Cache)且 WikiText-2 PPL 退化仅约 0.5。SpinQuant(Meta, 2024)进一步把旋转矩阵设为可学习参数,在 Stiefel 流形上用少量校准数据优化 R,把 W4A4 的零样本任务精度损失进 一步压到个位数百分点。二者常与 GPTQ 组合(旋转 → GPTQ 逐列补偿),已被集成进部分推理栈作为 W4A4/W4A8 的默 认预处理。相比 SmoothQuant 的逐通道缩放,旋转法对异常值的抑制更均匀,是 4-bit 激活量化能真正落地的关键一 环。

11.5 低比特量化前沿

随着 LLM 规模的持续膨胀,INT4 量化已逐渐成为新的基准线,而 INT3、INT2 乃至更极端的低比特量化方法正在快速演 进。2024 年可以被称为“LLM 极限量化元年”——从 INT4 到 INT2 的跨越意味着模型压缩比从 4× 提升至 8×,也意味 着量化误差控制的挑战量级跃升。本节先梳理 INT4 的主流化与免校准方法,再介绍 INT2/INT3 极限量化与训练时量化, 最后系统比较 FP4/FP6/FP8 等低比特浮点格式的适用场景。

11.5.1 INT4 的主流化

INT4 量化已成为 LLM 推理部署的事实标准。关键生态里程碑包括: •GPTQ/AWQ:将 INT4 精度损失控制在 0.1-0.3 PPL 以内,使 70B 模型可在单卡上运行 •NVIDIA TensorRT-LLM:原生支持 INT4 AWQ 和 GPTQ 格式,H100 上 INT4 吞吐为 FP16 的约 1.5× •vLLM: --quantization awq / --quantization gptq 一行命令部署 INT4 模型 •llama.cpp:GGUF Q4_K_M 格式广泛应用于消费级设备(Apple Silicon, x86 AVX2) INT4 的实用化让 405B 级模型在 8 卡 H100 节点上推理成为可能——Llama 3.1-405B 的 AWQ INT4 版本仅需约 230 GB 显 存,相比 FP16 的约 810 GB 节省约 3.5 倍。

11.5.2 免校准量化 HQQ

2024 年涌现的重要方法之一是免校准量化,其中 HQQ(Half-Quadratic Quantization,Badri & Shaji 2024)最具代表 性。HQQ 将权重量化建模为半二次优化问题,不需要任何校准数据集——完全通过权重的内部统计特性确定量化参数: •零校准数据:无需维护校准集,避免分布偏差,无数据泄露风险(医疗/金融等隐私敏感场景) •优化驱动:在量化空间内迭代搜索最优解,每步复杂度为 O(n log n) •硬件兼容:纯 W4A16 推理,与 vLLM/TensorRT-LLM 兼容 在 Llama-2-70B INT4 上的对比基准:GPTQ PPL=3.50(需 128 校准样本,约 4 GPU hours),AWQ PPL=3.48(需 128 样本,约 1 GPU hour),HQQ+ PPL=3.49(零校准,约 0.5 GPU hours)。HQQ+ 在零校准条件下追平了 AWQ 的精度, 是工业部署中的重要替代方案。

11.5.3 INT2/INT3 极限量化

QuIP#(2024,Cornell)在 2-bit 量化上取得突破性进展。其核心思想包括:

  1. 非相干性处理(Incoherence Processing):通过随机正交变换(Randomized Hadamard Transform)将权重矩阵旋 转到一个各向同性的分布,消除异常通道。变换后的权重矩阵在每个方向上的重要性接近均匀,使得均匀量化不再是次 优方案
  2. 格码本(Lattice Codebook):使用高维格点(如 E8 格)作为量化码本取代简单的均匀网格。E8 格在 8 维空间中提供 了最优球堆积密度,作为量化码本时,每个 8 维向量可用 16 bit 编码(每维度 2 bit),平均量化误差远优于逐元素均匀 量化 QuIP# 在 Llama-2-70B 的 2-bit 量化上实现了约 8× 的压缩比(FP16 16-bit → 2-bit),困惑度退化控制在约 2.0 PPL 以 内,显著优于同时期的其他 2-bit 方法。 AQLM(2024,Yandex/ISTA)采用加性量化(Additive Quantization)方法。与传统的乘性 + 加性补偿(GPTQ 风格) 不同,AQLM 将每个权重向量 w ∈ R 表示为 M 个码本向量之和: d M ^ ≈ ∑ Qm (w) w m=1

其中 Q (w) 是从第 m 个可学习码本中选择的最优向量。通过联合优化所有码本,AQLM 在 2-bit 量化上超越了 GPTQ 和 AWQ(在 WikiText-2 上 PPL 退化约 1.5-2.5 点)。 m

11.5.4 BitNet 与 BitDelta

BitNet b1.58(2024,Microsoft)提出了一种革命性的训练时量化方案:不量化现有的 FP16 模型,而是从头训练一个 使用三元权重(-1, 0, +1)的 Transformer。BitNet b1.58 的每个权重仅用 log (3) ≈ 1.58 bit 表示,模型大小约为同等 FP16 模型的 10× 压缩。关键架构创新: •权重被限制为 {−1, 0, +1} 三元值,前向传播中的矩阵乘法退化为加法和减法 •BitLinear 层替代标准线性层,使用 RMSNorm 和 absmax 量化 •可用 BitBLAS 等专用算子库实现极致加速 1.58-bit 权重意味着 100B 参数的模型仅需约 20 GB 存储,在边缘设备上运行大型语言模型成为可预见的现实。 BitDelta(2024,Together AI/Harvard)探索了一种更灵活的 1-bit 方案:仅对参数增量(parameter delta)进行 1- bit 量化。假设有一个基础模型 W 和一个微调后模型 W ,只量化微调产生的差异: base finetuned Δ = sign(Wfinetuned − Wbase ) 每个 delta 参数仅需 1 bit,总压缩比可超过 100×。BitDelta 适用于多 LoRA/多适配器场景——基础模型只需一份 FP16 副本,所有 adapter 以 1-bit delta 存储。

11.5.5 FP4 与 Blackwell 架构

NVIDIA Blackwell(B200/GB200)架构在 Tensor Core 中引入了原生 FP4 支持(micro-tensor format),标志着业界对 4-bit 精度的正式认可。 FP4(E2M1 格式): •符号位:1 bit •指数位:2 bit(范围 [0, 3],bias=1,规格化指数尺度最大为 2 ,配合尾数 1.5 得最大幅值 6.0;含次正规数最小可到 2 ) −1 •尾数位:1 bit Blackwell 的第二代 Transformer Engine 在训练/推理时可动态选择 FP4/FP6/FP8 精度,由编译器驱动的 Tile-by-Tile 精 度切换最大化算力利用率。FP4 Tensor Core 算力稠密约 20 PFLOPS(B200),开启 2:4 稀疏后可达约 40 PFLOPS。针对 per-tensor FP4 对异常值的粗糙处理,NVFP4 引入更细粒度的共享缩放与张量级二级缩放,使 4-bit 推理精度显著优于传 统 per-tensor FP4。

11.5.6 FP8 与 MX 标准

FP8 是当前(2024-2025)训练与推理落地最广的低比特浮点格式,由 NVIDIA/Arm/Intel 联合定义 OCP FP8 规范,含两 种编码:E4M3(1 符号、4 指数、3 尾数,最大幅值 448,动态范围小但精度高,适合前向/权重/激活)与 E5M2(5 指 数、2 尾数,最大幅值 57344,动态范围大,适合梯度)。Hopper Transformer Engine 通过逐 tensor 的动态缩放因子 (delayed scaling,基于历史 amax)在 E4M3/E5M2 间切换;DeepSeek-V3 更进一步用细粒度(1×128 tile / 128×128 block)FP8 完成全程预训练,证明 FP8 训练在千亿级模型上可稳定收敛。 为解决单一 tensor 缩放对异常值的粗糙处理,OCP 于 2023 年提出 Microscaling(MX)标准:一个 block(通常 32 个 元素)共享一个 8-bit(E8M0)幂次缩放因子,元素本身用 FP4(MXFP4,E2M1)、FP6(MXFP6)或 FP8(MXFP8)表 示,等效每元素平均比特开销仅增加 8/32=0.25 bit。NVIDIA Blackwell(B200/GB200)Tensor Core 原生支持 MXFP4/MXFP6/MXFP8。 FP6 是介于 FP8 和 FP4 之间的重要精度等级,代表了业界对“6-bit 推理甜点”的共识。主流 FP6 变体包括 E3M2(3-bit 指数 + 2-bit 尾数)和 E2M3(2-bit 指数 + 3-bit 尾数)。NVIDIA Blackwell B200/GB200 原生支持 MXFP6 Tensor Core 运 算;AMD MI350X 基于 CDNA 4 架构支持 FP6;Intel Gaudi 3 也通过矩阵引擎支持 FP6 推理加速。 FP16→FP6 理论压缩 2.67×(对比 INT4 的 4×),但精度损失远小于 INT4,通常困惑度退化 < 0.05(对比 INT4 的 +0.05~0.2)。对于 Llama-3-70B,FP6 权重 ≈ 70B × 0.75 bytes ≈ 52.5 GB,可装入单块 H100 80GB,而 INT4 压缩至 35 GB 的精度损失在某些下游任务(如代码生成、数学推理)可能不可接受。实际选型建议:下游准确率要求 > 99% 时 选 FP6;吞吐优先且可接受 1-2% 退化时选 INT4。

11.5.7 W8A8 部署选型

W8A8(权重与激活均为 8 bit)是兼顾精度与速度的部署形态,其中 FP8 正取代 INT8 成为 Hopper 及以后的主流。相比 INT8,FP8 是对称量化,只需计算 per-tensor scale 即可,无需零点与校准集,天然容纳激活值中的异常大值,INT8 则 需 SmoothQuant 式平滑迁移才能做到这一点。 硬件层面,Hopper SM 90 的 Tensor Core 原生支持 FP8 GEMM,稠密峰值约为 FP16 的 2 倍(H100 约 1979 TFLOPS); Blackwell 进一步将 FP8 与 FP4 通路集成进统一 tensor memory 架构。部署栈已成熟:vLLM 支持 --quantization fp8 (LLM FP8,权重 FP8 + 激活 FP8)与 W8A8 FP8( fp8_e4m3 ),TensorRT-LLM 提供 FP8 全套 kernel,DeepSeek- V3 亦采用 FP8(E4M3)完成训练与推理,验证了该格式在大规模系统中的可行性。 FP8 与 INT8 两种 W8A8 形态的核心差异如表11-6所示。 表11-6 FP8 与 INT8 W8A8 对比 维度 FP8 W8A8 (E4M3) INT8 W8A8 动态范围 指数位多,天然覆盖激活值异常值 定点,异常值需额外处理 量化复杂度 对称,仅 scale,无需校准 需零点与校准(SmoothQuant 平滑迁移) 硬件要求 Hopper/Blackwell Tensor Core 原生 Ampere 及以上 精度表现 Llama 系列 PPL 退化约 +0.1 SmoothQuant 约 +0.1 峰值算力 H100 FP8 ≈ 2× FP16 A100 INT8 ≈ 2× FP16 选型建议:Ampere(A100)部署沿用 INT8 W8A8 + SmoothQuant;Hopper/Blackwell 上优先 FP8 W8A8,理由是其 免校准、对称、精度接近无损且 kernel 生态成熟。当权重进一步压至 INT4 时,可退回 W4A8/FP8 混合形态(FP8 激活 + INT4 权重),以保留 FP8 激活的精度优势。

11.5.8 综合对比

各主流量化方法的综合对比如表11-7所示。 表11-7 低比特量化方法综合对比 方法 比特数 压缩比 PPL Degradation (Llama-2-7B) 推理加速 适用场景 FP16 (Ref) 16 1× 0 1× 全精度基线 GPTQ INT4 4 4× +0.07 1.5-2× 推理部署 AWQ INT4 4 4× +0.05 1.5-2× 推理部署 SmoothQuant W8A8 8 2× +0.10 1.5-2× 激活值量化 QuIP# INT2 2 8× +2.0 (70B) 3-4× 极致压缩 AQLM INT2 2 8× +1.8 (7B) 3-4× 极致压缩 BitNet b1.58 1.58 10× N/A (训练时量化,QAT) 10×+ 训练时量化 FP4 (Blackwell) 4 4× < +0.2 4× 原生硬件加速

11.5.9 量化方法演进趋势

量化技术的演进呈现三个方向:训练时量化(BitNet 路线,量化不是后处理而是模型的第一性结构)、向量级码本 (QuIP#、AQLM 路线,从逐元素发展到逐向量)、硬件-算法协同设计(Blackwell FP4、Groq INT4 路线,芯片的数值格 式定义软件量化的可行域)。 对于 AI Infra 工程师,当下最具实操价值的选择是 AWQ INT4 + FP16 KV Cache,未来 1-2 年的演进方向则是原生 FP4 硬 件训练 + INT2 推理的混合精度流水线。

11.6 KV Cache 量化

KV Cache(Key-Value Cache,键值缓存)是自回归解码时为避免重复计算而缓存的注意力键值张量。KV Cache 量化 (KV Cache Quantization)通过降低缓存数值位宽压缩每 token 存储字节数,本节从系统工程视角讨论其动机、量化粒 度与低比特策略、量化感知训练与推理引擎集成,以及与稀疏淘汰的组合方式。读者需具备注意力机制与量化数学基础。

11.6.1 动机与显存占比

Transformer 每层每头生成键矩阵 K 与值矩阵 V,解码时全部保留,形成随序列长度增长的缓存。设层数 L、每层头数 h 、头维度 d、每数值字节数 b,单个 token 的缓存占用为: mkv = 2 ⋅ L ⋅ h ⋅ d ⋅ b 总占用随序列长度 S 与并发序列数 B 线性增长: Mkv = 2 ⋅ B ⋅ S ⋅ L ⋅ h ⋅ d ⋅ b 以 Llama-3-70B(80 层、GQA 8 组 KV 头、head_dim=128)为例,单条序列每 token 的 KV Cache 约 80×8×128×2(K/V)×2 字节(FP16)≈ 320 KB,32K 上下文即约 10 GB,批量 32 时高达约 320 GB,远超权重的 140 GB。Llama-2-7B(32 层、32 头、头维度 128、FP16 存储)单 token 占用 2 × 32 × 32 × 128 × 2 = 512 KB,32K 上下文 单条序列约 16 GB,A100-80G 同时处理 5 条这样的长序列即耗尽显存。在长上下文与高并发推理中,KV Cache 的显存占 用往往超过权重本身,成为新的瓶颈,把缓存从 FP16 压到 FP8/INT8 可近似翻倍可容纳的上下文长度或并发数。

11.6.2 与权重量化的差异

权重是静态张量,可离线一次量化并以低精度存储;KV Cache 在推理过程中实时生成,量化须在线完成,且注意力计算 每步都要读取反量化,对访问延迟敏感。精度敏感度还随位置变化:生成下一个 token 主要依赖最近位置的信息,远端 token 的量化误差被后续所有位置反复读取放大,同一量化方案对缓存不同区段的影响并不均一。 KV Cache 量化直接压缩每 token 字节数,收益随序列长度与并发数放大。INT8 使缓存减半,INT4 减至四分之一;在 KV 显存占比过半的长上下文部署中,压缩效果直接转化为可服务的并发序列数上升。 解码阶段逐 token 生成时,注意力计算须读取该位置之前全部历史 token 的 K、V,读取量与序列长度成正比,长上下文 下由显存带宽而非算力决定耗时。缓存位宽减半,每步读取量随之减半,TPOT 与吞吐同步受益。Prefill 阶段缓存尚未成 型,量化收益集中在显存侧;Decode 阶段则同时收获带宽与显存两类收益。 另一特殊性是量化时机受限。权重离线量化可反复尝试多种方案并校验精度;KV 量化必须在解码过程中实时完成,每步 只处理新增的少量 token,量化算子须与主计算流水线并行,不能成为解码关键路径上的串行开销。

11.6.3 量化粒度

KV 量化粒度决定 scale 的共享范围,由细到粗: •per-token:每个 token 一个 scale,适配 V 的动态范围,计算开销低 •per-channel:每个头维度通道一个 scale,适配 K 的通道异常值 •per-head:每个注意力头一个 scale,兼顾头间分布差异与存储开销 •per-group:若干元素共享一个 scale(如 group_size=128),精度与开销折中 •per-layer:整层一个 scale,存储最省但精度损失大,仅用于实验对照

11.6.4 K 与 V 的敏感度差异

键矩阵 K 参与注意力分数 QK 的计算并经 softmax 归一化,数值扰动直接改变分数分布;值矩阵 V 仅参与加权求和,误 T 差在求和时部分抵消。多数模型对 K 的量化更敏感,需要更细的粒度,V 可采用较粗粒度压缩存储。 K 的异常值集中于少数通道,与权重中的异常值现象同源,per-channel 量化能显著缩小这类通道的量化误差;V 的数值 分布相对平稳,per-token 已接近上限。这一差异在统计上可观测:多数层中 K 与 V 的最值跨度相差数倍,按同一粒度量 化会把不必要的精度让渡给 V。

11.6.5 低比特方案与代表性方法

INT8 以 2 倍压缩换取接近无损的精度,是兼容性最好的起点;FP8 在 Hopper 及以上硬件原生支持,E4M3 用于前向计算 的 KV;INT4 将每 token 字节数降为 FP16 的四分之一,精度损失可通过分组量化缓解。缓存规模极大时可探索 2-bit 方 案,但须配合分组与异常值处理。INT8 与 FP8 均走低精度张量核(Tensor Core),反量化在算子内部完成,无需显式解 码为 FP16 再计算,因此位宽下降的同时不会引入额外的数据搬运。 工程上有三条代表路线:

  1. FP8 KV Cache:TensorRT-LLM 与 vLLM( --kv-cache-dtype fp8 )已原生支持,配合 Hopper/Blackwell 的 FP8 通路,精度损失通常 < 0.1 PPL,几乎无痛
  2. KVQuant INT4 分组量化:指出 Key Cache 在 RoPE 之前沿通道(per-channel)存在异常,Value Cache 则更适合 per-token 量化,并对 RoPE 前后分别处理,配合少量异常值稀疏保留,可将 Llama 系列压到 3-4 bit 而 PPL 退化 < 0.1
  3. KIVI:采用非对称策略:Key 按通道、Value 按 token 的 2-bit 量化,在 LongBench 上几乎无损 KIVI 提出分组按需量化思想:K 采用 per-channel 分组量化,V 采用 per-token 量化;缓存按 token 分组,仅对超出最近 窗口的旧部分做量化,最近 token 保留原始精度。该策略贴合 KV 的位置敏感度——新生成的 token 携带最多信息,不引 入量化误差;旧部分被反复读取,压缩其存储收益最高。KIVI 免训练、即插即用,按需量化的分组粒度与解码器逐 token 写入缓存的节奏一致,量化开销摊薄到每步新增的少量 token 上,流程如图11-3所示。 否 FP16 原精度保留 前向生成 K 与 V 按 token 分组缓存 是否超过最近窗口 注意力计算 输出结果 是 分组按需量化 INT4 压缩存储 图11-3 分组按需量化流程 部署侧需注意:量化 KV 会改变 PagedAttention 的 block 布局与反量化 kernel,且量化 scale 本身也要存储, group_size 越小元数据开销越大,需在压缩率与精度间权衡。

11.6.6 与旋转位置编码的交互

旋转位置编码(Rotary Position Embedding,RoPE)按位置对 K 做旋转,K 须在旋转之后量化。旋转使同一通道在不 同位置的数值幅度随角度变化,固定的 per-channel scale 难以同时适配所有位置,量化误差随序列长度累积。实践上对 旋转后的 K 重新统计 scale,或将旋转因子并入量化参数,以降低位置引入的分布漂移。

11.6.7 量化感知训练

量化感知训练(Quantization-Aware Training,QAT)在训练前向中插入模拟量化算子,以直通估计器(Straight- Through Estimator,STE)传播梯度,使模型适应低比特表示。对 KV 的适配有三个要点:对 K、V 分别插入模拟量化并 设定不同位宽;将注意力计算保持在量化数值域内完成,使训练与推理行为一致;通过键值头对齐约束不同头的 K、V 分 布趋近,降低头间差异,使共享 scale 的量化误差更小。 QAT 的代价是训练与数据成本:须在训练或微调管线中加入模拟量化,并维护足够数据以保持下游能力。多数生产环境 先以训练后量化(Post-Training Quantization,PTQ)评估 INT8/FP8 的精度是否可接受,不满足才升级为 QAT,因为 QAT 需要访问训练数据,而预训练数据在部署阶段往往受限。

11.6.8 推理引擎集成与评估

主流推理引擎已内置 KV 量化。vLLM 以 --kv-cache-dtype 启用 FP8 缓存,在支持硬件上走原生 FP8 注意力算子; TensorRT-LLM 在引擎构建阶段将 KV 量化绑定进计算图。集成关键在算子层面:prefill 阶段的 FlashAttention 与解码阶 段的单 token 注意力都需读取反量化后的 KV,量化参数须与分块缓存布局对齐,避免逐 token 解压引入访存开销。在 Hopper 上启用 FP8 KV Cache 的命令:

Enable FP8 KV cache with E4M3 format on Hopper GPUs

vllm serve ./Llama-3-70B
--kv-cache-dtype fp8_e4m3
--max-model-len 32768 KV 量化误差随上下文长度累积,评估须覆盖长文本任务。常用指标包括困惑度(Perplexity,PPL)、长上下文基准 (LongBench、RULER)与检索类任务(大海捞针,Needle in a Haystack),同时测量目标并发下的 TTFT、TPOT 与可 服务序列数。与权重量化相比,KV 量化的精度退化常在长序列上才暴露,短序列评测容易高估其效果。 评测应固定模型与引擎版本,仅在量化配置维度上切换,避免混淆变量。长上下文评测建议分段报告,如 1K、4K、8K、 16K、32K 各长度下的 PPL 与检索命中率,观察误差随长度的累积曲线;吞吐与延迟在目标并发与批大小下测量,与显存 峰值一并记录,服务化压测数据方可用于容量规划。

11.6.9 与稀疏淘汰的组合

稀疏淘汰(Eviction)以显存换信息,与量化正交:注意力分数高的 token 对后续生成贡献大,应予保留;分数低且不再 被引用的 token 可以丢弃。H2O(Heavy Hitter Oracle)统计各历史 token 的累积注意力分数,在固定预算下保留高分 token、淘汰低分 token;它可在静态与动态两种模式运行,静态模式每层淘汰固定数量的低分 token,给出确定性显存 上界,动态模式按分数分布自适应裁剪。StreamingLLM 保留序列首部 token(注意力汇聚点,attention sink)与滑动 窗口内的最近 token,其依据是注意力分数异常集中于首部 token 的观测。 淘汰有损长程依赖:部分任务需要访问远端 token 的细节,被淘汰的信息无法恢复,因此保留预算须配合任务特性选 择。量化与此不同,压缩后信息仍可反量化恢复,两者配合时由淘汰决定信息取舍、由量化决定存储密度,职责互补。 淘汰减少缓存中的 token 数,量化降低每 token 字节数,两者相乘决定总显存: M = B ⋅ Nretained ⋅ mquantized kv 其中 N 为保留的 token 数,m 为量化后的单 token 字节数。叠加后长上下文部署的显存可降至 FP16 全量缓 quantized 存的八分之一以下。 retained kv 工程上先运行淘汰策略确定保留集合,再对保留的 KV 分组量化并压缩存储,流程如图11-4所示。释放的显存由缓存管理 器回收给新序列。淘汰判定依赖注意力分数,应在量化之前以原始精度计算,避免量化误差污染保留决策;量化作用于保 留后的子集,两者的参数与流程解耦,可独立调优。叠加方案的精度损失来自两个来源,调优时先固定淘汰预算再调整量 化位宽,逐级逼近精度预算线。 历史 KV Cache 统计注意力分数 是否重要 token 是 否 保留并分组量化 淘汰并释放显存 低精度 KV 缓存 显存回收 注意力计算 容纳新序列 图11-4 量化与淘汰的组合流程

11.7 稀疏化技术

稀疏化(Sparsity)是深度学习模型压缩的另一条技术路线,其核心思想是:神经网络中存在大量冗余连接,将不重要的 权重置零可以同时减少模型存储和计算量,而精度损失可控。与量化互补,稀疏化通常在不改变非零权重数值精度的前提 下实现压缩。两者可以叠加使用——稀疏 + 量化可达到数十倍的综合压缩率。

11.7.1 稀疏模式分类

非结构化稀疏(Unstructured Sparsity):任意位置的权重可以被独立剪枝,生成的稀疏模式呈随机分布。这是最高灵活 度的稀疏形式,可达 90%+ 稀疏率。但随机模式对现代 GPU 的 SIMT 架构不友好——每个 Warp 内线程的访存地址发散, 导致严重的 Bank Conflict 和 Coalescing 失败。实际加速比有限,通常需要 > 95% 稀疏率才能观察到加速。 2:4 结构化稀疏(2:4 Structured Sparsity):由 NVIDIA Ampere 架构引入的硬件原生稀疏格式。在每 4 个连续权重中恰 好保留 2 个非零值,稀疏率为 50%。Ampere 的 Sparse Tensor Core 可在硬件层面跳过零值,实现 2× 的矩阵运算吞吐 量提升。2:4 模式的物理存储格式为: •非零值数组:每 4 个权重选 2 个,共 N /2 个值 •元数据(2-bit indices):4 选 2 的位置编码,需要 C(4, 2) = 6 种取值 2:4 稀疏在编程上具有确定性加速优势,但将剪枝问题从“选择哪些权重保留”变成了“如何满足 2:4 约束下最小化精度 损失”的组合优化问题。 块结构化稀疏(Block-Structured Sparsity):以固定大小的块为单位进行剪枝,如 2 × 2 或 4 × 4 块。比 2:4 更粗粒度, 访存友好度最高,但精度损失也更大。Google TPU 的某些版本支持 N × N 块稀疏矩阵乘加速。

11.7.2 训练后剪枝方法

SparseGPT(2023,ISTA)将 GPTQ 的权重量化框架拓展到剪枝领域,实现了 One-Shot 训练后剪枝。核心算法:

  1. Compute Hessian matrix H = 2XX^T for each layer's weights and input
  2. For each weight row:
    a. Sort by importance (|wij|^2 / [H^{-1}]jj)
    b. Determine pruning threshold based on target sparsity rate
    c. Use OBS framework to update remaining weights and compensate pruning loss

SparseGPT 在 50%-60% 非结构化稀疏率下,困惑度退化通常 < 0.5;在 2:4 结构化约束下,退化约 1-2 PPL 点。关键发 现是:大型模型(> 13B)的稀疏耐受性远高于小型模型。 Wanda(2023,CMU)提出了一种更简约的剪枝标准:权重值 × 激活值范数(Pruning by Weights and Activations)。第 i 行第 j 列的权重重要性定义为: Score(Wij ) = ∣Wij ∣ ⋅ ∥X:,j ∥2 Wanda 无需 Hessian 矩阵计算,无需权重更新补偿,仅需一次前向传播(获取激活值统计量)+ 一次按阈值剪枝。速度 比 SparseGPT 快数十倍,但精度略有不如——在 50% 非结构化稀疏下 PPL 退化约 0.3-0.5。 DSnoT(Dynamic Sparse No Training,ICLR 2024)在已剪枝(如 Wanda/SparseGPT)得到的稀疏 LLM 基础上,通过 无梯度的迭代权重更新与稀疏掩码调整来降低稀疏化重构误差,全程无需反向传播训练。它并非从随机初始化中挖掘中奖 彩票,而是对已剪枝稠密预训练模型做免训练的误差补偿式微调。

11.7.3 N:M 稀疏加速

NVIDIA Ampere 架构首次在硬件层面支持 2:4 稀疏。推理时,稀疏 Tensor Core 执行 MMA(Matrix Multiply- Accumulate)指令时自动解压缩稀疏格式,硬件跳过零值的乘法。程序员只需将权重裁剪为 2:4 模式,调用 cusparseSpMM 或 CUTLASS 的 SpMM kernel 即可。 CUTLASS 3.5+ 对 2:4 稀疏的优化层次:

  1. Warp-level cooperative load:整个 Warp 协作读取压缩稀疏行
  2. Shared memory layout:解压后的非零值在 Shared Memory 中排列为稠密格式
  3. MMA instructions:调用 mma.sync.sp 指令执行 2:4 稀疏的 FP16×FP16 矩阵乘,Tensor Core 硬件自动跳过被剪枝 的零值乘加 CUTLASS 的 2:4 稀疏 GEMM 性能数据如表11-8所示(A100,FP16)。 表11-8 2:4 稀疏 GEMM 性能 矩阵尺寸 (M×N×K) 稠密 TFLOPS 2:4 稀疏 TFLOPS 加速比 4096×4096×4096 148 236 1.59× 8192×8192×8192 156 268 1.72× 16384×8192×4096 160 285 1.78×

11.7.4 稀疏感知训练

Sparsity-Aware Training 的方法是在训练中周期性施加稀疏约束,通过持续的剪枝-恢复循环让模型学会在稀疏模式下 保持性能。典型流程:

 for epoch in range(total_epochs):
     standard_training_step()
     if epoch % T == 0: # T = pruning interval
         prune_to_sparsity(sparsity_target)
         # Gradually increase sparsity
         sparsity_target = min(final_sparsity, current_sparsity + step)

逐步稀疏化(Gradual Magnitude Pruning)允许模型在多个 epoch 中适应越来越高的稀疏率。Straight-Through Estimator(STE)用于传递剪枝操作的梯度,使反向传播能够通过稀疏化这一不可微操作。

11.7.5 彩票假说

Frankle & Carbin(2019)提出的彩票假说对稀疏化研究产生了深远影响:一个随机初始化的稠密网络包含一个子网络 (中奖彩票),该子网络在独立训练时可达到原网络的同等性能。 实际启示: •稠密 → 稀疏 → 从头训练该稀疏子网络,比直接剪枝 + 微调可能获得更好的最终精度 •某些剪枝结构可以通过权重重绕(Weight Rewinding)恢复——找到一个初始化迭代点,从该点重新训练稀疏网络 然而对于 LLM(百亿参数级别),彩票假说的可操作性受限:无法对每个稀疏候选子网络进行完整的重新训练。但该假说 为理解“为什么大型模型可以被如此激进的稀疏化”提供了理论视角。

11.7.6 稀疏与量化的协同压缩

稀疏化和量化可以叠加使用,形成多层压缩效应。SparseQuant 系列方法在 2:4 稀疏 + INT8 量化(综合压缩比约 4×) 的组合上实现了显著加速。以 Llama-2-7B 为例的稀疏与量化组合对比如表11-9所示。 表11-9 稀疏与量化组合对比 组合 压缩比 PPL Degradation 相对 FP16 加速 仅 INT4 量化 4× +0.05 1.5× 组合 压缩比 PPL Degradation 相对 FP16 加速 仅 2:4 稀疏 2× +1.5 1.7× 2:4 + INT8 量化 约4× +1.8 2.5× 50% 非结构化 + INT4 约8× +1.0 1.8× NVIDIA Hopper (H100) 架构进一步提升了稀疏加速——SM 90 的 Tensor Core 在 FP8 稠密模式下峰值算力约 1979 TFLOPS(约为 FP16 稠密的 2×),而 FP8 2:4 稀疏模式可再翻倍至约 3958 TFLOPS(约为 FP16 稠密的 4×),使稀疏化

  • 量化的组合效益达到最大化。 实际部署建议:对于推理场景,优先使用 INT4 量化(精度损失最小),其次叠加 2:4 结构化稀疏(需要在 TensorRT-LLM 中显式开启稀疏 kernel)。对于训练场景,稀疏化的加速收益有限,因为训练需要反向传播,稀疏掩码在前向和反向的计 算流中难以高效复用。

11.8 知识蒸馏

知识蒸馏(Knowledge Distillation, KD)是一种通过教师-学生框架将大模型中的知识迁移到小模型的技术。与量化和稀 疏化不同,蒸馏在改变模型架构和参数规模的同时,更注重知识表示的迁移。以 Gemma 2(2B 以同系列 27B 为教师)、 DeepSeek-R1-Distill 等为代表的近期工作表明,高质量蒸馏可以在保持下游任务性能的同时,实现 10×-50× 的规模压 缩。

11.8.1 蒸馏数学基础

知识蒸馏的核心是将教师模型的暗知识(Dark Knowledge)传递给学生模型。Hinton et al.(2015)提出的基础蒸馏损 失函数为: LKD = α ⋅ T 2 ⋅ KL(pT ∥pS ) + (1 − α) ⋅ LCE (pS , y) 其中: •p = softmax(z /T ):教师输出经过温度 T 软化后的概率分布 T T •p = softmax(z /T ):学生输出的软化概率 S S •T 为温度参数,T > 1 时概率分布更平滑,非线性类间关系得以保留 •α 为蒸馏损失权重,控制软标签与硬标签的混合比例 •T 因子补偿温度缩放对梯度的影响 温度 T 是蒸馏的核心超参数。T = 1 等价于普通 softmax;增加 T 会软化概率峰值,使类间关系(如猫和狗在语义上相 似)被软标签捕获。典型 T = 3 ∼ 20。

11.8.2 蒸馏形式的三层分类

Logit 层级蒸馏(Response-Based):仅使用教师模型的最终 logits 作为监督信号。优点是最简单、最通用,可以黑盒进 行(不需要教师模型内部参数)。Alpaca(Stanford)使用 GPT-3.5(text-davinci-003)的 API 生成 52K 指令-响应对, 微调 LLaMA-7B,即典型的 Logit 蒸馏(通过自回归交叉熵而非 KL 散度)。缺点是丢失了模型的中间表示信息。 特征层级蒸馏(Feature-Based):将教师模型中间层的隐藏状态或注意力图作为额外的监督信号。损失函数扩展为: Ltotal = LKD + β ∑ Lf eature (fTl , fSl ) l∈L 常用的特征匹配形式包括: •MSE/Huber 损失匹配隐藏状态 •注意力转移(Attention Transfer):使学生注意力图接近教师 •关系蒸馏(Relational KD):保持样本间的相对距离和角度关系 黑盒蒸馏(Black-Box/API-Only):仅通过教师模型的 API 获取输出,无法访问内部状态。这是 LLM 时代最普遍的蒸馏形 式,因为许多商业模型(GPT-4、Claude)仅提供 API。技术包括: •指令蒸馏(Instruction Distillation):用教师生成指令-响应对,微调学生(如 Alpaca, Vicuna) •合成数据蒸馏(Synthetic Data Distillation):使用教师模型生成大规模多样化训练语料(如 Phi-1/2/3 的“Textbooks Are All You Need”方法论) •逐步蒸馏(Step-by-Step Distillation):教师不仅给出答案,还给出思维链推理过程(如 Orca 系列)

11.8.3 LLM 时代的蒸馏实践

DistilBERT(2019, Hugging Face)是特征蒸馏在 BERT 上的经典案例。DistilBERT 使用教师(BERT-base)的隐藏状态 匹配 + 软标签 + 余弦嵌入损失,保留 97% 的性能,模型缩小约 40%(参数量 110M→66M),推理加速约 1.71×(快约 71%,DistilBERT 原论文 Table 1 数据)。 TinyLlama(2024)在 1.1B 参数内复现了 Llama 架构,训练过程中使用 3T token 数据。TinyLlama 并非直接蒸馏某个 教师,而是通过“规模适中的高效训练 + 尽可能大的数据量”的策略,展示了小型模型通过大规模预训练可以接近蒸馏的 效果。 Phi-3 系列(2024, Microsoft)是合成数据蒸馏的标杆。Phi-3-mini(3.8B)使用精心设计的教科书式合成数据训练,在 多项基准上媲美甚至超越 7B 级别模型。该系列不直接使用单个教师模型蒸馏,而是利用更强的模型(多个教师 + 自动验 证管线)生成高质量合成数据,属于 Curriculum Learning + 合成数据驱动的间接蒸馏。 Gemma 2(2024, Google)的 2B 模型是 Google 大规模蒸馏的代表——通过 TPU 集群上训练一个大教师模型(Gemma 27B),然后在输出分布、中间特征和注意力图三个层面进行联合蒸馏,最终 2B 模型的 MMLU 分数接近同等规模的最优 水平。

11.8.4 蒸馏 Scaling Law

与模型训练类似,知识蒸馏同样受 Scaling Law 约束。关键经验规律包括:

  1. 教师模型越大 → 学生表现越好,但收益递减。在某个临界教师规模后,继续增加教师规模对学生的收益微乎其微。对 于 7B 学生,教师超过 70B 后提升不明显
  2. 学生模型容量决定知识吸收上限。2B 学生无法完全吸收 175B 教师的所有知识——存在知识吸收瓶颈
  3. 数据质量 > 数据数量。合成数据的质量(多样性、正确性、推理深度)对蒸馏效果的影响远超纯粹的数据量。Phi-3 以 3.3T token 合成数据训练的 3.8B 模型超越了在 15T web 数据训练的 7B 模型

11.8.5 黑盒蒸馏工业实践

Alpaca 范式(Stanford, 2023)的标准流程:

 # Step 1: Generate training data
 prompts = load_seed_prompts("seed_tasks.jsonl")
 for prompt in prompts:
     response = call_teacher_api(prompt, model="text-davinci-003")

save_pair(prompt, response) # Output 52K instruction-response pairs

 # Step 2: Fine-tune student
 # Use standard autoregressive language model
 trainer = Trainer(
     model=student_model,
     train_dataset=alpaca_dataset,
     training_args=TrainingArguments(
         learning_rate=2e-5,
         num_train_epochs=3,
         per_device_train_batch_size=4,
         gradient_accumulation_steps=8,
         bf16=True,

) ) trainer.train() 整个微调过程在 8×A100 上约需 3 小时,成本约 $100(AWS on-demand)。这是 LLM 蒸馏成本的最低下限参考。 Alpaca 评估结果表明,7B 学生模型的指令跟随能力可达到 GPT-3.5 级别的一小部分,但显著低于教师本身。 UltraFeedback + Zephyr 工作流增加了基于偏好的强化学习环节:先生成多响应对,用教师模型打分(或使用 GPT-4 作为评判器),再用 DPO 训练让学生学会选择最优响应。Zephyr-7B-beta 在 MT-Bench 上的得分超过了 Llama-2-Chat- 70B,证明了精心设计的蒸馏流程可以弥补 10× 的规模差距。

11.8.6 与压缩技术的协同

蒸馏 + 量化是最常见的组合策略。典型工作流: Full-precision FP16 Teacher Model ▼ Knowledge Distillation Small FP16 Student Model (e.g., Llama-70B -> Llama-7B) ▼ AWQ INT4 Quantization Deployable INT4 Small Model (Inference Speedup + Memory Saving) 这种两级压缩可实现 10×-50× 的综合压缩比(70B FP16 → 7B INT4 约 40× 压缩)。对于大规模推理服务,这直接影响 单位 GPU 支持的并发请求数和单位请求的推理成本。

11.9 AWQ 量化部署实战

一个完整的 Llama-70B AWQ INT4 量化、评估、部署全流程实战指南,覆盖从环境搭建到生产级 vLLM 部署的所有关键 步骤和参数决策。

11.9.1 环境准备

环境要求:Python 3.10,CUDA 12.1,单张 A100-80GB 即可运行量化后的模型,FP16 基线需两张 A100-80GB。

Create environment

conda create -n awq-llama python=3.10 -y && conda activate awq-llama

Install dependencies

pip install torch==2.2.0 --index-url https://download.pytorch.org/whl/cu121 pip install autoawq==0.2.3 pip install transformers==4.40.0 accelerate datasets pip install vllm==0.4.2 # For inference deployment

11.9.2 下载与量化模型

量化阶段需加载 FP16 原始模型,显存占用约 140GB,建议在双卡 A100-80GB 上执行;量化产物约 36-37GB,单卡即可 部署。

 # quantize_llama_70b.py
 from awq import AutoAWQForCausalLM
 from transformers import AutoTokenizer
 model_path = "meta-llama/Meta-Llama-3-70B"
 quant_path = "./Llama-3-70B-AWQ-INT4"
 # Load model, needs ~140GB of GPU memory
 model = AutoAWQForCausalLM.from_pretrained(

model_path,

     device_map="auto", # Auto-distribute across GPUs
     safetensors=True,
     torch_dtype="auto",
     low_cpu_mem_usage=True,

)

 tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
 # Configure quantization parameters
 quant_config = {

"zero_point": True, "q_group_size": 128, # Common values 64/128; larger values have less metadata but slightly lower precision "w_bit": 4, # INT4 "version": "GEMM", # Optimized for matrix multiplication

 }
 # Load calibration data
 from datasets import load_dataset
 calib_data = load_dataset("wikitext", "wikitext-2-raw-v1", split="train")
 calib_texts = [item["text"] for item in calib_data.select(range(128))
                if len(item["text"]) > 100]
 # Run quantization
 model.quantize(
     tokenizer=tokenizer,
     quant_config=quant_config,
     calib_data=calib_texts,

)

 # Save quantized model
 model.save_quantized(quant_path, safetensors=True)
 tokenizer.save_pretrained(quant_path)

量化后的模型大小约 36-37 GB(权重 35 GB + 量化元数据约 1.5 GB),相比 FP16 的 140 GB 压缩约 4 倍。

11.9.3 困惑度评估

评估脚本对 AWQ 与 FP16 模型分别计算 WikiText-2 与 C4 的困惑度,在 A100-80GB 上执行。

 # eval_perplexity.py
 from transformers import AutoModelForCausalLM, AutoTokenizer
 from datasets import load_dataset
 import torch
 import torch.nn.functional as F
 def compute_ppl(model, tokenizer, dataset_name, split, max_samples=1000):
     dataset = load_dataset(dataset_name, split=split)
     texts = [item["text"] for item in dataset.select(range(max_samples))]
     encodings = tokenizer("\n\n".join(texts), return_tensors="pt")
     max_len = model.config.max_position_embeddings
     seq_len = min(encodings.input_ids.size(1), max_len)
     stride = 512
     nlls = []
     prev_end_loc = 0
     for begin_loc in range(0, seq_len, stride):
         end_loc = min(begin_loc + max_len, seq_len)
         input_ids = encodings.input_ids[:, begin_loc:end_loc].cuda()
         target_ids = input_ids.clone()

target_ids[:, :-stride] = -100 # Sliding window evaluation with torch.no_grad():

             outputs = model(input_ids)
             logits = outputs.logits
             loss = F.cross_entropy(
                 logits.view(-1, logits.size(-1)),
                 target_ids.view(-1),
                 ignore_index=-100

)

         nlls.append(loss.item() * stride)
         prev_end_loc = end_loc
         if end_loc == seq_len:

break

     ppl = torch.exp(torch.tensor(sum(nlls) / seq_len))
     return ppl.item()
 # Evaluate AWQ model and original
 awq_model = AutoModelForCausalLM.from_pretrained(

"./Llama-3-70B-AWQ-INT4", device_map="auto", torch_dtype=torch.float16 ) fp16_model = AutoModelForCausalLM.from_pretrained( "meta-llama/Meta-Llama-3-70B", device_map="auto", torch_dtype=torch.float16 )

 tokenizer = AutoTokenizer.from_pretrained("meta-llama/Meta-Llama-3-70B")
 for ds in ["wikitext", "c4"]:
     splits = {"wikitext": "test", "c4": "validation"}
     awq_ppl = compute_ppl(awq_model, tokenizer, f"Salesforce/{ds}-2-raw-v1" if "wikitext" in ds else f"allenai/c4", sp

lits[ds]) fp16_ppl = compute_ppl(fp16_model, tokenizer, f"Salesforce/{ds}-2-raw-v1" if "wikitext" in ds else f"allenai/c4", splits[ds]) print(f"{ds}: FP16 PPL={fp16_ppl:.2f}, AWQ PPL={awq_ppl:.2f}, Degradation={awq_ppl - fp16_ppl:.2f}") 预期结果:WikiText-2 PPL 退化约 0.1-0.2,C4 PPL 退化约 0.1-0.3。

11.9.4 吞吐量基准测试

基准测试在 A100-80GB 上执行,通过 vLLM 自带的 benchmark_throughput 测量。

FP16 baseline

vllm serve meta-llama/Meta-Llama-3-70B \

   --dtype float16 \
   --tensor-parallel-size 2 \
   --max-model-len 4096 \
   --gpu-memory-utilization 0.90 &
 # AWQ INT4

vllm serve ./Llama-3-70B-AWQ-INT4 \

   --dtype float16 \
   --quantization awq \
   --tensor-parallel-size 1 \
   --max-model-len 4096 \
   --gpu-memory-utilization 0.90 &
 # Send requests for benchmark

python benchmarks/benchmark_throughput.py \

   --backend vllm \
   --model ./Llama-3-70B-AWQ-INT4 \
   --quantization awq \
   --tokenizer meta-llama/Meta-Llama-3-70B \
   --dataset-name sharegpt \
   --dataset-path ./ShareGPT_V3_unfiltered_cleaned_split.json \
   --num-prompts 1000

典型基准数据如表11-10所示。 表11-10 AWQ INT4 吞吐基准 配置 Prefill (tok/s) Decode (tok/s) TTFT (ms) TPOT (ms) GPU 显存 FP16 (2×A100) 12,400 48 85 22 2× 78 GB AWQ INT4 (1×A100) 10,800 55 72 19 1× 76 GB AWQ INT4 (2×A100) 21,500 108 68 10 2× 38 GB AWQ INT4 在单卡场景下 decode 速度反超双卡 FP16——这是因为 INT4 权重减少的显存带宽需求超过了计算精度的损 失。

11.9.5 SGLang AWQ 集成

SGLang 提供了另一种高性能 AWQ 推理方案,与 vLLM 可互操作: pip install sglang[all]

 # Start AWQ model serving
 python -m sglang.launch_server \
   --model-path ./Llama-3-70B-AWQ-INT4 \
   --quantization awq \
   --tp-size 1 \
   --port 30000
 # Client call

curl http://localhost:30000/generate
-H "Content-Type: application/json"
-d '{"text": "Explain quantum computing in simple terms.", "sampling_params": {"temperature": 0.7, "max_new_tokens": 512}}'

11.9.6 生产部署检查清单

在将 AWQ 模型部署到生产环境前,逐项确认以下指标:

  1. 量化模型校验:在代表性评估集上的困惑度、下游任务准确率与原模型对比,退化在可接受范围(通常 < 1%)
  2. 延迟 SLA:TTFT < 200ms(p95),TPOT < 30ms(p99)
  3. 吞吐 SLA:在目标 batch size 下,每秒输出 token 数满足并发需求
  4. 显存安全性: gpu-memory-utilization 设置合理(建议 0.85-0.90),预留约 5-8 GB 给 KV Cache 增长
  5. KV Cache 配置:AWQ 模型 KV Cache 使用 FP16(不量化),确认 max-model-len 能容纳最长对话
  6. 混合部署:如果使用 Prefill-Decode 分离架构,量化模型在 Prefill 和 Decode 实例上的配置可能不同
  7. 健康检查与监控:通过 Prometheus + Grafana 暴露 vLLM metrics endpoint,监控 TTFT/TPOT 的百分位
  8. 灰度发布:新量化模型在 5% 流量下运行 24 小时后,逐级放量到 100%

11.9.7 性能调优建议

  1. group_size:从 128 改为 64 可提升约 0.05 PPL 精度,元数据增大约 3%。对于精度敏感场景(如代码生成、数学推 理)推荐 group_size=64
  2. zero_point:启用非对称量化通常带来 0.02-0.05 PPL 的改善,硬件兼容性需额外检查
  3. vLLM max_num_seqs:增加最大并发序列数可提高吞吐,但过长等待队列会劣化 TTFT;建议 32-128 之间调优
  4. SGLang 的 radix cache:对于前缀共享场景(如多轮对话),可减少 prefill 重复计算
  5. 与其他量化方法的组合:AWQ + SmoothQuant 可实现 W4A8,适用于对激活值量化有需求的纯整数推理管线 对于极致成本优化场景,考虑使用 2×A40(48 GB)代替 1×A100(80 GB)——AWQ INT4 将 70B 模型压缩至约 39 GB,恰好装入双 A40 的 96 GB 总容量。虽然 A40 的算力仅为 A100 的 70%,但采购成本约 1/4,是中小型团队的优选部 署方案。

11.10 模型部署压缩全景

本节从工程决策视角汇总本章的量化、稀疏与蒸馏方法,给出模型部署压缩的方法论全景:如何评估压缩收益、如何组合 方法、如何在推理引擎中落地,以及如何在精度与性能之间取得平衡。

11.10.1 压缩方法分类与协同

模型压缩技术按作用维度分为三类: •剪枝:删除冗余参数。结构化剪枝整行、整列或整头移除权重,可直接获得实际加速;非结构化剪枝以稀疏矩阵形式丢 弃单个权重,压缩率高但依赖稀疏核才能兑现性能 •量化:降低权重与激活的数值位宽。权重量化(W4A16/W8A16)只压缩参数,激活量化(W8A8/W4A8)进一步压缩 中间张量与 KV Cache,并可利用低精度 Tensor Core •蒸馏:以教师-学生框架让小模型复现大模型的知识,直接缩小模型规模,属结构性压缩而非数值压缩 三类压缩的收益维度不同: •模型大小:INT8 权重约压缩 2 倍,INT4 约 4 倍,蒸馏可达 10 倍-50 倍的规模压缩 •内存带宽:解码阶段逐 token 读取全部权重,单步耗时受显存带宽约束。Llama-70B FP16 每步需读约 140 GB,A100 约 2 TB/s 的带宽给出约 70 ms/token 的 TPOT 下限;INT4 权重将读数降为约 35 GB,TPOT 下限降为约 17 ms •推理延迟:Prefill 阶段计算受限,INT8/FP8 借助低精度 Tensor Core 提升算力(H100 的 INT8 稠密算力约 1979 TOPS,约为 FP16 稠密的两倍);Decode 阶段带宽受限,权重量化收益最直接 •吞吐:权重读取量下降使每步耗时缩短,显存释放后单位 GPU 可容纳的并发序列数上升,两者共同放大吞吐 工业界几乎不单独使用某一类方法。蒸馏先确定模型骨架,把 70B 缩到 7B,再叠加 INT4 量化把权重压到约 4 GB,综合 压缩比可达 40 倍;量化与剪枝处理细节冗余,蒸馏决定能力上限。如图11-5所示,三类方法在部署中通常以组合形式出 现。 组合收益需要分项估算:显存占用按参数量与每参数位宽相乘,蒸馏把参数从 70B 降到 7B、INT4 再把每参数从 2 字节压 到 0.5 字节,总显存可由约 140 GB 降至 3.5 GB;解码吞吐的提升近似来自每步权重读取量的下降。两类收益并不必然完 全叠加——蒸馏后仍跑 FP16 的模型,带宽收益来自规模缩小;保持 70B 只做量化的模型,带宽收益来自位宽压缩。两者 叠加时显存以相乘近似,但精度退化也会叠加,这正是组合方案调优难度高于单一方案的原因。 模型部署压缩 剪枝 量化 蒸馏 结构化剪枝 非结构化剪枝 INT8 W8A8 INT4 W4A16 FP8 KV Cache 量化 规模压缩蒸馏 合成数据蒸馏 图11-5 部署压缩技术全景分类

11.10.2 部署压缩决策流程

压缩选型本质是在显存、延迟、吞吐与精度四个约束下求解,流程如下。

  1. 明确部署约束:先回答四个问题。显存约束决定可容纳的模型规模(70B 在 A100-80G 上只能以 INT4 单卡部署,FP16 需两张卡);延迟 SLA 要区分 TTFT 敏感还是 TPOT 敏感;吞吐目标决定并发需求;精度预算给出退化上限,如下游任务 下降不超过 1%。
  2. 选择压缩组合:显存受限时优先权重量化(W4A16);延迟与吞吐敏感且硬件支持时选 W8A8/FP8 以利用低精度算力; 成本极端敏感才引入蒸馏管线。激活量化与权重量化彼此独立,可自由叠加,W4A8 即 AWQ 与 SmoothQuant 的组合。
  3. 离线精度验证:先用困惑度(WikiText-2/C4 的 PPL)粗筛,再用下游任务准确率与输出质量(MMLU、MT-Bench) 做最终判断。PPL 合格不代表业务场景合格,校准集与线上分布的偏差会放大误差。
  4. 逐级性能验证:依次通过离线精度、单卡性能、服务化压测三道关卡,最后线上灰度放量。如图11-6所示,任何一级 不达标都应回退到压缩组合选择,而非带病下推。 评估集建设与模型本身同等重要。建议维护一份覆盖核心业务场景的回归用例集,量化前后逐条对比输出质量;对生成式 任务,除 MT-Bench 类整体得分外,还应抽查指令遵循、格式正确、幻觉频率等细粒度指标。灰度按流量阶梯放量(如 5%、25%、50%),同步监控 TPOT/TTFT 分位与业务侧质量反馈,异常即回滚,避免带病全量。 明确部署约束 选择压缩组合 退化超标 离线精度验证 不达标 通过 SLA 不满足 单卡性能验证 达标 服务化压测 满足 线上灰度放量 持续监控 图11-6 部署压缩决策流程

11.10.3 主流压缩方案对比

业界常用的压缩方案如表11-11所示。方案选择的核心是硬件算力通路与精度预算:Ampere 上走 INT8 路线,Hopper 及 以上用 FP8 路线,显存受限场景回到 INT4 权重量化。 表11-11 主流压缩方案对比 方案 原理 位宽/压缩比 精度损失 硬件要求 落地成熟度 INT8 W8A8 权重与激活均量化至 INT8,走 2 倍 低 Volta+ 支持 INT8 极高,TensorRT- Tensor Core INT8 MMA 的 Tensor Core LLM/vLLM 线 默认路 INT4 权重 仅权重量化至 INT4,激活保持 约 4 倍,70B 约 36- 低至中 通用 CUDA,无特 极高,各引擎原生 量化 FP16(AWQ/GPTQ) 40 GB 殊硬件 支持 FP8 FP8 原生推理格式,E4M3 用 Hopper+ 原生, 高,与训练管线格 (E4M3/E 于权重与前向、E5M2 用于梯 2 倍 低 Ampere 仅软件模 式对齐 5M2) 度 拟 稀疏剪枝 删参数,2:4 结构化或 SparseGPT 非结构化 2:4 约 2 倍,非结构 中至高,大稀 化可稀疏 50%-90% 疏比退化明显 2:4 需 Ampere+ 稀 中,仅 NVIDIA 硬件 疏 Tensor Core 加速 蒸馏 教师-学生框架缩小模型规模 规模 10 倍-50 倍 取决于学生容 量 训练算力高,推理 高,需重训成本 无特殊要求 KV Cache 压缩缓存激活值 (FP8/INT8) ,长上下文收益 每 token 4 字节降至 低 Hopper+ FP8 或 中高,vLLM/TRT- 量化 显著 1-2 字节 Ampere INT8 LLM 已支持 多方法叠加,如 W4A8 中,工程复杂度上 组合方案 (AWQ+SmoothQuant)、蒸 综合 4 倍-40 倍 中 取决于组合成分 升 馏+INT4 INT8 W8A8 是兼容性最好的起点:Volta 以来的硬件均具备 INT8 Tensor Core,vLLM 与 TensorRT-LLM 开箱即用,精度 损失通常保持在 1% 以内。FP8 在 Hopper 上以相近精度和更低的校准成本取代 INT8,但仅限新硬件。INT4 权重量化以 约 4 倍压缩换取中等精度损失,是显存受限场景的主力,其反量化开销已被 Marlin 等内核优化到可忽略。稀疏与蒸馏定 位不同:前者适合权重冗余明显的中小模型,后者适合需要长期维护同一族模型的团队。KV Cache 量化与主权重方案正 交,长上下文或高并发时建议叠加使用。

11.10.4 推理引擎中的压缩落地

主流推理引擎对压缩方案的支持深度,决定压缩收益能否真正兑现。 vLLM:通过 --quantization 指定方案,支持 awq、gptq、fp8、squeezellm、gguf、bitsandbytes 等,并提供基于 Marlin 内核的 awq_marlin、gptq_marlin、fp8_marlin 加速变体。该参数同时决定权重加载器与 kernel 选择,awq 默 认走 AWQ 反量化 kernel,fp8 在支持硬件上走原生 FP8 GEMM;引擎各版本支持的方案集合有差异,升级前需核对目标 模型的量化格式是否仍被支持。KV Cache 量化用 --kv-cache-dtype fp8 (主流 E5M3)或 --kv-cache-dtype fp8_e4m3 ,长上下文场景收益显著:

AWQ INT4 weights + FP8 KV cache on one A100-80G

vllm serve ./Llama-3-70B-AWQ-INT4 \

   --quantization awq \
   --kv-cache-dtype fp8 \
   --gpu-memory-utilization 0.90

TensorRT-LLM:量化权重在构建阶段绑定进引擎,运行时无逐层反量化开销。FP8 部署走完整 TensorRT 编译管线:先 量化权重并导出 checkpoint,再用 trtllm-build 编译引擎, --weight_only_precision 控制权重量化位宽。引擎 与具体 GPU 型号和量化位宽绑定,换卡或换量化方案需重新编译,这是其获得极致性能的代价,适合对延迟抖动敏感、 追求极致吞吐的 NVIDIA 生产环境。 llama.cpp / GGUF:GGUF 格式定义了一套量化方案族,q4_0、q4_K_M、q8_0 为常用档位。K-quant(q4_K_M)以 分组量化提升低比特精度,q8_0 接近无损。该生态面向 CPU、Apple Silicon 与端侧部署,无专用加速核时仍能获得带宽 收益。权重转换全程在本地完成:先经 convert-hf-to-gguf 从 HuggingFace 权重导出 GGUF,再用 llama-quantize 指定 q4_K_M 等档位量化,无需额外 GPU。 HuggingFace Transformers + bitsandbytes: load_in_4bit 以 NF4 格式加载权重, load_in_8bit 采用 LLM.int8() 的混合精度思路。二者在加载与推理时反量化为高精度计算,主要面向试验、QLoRA 微调与中小规模推理, 吞吐收益弱于原生低精度内核。 其他路径:MLX 面向 Apple Silicon 提供 4-bit/8-bit 分组量化,分组粒度与 bitsandbytes 的 NF4 类似,加载后同样以反 量化精度计算,适合推理精度敏感而硬件受限的端侧场景;ONNX Runtime 通过动态 INT8 量化与 QDQ 模型把量化参数 固化进图结构,适合固定静态图的跨平台边缘部署。各引擎能力对比如表11-12所示。 表11-12 推理引擎压缩能力对比 引擎 主要支持方案 典型适用场景 vLLM AWQ/GPTQ/FP8/SqueezeLLM/GGUF,KV Cache FP8 大规模 GPU 在线服务 TensorRT-LLM W8A8/INT4/FP8/SmoothQuant NVIDIA 高吞吐生产管线 llama.cpp/GGUF q4_0/q4_K_M/q8_0 等 CPU、Apple Silicon、端侧 Transformers+bitsandbytes NF4 4-bit、INT8 加载 试验、QLoRA 微调、中小规模 MLX 4-bit/8-bit 分组量化 Apple Silicon 端侧推理 ONNX Runtime 动态 INT8、QDQ 跨平台边缘部署

11.10.5 精度与性能平衡

压缩的精度损失有三个来源: •量化噪声:舍入误差在异常值通道被放大,是 W4/W8 精度退化的主因;GPTQ 的二阶补偿与 AWQ 的激活感知缩放都 是针对该来源的修正 •剪枝信息丢失:低幅权重可能承载任务相关信号,剪枝破坏参数分布后误差逐层累积 •蒸馏知识缺口:学生模型容量有限,教师的知识无法完整迁移,学生越小缺口越大 校准数据集是量化精度的隐形变量。校准集应与线上分布一致,数百条样本即可(常见 128-512 条);过大的校准集或反 复多轮校准会过拟合校准分布,反而降低泛化。同一模型分别用 WikiText 与 C4 校准,量化后的 PPL 表现可能相反。 精度恢复手段按成本递增排列:先尝试逐层误差补偿(AWQ 激活感知缩放、GPTQ 逐层重建),再考虑少量 LoRA 微调 (QLoRA 在 4-bit 基座上直接微调),最后才是重训或蒸馏替换。多数业务在 PPL 退化 0.1-0.3、下游任务退化 1% 以内时 无需恢复。 性能实测应贴近真实服务负载。量化收益在小 batch、短序列下容易被高估:Decode 阶段的带宽收益在长序列与大并发 下才完全显现,Prefill 的 INT8/FP8 收益在长 prompt 批量处理时才可测。建议用引擎自带压测工具(vLLM 的 benchmark_throughput、SGLang 的 bench_one_batch)在目标并发与上下文长度下测量 TTFT、TPOT 与吞吐,并对 比峰值显存占用。只测单卡小 batch 的推理时延,会得到乐观但不可外推的结论。 测速时遵循对照原则:同一引擎、同一 batch 与上下文长度、同一预热轮数下仅切换量化配置,否则收益会被测量噪声淹 没。批处理下 Decode 吞吐近似随 batch 线性增长,应在目标并发(如 64-256)而非 batch=1 下读数;Prefill 的加速比 在长 prompt 与批量 prefill 时才稳定。显存观测以 nvidia-smi 的峰值为准,注意 KV Cache 随序列增长,长上下文下应 预留 5%-10% 余量,避免 OOM 引发的服务抖动吞掉压缩带来的收益。 压缩本质是精度与成本的显式交换。工程上应先以低成本手段(校准集优化、逐层误差补偿)逼近精度预算线,仍不满足 再引入微调等更高成本的恢复路径。最终选型应同时被离线指标、服务化压测与灰度数据三方确认,任何一方不通过都不 应进入全量部署。