模型量化基础知识 - 基本介绍

低功耗蓝牙项目,需要一块懂省电的板

思澈 SF32LB52 芯片,BLE 协议栈深度优化,上手即开发

之前自己对量化也是一知半解,找个时间来好好梳理一下。

一文读懂大模型量化:从 FP16 / BF16 到 INT8 的工程实践

随着大语言模型(LLM)规模不断增大,显存、内存、带宽和功耗逐渐成为部署和推理阶段的主要瓶颈。无论是在云端推理降本,还是在端侧(NPU / DSP / GPU)落地,量化(Quantization) 几乎已经成为必选项。

本文将从工程视角出发,系统介绍什么是大模型量化、为什么要量化、常见量化类型、encodings 的角色,以及在真实推理链路中的取舍


一、什么是大模型量化?

量化,本质上是降低模型中数值的表示精度,以减少:

  • 模型参数和中间激活(activation) 的内存占用
  • 计算和访存带宽
  • 推理延迟与功耗

在不显著损失精度的前提下,让模型跑得更快、更省资源、更便宜

在大模型中,量化通常作用于三类对象:

  1. 权重(Weights)
  2. 激活(Activations)
  3. 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

最后用一张工程对比表总结一下两种量化方式的区别:

维度FP16INT16
bit 数1616
动态范围✅ 大❌ 固定
精度模型相对误差绝对步长
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 量化,可以参考这条“风险递增”的路线:

  1. FP32 → BF16 / FP16
  2. 权重 INT8,激活 FP16(W8A16)
  3. KV Cache 量化(视硬件支持)
  4. 逐层 mixed precision 微调
  5. 🚧 全 INT8 / 更低 bit(需要 QAT / 算法支持)

九、总结

可以用三句话概括大模型量化的工程本质:

  1. FP16 / BF16 是“浮点降精度”,不需要 encodings
  2. INT8 / INT16 是“定点量化”,必须依赖 encodings
  3. 量化的目标不是“最低 bit”,而是“最优性价比”

在大模型时代,量化不再是“压缩模型”的附加步骤,而是推理系统设计的一部分

下一章会进一步介绍PTQ。

低功耗蓝牙项目,需要一块懂省电的板

思澈 SF32LB52 芯片,BLE 协议栈深度优化,上手即开发

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值