你想象过这样的场景吗?搬家时,衣柜里几十件厚羽绒服占满了三个巨大的收纳箱,货车跑一趟都装不下。有经验的搬家师傅会拿出真空压缩袋,把羽绒服压成一块块薄饼,原本三个箱子装下的东西,一个箱子就够了——虽然衣服有点皱,但到了新家抖一抖、挂一挂,照样暖和。 大模型推理加速里的 INT8 量化,做的就是这件事。大模型工作时,大脑里存着的“记忆”(权重)默认用 FP32 格式记录——每个数字都用 4 字节的“大箱子”单独装。而 INT8 量化,就是把这些记忆从 4 字节的箱子压缩进 1 字节的压缩袋,让同样的显存装下 4 倍的内容,让 GPU 在同样时间内处理更多请求。代价是“衣服皱了一点”——精度有轻微损失,但换来的却是推理速度的大幅提升和成本的直线下降。 这个过程的关键,在于找到正确的“压缩比例”(scale)和“袋子拉链的位置”(zero point),还要用“旧衣服样本”(校准数据集)试压一次,确保压缩方案稳妥。接下来,我们就跟着搬家师傅,一步步拆解 INT8 量化的全部秘密。

岗位关联

对 AI 从业者而言,INT8 量化是部署大模型时必须掌握的看家本领——它直接决定你的模型能否在有限 GPU 上跑得动、跑得快、跑得便宜,是通往工业级推理优化的第一把钥匙。

目录
  1. 可视化演示
  2. 数据格式之争
  3. 尺度与零点
  4. 对称与非对称
  5. 校准数据集
  6. 推理加速秘密
  7. 精度与速度权衡
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示FP32到INT8的量化映射过程、对称与非对称量化策略对比及精度与加速的权衡分析,支持映射、策略、权衡三种模式切换。

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

量化映射:FP32→INT8值映射 连续浮点值→256个离散整数bin Scale和Zero Point决定映射精度 q = round(x / scale) + zero_point 离群值会拉大范围降低正常值量化精度。

数据格式之争

搬家公司仓库里,每个货架都摆着同样的收纳箱——四四方方,占四个格子(FP32,32 位浮点数,占 4 字节)。这种箱子做工精细,能装下任何尺寸的衣物,就连 3.14159265 这种拖着小尾巴的长度也能精确记下。但问题是,一个 1750 亿参数的大模型,拥有 1750 亿个这样的箱子,把整个仓库塞得满满当当,光是搬运就要花掉大量油费和时间。

INT8 量化做的第一件事,就是换上“1 字节小袋”。这种压缩袋只有原来四分之一的空间(8 位整数,只能记录 -128 到 127 的整数),但它能把 32 位浮点数里那些多余的小数尾巴全部压平。原本占 4 个格子的箱子,现在只占 1 个格子——这就是 75% 显存节省的根本来源。

有人会问:数字被压成整数后,3.14 变成 3,1.618 变成 2,信息不是丢了吗?没错,会有损失。但大模型的权重并不需要每个数都精确到小数点后八位——就像羽绒服压扁之后,保暖性能几乎不受影响。关键是要在压缩比例和还原度之间找到平衡点。

换上了压缩袋,仓库瞬间空出四分之三的空间。但光换袋子还不够——你还得知道“多大的衣服用多大力气压”,这正是下一节 scale 和 zero point 要解决的问题。

压缩率=INT8 字节数FP32 字节数=14=25%\text{压缩率} = \frac{\text{INT8 字节数}}{\text{FP32 字节数}} = \frac{1}{4} = 25\%
这个公式说明:从 FP32 换成 INT8,每个权重占用的存储空间只剩原来的四分之一,因此显存占用理论上减少 75%。
  1. INT8 字节数INT8 是 8 位整数,在计算机中固定占用 1 个字节。
    INT8 字节数=1\text{INT8 字节数} = 1
  2. FP32 字节数FP32 是 32 位单精度浮点数,固定占用 4 个字节。
    FP32 字节数=4\text{FP32 字节数} = 4
  3. 计算比值两者相除得到压缩率。
    14=0.25\frac{1}{4} = 0.25

