SmoothQuant:平滑激活异常值实现 W8A8 量化

FreeGuideOnline 最新 2026-06-14

SmoothQuant 平滑量化:让大语言模型轻松实现 W8A8 量化

随着大语言模型(LLM)规模急剧增长,模型推理成本成为业界核心痛点。量化技术通过降低权重和激活值的数值精度,可大幅减少显存占用和延迟。其中,INT8 量化(W8A8) 兼顾精度和硬件加速效率,是工业落地的最佳折中方案。然而,LLM 中普遍存在的激活异常值(Activation Outliers) 使得直接将激活值量化为 INT8 会导致严重精度损失。SmoothQuant 提出了一种简单且高效的“平滑”方法,无痛解决激活异常值问题,稳定实现 W8A8 量化。


什么是激活异常值?为什么它阻碍 W8A8 量化?

在 Transformer 架构中,激活值(即层与层之间传递的张量)呈现出通道方向上的巨大动态范围差异:少数通道的数值比其余通道大 100 倍甚至更多,形成“异常值通道”。这些异常值通道通常与模型学习到的特定语义信息相关(如分隔符、句号等 token 的嵌入),是模型能力的内在表现,无法简单丢弃或截断。

若直接对整个激活张量使用单一的量化缩放因子(如 per‑tensor 量化),异常值通道将撑大量化范围,导致绝大多数正常通道的量化精度严重不足(信息被压缩到很小的整数区间内)。若采用 per‑token 量化,虽能部分缓解,但会引入复杂的动态缩放,硬件实现不友好。W8A8 量化要求权重量化成 INT8,激活值也量化成 INT8,而激活异常值直接让简单实施方式失效。


SmoothQuant 核心思想:把量化难度从激活迁移到权重

SmoothQuant 提出一个关键洞察:权重张量才是“承受”量化的较好介质。权重是静态参数,可以离线量化;权重通道方向的分布通常更加平坦,不存在极端异常值。于是,SmoothQuant 通过数学等价变换,将激活值中的异常值难度“迁移”到权重上,使得两者都变得易于 INT8 量化。

具体来说,对于线性层计算 Y = X · WX 为激活输入,W 为权重矩阵),SmoothQuant 引入一个平滑因子向量 s,对输入通道进行缩放:

Y = (X · diag(s)^(-1)) · (diag(s) · W)
  = X_smooth · W_smooth

其中 s 的选择使得:

  • X_smooth = X / s 变得易于量化(消减了异常值通道的幅值)
  • W_smooth = s * W 通过吸收缩放,其数值范围仍在 INT8 可承受范围内

因为权重的通道维度往往有更大的“容量”(数量更大的通道数),能够通过离线逐通道量化来分摊量化误差,所以这个迁移有效且无损。


平滑因子 s 的计算方法

SmoothQuant 通过分析极值分布自动计算每个通道的迁移强度,让计算量保持极低,无需训练或标定数据即可获得最优平滑因子。

核心公式:

对于一个线性层的输入激活 X(形状为 [tokens, in_channels]),我们统计每个通道的最大绝对值,记为 max_x_j;再统计对应权重矩阵 W(形状为 [out_channels, in_channels])每个输入通道的绝对值最大值,记为 max_w_j。平滑因子定义为:

s_j = max(|X|_j)^α / max(|W|_j)^(1-α)

其中 α 是一个迁移强度超参数(0 ≤ α ≤ 1)。α 控制多少量化难度从激活向权重迁移:

  • α=0.5 时等比例分配难度,通常效果最佳。
  • α=1 相当于单独将激活归一化,权重不变。
  • α=0 相当于单独处理权重,激活不变。

实际算法流程:

  1. 使用少量校准样本(如 512 个 token 文本)运行模型,收集每个线性层的激活值。
  2. 对每个线性层,计算各个 in‑channel 的激活绝对值最大值 max_x_j
  3. 获取对应权重的绝对值最大值 max_w_j(权重是静态已知的)。
  4. 根据预设的 α 计算出每个通道的平滑因子 s_j
  5. 将平滑因子吸收进模型:权重 W 变化为 W_smooth;在下一次前向推理时,将激活除以 s(此除法可以融合到前面的 LayerNorm 等操作中,零额外延迟)。

整个过程无需模型重训练,计算开销小于一次前向传播,可以轻松嵌入任意推理流水线。


