模型量化基础知识 - PTQ - 训练后量化

文章目录

  • [一、PTQ 是什么](#一、PTQ 是什么)
  • [二、PTQ 的标准流程(五大步骤)](#二、PTQ 的标准流程(五大步骤))
    • [✅ Step 0:准备 FP 模型(Baseline)](#✅ Step 0:准备 FP 模型(Baseline))
    • [✅ Step 1:插入量化节点(Quantization Simulation)](#✅ Step 1:插入量化节点(Quantization Simulation))
    • [✅ Step 2:校准(Calibration)](#✅ Step 2:校准(Calibration))
    • [✅ Step 3:确定量化方案(Policy)](#✅ Step 3:确定量化方案(Policy))
    • [✅ Step 4:导出量化模型(Encodings + Graph)](#✅ Step 4:导出量化模型(Encodings + Graph))
    • [✅ Step 5:验证与部署](#✅ Step 5:验证与部署)
  • [三、用一句话总结 PTQ 全流程](#三、用一句话总结 PTQ 全流程)
  • 四、一个极简流程图(工程版)
  • [五、什么时候 PTQ 不够用?](#五、什么时候 PTQ 不够用?)
    • [✅ 最后一句工程总结](#✅ 最后一句工程总结)
  • 课后题
    • [一、为什么说 PTQ 的"理论上限"就是逼近当前 FP 模型?](#一、为什么说 PTQ 的“理论上限”就是逼近当前 FP 模型?)
      • [1️⃣ PTQ 在做什么(抽象层面)](#1️⃣ PTQ 在做什么(抽象层面))
      • [2️⃣ 为什么再多 trick 也只能"无限逼近"](#2️⃣ 为什么再多 trick 也只能“无限逼近”)
    • [二、那 QAT → dequant 回 BF16,为什么会"更量化友好"?](#二、那 QAT → dequant 回 BF16,为什么会“更量化友好”?)
      • [1️⃣ QAT 真正学到的是什么?](#1️⃣ QAT 真正学到的是什么?)
      • [2️⃣ dequant 回 BF16 后,发生了什么?](#2️⃣ dequant 回 BF16 后,发生了什么?)
    • 三、从"工程视角"把两条路线放在一起看
    • [四、一个判断标准,决定"值不值得做 QAT-dequant"](#四、一个判断标准,决定“值不值得做 QAT-dequant”)

下面我们用工程视角PTQ(Post‑Training Quantization,训练后量化)基本流程 完整梳理一遍。可以把它当成一条标准流水线,无论是 TensorRT / PyTorch / QNN,本质步骤都高度一致。


一、PTQ 是什么

PTQ 的核心特点是:

模型已经训练完成

不再反向训练、不更新权重

✅ 通过少量代表性数据,计算量化参数(encodings)

PTQ 主要解决的是:如何在不重新训练的前提下,把 FP32/FP16 模型安全地变成 INT8 / INT16 / 混合精度模型


二、PTQ 的标准流程(五大步骤)

✅ Step 0:准备 FP 模型(Baseline)

  • 输入:已训练好的 FP32 / FP16 模型
  • 通常先做:
    • 图优化(fold BN、常量折叠)
    • 确认算子在目标硬件上可量化

这是后续所有步骤的基础。


✅ Step 1:插入量化节点(Quantization Simulation)

在模型图中插入"量化器(Quantizer / Observer)"

  • 权重前:模拟 weight quant
  • 激活后:模拟 activation quant

此时:

  • 计算仍然是 FP
  • 但数值会被"压到量化网格上"
  • 用来评估量化误差

这一步通常叫:

  • Quantization Simulation
  • Fake Quant
  • QuantSim

✅ Step 2:校准(Calibration)

这是 PTQ 最核心的一步

做什么?

  • 少量代表性数据跑模型 forward
  • 统计各层激活 / 权重的:
    • min / max
    • 或直方图 / percentile / KL

目的:

  • 计算每个量化器的 scale 和 zero_point
  • 也即之前提到的 encodings

⚠️ 权重的 encodings 通常可直接算

⚠️ 激活的 encodings 必须依赖校准数据


✅ Step 3:确定量化方案(Policy)

在校准完成后,需要做策略选择:

  • 对称 vs 非对称
  • per‑tensor / per‑channel / per‑block
  • 哪些层:
    • INT8
    • INT16
    • FP16(混合精度)

这一步往往结合:

  • 量化敏感度分析
  • 精度 / 性能 trade‑off

✅ Step 4:导出量化模型(Encodings + Graph)

输出通常包括两部分:

  1. 量化后的模型结构
    • 权重已是 INT8 / INT16
  2. encodings 文件
    • scale
    • zero_point
    • bitwidth

这些会被交给:

  • TensorRT
  • QNN
  • NPU 编译器
    用于生成真正的整数推理图。

✅ Step 5:验证与部署

最后一定要做:

  • 精度验证(Top‑1 / BLEU / Rouge / ppl)
  • 性能验证(latency / throughput / power)
  • 与 FP baseline 对齐

如果精度不够:

  • 回到 Step 3
  • 做 mixed precision 或范围调整

三、用一句话总结 PTQ 全流程

PTQ =
插量化器 → 跑校准数据 → 算 encodings → 固化量化参数 → 导出整数模型


四、一个极简流程图(工程版)

复制代码
FP 模型
  ↓
插入 Quantizer(仿真)
  ↓
Calibration(跑少量数据)
  ↓
计算 scale / zero_point
  ↓
选择量化策略(INT8 / INT16 / 混合)
  ↓
导出量化模型 + encodings
  ↓
部署到目标硬件

五、什么时候 PTQ 不够用?

当出现:

  • 精度下降明显
  • LLM / Attention 特别敏感
  • 低 bit(≤ INT4)

👉 就需要:

  • QAT
  • AWQ / GPTQ / SmoothQuant 等高级方案(但仍然以 PTQ 思想为基础

✅ 最后一句工程总结

PTQ 是"用最小成本,把训练好的模型推向可部署状态"的量化方案,
也是所有高级量化技术的起点。


课后题

PTQ只能无限逼近浮点模型的精度吗?QAT做完再dequant回bf16的模型,能让模型对量化更友好?

  1. PTQ 本身的上限,确实是"在给定量化格式下,尽量逼近当前浮点模型的行为"

    👉 它不会改变模型对量化误差的"内在敏感性",只能在既定 FP 权重分布下做最优近似。

  2. QAT → 再 dequant 回 BF16/FP16,确实可以让模型"对量化更友好"

    👉 但这不是魔法,它本质上是:
    用量化噪声当正则,重新塑造权重 / 激活分布,使其更容易被低比特表示

换句话说:

QAT-dequant ≠ 提升 FP 模型"绝对精度"

QAT-dequant = 提升 FP 模型"可量化性(quantizability)"


一、为什么说 PTQ 的"理论上限"就是逼近当前 FP 模型?

1️⃣ PTQ 在做什么(抽象层面)

不管我们用的是:

  • min/max / percentile
  • GPTQ / AdaRound / SpinQuant
  • CLE / BN re-estimation

PTQ 都遵循同一个约束:

不允许修改 FP 模型的"功能形式"

✅ 只能在 固定 FP 权重 + 固定前向结构 下,找一个量化表示

形式化一点:

min ⁡ quant params    ∥ f quant ( x ) − f fp ( x ) ∥ \min_{\text{quant params}} \; \| f_{\text{quant}}(x) - f_{\text{fp}}(x) \| quant paramsmin∥fquant(x)−ffp(x)∥

也就是说:

  • 目标函数是 FP 模型
  • FP 模型本身不动

2️⃣ 为什么再多 trick 也只能"无限逼近"

即便用:

  • 二阶信息(GPTQ)
  • 残差补偿
  • 更复杂的 rounding search

如果 FP 权重分布本身是:

  • 有极端 outlier
  • LN / exp 前激活分布重尾
  • 某些层对 scale 特别敏感

👉 那 PTQ 能做的只是:

  • 把误差挪一挪
  • 在不同 token / channel 之间平衡损失

但它无法改变:

  • 权重是否"天生适合 4bit / 8bit"
  • 激活分布是否"量化友好"

所以我们看到的现象通常是:

  • PTQ:接近 FP,但总差一点
  • 而且 bitwidth 越低,gap 越"刚性"

二、那 QAT → dequant 回 BF16,为什么会"更量化友好"?

这是一个非常容易被误解、但在工程上极其重要的点

1️⃣ QAT 真正学到的是什么?

QAT 的训练目标并不是:

"把 FP 精度训得更高"

而是:

min ⁡    E x [ ∥ f fake-quant ( x ) − y ∥ ] \min \; \mathbb{E}{x} \left[ \| f{\text{fake-quant}}(x) - y \| \right] minEx[∥ffake-quant(x)−y∥]

也就是说:

  • 前向里长期暴露在量化噪声下
  • 梯度会逼着模型去"适应这个噪声模型"

结果是,模型会自发地

  • 压缩权重动态范围
  • 减少对单点 outlier 的依赖
  • 让重要信息集中在"量化 bins 的中心"
  • 让激活分布更接近对称 / 稳定

👉 这些都是"对量化友好"的结构性变化


2️⃣ dequant 回 BF16 后,发生了什么?

这是关键点:

dequant 并不会把模型"变回原来的 FP 模型"

我们得到的是一个新的 BF16 模型:

θ bf16 QAT-dequant ≠ θ bf16 orig \theta_{\text{bf16}}^{\text{QAT-dequant}} \neq \theta_{\text{bf16}}^{\text{orig}} θbf16QAT-dequant=θbf16orig

它具备两个特性:

  1. 功能上接近原模型
  2. 参数分布是"为量化优化过的"

所以我们会看到非常典型的工程现象:

  • 原 FP → PTQ:
    • W4A16 掉很多
  • QAT → dequant → 再 PTQ:
    • 同样 W4A16,明显稳很多
    • calibration 不那么敏感
    • GPTQ / SpinQuant 更容易收敛

三、从"工程视角"把两条路线放在一起看

路线 本质 能解决什么 解决不了什么
PTQ only 近似固定 FP 快、无需训练 FP 模型本身"不可量化"的问题
QAT → dequant 重塑模型分布 提升可量化性 需要训练成本
QAT → PTQ 最常见工业解 稳定低 bit PTQ 不是 0 成本
PTQ + GPTQ 最优逼近 推极限 上限仍由 FP 决定

一句非常工程化的总结:

🔹 PTQ 是"压缩器"

🔹 QAT 是"为压缩而重新设计内容"


四、一个判断标准,决定"值不值得做 QAT-dequant"

可以用这个经验判断:

  • W8A8 / W8A16 已经很稳
    → QAT-dequant 意义不大
  • W4A16 / W4A8 / KV quant 非常敏感
    QAT-dequant 非常值得
  • 同一模型,不同 PTQ notebook 结果差异巨大
    → 模型本身量化脆弱,QAT 很可能是"治本"
相关推荐
Storynone2 小时前
【踩坑笔记】Geforce RTX5060 显卡对应的 Pytorch 安装
人工智能·pytorch·笔记
Deepoch2 小时前
Deepoc 具身模型开发板:重构机械臂扫地机智能清洁新范式
人工智能·科技·机械臂·具身模型·deepoc·扫地机
技术小黑2 小时前
TensorFlow学习系列09 | 优化猫狗识别
人工智能·学习·tensorflow
指掀涛澜天下惊2 小时前
AI 基础知识十三 Transformer注意力机制(Attention)
人工智能·深度学习·机器学习·transformer·q k v
weifont2 小时前
太烧token了,我用Ai写了一个vscode的插件wps-editor(已开源)
人工智能·vscode·wps
春末的南方城市2 小时前
AI 首次实现电影级多镜头长视频生成!快手&港中文开源ShotStream,可实现单NVIDIA GPU上可达16 FPS 互式故事讲述和高效即时帧生成。
人工智能·音视频
宇擎智脑科技2 小时前
Claude Code 源码分析(一):多 Agent 协调器架构 —— 一个工业级 Coordinator-Worker 模式的完整实现
人工智能·agent·claude code
Jayin_chan2 小时前
大语言模型(LLM)输出机制(方便自己查阅)
人工智能·语言模型·自然语言处理
李元豪2 小时前
3分分类计算差值
人工智能·分类·数据挖掘