尺度与零点

搬家师傅手里有一件关键工具:一把卷尺。衣服大了就多压一点,衣服小了就少压一点——这把卷尺,就是量化里的 scale(缩放因子)。它的作用,是把 FP32 的连续实数区间“翻译”成 INT8 的整数格子。每一个整数格子占据多宽的现实数值范围,由 scale 决定。

但光有 scale 还不够。想象一个场景:FP32 的数值范围是 [-2.0, 6.0],最左边是负的,最右边是正的。用 INT8 的 [-128, 127] 去对应时,如果直接从 0 开始对齐,浮点数的"0"在整数空间里可能落在第 43 格上——这就是 zero point(零点) 的来历:它表示浮点 0 对应到整数轴上的哪个位置,负责让实数空间的零点和整数空间的零点对齐。

有了 scale 和 zero point,就形成了完整的“打包-拆包”闭环。打包(量化)时,用浮点数值除以 scale 再四舍五入,然后加上 zero point;拆包(反量化)时,把这个过程倒过来。在推理时,矩阵乘法可以全部在整数空间进行——就像打包好的行李在传送带上飞快流转,只有最后需要看结果时才拆开看一眼。

卷尺和拉链位置都确定了,搬家师傅就能给所有衣物统一打包。但下一个问题来了:衣柜里的衣服有的偏大有的偏小,分布不对称,这时该怎么办?

q=round(rscale+zp),r=scale×(q−zp)q = \text{round}\left(\frac{r}{\text{scale}} + zp\right), \quad r = \text{scale} \times (q - zp)
第一个公式把 FP32 实数 r 映射成 INT8 整数 q;第二个公式是逆运算,把整数还原成浮点数。scale 是缩放比例,zp 是零点偏移。
  1. 量化正向映射将实数 r 除以 scale,把连续值压缩到“每格”的大小,然后四舍五入取整。
    q=round(rscale)q = \text{round}\left(\frac{r}{\text{scale}}\right)
  2. 零点对齐加上 zero point(zp),修正浮点 0 与整数 0 的偏移。
    q=round(rscale)+zpq = \text{round}\left(\frac{r}{\text{scale}}\right) + zp
  3. 反量化还原把整数 q 减去 zp,再乘回 scale,恢复为近似的浮点数。
    r≈scale×(q−zp)r \approx \text{scale} \times (q - zp)

对称与非对称

观察一下你家的衣柜:冬天的厚外套挂在左边,夏天的短袖挂在右边,中间的分界线正好是“零”的位置——这就是对称量化(Symmetric Quantization)。对称量化假设数据在正负方向上是均匀分布的,因此把浮点数的刻度对称地映射到 [-127, 127] 的整数区间。它的优点是公式简单、计算快,但缺点是:如果数据实际集中在 [0, 6.0](全是正值),对称映射会浪费一半的整数格子,导致精度下降。

再看另一种情况:你的衣柜里全是厚重的羽绒服,没有一件短袖——浮点数值全部落在正半轴。这时如果还用对称量化,相当于把半个衣柜空着不用,显然很浪费。非对称量化(Asymmetric Quantization) 就是专门应对这种“偏科”分布的:它允许最大值和最小值各自独立确定,不要求以 0 为中点,利用 zero point 来精确对齐。

在实际的大模型部署中,工程师通常对权重使用对称量化(因为训练好的权重通常近似关于 0 对称),而对激活值(每一层的输入输出)使用非对称量化(因为激活经过 ReLU 等激活函数后往往全是正值,范围严重偏斜)。这种“区别对待”就像搬家师傅对不同材质的衣物分类处理:羽绒服真空压缩,西装挂起来防皱。

