想象一个搬运队要过一座只能承重100斤的独木桥。队伍里有10个工人,其中9个人体重都在90斤左右,但有1个工人体重高达200斤。为了过桥,队长想了个办法:让最重的那个工人把身上的重物分给其他9个人背着,这样每个人都能安全通过。这个聪明的队长做的工作,就叫“平滑”——把异常沉重的负担分摊到大家身上,让整个队伍变得均衡。 大模型也面临类似的困境。在把模型从FP16精度压缩到INT8时,模型中总有一些“特别重”的激活值(好比那个200斤的工人),它们的存在让整个压缩过程变得极其困难。SmoothQuant技术的核心智慧,正是把激活值中这些“异常点”通过数学变换,巧妙迁移到权重参数上,让整个模型变得“均衡可压缩”。这项技术能让70B级别的大模型在保持精度的同时,推理速度提升数倍,显存占用降低一半以上。

岗位关联

掌握SmoothQuant,你就掌握了当前大模型工业级部署的核心压舱石,这直接关系到大模型产品能否以可接受的成本真正落地商用。

目录
  1. 可视化演示
  2. 量化技术背景
  3. 平滑量化原理
  4. 缩放因子推导
  5. 与AWQ对比
  6. 与GPTQ对比
  7. 综合对比分析
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

本节配有交互动效(进入视口后自动加载,约 3KB)。

量化技术背景

搬运队要过桥,首先得知道队伍里每个人的体重。同样地,要让大模型“瘦身”过部署这座“窄桥”,我们得先理解模型为什么这么“重”。一个700亿参数的模型,以FP16精度存储时,光是权重就需要约140GB的显存——这就像10个200斤的壮汉要过一座承重有限的桥,显然不现实。所以工程师们想到了INT8量化:把每个参数从16位压缩到8位,显存直接减半,推理速度还能提升2-4倍。

但问题来了。模型中有两类数据在“拖后腿”:权重参数(weight)和激活值(activation)。权重参数的数值分布通常比较均匀,好比每个人的基础体重差不多;可激活值的分布却不均衡,某些维度上会出现巨大的异常峰值——就像队伍里突然混进一个体重500斤的“巨无霸”。

这种异常峰值对INT8量化是致命的。量化过程可以理解为给每个数值找“刻度”,比如把-127到127分成256个刻度。如果有一个数值是200,其他都是10左右,那么刻度就得拉到200的范围,导致10左右的数值只能落在相邻的几个刻度上,精度损失惨重。这正是SmoothQuant要解决的核心痛点:让激活值的分布变得像权重一样均匀,从而让INT8量化真正落地。

平滑量化原理

回到搬运队的比喻。面对那个500斤的“巨无霸”,队长怎么解决?他不是让所有人强行上桥,也不是把巨无霸扔下——而是让巨无霸把身上的重物分摊给其他9个人。这样一来,巨无霸变轻了,其他人虽然变重了些,但所有人的体重都落在了一个合理的区间内。

SmoothQuant的数学原理与此如出一辙。它不修改模型输出的计算结果,而是对权重和激活值做一个“联合变换”:把激活值中异常大的数值“缩小”一些,同时把权重中对应的数值“放大”相同的倍数。整个过程用一个缩放因子s来实现。

这个变换的精妙之处在于数学上的等价性。假设原始计算是Y = X·W(X是激活值,W是权重),我们引入一个缩放因子s,令X' = X·s(激活值缩小s倍),W' = W/s(权重放大s倍),那么:

Y=(X×s)×(W/s)=X′×W′Y = (X \times s) \times (W / s) = X' \times W'

也就是说,变换前后的数学结果完全一致。但在数值分布上,激活值中的异常峰值被“削平”了,权重虽然有所增大,但权重的分布本来就均匀,稍微增大并不会影响量化效果。这就像队伍里的每个人虽然体重变了,但总重量没变,过桥的安全性却大大提升了。

1. 原始计算:激活值X乘以权重W得到输出Y,这是神经网络的线性层运算。

Y=X×WY = X \times W

2. 引入缩放因子:在X和W之间插入一个缩放因子s及其倒数,数学上等价于乘以1,不会改变结果。

Y=X×s×W/sY = X \times s \times W / s

3. 重新组合:把s和X结合得到新的激活值X',把W除以s得到新的权重W',变换后计算形式保持不变。

Y=X′×W′Y = X' \times W'

这个等价变换的意义在于:激活值的异常峰值被s削弱了,而权重虽然被放大,但权重的均匀分布使其对量化并不敏感。就像一个团队里把重物从体弱的人身上转移到体强的人身上,整体效率反而更高。

