之前自己对量化也是一知半解,找个时间来好好梳理一下。
文章目录
一文读懂大模型量化:从 FP16 / BF16 到 INT8 的工程实践
随着大语言模型(LLM)规模不断增大,显存、内存、带宽和功耗逐渐成为部署和推理阶段的主要瓶颈。无论是在云端推理降本,还是在端侧(NPU / DSP / GPU)落地,量化(Quantization) 几乎已经成为必选项。
本文将从工程视角出发,系统介绍什么是大模型量化、为什么要量化、常见量化类型、encodings 的角色,以及在真实推理链路中的取舍。
一、什么是大模型量化?
量化,本质上是降低模型中数值的表示精度,以减少:
- 模型参数和中间激活(activation) 的内存占用
- 计算和访存带宽
- 推理延迟与功耗
在不显著损失精度的前提下,让模型跑得更快、更省资源、更便宜。
在大模型中,量化通常作用于三类对象:
- 权重(Weights)
- 激活(Activations)
- KV Cache(推理阶段的 Key / Value)
注:现代大模型的Transformer架构里bias参数非常少,以下线性层通常设置 bias=False:
Q / K / V 投影
Attention 输出投影(O)
MLP 中的大矩阵投影(如 gate / up / down)
因为在有残差连接 + 归一化(LayerNorm / RMSNorm)的前提下,
这些 bias 对表达能力贡献很小,但会增加参数、访存和实现复杂度。
二、为什么大模型特别需要量化?
1️⃣ 模型规模指数级增长
从 7B、13B 到 70B、百亿级,多数模型即使只做推理,也难以直接用 FP32 运行。
2️⃣ 推理瓶颈不只在算力
对 LLM 来说,内存带宽和 KV Cache 往往比算力更早成为瓶颈,尤其是在长上下文、多轮对话、CoT 推理等场景。
3️⃣ 端侧与私有化部署需求
在 NPU / DSP / 边缘 GPU 上:
- FP32 往往不可用或效率极低
- INT8 / FP16 才是“甜点区”
三、量化 ≠ 一种技术,而是一族方案
在工程实践中,“量化”并不只有一种形态,FP16 / BF16 与 INT8 本质上是两类完全不同的路线。
四、浮点量化:FP16 / BF16(最稳妥的第一步)
首先介绍几个概念:
指数位(Exponent):决定一个数 “有多大 / 多小”(数量级、范围)
尾数位(Mantissa,也叫 Significand):决定一个数 “有多精细”(精度、小数细节)
符号位(Sign):正或者负。
以十进制科学计数法为例子:
123400 = +1.234 × 10^5
+就是符号位,1.234就是尾数部分,5就是指数部分。
计算机数据使用的是二进制科学计数法:
-1.01101 × 2^k
-就是符号位,1.01101就是尾数部分,k就是指数部分。
对上述几个概念有了基本的理解之后,我们再来介绍几种数据格式:
✅ FP32(float32)
- IEEE 标准浮点格式
1 bit sign + 8 bit exponent + 23 bit mantissa - 优点:动态范围非常大(指数位多)、精度高(尾数位多)、 数值最稳定,几乎不怕溢出 / 下溢
- 缺点:占用内存大(32 bit)、访存带宽压力大、推理/训练速度慢、功耗高
✅ FP16(float16)
- IEEE 标准浮点格式
- 1 bit sign + 5 bit exponent + 10 bit mantissa
- 优点:成熟、硬件支持好、精度损失小
- 缺点:动态范围有限,极端数值可能溢出
✅ BF16(bfloat16)
- IEEE 标准浮点格式
- 1 bit sign + 8 bit exponent + 7 bit mantissa
- 优点:动态范围接近 FP32,更稳定
- 缺点:精度略低于 FP16,小数更粗
FP16 / BF16 不需要 encodings,因为:
- FP16 / BF16 本身就是标准浮点表示
- 数值解释规则由 IEEE 754 标准固定
- 不存在 scale / zero-point / offset 这种外部映射关系
在工程中,它们往往只是一次 dtype cast:
model = model.to(torch.float16) # 或 torch.bfloat16
✅ 无校准、无 encodings、风险最低
👉 通常是量化的第一步
五、整数 / 定点量化:INT8 / INT16(真正的“量化”)
与浮点量化不同,整数没有指数位和动态范围,这就引入了一个核心问题:
一个 INT8 的数值,代表多少“真实世界”的浮点值?
这正是 encodings 存在的原因。典型 encodings 包含:
scale:量化步长offset:零点偏移
反量化的基本公式:
real_value = scale * (int_value - offset)
int_value指的是int8或者int16字面上的整型数值。
因此:
- ✅ INT8 / INT16 一定需要 encodings
- ✅ encodings 需要通过 校准(calibration) 得到
- ✅ encodings 是部署到后端(如 QNN / NPU)的关键输入
- ❌ encodings 与token decode、logits decode无关,一个是数值层面的线性变换,一个是符号层面的查表映射。
看到这里有的朋友可能会问,同样是2字节,已经有fp16了,为什么还需要INT16呢?这是因为在“硬件执行与系统工程”上,INT16 在某些场景具有明确优势,具有确定性、可控性、以及对特定硬件(DSP / NPU / MCU)的友好性。**
FP16(float16)
- IEEE 浮点
- 动态范围大(指数位)
- 精度随数值变化
- 舍入误差是相对误差
INT16(int16)
- 定点整数
- 动态范围固定
- 精度是绝对均匀步长
- 行为是完全可预测的
如果我们在坐标系上画出float16跟int16每一个离散数据点的落点,会发现float16的点是落在一条下凸的指数曲线上,而int16是落在一条直线上,所以fp16的误差会随数值变化,而int16的误差在encoding确定的情况下不随int_value的取值而变化。
👉 二者差异不在“16bit”,而在“指数 vs 定点”。INT16量化:
- 所有误差都是线性、可控的
- 不存在:
- NaN
- Inf
- subnormal
- 不会因为指数溢出“突然炸掉”
👉 在 安全 / 车规 / 通信 / DSP 场景里,这是硬需求。
INT16通常出现在这几类场景:
✅ 1️⃣ INT8 不够准,但 FP16 太贵
- INT8 精度损失大
- INT16 是 “保守但稳妥”的中间档
✅ 2️⃣ 激活 / KV cache
- 对数值范围有界
- 对误差更敏感
- INT16 + 好 encodings 往往比 FP16 更稳定
✅ 3️⃣ 硬件不支持 FP16
- MCU / DSP / 老一代 NPU
- 只能走 INT16
最后用一张工程对比表总结一下两种量化方式的区别:
| 维度 | FP16 | INT16 |
|---|---|---|
| bit 数 | 16 | 16 |
| 动态范围 | ✅ 大 | ❌ 固定 |
| 精度模型 | 相对误差 | 绝对步长 |
| NaN / Inf | ✅ 有 | ❌ 无 |
| encodings | ❌ 不需要 | ✅ 需要 |
| 硬件通用性 | GPU 强 | DSP / NPU 强 |
| 行为可控性 | 中 | ✅ 极高 |
六、大模型量化的几种常见策略
1️⃣ PTQ(Post-Training Quantization)
- 训练后量化
- 使用少量校准数据
- 工程上最常用、成本最低
2️⃣ QAT(Quantization-Aware Training)
- 训练过程中引入量化噪声
- 精度最好
- 成本高,训练复杂
3️⃣ 混合精度(Mixed Precision)
- 大部分层用 INT8
- 敏感层(Embedding / LayerNorm / LM Head)保留 FP16/BF16
- LLM 实战中的主流方案
七、LLM 特有的量化难点
1️⃣ KV Cache 体量巨大
- 长上下文下,KV Cache 占用往往超过权重
- KV 的量化(INT8 / FP16)直接影响带宽和时延
2️⃣ Attention / Softmax 对精度敏感
- 低精度可能导致数值不稳定
- 常见做法:Attention 中间计算保留更高精度
3️⃣ 输出层(LM Head)极度敏感
- 很多方案选择 LM Head 保留 FP16/BF16
- 否则 logits 排名会被扰动,影响生成质量
八、工程实践中的推荐路径
如果你在真实项目中落地 LLM 量化,可以参考这条“风险递增”的路线:
- ✅ FP32 → BF16 / FP16
- ✅ 权重 INT8,激活 FP16(W8A16)
- ✅ KV Cache 量化(视硬件支持)
- ✅ 逐层 mixed precision 微调
- 🚧 全 INT8 / 更低 bit(需要 QAT / 算法支持)
九、总结
可以用三句话概括大模型量化的工程本质:
- FP16 / BF16 是“浮点降精度”,不需要 encodings
- INT8 / INT16 是“定点量化”,必须依赖 encodings
- 量化的目标不是“最低 bit”,而是“最优性价比”
在大模型时代,量化不再是“压缩模型”的附加步骤,而是推理系统设计的一部分。
下一章会进一步介绍PTQ。
2528

被折叠的 条评论
为什么被折叠?