qasym=round(r−rmin⁡scale),scale=rmax⁡−rmin⁡255q_{\text{asym}} = \text{round}\left(\frac{r - r_{\min}}{\text{scale}}\right), \quad \text{scale} = \frac{r_{\max} - r_{\min}}{255}

对不同材质的衣物采用不同方案后,精度提升立竿见影。但这里有一个隐藏前提:你怎么知道衣柜里只有羽绒服没有短袖?这就需要在打包前“打开柜门看一眼”——校准数据集登场了。

qsym=round(rscale),scale=max⁡(∣rmin⁡∣,∣rmax⁡∣)127q_{\text{sym}} = \text{round}\left(\frac{r}{\text{scale}}\right), \quad \text{scale} = \frac{\max(|r_{\min}|, |r_{\max}|)}{127}
对称量化以 0 为中心映射到 [-127, 127],适合权重;非对称量化用最小值和最大值划定区间,适应任意分布,适合激活值。
  1. 对称量化尺度取浮点数绝对值的最大值,除以 127,得到每个整数格代表的数值宽度。
    scalesym=max⁡(∣rmin⁡∣,∣rmax⁡∣)127\text{scale}_{\text{sym}} = \frac{\max(|r_{\min}|, |r_{\max}|)}{127}
  2. 对称量化映射直接除以 scale 取整,zero point 恒为 0。
    qsym=round(rscale)q_{\text{sym}} = \text{round}\left(\frac{r}{\text{scale}}\right)
  3. 非对称量化尺度用最大值减最小值得到总宽度,除以 255(INT8 全部格子数)。
    scaleasym=rmax⁡−rmin⁡255\text{scale}_{\text{asym}} = \frac{r_{\max} - r_{\min}}{255}
  4. 非对称量化映射减去最小值后再缩放,保证最低值映射到 0。
    qasym=round(r−rmin⁡scale)q_{\text{asym}} = \text{round}\left(\frac{r - r_{\min}}{\text{scale}}\right)

校准数据集

搬家师傅经验再丰富,也必须在动手前打开每一个衣柜,实际看看里面装了什么。如果只看一眼就凭经验决定压缩比例,很可能把丝绸衬衫塞进真空袋压出褶皱。校准数据集(Calibration Dataset) 就是这个“打开衣柜看一眼”的动作——用一小批有代表性的真实输入,让模型“试跑”一遍,记录每一层权重和激活值的真实数值范围。

校准集的选择直接影响量化效果。它不要求像训练集那样庞大——通常几百到几千条样本就足够——但必须有代表性:要覆盖模型在生产中会遇到的各种输入形态。比如一个中文对话模型,校准数据就应该涵盖新闻、问答、闲聊、代码等不同类型的话语。如果只拿代码样本做校准,模型回答日常对话时就会因数值范围估计不准而精度暴跌。

校准的核心流程分三步。第一步,喂入校准数据,让模型正常前向传播,同时记录每层权重的数值分布和激活值的 min/max。第二步,根据记录的分布,用我们前面学的公式计算每层的 scale 和 zero point。第三步,验证——用量化后的模型跑一组测试数据,观察精度损失是否在可接受范围内。如果损失过大,就得调整校准策略,比如换更大的校准集或改用非对称量化。

校准完成,scale 和 zero point 全部确定,所有“衣物”都按规格压好。但这套流程真正神奇的地方在于:它究竟为什么能让推理变快?下一节我们拆开 CPU/GPU 的引擎盖看看。

Δcalib=1N∑i=1N∣∣ri−r^i∣∣ri∣+ϵ∣\Delta_{\text{calib}} = \frac{1}{N}\sum_{i=1}^{N}\left| \frac{|r_i - \hat{r}_i|}{|r_i| + \epsilon} \right|
这个公式表示校准前后的平均相对误差。r_i 是 FP32 时的输出,\hat{r}_i 是量化后的输出,误差越小说明量化方案越成功。
  1. 逐样本误差对每个样本,计算量化前后输出的相对差。
    ∣ri−r^i∣∣ri∣+ϵ\frac{|r_i - \hat{r}_i|}{|r_i| + \epsilon}
  2. 取平均对所有校准样本的误差求和并取平均。
    1N∑i=1N\frac{1}{N}\sum_{i=1}^{N}
  3. 安全系数分母加上一个极小值 \epsilon,防止除零。
    ϵ=10−7\epsilon = 10^{-7}

