一、问题定义:显存带宽瓶颈与精度冗余的共存
大语言模型推理的性能困境,归根结底是一个数据搬运问题。
以 Llama-2-70B 在 H100 上的 decoding 阶段为例。这一阶段每次只处理单个 token,计算量约 140 GFLOPs,但需要从 HBM 搬运约 140 GB 的参数数据(每个参数 2 bytes,FP16)。H100 的 HBM 带宽约 3.35 TB/s,因此:
Tdata_transfer=140 GB3.35 TB/s≈42 msTdata_transfer=3.35 TB/s140 GB≈42 msTcompute=140 GFLOPs989 TFLOPS≈0.14 msTcompute=989 TFLOPS140 GFLOPs≈0.14 ms
数据搬运时间是计算时间的约 300 倍。GPU 中成千上万的 Tensor Core 在绝大部分时间里处于空闲状态,等待数据从 HBM 抵达寄存器。这就是 memory-bound 困境的具象化:算力不是瓶颈,带宽是。
解决的思路只有两个方向:减少需要搬运的数据量,或增加搬运的带宽。后者受制于物理定律——HBM 带宽的年增速约为 20-30%,而模型规模的增长速度是其 3-5 倍。前者在一段时间内只能靠更激进的并行策略(tensor parallelism),但通信开销同样受带宽约束。
但这里存在一个隐含的矛盾:我们真的需要每个参数都用 16 bits 来表示吗?
训练阶段,高精度(FP32 或 BF16)是必要的——反向传播的梯度累积跨越数千步,微小的精度误差在漫长训练中会被放大。但推理阶段是单次前向传播,没有梯度累积,没有参数更新。这种场景下,16-bit 精度是否为过度的冗余?
大量实证研究给出了肯定的答案。以 Llama-2-70B 在标准基准上的表现为例:
| 精度 | Perplexity (WikiText-2) | 参数显存 | 相对 FP16 的吞吐 |
|---|---|---|---|
| FP16 | 5.12 | 140 GB | 1.0× |
| INT8 (SmoothQuant) | 5.15 (+0.06%) | 70 GB | 1.6-1.8× |
| FP8 | 5.13 (+0.02%) | 70 GB | 1.8-2.0× |
| INT4 (GPTQ) | 5.30 (+3.5%) | 35 GB | 2.5-3.0× |
用 0.02% 的 perplexity 损失换取 2 倍的吞吐提升——这就是量化技术存在的根本理由。模型参数中承载的精度不是全部有用。那些微小到对人类阅读和推理结果无影响的低位信息,占据了不成比例的显存带宽和显存空间。量化的本质是将这些"冗余精度"识别出来并移除,把释放出的带宽和显存转化为实际吞吐。
二、数值表示:浮点与整数的代价差
理解量化的工作原理,需要理解不同数值格式在硬件上的成本差异。
2.1 浮点格式:高动态范围,高带宽成本
FP32(单精度浮点):1 bit 符号 + 8 bits 指数 + 23 bits 尾数 = 32 bits。动态范围约 ±3.4×10³⁸,精度约 7 位有效十进制数字。训练的标准格式。
FP16(半精度浮点):1 bit 符号 + 5 bits 指数 + 10 bits 尾数 = 16 bits。动态范围 ±65,504,精度约 3-4 位有效十进制数字。推理的主流格式,自 V100 起有原生硬件支持。
BF16(Brain Float 16):1 bit 符号 + 8 bits 指数 + 7 bits 尾数 = 16 bits。动态范围与 FP32 相同(同样是 8 位指数),精度低于 FP16。Google TPU 和 A100 起引入的原生支持格式。在训练和推理中逐渐替代 FP16,因为它避免了 FP16 的梯度下溢问题——对于 LLM 中大量集中在 [-1, 1] 范围内的参数和激活值,BF16 的动态范围比精度重要得多,8 位指数的设计决策被证明是对的。
FP8:Hopper 架构(H100)引入的两种变体——E4M3(4 位指数,3 位尾数)和 E5M2(5 位指数,2 位尾数)。前者精度更高,适合表示权重和激活;后者动态范围更大,适合梯度(训练场景)。FP8 的关键创新不是减少了多少位,而是得益于 H100 的FP8 Tensor Core——FP8 矩阵乘法的吞吐是 FP16 的 2 倍,因为每个 Tensor Core 每个周期可以处理两倍的 FP8 元素。
2.2 整数格式:低带宽,窄动态范围
INT8:8 位有符号整数,范围 [-128, 127],可表示 256 个离散值。没有指数位,没有分数精度——相邻值之间总是相差 1。因此 INT8 量化必须引入**缩放因子(scale factor)**来将浮点值的数值范围映射到 [-128, 127] 的离散整数范围。
INT4:4 位整数,范围 [-8, 7] 或 [0, 15],仅 16 个离散值。INT4 量化的压缩比是 FP16 的 4 倍,但其表达能力极弱——将 70B 模型的某个权重矩阵压缩到每个参数只有 16 种可能的取值,这需要在量化算法上做大量精巧的设计。
2.3 核心公式:量化与反量化
量化的数学本质是将连续值映射到离散格点:
量化(浮点 → 整数):
xint=round(xfloats)+zxint=round(sxfloat)+z
反量化(整数 → 浮点):
x^float=(xint−z)×sx^float=(xint−z)×s
其中s(scale)决定映射的"步长",z(zero-point)用于处理非对称分布——当原始数据不关于零点对称时,zero-point 允许格点覆盖更合适的数值范围。
对于没有z的对称量化(假设 zero-point = 0),信息损失集中在round()操作上。缩放因子s通常是整个 tensor(per-tensor)或每个通道(per-channel)独立确定的,选择s使得量化误差最小化是各种量化算法的核心优化目标。
三、量化方案的分类型谱
在深入具体算法之前,理解量化方案的分类维度是必要的。这四组分类维度相互交叉,形成了一张多维设计空间。
3.1 训练后量化(PTQ)vs 量化感知训练(QAT)
PTQ(Post-Training Quantization):在模型训练完成后,仅用少量校准数据(通常是几百到几千个样本)来确定量化参数。不需要重新训练模型,不需要访问训练代码或完整训练数据。PTQ 是推理部署中最主流的方案——GPTQ、AWQ、SmoothQuant、FP8 均属此类。优点是部署成本低(几分钟到几小时),缺点是量化误差可以被累积放大。
QAT(Quantization-Aware Training):在训练(或微调)过程中模拟量化效果——前向传播使用模拟的量化和反量化,反向传播正常使用 FP32 梯度更新权重。模型在训练过程中"学会适应"量化误差。优点是精度损失极低(通常 <0.1%),缺点是需要完整的训练基础设施、数据和计算资源。QAT 在边缘设备(手机、IoT)和极致精度要求的场景中更常见。
3.2 Weight-only 量化 vs Weight + Activation 量化
Weight-only Quantization:仅量化模型权重,激活值保持 FP16/BF16。每次推理时的矩阵乘法流程是:从显存加载 INT4 权重 → 反量化回 FP16 → 与 FP16 激活值做矩阵乘法。这节省了权重在显存中的存储空间(4× 压缩比),但计算仍在 FP16 精度下进行——因此减少的是内存带宽压力而非计算时间。适用于 batch size 较小、memory-bound 的 decoding 阶段。
Weight + Activation Quantization:同时量化权重和激活值。真正的收益在于——矩阵乘法的两个操作数都是低精度整数时,可以直接使用 INT8 Tensor Core 进行整数矩阵乘法,无需在运行时反量化。这不仅节省了 2× 的显存带宽(权重 + 激活),还获得了 INT8 Tensor Core 2× 的计算吞吐提升。但代价是激活值的量化远比权重量化困难——激活值的分布随输入而变化,且存在极端的 outlier 问题(见 SmoothQuant 一节)。
3.3 对称量化 vs 非对称量化
对称量化:s = max(|x|) / max_int,zero-point = 0。量化格点关于零对称。实现简单,对分布对称的数据(如大部分层的权重,经过 LayerNorm 后的激活)效果好。
非对称量化:s = (max(x) - min(x)) / 255(INT8),z = round(-min(x) / s)。量化格点覆盖[min(x), max(x)]的完整范围。对于分布在正区间(如 ReLU 后的激活)或偏向一侧的数据,非对称量化可以避免对称量化浪费一半的格点。
3.4 量化粒度
Per-tensor:整个参数矩阵共享一个s和一个z。最简单,但一个异常值(outlier)会拉大整个 tensor 的s,导致其他 99.9% 的数值被映射到极窄的离散值范围内,精度损失严重。
Per-channel(或 per-row/per-column):矩阵的每一行(或列)有独立的s。这是权重量化的标准粒度——不同输出通道的权重值分布可能有数量级的差异,per-channel 量化能很好地适应这种差异。对于 4096×4096 的权重矩阵,per-channel 量化需要 4096 个 scale 值(额外的 16 KB 开销,可忽略)。
Per-token(激活量化):每个 token 位置的激活向量有独立的s。这在 decode 阶段(batch size 通常很小,每个 batch 条目就是一个 token)与 per-tensor 相同,但在 prefill 阶段(一个请求可能包含数千 token),per-token 量化能更好地处理不同 token 位置的激活值差异。
Group-wise:将矩阵的列(或行)以固定大小分组(如 group_size=128),每组有独立的s。这是 INT4 权重量化的标准粒度——GPTQ 和 AWQ 都依赖 group-wise 量化来补偿 INT4 极低的表达能力。group_size=128 意味着每 128 个参数共享一个 16-bit scale 和可选 16-bit zero-point,相当于每个参数的有效位宽 = 4 + 32/128 = 4.25 bits——精度提升显著而额外存储极小。
四、GPTQ:逐列贪心补偿的 INT4 权重量化
4.1 问题的棘手性
将模型权重以极低精度(如 INT4)表示,最朴素的方法是逐层直接量化——对于每一层的权重矩阵 W,找到一组量化参数使||W - Ŵ||(L2 或 Frobenius 范数)最小化。对于 per-column 对称 INT4 量化,每一列的最优 scale 可以通过最小化该列的量化误差直接得到。
但这里有一个关键问题:逐层独立量化的误差假设是每层对量化误差的容忍度可以通过该层的权重矩阵本身来评估,但实际影响模型输出的是该层量化误差在后续层中的传播。且更重要的是,对于 transformer 的每一层,权重矩阵的不同行的敏感度差异巨大。
GPTQ(Generative Pre-trained Transformer Quantization)的核心洞察是:量化可以逐列进行,列与列之间的误差可以通过在后续列的量化中"补偿"来抵消,而不需要重新量化已处理过的列。
4.2 算法核心:逐列量化 + Hessian 引导的误差补偿
GPTQ 的算法流程如下:
输入: FP16 权重矩阵 W ∈ R^{d_out × d_in} 少量校准数据用于计算 Hessian 矩阵 H 1. 计算输入特征 X 的 Hessian: H = 2·X^T·X(来自校准数据) 对其求逆: H_inv(这只需要计算一次,存储在 CPU 上即可) 2. 对权重矩阵的每一列 i = 1 .. d_in: a. 将 W[:, i] 量化为 INT4: Ŵ[:, i] = quantize(W[:, i]) 量化误差 Δw = W[:, i] - Ŵ[:, i] b. 计算本次量化的平方误差: E_i = (Δw^T · H_inv · Δw) 这个误差衡量了"如果直接量化这一列,对最终输出的影响" c. [误差补偿] 对剩下的列 j = i+1 .. d_in 进行补偿: W[:, j] -= Δw · H_inv[i, j] / H_inv[i, i] 补偿的目的是: "通过微调未量化的列,抵消已量化列的误差" 输出: INT4 权重矩阵 Ŵ + per-group scale/zero-point步骤 2c 是 GPTQ 的精髓。它的数学原理是:通过 Hessian 矩阵的逆来解一个二次规划问题——在已量化的列误差不可修改的约束下,如何调整剩余列使得整体输出的 L2 误差最小化。这是最优脑外科(Optimal Brain Surgeon, OBS)剪枝框架在量化问题上的直接应用。
4.3 为什么有效以及为什么需要校准数据
GPTQ 的误差补偿依赖于 Hessian 矩阵,而 Hessian 矩阵是从校准数据计算得到的。校准数据的质量直接影响 Hessian 对真实推理分布的近似程度。
校准数据不需要是训练数据,也不需要标注。通常使用从目标应用的典型输入分布中抽取的128-256 个序列样本,每个约 2048 token。Hessian 矩阵逐层计算——对每一层,截取校准数据流经该层时的输入特征 X,计算H = 2·X^T·X。这一计算在 GPU 上逐批完成(因为 X 的尺寸可能很大),最终 H 累积后求逆并转移到 CPU——H 的尺寸是d_in × d_in(对于 4096 的 hidden_dim,约 67 MB,CPU 内存轻松容纳)。
校准数据的选择会影响量化后的模型精度,但这种影响通常很小(<0.5% perplexity 差异)——GPTQ 的误差补偿机制对校准数据的具体分布不敏感,只要它大致覆盖了主要的输入模式。
4.4 激活顺序与分组
2019 年的原始 OBQ 算法按任意顺序量化权重,GPTQ 论文的实验表明量化顺序对精度影响很小——因为误差补偿的数学保证是顺序无关的。但在 GPTQ 中,列按自然顺序处理,主要是工程实现的便利性考虑(H_inv 的 Cholesky 分解适合列序处理)。
分组(group_size)是另一个重要参数。当 group_size = 128 时,每 128 列独立计算一个 scale。分组越小,量化的拟合精度越高(因为每组的 scale 可以更精确地匹配该组的权重分布),但额外存储的 scale/zero-point 参数越多。group_size = 128 在实践中是一个优秀的平衡点——精度损失约比 per-column(group_size = d_in)低 50-80%,但额外存储开销仅增加 3.1%。
五、AWQ:识别和保护的只是 1% 的权重
5.1 Activation-aware 的核心洞察
AWQ(Activation-aware Weight Quantization)提出的问题比 GPTQ 更进一步:不是所有权重对量化误差的贡献相等。模型输出对 1% 的"显著性权重"(salient weights)的量化异常敏感,而其余 99% 的权重对量化误差的容忍度出乎意料地高。
权重的重要性不是孤立属性——它由权重值和对应的激活值共同决定。一个权重值本身很小,但如果它对应的输入通道的激活值一直很大(即该特征通道持续被激活),它实际贡献的信号量就很大,量化它造成的误差就显著。反之,一个权重值很大但如果对应的激活通道几乎总是零,量化它的影响就很小。
AWQ 用"逐通道权重值 × 逐通道平均激活值"来量化每个通道的重要性:
si=∣wi∣⋅∣xi∣βoptional normalizationsi=optional normalization∣wi∣⋅∣xi∣β
其中 wiwi 是第 i 个输入通道的权重向量,xixi 是该通道在校准数据上的平均激活幅值。
5.2 通道级缩放:在量化的数学等价性中隐藏保护
识别出了显著通道后,AWQ 使用一个非常巧妙的技巧来保护它们:不修改量化算法本身,而是通过改变权重和激活的值来让显著通道"更耐量化"。
具体做法:对于显著通道 i,定义一个缩放因子 si>1si>1,将权重值除以 sisi(缩小权重),将对应激活乘以 sisi(放大激活)。这在数学上是等价的——矩阵乘法的结果不变:
W⋅x=(W⋅diag(1/s))⋅(diag(s)⋅x)W⋅x=(W⋅diag(1/s))⋅(diag(s)⋅x)
但量化的舍入误差是在缩放后的权重上发生的。当显著通道的权重被缩小后,它们落在更窄的数值范围内,量化格点对它们的覆盖更精细——相对舍入误差更小。非显著通道的权重被放大(si<1si<1 时),但这无所谓——它们对误差不敏感。
缩放因子通过一个简单的网格搜索找到:对每个通道,尝试几个候选缩放值,计算量化后的输出误差,选最小的。这个搜索是 per-channel 的,对于 4096 通道的层只需几秒钟。
5.3 与 GPTQ 的差异
GPTQ 和 AWQ 都是 INT4 weight-only 量化,但思路不同:
- GPTQ 是列优先的贪心算法:逐列量化 + 误差补偿。每量化一列,将误差分摊到剩余列上。算法复杂度高(需要对 Hessian 求逆),但补偿机制更系统化。
- AWQ 是通道级预处理:先识别重要的输入通道,通过等价的缩放变换保护它们,然后直接应用最朴素的 per-channel 量化。算法极简(不需要 Hessian,不需要贪心),但有效性依赖于"只有极少数通道是显著的"这一经验观察。
在实践中,两种方法在同一模型上的精度差异通常 <1% perplexity——这意味着选择哪个算法更多取决于工程偏好(GPTQ 的 GPU 显存需求更高,因为 Hessian 在 GPU 上计算;AWQ 更轻量,校准更快)而非精度差距。
六、SmoothQuant:驯服激活值中的异常通道
6.1 激活量化的根本困难:Outlier Channels
Weight-only 量化解决了权重显存占用的问题(将 140 GB 压缩到 35 GB),但它没有将收益转化为计算速度——因为激活仍是 FP16,矩阵乘法仍需在 FP16 Tensor Core 中执行。真正的计算加速来自Weight + Activation 同时量化到 INT8,利用 INT8 Tensor Core 的 2× 计算吞吐。
但激活量化面临一个根本性的困难:LLM 的激活值中存在系统性的异常通道(outlier channels)。
经验观察显示,在 LLM 的中间层中(尤其是 LayerNorm 的输出),某些固定的特征通道的激活幅值比其他通道大 10-100 倍。这些通道对应的神经元在几乎所有输入上都输出极大的值,而绝大多数通道的输出集中在接近零的范围。如果对整个激活 tensor 使用 per-tensor 对称量化,scale 会被这些少数异常通道拉得极大——导致其他 99% 的通道被量化到一个极窄的离散范围(如 [-3, 3] 的浮点值映射到 INT8 的 [-127, 127] 却被 [outlier_channel_max] 拉大的 scale 稀释),几乎丧失所有精度。
Per-token 量化(每个 token 位置有独立的 scale)可以部分缓解这个问题,但无法根除——因为一个 token 位置内的不同通道之间的异常差异仍然存在。
6.2 数学等价变换:将量化困难从激活迁移到权重
SmoothQuant 的解决方案极为优雅:通过在数学上等价的变换,将每个异常通道的量化难度从激活值"平滑迁移"到对权重值上。
对于权重矩阵 W(形状 d_out × d_in)和激活向量 x(形状 d_in):
y=W⋅x=(W⋅diag(s)−1)⋅(diag(s)⋅x)y=W⋅x=(W⋅diag(s)−1)⋅(diag(s)⋅x)
其中 s 是一个逐通道的平滑因子向量(形状 d_in)。
等价变换后:
W' = W · diag(s)^(-1):权重矩阵的每一列除以 s_j(权重通道 j 被放大)x' = diag(s) · x:激活向量的每一行乘以 s_j(激活通道 j 被缩小)
关键选择是 sjsj 的值。对于异常通道(activation outlier 所在的通道 j),取 sj>1sj>1,将激活值缩小(变得更容易量化),同时将对应的权重列放大(这就是"迁移"的含义)。权重列被放大后量化的难度增加——但权重量化通常使用 per-channel scale,对异常的容忍度比激活量化强得多(因为权重的一列都是同一通道,分布通常更平滑)。
sjsj 的精确公式:
sj=max(∣xj∣)α/max(∣W:,j∣)(1−α)sj=max(∣xj∣)α/max(∣W:,j∣)(1−α)
其中 α ∈ [0, 1] 是迁移强度参数。α = 0.5 时,量化难度在权重和激活之间均等分配,这在实践中几乎总是最优的。
6.3 SmoothQuant 的效果
在 OPT-175B 上,SmoothQuant INT8 量化在所有评测基准上的精度损失 <0.5%,同时获得了:
- 权重显存减半(从 FP16 的 350 GB → INT8 的 175 GB)
- 计算吞吐提升约 1.6-1.8×(INT8 Tensor Core 的理论 2× 增益扣除反量化开销等)
并且——SmoothQuant 的数学等价变换前提是该层的计算是线性投影(如矩阵乘法)。对于 attention 的 QKV 投影和 MLP 的全连接层,这个前提精确成立。对于 element-wise 操作(如残差加法、激活函数)、LayerNorm 和 softmax,它们不需要量化。
6.4 与 AWQ 的相似性与差异
SmoothQuant 和 AWQ 都使用了"数学等价的缩放变换来改变量化难度"的技巧,但方向相反:
- AWQ:缩小显著通道的权重(si>1si>1 用于显著通道的权重侧),放大对应激活。目的是保护显著权重通道在INT4极端压缩下的精度。
- SmoothQuant:缩小异常通道的激活(sj>1sj>1 用于异常通道的激活侧),放大对应权重列。目的是使得激活值可以被INT8量化而不被异常通道压塌精度。
前者是"把好钢用在刀刃上"(保护好那 1% 的显著权重),后者是"把压力从弱者身上移走"(让受不了量化精度的激活异常通道把负担转嫁给更容错的权重)。
七、FP8:原生硬件支持的"几乎免费"精度折半
7.1 与 INT8 的本质差异
FP8 和 INT8 虽然都是 8 bits,但在数值表示上有根本性差异:
- INT8:固定步长的均匀格点,动态范围约 256:1(最大值/最小值比)。对分布较广的数据需要精心选择 scale 来覆盖,且两端的异常值会严重压缩中间区域的表示能力。
- FP8 (E4M3):1 sign + 4 exponent + 3 mantissa。动态范围与 FP16 相同(得益于共享的指数位宽),但精度更低。这使得 FP8 对异常值不敏感——指数位可以覆盖极宽的数值范围,而不会像 INT8 那样需要为异常值"拉大格点间距"。
这意味着 FP8 量化不需要 SmoothQuant 那样的激活平滑化——FP8 的动态范围天然能容纳 activation outlier。也意味着 FP8 的量化算法也比 INT8 简单得多——通常只需要 per-tensor 缩放(一个 scale 值),不需要 per-channel 或 group-wise 的复杂粒度。
7.2 FP8 的硬件支持
FP8 的核心价值在于H100 的原生 FP8 Tensor Core 支持。H100 的 Tensor Core 在 FP8 模式下每个周期可以执行 2× 的矩阵乘法吞吐(相比 FP16),因为每个 Tensor Core 寄存器可以容纳 2 倍的 FP8 元素。
FP8 推理的矩阵乘法流程:
- 权重以 FP8 E4M3 格式存储在显存中(带宽减半)
- 激活从上一层的输出直接转换为 FP8(不需要量化和反量化循环)
- FP8 Tensor Core 执行矩阵乘法,中间累加器使用 FP32(保证累加不损失精度)
- 输出转换回 BF16/FP16
这个流程的最大优势是不需要数据校准(calibration)——FP8 的 scale 可以通过权重的 per-tensormax(|W|)直接计算,激活的 scale 可以通过在少数样本上运行的在线统计来确定。整个"量化"过程比 GPTQ 或 AWQ 的 INT4 校准快几个数量级。
7.3 FP8 的局限与适用场景
FP8 量化模型的精度损失极低(perplexity 增加约 0.02-0.1%),但带来的吞吐提升(1.8-2.0×)显著。然而:
- 仅限 Hopper 及之后的架构(H100、H200、B100/B200)。A100 及之前的 GPU 不支持 FP8 Tensor Core。这是 FP8 最根本的限制——它是硬件的函数,而非纯粹的算法选择。
- 显存节省仅 2×,而 INT4 weight-only 可以节省 4×。对于需要最大化 batch size 或服务最大可能模型的场景,INT4 的 4× 压缩比仍是不可替代的。
- FP8 训练 + FP8 推理才是 FP8 的完整价值主张——训练阶段使用 FP8(减少显存和通信开销),推理阶段直接复用 FP8 权重,跳过量化和校准步骤。在训练-推理一体化的场景中,FP8 的综合成本优势是 INT8/INT4 无法比拟的。
八、量化方案的工程选择指南
不存在"最好的量化方案"——只有"在给定约束下最合适的方案":
| 约束条件 | 推荐方案 | 理由 |
|---|---|---|
| 硬件为 H100+,追求低延迟 + 高吞吐 | FP8 | 原生硬件支持,精度损失可忽略,训练+推理统一格式 |
| 硬件为 A100 或更早,显存极度紧张 | INT4 (AWQ/GPTQ) weight-only | 4× 压缩比,模型可放入单卡;decode 延迟降低与带宽节省成正比 |
| 硬件为 A100,追求计算加速 | INT8 SmoothQuant(W8A8) | 2× 计算吞吐 + 2× 带宽节省,但需处理激活量化 |
| 延迟不敏感,精度要求极严格 | 不量化 / BF16 | 零精度损失,但成本最高 |
| 边缘设备、小模型 | QAT + INT8/INT4 | 训练时适应量化误差,精度损失最小 |
| 微调后的模型需要快速量化部署 | AWQ | 校准速度快(分钟级),不需要 Hessian 计算,算法简单稳定 |
| 需要批量量化多种不同模型 | GPTQ | 算法对模型架构的泛化性好,成熟的公开实现 |
一个重要的趋势是:随着 H100/H200/B200 的普及,FP8 正在成为推理场景的默认方案。其"几乎免费"的精度-性能交换(0.02% 精度损失换 2× 加速)使得其他方案的适用空间被压缩到显存极端受限或旧硬件的场景中。
九、总结
量化技术的演进反映了一个更宏大、更底层的工程规律:当硬件进步的速度无法匹配算法对资源需求的膨胀速度时,解决瓶颈的方法不是期待更好的硬件,而是重新审视"哪些信息是真正必要的,哪些是冗余的"。
在 FP16 推理中,每个权重参数都用 16 bits 表示。但量化后的实验事实表明,对于推理阶段的单次前向传播,一个 70B 参数模型中承载的信息量远不需要 16 bits/param——FP8 的 8 bits 只损失 0.02% 的 perplexity,INT4 的 4 bits 只损失约 3-5%。
换句话说,推理时的模型参数中,至少一半以上的位携带的信息对最终输出几乎没有影响。这些"无影响位"占据的是实打实的 HBM 带宽、显存空间、以及计算单元的时间。量化的本质就是识别并移除这些位,将物理资源释放给真正关键的少数。
从系统设计的角度看,量化不是一种"优化",而是一种精度-资源密度的重新平衡:
- 训练阶段,精度资源的冗余度需要高(梯度累积、优化器状态、跨步稳定性)
- 推理阶段,精度资源的冗余度可以低(单次前向,无信息累积)
这种不对称性是量化技术存在的根本原因,也是各种量化方案——从 GPTQ 的矩阵逆误差补偿到 AWQ 的显著通道保护,从 SmoothQuant 的数学等价平滑到 FP8 的原生硬件映射——共同试图利用的结构性机会。
对于正在部署 LLM 服务的团队来说,量化的核心决策不是"要不要量化"(答案几乎总是"要"),而是在显存约束、延迟目标、精度底线和硬件平台这四个变量之间,找到最适合的量化方案组合。FP8 是当前最简单的最优解(如果硬件允许),INT4 是最激进的压缩手段(如果显存是瓶颈),INT8 SmoothQuant 是 A100 平台上的最佳中间地带。
本文基于 GPTQ (Frantar et al., 2023)、AWQ (Lin et al., 2024)、SmoothQuant (Xiao et al., 2023)、FP8 (Micikevicius et al., 2022) 等关键论文撰写,并结合了 TensorRT-LLM、vLLM、SGLang 等主流推理引擎的量化实现经验。