难度
进阶
从为什么要量化讲起,系统理解低比特表示、后训练量化与主流 4-bit 方法在大模型部署中的权衡。
难度
进阶
阅读时长
约 115 分钟
更新日期
2026/03/24
主题
量化 / 推理优化 / 部署 / 系统性能
读完这篇文章后,你应该能:
这篇教程不是底层数值分析课,而是面向工程实践的第一性原理导览。
大模型部署的成本主要来自三类资源:
当模型很大、并发很多、上下文很长时,单纯使用 FP16 或 BF16 往往意味着:
量化的核心思路,就是用更少的 bit 表示数值,从而降低存储和访存压力。直观上可以理解为:
bit 数越低,越省空间;但 bit 数越低,信息损失风险也越大。所以量化从来不是“免费午餐”,而是资源与精度之间的折中。
讨论量化时,最容易混淆的是对象。实际上,量化可以发生在不同部分:
实际部署里最常见、风险相对可控的是权重量化,因为:
激活和 KV Cache 的量化同样重要,但对稳定性和运行时支持要求更高。
这里最容易混的两件事,其实可以拆开看:一是“量化对象是谁”,二是“量化发生在训练后还是训练中”。
<rect x="34" y="76" width="912" height="174" rx="24" fill="#f9fafb" stroke="#e5e7eb" />
<text x="58" y="108" font-size="20" font-weight="700">一、量化对象</text>
<g>
<rect x="58" y="126" width="250" height="104" rx="18" fill="#e8f1ff" stroke="#98b7e1" />
<text x="183" y="156" text-anchor="middle" font-size="20" font-weight="700">权重量化</text>
<text x="183" y="181" text-anchor="middle" font-size="13" fill="#4b5563">最常见、最稳妥的第一步</text>
<text x="183" y="202" text-anchor="middle" font-size="13" fill="#4b5563">主要收益:模型更容易装进显存</text>
</g>
<g>
<rect x="364" y="126" width="250" height="104" rx="18" fill="#eef6e8" stroke="#a8c48e" />
<text x="489" y="156" text-anchor="middle" font-size="20" font-weight="700">激活量化</text>
<text x="489" y="181" text-anchor="middle" font-size="13" fill="#4b5563">进一步压缩运行时张量</text>
<text x="489" y="202" text-anchor="middle" font-size="13" fill="#4b5563">风险:动态分布更难校准</text>
</g>
<g>
<rect x="670" y="126" width="250" height="104" rx="18" fill="#fff4dc" stroke="#e2c36f" />
<text x="795" y="156" text-anchor="middle" font-size="20" font-weight="700">KV Cache 量化</text>
<text x="795" y="181" text-anchor="middle" font-size="13" fill="#4b5563">面向长上下文与高并发瓶颈</text>
<text x="795" y="202" text-anchor="middle" font-size="13" fill="#4b5563">风险:decode 稳定性与实现支持</text>
</g>
<rect x="34" y="278" width="912" height="112" rx="24" fill="#f6f9ff" stroke="#d7e2f1" />
<text x="58" y="310" font-size="20" font-weight="700">二、量化路线</text>
<g>
<rect x="88" y="328" width="276" height="42" rx="14" fill="#e8f1ff" stroke="#98b7e1" />
<text x="226" y="354" text-anchor="middle" font-size="18" font-weight="700">PTQ:模型训练完以后再量化</text>
</g>
<g>
<rect x="614" y="328" width="276" height="42" rx="14" fill="#eef6e8" stroke="#a8c48e" />
<text x="752" y="354" text-anchor="middle" font-size="18" font-weight="700">QAT:训练时就模拟量化误差</text>
</g>
<line x1="364" y1="349" x2="614" y2="349" stroke="#5b6b7f" stroke-width="3" marker-end="url(#quant-arrow)" />
<text x="489" y="336" text-anchor="middle" font-size="13" fill="#64748b">训练成本更高,但潜在精度更稳</text>
</g>
INT8 量化之所以普及,很大程度上是因为它在“压缩收益”和“精度可接受性”之间比较平衡。
它的优势包括:
它的局限也很明确:
所以 INT8 常常是“稳妥路线”,但不是资源最省路线。
INT4 的诱惑非常大,因为它比 INT8 还能再节省一半空间。对 7B、14B、32B 这类模型来说,能不能压到 4-bit,往往直接决定它是否能在特定设备上跑起来。
但 4-bit 的难点也更明显:
因此,INT4 通常更依赖精细的后训练量化方法,而不是简单粗暴地统一缩放。
这两个词很容易一起出现:
模型先训练好,再做量化。优点是成本低、部署方便,不需要重新训练底座模型。
训练过程中就模拟量化误差,让模型逐步适应低比特表示。优点是潜在精度更好,缺点是实现复杂、训练成本更高。
在 LLM 场景里,很多团队优先接触到的是 PTQ,因为它更适合开源模型部署与快速验证。
GPTQ 可以粗略理解为一种面向大模型权重的后训练量化方法。它的核心吸引力在于:
工程上你可以这样理解 GPTQ:
所以 GPTQ 往往适合“我想把模型压得比较狠,同时还希望保住主要能力”的场景。
AWQ(Activation-aware Weight Quantization)这个名字已经点出了它的思路:量化时会考虑激活分布对重要权重的影响。
它的实践价值在于:
如果把它和 GPTQ 粗略对比,可以这样记:
真实选择时,不要把它们当成绝对优劣,而是看:
很多人只从显存角度理解量化,但它还会影响:
不过也要注意:低比特不必然意味着更快。如果硬件内核、推理框架、算子实现没有充分优化,你可能会看到:
所以部署评估时,至少要同时看三件事:
如果你想自己动手做第一轮量化实验,可以用下面这个顺序:
这个顺序的好处是:你始终知道“退化是从哪一步开始发生的”。
如果只是快速验证 8-bit/4-bit 加载路线,可以先从 bitsandbytes 风格的方式入手:
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
model_name = "Qwen/Qwen2.5-7B-Instruct"
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_use_double_quant=True,
bnb_4bit_compute_dtype="bfloat16",
)
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
model_name,
quantization_config=bnb_config,
device_map="auto",
)
这类方式的价值在于“上手快”,适合先验证模型能否以低比特稳定运行。若你要做面向生产的高吞吐部署,通常还需要进一步结合具体推理框架,例如 vLLM 或 TGI。
量化不只用于推理,也常与微调结合。最典型的例子就是 QLoRA:
所以量化并不只是“部署结束动作”,也能成为训练阶段的资源解法。如果你想把这部分打通,可以结合阅读 LoRA 微调实战。
虽然量化很有吸引力,但下面几种情况要谨慎:
量化是强工具,但前提是你知道自己在解决什么瓶颈。
如果内核不匹配、算子不成熟,量化后的速度可能没有你想象的大。
某些模型在公开基准上损失不大,但在你的垂直任务里可能明显掉质。
权重量化、激活量化、缓存量化不是一回事,收益和风险都不同。
量化上线后若出现质量问题,应该能快速切回高精度版本,否则排障成本会很高。
从相近主题继续深入,建立连续学习链路。