缩放因子推导

现在问题来了:s应该取多大?如果s太大,激活值被压得太狠,虽然量化容易了,但权重被放大后也可能超出INT8的表示范围;如果s太小,激活值的异常峰值依然存在,量化误差依然很大。这就像队长在分派重物时,既不能让巨无霸完全卸掉所有负担(那别人也扛不住),也不能只让他卸下一小块(那他还是过不了桥)。

SmoothQuant提出了一个基于通道统计信息的自适应方案。对于模型的每一层,我们统计激活值每个通道的绝对最大值(记为α),以及权重每个通道的绝对最大值(记为β)。然后,缩放因子s定义为:

s=α/βs = \sqrt{\alpha / \beta}

这个公式的精妙之处在于:如果某个通道的激活值异常大(α很大),那么s也相应变大,激活值被削弱得更多;如果权重较大(β很大),s变小,权重受到的放大影响更小。采用平方根的形式,是为了在两者之间取得平衡,让变换后的激活值和权重都处于相似的数量级。

1. 统计通道最大值:对激活值矩阵X的每个通道(维度)计算绝对值的最大值α,对权重矩阵W的每个输出通道也计算绝对值的最大值β。α反映激活值的峰值强度,β反映权重的量级。

α=max⁡(∣Xchannel∣),β=max⁡(∣Woutput_channel∣)\alpha = \max(|X_{channel}|), \quad \beta = \max(|W_{output\_channel}|)

2. 计算通道比例:将每个通道的α与对应的β相除,得到该通道的不均衡程度。比例越大,说明该通道激活值的异常越严重,需要更强的平滑处理。

ratio=α/βratio = \alpha / \beta

3. 开方取缩放因子:对比例取平方根得到缩放因子s。平方根操作是一种“折中”策略——既不把问题完全推给权重,也不让激活值保留太多异常。

s=ratio=α/βs = \sqrt{ratio} = \sqrt{\alpha / \beta}

这样,不同的通道会有不同的s值,有的通道被平滑得多一些,有的少一些。正如每个工人分摊的重物量不同,但最终大家都处在一个能安全过桥的体重范围内。此外,SmoothQuant还引入了一个超参数来控制迁移强度,让使用者可以根据精度要求灵活调节平滑的程度。

与AWQ对比

搬运队解决过桥问题,不只一种方案。有一位叫AWQ(激活感知权重量化)的队长提出了另一种思路:他不让所有人平均分摊重物,而是先调查谁是队伍里最能干、最不能出错的“关键工人”——比如负责扛珍贵物资的几位。

AWQ的核心思想是:激活值在不同通道上的重要性不同,有些通道的激活值虽然存在异常峰值,但它们是模型推理的关键信息通道,如果直接平滑掉,反而会损伤模型精度。因此,AWQ选择保护这些重要通道,让它们保持高精度(不量化或用更高精度),同时对不重要的通道进行激进量化。

这与SmoothQuant形成了鲜明对比。SmoothQuant是“一视同仁”地平滑所有通道的激活峰值,让整体分布变均衡;AWQ则是“重点保护”重要通道,牺牲次要通道的精度来换取整体效果的优良。一个像“平均主义”的队长,一个像“精英主义”的队长。

在实际应用中,两种方法并不是对立的。SmoothQuant通过数学变换改变了激活值的分布,AWQ则通过通道感知的方式决定保护策略。事实上,你可以先用SmoothQuant把激活值的峰值平滑掉,再用AWQ的思路对某些关键通道给予额外保护,两者珠联璧合。这也是当前主流量化方案中,很多工作将SmoothQuant与AWQ结合使用的原因——先用平滑让分布变均匀,再按重要性差异化分配精度资源。

与GPTQ对比

队伍里还有第三位“队长”叫GPTQ。前两位队长都在想“怎么调整人的体重分布”,GPTQ的思路却是:“与其调体重,不如选一条更稳的桥走过去”。

GPTQ(GPT Quantization)是一种基于误差补偿的量化方法。它的核心思路是:在量化权重的过程中,不是简单地四舍五入到最近的INT8刻度,而是逐层地最小化量化误差——量化这一层的权重后,计算一下带来的输出误差,然后通过调整剩余未量化的权重来补偿这个误差。让每一层的误差尽可能小,然后逐层传导下去。