推理加速秘密

假设你是快递分拣中心的调度员。传送带上原本传送的是巨大的、形状不规则的笨重箱子(FP32),传送速度慢,传送带负载也高。现在所有包裹都换成了规整的真空压缩袋(INT8),尺寸统一、重量减轻,传送带每秒能传的包裹数量翻了数倍——这就是 INT8 量化加速推理的直观画面。

加速的第一个来源是矩阵乘法整数化。大模型推理的核心就是无数次矩阵乘法:Y = WX + b。在 FP32 下,每次乘加都需要浮点运算单元处理;换成 INT8 后,乘加运算全部变成整数运算,而 GPU 的整数运算单元通常比浮点单元更快且吞吐更高,计算密度显著上升。

第二个来源更关键:显存带宽的缩减。大模型推理(尤其自回归生成)的瓶颈往往是“吃不饱”——GPU 计算能力充足,但权重从显存搬运到计算单元的速度跟不上。这个现象叫 memory-bound。权重换成 INT8 后,每个参数需要搬运的数据量从 4 字节降到 1 字节,同样的带宽单位时间能搬 4 倍的权重,内存瓶颈被大幅缓解。

第三个来源是批处理吞吐量的提升。假设一块 GPU 的显存是 40GB,FP32 下只能同时塞进 10 个请求,INT8 量化后同样的显存可以同时塞进约 39 个请求(扣掉其他开销)。推理引擎的吞吐量(每秒处理的请求数)几乎线性提升,单次请求的响应延迟也随之下降。

传送带提速了,吞吐量上去了,但细心的工程师会问:那些被压皱的衬衫怎么办?精度到底掉了多少?这就是我们最后一节要谈的权衡艺术。

理论加速比=FP32 推理时间INT8 推理时间≈带宽降低因子1+反量化开销\text{理论加速比} = \frac{\text{FP32 推理时间}}{\text{INT8 推理时间}} \approx \frac{\text{带宽降低因子}}{1 + \text{反量化开销}}
实际加速比主要由带宽降低(约 4 倍)贡献,但因推理过程中仍需要部分反量化操作,最终通常达到 2-3 倍的整体加速。
  1. 带宽降低因子每个权重从 4 字节降到 1 字节,搬运速度理论上快 4 倍。
    带宽降低因子≈4\text{带宽降低因子} \approx 4
  2. 反量化开销量化推理不是完全不用浮点,部分中间结果需要转回浮点,带来约 30%-50% 的开销。
    反量化开销≈1.3∼1.5\text{反量化开销} \approx 1.3 \sim 1.5
  3. 最终加速比两者相除,得到约 2.7-3 倍的实际加速。
    41.4≈2.86\frac{4}{1.4} \approx 2.86

精度与速度权衡

任何压缩都有代价。把羽绒服压进真空袋,衣服会皱;把 FP32 压成 INT8,数值会失真。工程师的工作不是追求“零损失”——那在物理上不可能——而是确认损失发生在可接受的范围内。

量化误差的来源主要有三处。第一是舍入误差:3.14 变成 3,0.618 变成 1,每个数的精度都从 8 位小数降到了整数位。第二是截断误差:如果数值超出了 scale 定义的范围(比如某个权重是 200,但 scale 把最大范围定为 127),超出的部分被直接“剪掉”。第三是累积误差:单层的误差看似微小,但大模型有几十上百层,误差逐层放大,最终可能影响输出质量。

