04. 量化为什么能提升部署效率?它的主要代价是什么?
整理量化提升部署效率的原理与主要代价。
简单回答
量化是把模型参数从高精度(FP16/BF16,每个参数 2 字节)压缩到低精度(INT8 1 字节、INT4 0.5 字节),直接减少模型大小、降低显存占用、加速推理(因为 Decode 阶段是访存瓶颈,参数小了读取更快)。主要代价是精度损失——低精度表示的数值范围和精度都不如高精度,可能导致模型效果下降。程度取决于量化方法和模型大小,7B 以上的模型做 INT8 量化通常效果损失很小,INT4 需要更精细的量化方法。
详细解释
量化为什么有效
回到 Prefill-Decode 的分析:Decode 阶段的瓶颈是显存带宽。每生成一个 token,需要从显存读取全部模型参数。如果参数从 FP16(2 字节)量化到 INT8(1 字节),读取的数据量直接减半,理论上 Decode 速度可以翻倍。INT4(0.5 字节)更是减少到四分之一。
除了速度提升,量化还有两个实际好处。显存占用减少——7B 的 FP16 模型需要约 14GB 显存,INT4 量化后只需要约 3.5GB,一张消费级 GPU(如 RTX 4090 24GB)就能跑。更大的 batch——显存省出来的空间可以用来放更多请求的 KV Cache,支持更大的并发量。
量化的基本原理
最简单的量化是均匀量化(Uniform Quantization)。把 FP16 的参数值映射到一个有限的整数范围。以 INT8 为例:
是缩放因子(scale), 是零点(zero point)。反量化时:。
量化的误差来自 round 操作——FP16 可以表示的数值是连续的,INT8 只有 256 个离散值,很多值在量化时会被"就近舍入",产生误差。
PTQ vs QAT
PTQ(Post-Training Quantization,训练后量化)是在模型训练完成后直接量化,不需要重新训练。优点是简单快速,缺点是精度损失可能较大,特别是低比特量化(INT4 以下)。GPTQ、AWQ、SmoothQuant 等都属于 PTQ 方法,但它们用了更精巧的技巧来减少量化误差。
QAT(Quantization-Aware Training,量化感知训练)是在训练过程中模拟量化操作,让模型学会在低精度下工作。精度损失更小,但需要额外的训练开销(可能需要几百到几千步微调)。对于部署量非常大、对精度要求高的场景值得投入。
量化的代价
精度损失是最核心的代价。模型越小,量化对效果的影响越大——7B 模型做 INT8 通常几乎无损,做 INT4 效果损失在 1~3%;1B 的小模型做 INT4 效果可能明显下降。这个规律是因为大模型的参数冗余度更高,"容错空间"更大。
不是所有层对量化同样敏感。Attention 的 QKV 投影矩阵和输出投影矩阵通常比 FFN 更敏感。一些量化方法(如 AWQ)会自动识别"重要通道"并保持更高精度。
量化后的模型在某些任务上可能出现异常行为——比如在 few-shot 场景下突然变差、在长文本生成时质量下降。这些问题不一定在常规 benchmark 上能检测到,需要在业务场景中做充分测试。
低比特量化(INT4 及以下)需要特殊的计算内核支持。不是所有硬件和框架都能高效执行 INT4 矩阵运算。比如 INT4 的矩阵乘需要专门的 CUDA kernel,如果用不了高效 kernel,量化带来的理论速度提升可能打折扣。
面试时可以这样答
量化之所以能提升部署效率,核心原因是 Decode 阶段是访存瓶颈。参数从 FP16 压到 INT8,读取数据量减半,理论上速度翻倍。同时显存占用也减少,可以跑更大 batch 或在更小的 GPU 上部署。
主要代价是精度损失。模型越大越耐量化——7B 做 INT8 几乎无损,做 INT4 损失 1~3%。小模型量化敏感度更高。不同层对量化的敏感度也不同,现代量化方法如 AWQ 会自动识别重要通道做差异化处理。
实际部署中我一般的策略是先试 INT8,基本都没问题。如果显存还是不够或者要追求更高吞吐,再试 INT4 的 GPTQ 或 AWQ,但一定要在业务场景上做效果评测,不能只看通用 benchmark。有些量化导致的问题很隐蔽,可能只在特定任务或长文本场景下才暴露。
常见追问
- PTQ 和 QAT 分别适合什么场景?
- 量化能和 LoRA 结合吗?QLoRA 是怎么做的?
- 为什么 Attention 层比 FFN 层对量化更敏感?