打个比方,普通量化就像让10个人依次过桥,每个人过桥时都发出“咯吱”一声响;GPTQ则像一个精细的指挥官,让每个人过桥时都微调自己的步伐来抵消前面人留下的震动。这样做的好处是精度损失极小,尤其在低比特(如3bit、4bit)量化场景下,GPTQ表现非常出色。

但GPTQ的代价是计算开销大。它需要在实际量化过程中反复计算误差和调整权重,这个过程需要大量的计算资源和时间。相比之下,SmoothQuant只需要统计数据分布、计算缩放因子、应用变换,整个过程在几分钟内就能完成,完全不需要重训练或反复迭代。

所以,两种方法的适用场景也不同:如果你追求极致的低比特量化(比如4bit)且算力充足,GPTQ是更好的选择;如果你需要快速把FP16模型转为INT8部署,且希望最小化部署成本,SmoothQuant则是更高效的方案。

综合对比分析

现在,搬运队有了三位风格各异的队长:SmoothQuant(平滑派)、AWQ(保护派)、GPTQ(补偿派)。在实际项目中,我们应该选择哪位队长?

这取决于过桥的具体情况。如果桥的承重限制不算太苛刻(目标精度是INT8),SmoothQuant是首选——它速度快、无需重训练、实现简单,是当前大模型INT8部署的主流方案。如果队伍中有特别重要的“关键工人”(部分通道对精度影响极大),可以结合AWQ做通道保护。如果过桥条件极其苛刻(需要4bit甚至更低精度),则需要GPTQ这种精细的误差补偿策略。

一个典型的工程实践是组合使用:先用SmoothQuant对激活值做平滑处理,让分布变得均匀;再用AWQ识别并保护关键通道;最后用GPTQ对权重做逐层误差优化。三者各司其职,把激活值的异常、通道的重要性差异、权重量化的误差三个问题分别解决。

从部署效果来看,SmoothQuant能让大模型的显存占用降低约50%,推理吞吐量提升1.5-3倍,而精度损失控制在1%以内。这意味着原本需要8张A100才能跑起来的70B模型,现在4张就能搞定——对众多AI创业公司来说,这意味着部署成本直接减半,让大模型真正从“实验室玩具”变成了“可商用产品”。

AI 应用场景

云端大模型推理服务部署

阶段:模型部署与推理优化

解决的问题:传统FP16格式部署700亿参数大模型需要约140GB显存,单张A100(80GB)无法承载,必须使用多卡并行,导致推理服务成本极高。SmoothQuant将模型量化为INT8后,显存需求降至70GB左右,单卡即可部署,推理延迟降低约50%。

具体案例:一家AI医疗公司需要在云端部署一个用于病历分析的LLM,原本需要4张A100显卡支撑,月成本超10万元。使用SmoothQuant量化后,仅需2张A100,成本直接减半,同时推理速度从每秒8次提升到20次,患者等待时间从3秒缩短到1.2秒。量化过程只用了不到30分钟,且无需重新训练模型。

边缘设备端侧大模型部署

阶段:模型压缩与端侧适配

解决的问题:手机、智能音箱等边缘设备的显存和算力有限,无法直接运行FP16大模型。SmoothQuant的数学等价变换保证了量化精度,使得70亿参数模型在8GB内存的设备上也能流畅运行,解决了隐私敏感场景(如医疗问诊、金融风控)中数据无法上云的痛点。

具体案例:某银行希望在本地部署一个智能客服大模型,客户对话数据不能离开银行内网。工程师使用SmoothQuant将模型从FP16转为INT8,部署在银行的GPU服务器上。量化后模型体积从14GB缩减到7GB,推理速度提升2.8倍,客户咨询平均响应时间从5秒降至1.8秒,同时数据全程在内部网络流转,满足合规要求。

Python 演示