控制误差的常见策略包括:选择有代表性的校准集(让 scale 更贴合真实分布)、对关键层(如 attention 的输出层)保持 FP32 精度、混合使用不同量化策略、以及在量化后做短期的任务特定微调(PTQ-QAT 混合方案)。业界经验表明,对于大多数任务,INT8 量化后的精度损失可以控制在 1%-3% 以内——相当于羽绒服压完抖一抖就恢复了 95% 的蓬松度。

所以,INT8 量化的本质不是“要不要损失精度”的问题,而是“用多大损失换多少速度”的工程决策。聪明的工程师知道:羽绒服压皱了可以抖开,只要不把衣服撑破——量化同理,控制在可接受范围内的精度损失,换来的是成倍的推理速度与成本节省,这才是大模型规模化落地的核心智慧。

量化后精度≈FP32 精度−O(数值范围scale×27)⋅L\text{量化后精度} \approx \text{FP32 精度} - \mathcal{O}\left(\frac{\text{数值范围}}{\text{scale} \times 2^7}\right) \cdot \sqrt{L}
L 是模型层数,量化误差随层数增加而累积(与 \sqrt{L} 成正比),理解这个关系才能判断量化方案的可靠性。
  1. 单层误差每个格子的宽度除以 127,就是单个数值的最大绝对误差。
    ϵlayer=scale127\epsilon_{\text{layer}} = \frac{\text{scale}}{127}
  2. 范围影响实际误差还取决于数值在格子内的位置,最大不超过半格。
    ϵmax=scale27≈scale128\epsilon_{\text{max}} = \frac{\text{scale}}{2^{7}} \approx \frac{\text{scale}}{128}
  3. 层间累积误差像随机游走一样随层数累计,用均方根逼近。
    ϵtotal≈ϵmax×L\epsilon_{\text{total}} \approx \epsilon_{\text{max}} \times \sqrt{L}

AI 应用场景

用 TensorRT-LLM 部署大模型推理服务

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

解决的问题:大模型权重动辄上百 GB,FP32 部署下单张 A100 只能同时服务个位数用户,GPU 显存和带宽成本极高。INT8 量化让同一块 GPU 服务更多请求,推理成本直接砍半。

具体案例:某 AI 公司需要在一台 8×A100 服务器上部署 70B 参数的对话模型。原始 FP32 权重占 280GB,8 张卡几乎满载还只能支撑 40 并发。用 TensorRT-LLM 对权重做 INT8 量化后,权重压缩至 70GB,同一批 GPU 能支撑 150+ 并发,服务成本下降约 60%。

vLLM 中的 KV Cache 量化提升长对话吞吐

阶段:推理时的显存优化

解决的问题:长对话场景中,缓存的 key/value(KV Cache)占用大量显存,导致 batch size 受限、吞吐量上不去。对 KV Cache 做 INT8 量化,可显著增加可缓存的 token 数。

具体案例:某客服机器人平均每轮对话长度 2000 token,FP32 缓存下 24GB 显存只能支撑 32 路并发;对 KV Cache 做 8 位量化后同样显存支撑 80 路并发,用户等待时间从 3 秒降到 1.2 秒。

边缘设备端侧部署大模型

阶段:端侧模型推理

解决的问题:手机、智能音箱等端侧设备显存和算力极其有限,FP32 模型根本无法运行。INT8 量化是端侧推理的事实标准。

具体案例:某手机厂商在旗舰机型上端侧部署 7B 参数助手模型。FP32 模型体积 28GB,远超手机运存;INT8 量化后仅 7GB,配合 NPU 加速,首次实现了离线实时对话。

Python 演示