为什么这种迁移是有效的?

  • 权重具有更大的等效“量化位宽”:INT8 量化时,per‑channel 量化可看作每个输出通道拥有独立的缩放因子,而权重通道数通常远大于激活的序列维度,因此权重能够以更高的有效位宽(Effective bit‑width)表示平滑迁移后的额外数值范围。
  • 激活平摊后的均匀分布:将异常值能量划给权重后,激活张量的动态范围大幅压缩,使其更适合 INT8 对称量化,量化步长更合理,信息损失可控。
  • 数学等价无精度损耗:平滑变换是纯粹的恒等变换,理论上不会引入任何计算误差。实际量化引入的噪声只来源于两个平滑后张量的量化取整,相较于原始直接量化激活,噪声显著降低。

实现细节与系统融合

SmoothQuant 可以极轻易地接入现有推理框架,以下是关键工程处理:

1. 平滑操作与 LayerNorm 融合

对于 Transformer 层,前一层的输出通常经过 LayerNorm(或 RMSNorm)后进入线性层。我们可以将平滑因子 s 的倒数直接乘入 LayerNorm 的权重参数中,这样在推理时无需额外乘法,实现零开销迁移:

LayerNorm 输出 y = y_old / s
等效于:LayerNorm.weight_new = LayerNorm.weight_old / s

2. 按层独立设置 α

不同层对异常值的敏感度不同,可以在校准过程中自动搜索或手动调节每层的 α。通常自注意力层的 Q/K/V 投影受益于稍大的激活迁移(α 略大),而 FFN 层可维持默认 0.5。

3. 量化配置

平滑后,X_smooth 采用 per‑tensor 对称 INT8 量化;W_smooth 采用 per‑channel 对称 INT8 量化(输出通道方向)。这是最常见的硬件亲和量化方案,NVIDIA TensorRT、Intel OpenVINO、Apple CoreML 等均原生支持。


精度效果验证

SmoothQuant 在各类大规模语言模型上表现稳定,近乎无损。

  • LLaMA‑7B/13B/30B/65B:在 W8A8 量化下,困惑度(WikiText‑2)与 FP16 基线差值小于 0.1,显著优于标准 per‑tensor 量化(差距 >1.0)。
  • OPT 系列:所有模型均实现困惑度无损,包括 OPT‑175B。
  • BLOOM:176B 参数模型只用 512 条校准样本即可完成平滑,量化后 MMLU 零样本精度下降 <0.5%。
  • 推理加速:在 NVIDIA A100 上,SmoothQuant 结合 INT8 推理相较于 FP16 可获得 1.5‑1.7 倍吞吐提升,显存占用降低近一半。

初学者快速上手指南

如果你想在自己的模型上试用 SmoothQuant,推荐遵循以下步骤:

  1. 安装依赖:主流 LLM 量化库(如 llm-awqauto-gptq 内集成了 SmoothQuant 逻辑,或直接使用 smoothquant 开源实现)。
  2. 准备校准数据:随机抽取约 100‑1000 个 token 的文本(Wiki 或代码文本均可)。
  3. 计算平滑因子:运行校准脚本,将激活和权重的极值收集,生成每层 s
  4. 融合并量化模型:将 s 吸收进权重和 LayerNorm,随后执行标准 INT8 量化。
  5. 测试精度:在验证集上评估困惑度或任务准确性,确认无损。

无需改动模型架构,无需额外训练,即可获得 W8A8 量化的全部加速收益。


SmoothQuant 与其他量化方案对比

方法 量化精度 是否需要训练 处理异常值方式 硬件友好度
Naïve W8A8 严重降级 直接量化,异常值干扰
LLM.int8() 无损 混合精度分解 低(需自定义kernel)
SmoothQuant 近乎无损 平滑迁移到权重
GPTQ 仅权重量化 逐层权重量化
AWQ 仅权重量化 缩放权重要通道

SmoothQuant 是当前唯一同时实现激活和权重均 INT8 量化、无需训练且近乎无损的方案,兼具精度与广泛硬件支持。


总结

SmoothQuant 通过一个简洁且优雅的数学变换,将 LLM 量化中最棘手的激活异常值问题转换为可实现无损 INT8 推理的“可迁移难度”。该方法零训练、低成本、易部署,让 W8A8 量化在千亿参数大模型上落地成为可能。对于任何试图加速 LLM 推理的工程师和研究者来说,SmoothQuant 是工具箱中必知必会的核心技术。

立即尝试将 SmoothQuant 集成到你的模型流水线中,以近乎零精度损失的代价换取高达 2 倍的吞吐提升和 50% 的显存节省。