python61 行
import numpy as np def smooth_quant(activations, weights, alpha=0.5):    """    SmoothQuant平滑量化核心实现    activations: 激活值矩阵,形状 [num_channels, seq_len]    weights: 权重矩阵,形状 [num_channels, output_dim]    alpha: 平滑强度系数,0-1之间    """    # 1. 计算激活值每个通道的绝对最大值    act_max = np.max(np.abs(activations), axis=1)    # 2. 计算权重每个通道的绝对最大值    weight_max = np.max(np.abs(weights), axis=1)    # 3. 计算缩放因子 s = (act_max^alpha) / (weight_max^(1-alpha))    s = np.power(act_max, alpha) / np.power(weight_max, 1 - alpha)    # 4. 将s扩展为对角矩阵方便矩阵乘法    s_diag = np.diag(s)    # 5. 计算平滑后的激活值和权重    new_acts = np.matmul(np.linalg.inv(s_diag), activations)    new_weights = np.matmul(s_diag, weights)    return new_acts, new_weights, s def quantize_int8(matrix):    """将浮点矩阵量化为INT8(简化版:对称量化)"""    # 计算缩放因子:矩阵最大绝对值 / 127    scale = np.max(np.abs(matrix)) / 127.0    # 四舍五入并裁剪到[-127, 127]范围    quantized = np.round(matrix / scale)    quantized = np.clip(quantized, -127, 127).astype(np.int8)    return quantized, scale def main():    # 设置随机种子保证可复现    np.random.seed(42)    # 模拟激活值:一个通道有异常峰值(200)    acts = np.random.normal(3, 1, size=(4, 8))    acts[2, 3] = 200  # 制造异常峰值    # 模拟权重:相对均匀    weights = np.random.normal(1, 0.3, size=(4, 4))     # 原始激活值的最大值    orig_max = np.max(np.abs(acts))    print(f"原始激活值最大值: {orig_max:.2f}")     # 应用SmoothQuant    smooth_acts, smooth_weights, s = smooth_quant(acts, weights)    print(f"平滑后激活值最大值: {np.max(np.abs(smooth_acts)):.2f}")    print(f"缩放因子 s: {[f'{x:.3f}' for x in s]}")     # 量化误差对比    q_orig, _ = quantize_int8(acts)    q_smooth, _ = quantize_int8(smooth_acts)     # 计算反量化后的误差    orig_mse = np.mean((acts - q_orig.astype(np.float32) * np.max(np.abs(acts)) / 127.0) ** 2)    smooth_mse = np.mean((smooth_acts - q_smooth.astype(np.float32) * np.max(np.abs(smooth_acts)) / 127.0) ** 2)    print(f"直接量化MSE误差: {orig_mse:.4f}")    print(f"SmoothQuant后MSE误差: {smooth_mse:.4f}") if __name__ == "__main__":    main()
目的:演示SmoothQuant的核心流程——计算通道级缩放因子s,将激活值的异常峰值平滑迁移到权重上,并对比平滑前后INT8量化的误差。
  1. act_max = np.max(np.abs(activations), axis=1)统计每个通道激活值的峰值强度,找出“最重的工人”
  2. s = np.power(act_max, alpha) / np.power(weight_max, 1 - alpha)计算平滑因子,让峰值越大的通道被平滑得越多
  3. new_acts = np.matmul(np.linalg.inv(s_diag), activations)用s的逆矩阵缩小激活值的峰值
  4. new_weights = np.matmul(s_diag, weights)用s放大权重,数学上保证输出结果等价
  5. quantized = np.round(matrix / scale)将浮点数映射到最近的INT8刻度上
  6. orig_mse = np.mean(...)计算直接量化的误差,作为对照组
  7. smooth_mse = np.mean(...)计算平滑后量化的误差,直观展示平滑效果

常见误区

误区SmoothQuant要对权重和激活值做变换,这应该需要重新训练或者微调一下模型才能保证精度吧?反正我看到要改权重就觉得要训练。

正解SmoothQuant是训练后量化(PTQ)技术,完全不需要重新训练。它利用了数学等价变换:Y = (X×s)×(W/s),变换前后的计算结果在数学上完全一致。它只改变权重和激活值的分布形态,不改变模型的语义。整个过程只需要一部分校准数据来统计激活值的分布特征,几分钟就能完成,这与量化感知训练(QAT)有本质区别。

为何常见:很多人习惯了“改模型参数就要训练”的思维定式,忽略了数学等价变换这一精妙之处。看到代码中new_weights = s_diag @ weights就误以为是修改了模型,实际上这个修改是数学上严格保价的。

误区既然激活值有异常峰值是坏事,那把s调到最大,把激活值压得越狠,量化效果不就越好吗?那我直接把所有激活值都压到很小区间不就行了?

正解s过大会导致权重被过度放大。虽然权重的分布相对均匀,但放大到一定程度后,权重也会超出INT8的表示范围,导致权重量化误差增大。SmoothQuant的公式s = (α^a)/(β^(1-a))是一个平衡设计,它的目标是让平滑后的激活值和权重具有相近的“敏感度”——双方都处于INT8能够良好表示的范围。过度压激活值,实际上是拆东墙补西墙,最终总误差反而可能增大。