python66 行
import numpy as np  def symmetric_quantize(tensor):    """对称 INT8 量化:以 0 为中心映射到 [-127, 127]"""    max_abs = np.max(np.abs(tensor))    scale = max_abs / 127.0    q = np.round(tensor / scale).astype(np.int8)    return q, scale  def asymmetric_quantize(tensor):    """非对称 INT8 量化:用 min/max 划定区间并引入 zero point"""    min_val = np.min(tensor)    max_val = np.max(tensor)    scale = (max_val - min_val) / 255.0    q = np.round((tensor - min_val) / scale).astype(np.int8)    return q, scale, min_val  def fake_dequantize(q, scale, zero=0):    """反量化:把 INT8 整数还原成近似浮点数"""    return (q.astype(np.float32) - zero) * scale  def mse_error(original, reconstructed):    """均方误差:量化前后差异越小越接近原值"""    return np.mean((original - reconstructed) ** 2)  def simulate_int8_inference(weights, activations):    """模拟 INT8 推理:量化 -> 整数矩阵乘法 -> 反量化"""    w_q, w_scale, w_zero = asymmetric_quantize(weights)    a_q, a_scale, a_zero = asymmetric_quantize(activations)    # 整数乘法(符合 INT8 推理加速的本质)    out_q = w_q.astype(np.int32) @ a_q.astype(np.int32)    # 反量化还原到浮点域    out = (out_q - w_zero * a_q.shape[1]) * (w_scale * a_scale)    return out, out_q  if __name__ == "__main__":    np.random.seed(42)    # 模拟一个 3x3 的权重矩阵和 3x5 的输入特征    weights = np.random.randn(3, 3) * 0.5    activations = np.random.randn(3, 5) * 0.8     # FP32 原始输出    fp32_out = weights @ activations     # INT8 量化推理    q_weights, w_scale = symmetric_quantize(weights)    q_act, a_scale, a_min = asymmetric_quantize(activations)     # 整数矩阵乘法(乘加都在 INT8/INT32 域)    int_out = q_weights.astype(np.int32) @ q_act.astype(np.int32)     # 反量化    deq_out = (int_out * w_scale * a_scale)     # 对比精度    mse = mse_error(fp32_out, deq_out)    print("FP32 输出:\n", fp32_out)    print("INT8 反量化输出:\n", deq_out)    print("量化 MSE 误差:", round(mse, 6))    print("INT8 存储占比: {:.1%}".format(1 / 4))
目的:用 NumPy 从零实现对称/非对称 INT8 量化,演示了“量化 → 整数运算 → 反量化”的完整推理链路,直观展示精度损失情况。
  1. symmetric_quantize(tensor)对称量化:计算 max_abs / 127 得到 scale,然后整体除以 scale 取整,适合权重这类关于 0 对称的分布。
  2. asymmetric_quantize(tensor)非对称量化:用 (max - min) / 255 计算 scale,同时保留 min 值作为零点偏移依据。
  3. int_out = q_weights.astype(np.int32) @ q_act.astype(np.int32)核心加速点:矩阵乘法完全在 INT8 → INT32 的整数域完成,避免浮点运算。
  4. deq_out = (int_out * w_scale * a_scale)反量化:将整数结果映射回浮点域,公式来自 r = scale × q。
  5. mse_error评估量化精度损失,数值越小说明压缩方案越好,是工程中判断量化是否可用的关键指标。

常见误区

误区“量化不就是把 3.14 变成 3、把 2.99 变成 2 吗?那精度肯定崩了。” 很多初学者认为量化就是粗暴截断小数,因此极度怀疑其可用性。

正解真正的量化不是简单截断,而是先通过 scale 和 zero point 把整个数值分布“平移 + 缩放”到整数空间。这类似于搬家前先把衣服装进真空袋再抽气,而不是直接把衣服揉成团塞进小盒子。权重分布整体被映射到 [-127, 127] 或 [-128, 127] 的完整范围内,精度损失远小于直接截断。

为何常见:因为“量化”这个词听起来像“四舍五入”,而人们把四舍五入等同于丢精度。实际上,量化是有全局视野的重新标定。

误区“为了保证 scale 算得准,我把所有训练数据都拿去校准,这样总该没问题了吧?” 初学者直觉上认为数据越多越精确。

正解校准不是训练,不需要看全部数据。校准的核心目标是估计数值范围(min/max),几千张有代表性的样本通常已经足够。数据过多反而可能引入极端离群值,让 scale 被拉大,导致正常数值的量化精度下降。过量校准数据还会拖慢部署周期,毫无必要。

为何常见:因为人类习惯了“数据越多模型越准”的训练直觉,但校准是统计分布,不是优化参数,过度采样反而引入噪声。

误区“我学会了对称量化,就直接把所有权重和激活都对称量化了,一劳永逸。” 不少工程师图省事只用一个策略打天下。

正解实际的量化工程必须分层制定策略。权重通常关于 0 对称(适合对称量化),而激活值经过 ReLU 后非负(适合非对称量化);attention 输出层等敏感层可能需要保持 FP32,或者用更高 bit 的量化。优质方案往往是“混合精度量化”。

为何常见:因为教程往往用一个统一公式示例,让人误以为所有层可以共用一套 scale 和 zero point。

误区“量化精度肯定会差,我只能重新训练模型来修复损失,成本太可怕了。” 因此很多人不敢尝试量化。

正解当前主流的 INT8 量化大多采用 训练后量化(PTQ),不需要重训练。只要校准集选得好、量化策略得当,绝大多数模型的精度损失可控制在 1%-3% 内。只有对精度极度敏感或分布极度偏斜的模型,才需要引入量化感知训练(QAT)。工程上应优先尝试 PTQ,成本最低。

为何常见:因为听到“精度损失”就联想到“需要训练补偿”,忽视了 PTQ 这种轻量级方法的有效性。

误区“我把模型改成 INT8,推理速度一定快 4 倍。” 学生看到“存储省 75%”就以为速度也是 4 倍。

正解实际加速取决于模型的瓶颈类型。如果模型是计算密集型的(算力是瓶颈),INT8 的加速来自整数运算效率提升,通常为 1.5-2 倍;如果是显存带宽密集型(大模型推理的常态),加速来自数据搬运量降低,可达 2-3 倍。但若实现得不好(比如频繁反量化),加速比甚至可能不足 1.5 倍。

为何常见:人们把“存储压缩率”直接等同于“计算加速比”,忽略了推理链路中多个环节的额外开销。

面试题

Q1. INT8 量化相比 FP32 每个权重占用的存储空间减少多少?

单选题 · easy

  • A.25%
  • B.50%
  • C.75%← 正确答案
  • D.87.5%

答案:C。FP32 占 4 字节,INT8 占 1 字节,每个权重的存储从 4 字节降到 1 字节,减少 75%。这与“占用的空间只剩四分之一”等价,C 正确。

Q2. 在 INT8 量化中,scale(缩放因子)的作用是什么?

单选题 · easy

  • A.决定浮点数的符号位
  • B.把 FP32 数值范围映射到 INT8 整数范围的比例尺← 正确答案
  • C.压缩模型的层数
  • D.加快训练时的梯度下降

答案:B。scale 相当于搬家时的“压缩比例”,决定了每个整数格子代表多大的实数范围。它负责将连续的 FP32 区间映射到离散的 INT8 整数空间,是量化的核心参数。

Q3. 对称量化与非对称量化的核心区别是什么?

单选题 · easy

  • A.对称量化速度快一倍
  • B.非对称量化需要 zero point,对称量化不需要← 正确答案
  • C.对称量化精度一定更高
  • D.非对称量化只适用于 GPU

答案:B。对称量化以 0 为中心映射,zero point 固定为 0;非对称量化允许最大值与最小值不对等,需要用 zero point 来对齐浮点 0 和整数 0 之间的偏移。因此核心区别在于是否需要 zero point。

Q4. 为什么激活值通常使用非对称量化而权重常用对称量化?

单选题 · mid

  • A.激活值数量远多于权重
  • B.激活值经过 ReLU 后多为正值,分布偏斜,非对称更适配← 正确答案
  • C.权重的存储空间更大
  • D.激活值必须用浮点运算