为何常见:人容易犯“头痛医头”的思维错误:看到了激活值的问题就只盯着它,忽略了平滑操作对权重的副作用。实际上SmoothQuant是一个联合优化问题,需要在激活值和权重之间找到最佳平衡点。

误区SmoothQuant是给70B、175B这种超大模型用的,我们做的小模型或者CV模型用不上这个技术。

正解SmoothQuant解决的是“激活值存在异常峰值导致量化困难”这一普遍问题。这种异常峰值在Transformer架构的大模型中尤为明显(因为LayerNorm之后激活值在某些通道上持续出现大数值),但在其他模型(如BERT、ViT)中同样存在类似现象。任何在量化时遇到激活值分布不均问题的模型,都可以尝试SmoothQuant。只不过在大模型上收益最显著,因为大模型的显存压力和部署成本压力最大。

为何常见:技术文章通常以大模型作为案例展示效果,读者容易把技术本身和它展示的场景绑定。实际上平滑量化的核心思想——将难以量化的异常值转移到容易量化的参数上——是一个通用方法论,与模型规模无关。

误区AWQ说保护重要通道,SmoothQuant说平滑所有通道,这两个思路是冲突的,项目中只能选一个用。

正解两者解决的是不同粒度的问题。SmoothQuant在“数值分布”层面解决问题——让激活值分布变均衡;AWQ在“通道重要性”层面解决问题——让重要通道获得更多精度资源。它们是完全正交(互补)的技术,实际上可以组合使用:先做SmoothQuant的平滑变换,再做AWQ的通道保护量化,甚至再加入GPTQ做误差补偿——也就是当前主流的量化组合拳。很多SOTA量化工作正是这样做的。

为何常见:技术文章为了对比清晰,往往会把不同方法放在对立面进行讨论,读者容易把“对比分析”误解为“非此即彼”的竞争关系。实际上,不同量化方法解决的是量化问题链条上的不同环节,它们之间的互补关系远远大于竞争关系。

误区从FP16变成INT8,表示精度从16位降到8位,精度损失肯定很大吧?量化模型在业务上不敢用。

正解对于大模型而言,SmoothQuant配合适当的校准,INT8量化的精度损失通常可以控制在1%以内。原因有两方面:第一,大模型的参数量巨大,具有很高的冗余度,个别参数的量化误差对整体输出的影响微乎其微;第二,SmoothQuant的数学等价变换保证了激活值分布不改变模型语义,量化误差被限制在很小的范围内。在许多任务上(如文本生成、代码补全),INT8量化模型与FP16模型的输出质量几乎没有可感知的差异。

为何常见:人们习惯性地认为“精度降低=质量下降”,忽略了量化误差与模型冗余度之间的关系。模型越大、冗余度越高,对量化误差的容忍度也越高。这就像一本厚厚的字典里印错几个字母不影响阅读,但如果是一张便条纸,印错一个字母可能就会引起误解。

面试题

Q1. SmoothQuant中“平滑”指的是什么操作?

单选题 · mid

  • A.对模型参数做平均池化
  • B.将激活值的异常峰值迁移到权重上← 正确答案
  • C.对梯度做平滑处理
  • D.降低模型的参数量

答案:B。SmoothQuant的核心思想是引入缩放因子s,将激活值中异常大的数值缩小,同时将权重放大相同倍数,实现数学等价变换。这就像把500斤重物从一人身上分摊到多人身上。“平均池化”是特征处理操作,与量化无关;“梯度平滑”是优化技巧;“降低参数量”是模型剪枝或蒸馏的目标。

Q2. SmoothQuant的数学基础是以下哪个等式?

单选题 · mid

  • A.Y = X × W + b
  • B.Y = (X × s) × (W / s)← 正确答案
  • C.Y = (X + s) × (W - s)
  • D.Y = min(X, W) × s

答案:B。SmoothQuant利用了乘法的结合律性质,在X和W之间插入s及其倒数s/s=1,所以Y = X × W = (X × s) × (W / s)。这保证了变换前后的输出在数学上完全一致。其他选项要么引入了额外的偏置项(A),要么改变运算性质(C、D),破坏了等价性。

Q3. 缩放因子s的计算公式是什么?

单选题 · mid

  • A.s = α + β
  • B.s = max(α, β)
  • C.s = α × β
  • D.s = √(α/β)← 正确答案

答案:D。SmoothQuant的缩放因子采用s = √(α/β),其中α是激活值通道的最大绝对值,β是权重通道的最大绝对值。平方根操作是为了在激活值和权重之间取得折中平衡,避免激活值被压得太狠或权重被放得太大。加法、取最大值、乘法都无法实现这种平衡。