答案:B。大模型中大量使用 ReLU 等激活函数,输出多为非负值,数值分布明显偏向正半轴。此时若用对称量化会浪费一半整数格子,非对称量化能更精细地利用 INT8 的全部表达范围。而训练好的权重通常近似关于 0 对称,因此适合对称量化。

Q5. 校准数据集(Calibration Dataset)的主要用途是什么?

单选题 · mid

  • A.重新训练模型参数
  • B.统计每层权重和激活值的数值范围以确定 scale 和 zero point← 正确答案
  • C.替代测试集评估最终精度
  • D.扩充训练数据提升模型能力

答案:B。校准集用于“试跑”模型,记录每层中间数据的 min/max 和分布,进而推导出合适的 scale 和 zero point。它不是用来训练或测试模型的,而是为量化参数的确定提供依据。

Q6. INT8 量化加速大模型推理的最主要原因是什么?

单选题 · mid

  • A.减少了显存带宽压力,相同时间能搬运更多权重← 正确答案
  • B.完全消除了浮点运算
  • C.模型参数变少
  • D.GPU 频率自动提高

答案:A。大模型推理通常是 memory-bound,瓶颈在于权重从显存搬运到计算单元。INT8 将每个权重从 4 字节减到 1 字节,单位时间可搬运的权重数量变为 4 倍,这才是加速的核心来源。B 错误——反量化仍需要浮点运算。

Q7. 对于 1750 亿参数模型,FP32 部署需要约 700GB 显存,INT8 量化后约需多少?

单选题 · hard

  • A.175GB← 正确答案
  • B.350GB
  • C.87.5GB
  • D.700GB

答案:A。1750 亿参数 × 1 字节 = 1750 亿字节 ≈ 175GB(用 1B=10^9 计算时约为 175GB;用 2^30 计算则为约 163GiB)。核心是 INT8 每个参数 1 字节,比 FP32 少 4 倍。

Q8. 关于量化误差的来源,下列说法正确的是?

多选题 · mid

  • A.舍入误差:浮点数取整时丢失小数部分← 正确答案
  • B.截断误差:超出 scale 范围的数值被强制裁剪← 正确答案
  • C.累积误差:多层量化误差叠加放大← 正确答案
  • D.训练误差:模型在训练集上过拟合

答案:ABC。A、B、C 都是量化误差的典型来源。D 是训练阶段的概念,与量化误差无关。量化误差的本质是“压缩过程的信息丢失”,类比真空袋压衣服的皱痕,多层堆叠后褶皱更明显。

Q9. 下列哪些策略可以帮助控制 INT8 量化的精度损失?

多选题 · hard

  • A.使用有代表性的校准数据集← 正确答案
  • B.对敏感层(如 attention 输出层)保持 FP32← 正确答案
  • C.混合使用对称与非对称量化策略← 正确答案
  • D.将校准集扩大到全量训练数据

答案:ABC。A 保证 scale 贴合真实分布;B 对关键层不做量化,避免误差累积;C 根据不同层的分布特性选择最优方案。D 错误:校准数据过多反而可能引入离群值,导致 scale 失真,并不一定提升效果。

Q10. 关于 INT8 量化推理,下列说法正确的是?

多选题 · hard

  • A.矩阵乘法主要在整数域完成,但结果可能需要反量化← 正确答案
  • B.实际加速比通常为 2-3 倍而非 4 倍← 正确答案
  • C.权重和激活值可以使用不同的 scale← 正确答案
  • D.量化后模型无需任何校准即可直接部署

答案:ABC。A 正确:核心运算用 INT8/INT32 整数乘法,最终输出需反量化回浮点。B 正确:因反量化开销和部分层保持 FP32,实际加速达不到理论 4 倍。C 正确:权重和激活的数值分布不同,scale 独立计算。D 错误:量化必须经过校准确定 scale 和 zero point,不能跳过。