Q4. 与SmoothQuant相比,AWQ的核心特点是什么?

单选题 · mid

  • A.对所有通道一视同仁地平滑
  • B.保护激活值重要通道的精度← 正确答案
  • C.按层逐步量化权重参数
  • D.直接在训练时加入量化噪声

答案:B。AWQ是激活感知量化,核心在于识别激活值中重要的通道并加以保护,让这些通道保持更高精度(或不被量化),而次要通道进行更激进的量化。这与SmoothQuant的“全局平滑”策略形成互补。C选项是GPTQ的做法;D选项是量化感知训练(QAT)的做法。

Q5. GPTQ与传统量化(直接四舍五入到最近刻度)的关键区别是什么?

单选题 · easy

  • A.GPTQ使用更小的量化刻度
  • B.GPTQ逐层量化并补偿由量化产生的误差← 正确答案
  • C.GPTQ直接训练模型适应低精度
  • D.GPTQ可以跳过量化过程

答案:B。GPTQ在量化每一层权重后,会计算该层量化带来的输出误差,然后调整该层中尚未量化的权重来补偿这个误差,这是一种逐层贪心加误差补偿的策略。它并没有用更小的刻度(A),也不涉及训练过程(C),更不会跳过量化(D)。

Q6. 以下哪些场景适合使用SmoothQuant?

多选题 · hard

  • A.需要将70B模型部署到单张A100上← 正确答案
  • B.想通过INT8量化将推理速度提升2倍以上← 正确答案
  • C.训练时发现梯度爆炸需要处理
  • D.模型激活值分布存在明显通道级异常峰值← 正确答案

答案:ABD。SmoothQuant适合需要降低显存占用(A)、提升推理速度(B)的大模型部署场景,其前提是激活值存在通道级异常峰值(D),这正是它要解决的问题。C选项的梯度爆炸是训练阶段的问题,SmoothQuant是训练后量化方法,不涉及训练优化。

Q7. SmoothQuant、AWQ、GPTQ三种技术的关系,以下描述最准确的是?

单选题 · mid

  • A.三者是同一思路的不同实现
  • B.三者互相矛盾,项目中只能选其一
  • C.三者解决问题不同层面,可组合使用← 正确答案
  • D.三者都需要重新训练模型

答案:C。SmoothQuant解决激活值分布不均问题,AWQ解决通道重要性差异问题,GPTQ解决权重量化误差补偿问题。三者解决的是量化流程中不同环节的挑战,因此在工程实践中可以组合使用,达到更好的整体量化效果。例如常用方案是SmoothQuant+AWQ组合,先平滑再保护。

Q8. SmoothQuant量化后,模型的什么指标通常几乎不变?

单选题 · easy

  • A.参数量
  • B.各层输出的数学结果← 正确答案
  • C.训练所需数据量
  • D.模型架构结构代码

答案:B。由于SmoothQuant使用数学等价变换Y = (X×s)×(W/s),变换前后的每层输出在数学上完全一致。这使得后续的量化误差仅来自于INT8表示的精度限制,而非变换本身。因此模型各层输出结果在变换前后保持一致,这是SmoothQuant无需重训练就能保持精度的根本原因。

Q9. 关于SmoothQuant的缩放因子推导,以下说法正确的有哪些?

多选题 · mid

  • A.α是激活值通道的绝对最大值← 正确答案
  • B.β是权重通道的绝对最大值← 正确答案
  • C.平方根是为了在激活和权重间取得平衡← 正确答案
  • D.s值对所有通道都相同

答案:ABC。缩放因子是逐通道计算的,每个通道根据自身的α和β得到不同的s值(D错误)。α和β分别是激活和权重在该通道的最大绝对值(A、B正确),s = √(α/β)采用平方根是在两者之间做折中平衡(C正确),使得激活值不会被过度压缩,权重也不会被过度放大。

Q10. 使用SmoothQuant对70B模型做INT8量化,预期的显存节省约为多少?

单选题 · mid

  • A.10%-20%
  • B.100%(完全不用显存)
  • C.约50%← 正确答案
  • D.几乎不节省

答案:C。INT8相比FP16每个参数从2字节减为1字节,因此模型权重的显存占用直接减半。对于70B模型,FP16需要约140GB,INT8仅需约70GB,节省约50%。这正是SmoothQuant能将70B模型部署到单张A100(80GB)的基础。100%的节省不现实,10%-20%明显低估了INT8的压缩效果。