第3章 PTQ:不用重新训练也能量化 LLM

第3章 PTQ:不用重新训练也能量化 LLM

3.1 一个现实问题:模型训练完了,还能量化吗?

前两章我们已经知道:LLM 之所以需要量化,很大程度上是因为模型参数太多,高精度权重会带来巨大的存储和显存开销。例如一个 7B 模型,如果参数使用 FP16:

7B×2 Bytes≈14GB7B \times 2\ \text{Bytes} \approx 14\text{GB}7B×2 Bytes≈14GB

如果使用 INT4:

7B×0.5 Byte≈3.5GB7B \times 0.5\ \text{Byte} \approx 3.5\text{GB}7B×0.5 Byte≈3.5GB

于是自然会产生一个问题:

难道为了得到一个 4-bit 模型,需要重新训练一个 4-bit 的 LLM 吗?

如果答案是"是",那么量化的成本会非常高。因为训练一个现代 LLM 通常需要大规模数据集、大量 GPU、数天甚至更长时间的训练、巨大的工程成本。如果每一次从 FP16 变成 INT8、INT4 都需要重新训练,那么量化就很难大规模应用。

幸运的是:不一定需要重新训练。 这就是 PTQ(Post-Training Quantization),即训练完成之后,再进行量化。


3.2 什么是 PTQ?

先看最简单的过程:
#mermaid-svg-Y3WOfs2PslWYOheX{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Y3WOfs2PslWYOheX .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Y3WOfs2PslWYOheX .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Y3WOfs2PslWYOheX .error-icon{fill:#552222;}#mermaid-svg-Y3WOfs2PslWYOheX .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Y3WOfs2PslWYOheX .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Y3WOfs2PslWYOheX .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Y3WOfs2PslWYOheX .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Y3WOfs2PslWYOheX .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Y3WOfs2PslWYOheX .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Y3WOfs2PslWYOheX .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Y3WOfs2PslWYOheX .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Y3WOfs2PslWYOheX .marker.cross{stroke:#333333;}#mermaid-svg-Y3WOfs2PslWYOheX svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Y3WOfs2PslWYOheX p{margin:0;}#mermaid-svg-Y3WOfs2PslWYOheX .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Y3WOfs2PslWYOheX .cluster-label text{fill:#333;}#mermaid-svg-Y3WOfs2PslWYOheX .cluster-label span{color:#333;}#mermaid-svg-Y3WOfs2PslWYOheX .cluster-label span p{background-color:transparent;}#mermaid-svg-Y3WOfs2PslWYOheX .label text,#mermaid-svg-Y3WOfs2PslWYOheX span{fill:#333;color:#333;}#mermaid-svg-Y3WOfs2PslWYOheX .node rect,#mermaid-svg-Y3WOfs2PslWYOheX .node circle,#mermaid-svg-Y3WOfs2PslWYOheX .node ellipse,#mermaid-svg-Y3WOfs2PslWYOheX .node polygon,#mermaid-svg-Y3WOfs2PslWYOheX .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Y3WOfs2PslWYOheX .rough-node .label text,#mermaid-svg-Y3WOfs2PslWYOheX .node .label text,#mermaid-svg-Y3WOfs2PslWYOheX .image-shape .label,#mermaid-svg-Y3WOfs2PslWYOheX .icon-shape .label{text-anchor:middle;}#mermaid-svg-Y3WOfs2PslWYOheX .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Y3WOfs2PslWYOheX .rough-node .label,#mermaid-svg-Y3WOfs2PslWYOheX .node .label,#mermaid-svg-Y3WOfs2PslWYOheX .image-shape .label,#mermaid-svg-Y3WOfs2PslWYOheX .icon-shape .label{text-align:center;}#mermaid-svg-Y3WOfs2PslWYOheX .node.clickable{cursor:pointer;}#mermaid-svg-Y3WOfs2PslWYOheX .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Y3WOfs2PslWYOheX .arrowheadPath{fill:#333333;}#mermaid-svg-Y3WOfs2PslWYOheX .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Y3WOfs2PslWYOheX .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Y3WOfs2PslWYOheX .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Y3WOfs2PslWYOheX .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Y3WOfs2PslWYOheX .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Y3WOfs2PslWYOheX .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Y3WOfs2PslWYOheX .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Y3WOfs2PslWYOheX .cluster text{fill:#333;}#mermaid-svg-Y3WOfs2PslWYOheX .cluster span{color:#333;}#mermaid-svg-Y3WOfs2PslWYOheX div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Y3WOfs2PslWYOheX .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Y3WOfs2PslWYOheX rect.text{fill:none;stroke-width:0;}#mermaid-svg-Y3WOfs2PslWYOheX .icon-shape,#mermaid-svg-Y3WOfs2PslWYOheX .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Y3WOfs2PslWYOheX .icon-shape p,#mermaid-svg-Y3WOfs2PslWYOheX .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Y3WOfs2PslWYOheX .icon-shape .label rect,#mermaid-svg-Y3WOfs2PslWYOheX .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Y3WOfs2PslWYOheX .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Y3WOfs2PslWYOheX .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Y3WOfs2PslWYOheX :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 原始训练
FP16 / BF16 LLM
PTQ
INT8 / INT4 LLM
部署

这里最核心的一点是:模型已经训练完成,量化是在训练结束之后进行的。 因此:

PTQ=Post-Training Quantization\boxed{PTQ = Post\text{-}Training\ Quantization}PTQ=Post-Training Quantization

3.2.1 PTQ 与普通训练的区别

普通训练是一个反复迭代更新参数的过程,最终得到一个 FP16 / BF16 模型;而 PTQ 不再进行大规模的模型参数更新:
#mermaid-svg-pMctqjmmjo1Y1oxJ{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-pMctqjmmjo1Y1oxJ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-pMctqjmmjo1Y1oxJ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-pMctqjmmjo1Y1oxJ .error-icon{fill:#552222;}#mermaid-svg-pMctqjmmjo1Y1oxJ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-pMctqjmmjo1Y1oxJ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-pMctqjmmjo1Y1oxJ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-pMctqjmmjo1Y1oxJ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-pMctqjmmjo1Y1oxJ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-pMctqjmmjo1Y1oxJ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-pMctqjmmjo1Y1oxJ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-pMctqjmmjo1Y1oxJ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-pMctqjmmjo1Y1oxJ .marker.cross{stroke:#333333;}#mermaid-svg-pMctqjmmjo1Y1oxJ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-pMctqjmmjo1Y1oxJ p{margin:0;}#mermaid-svg-pMctqjmmjo1Y1oxJ .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-pMctqjmmjo1Y1oxJ .cluster-label text{fill:#333;}#mermaid-svg-pMctqjmmjo1Y1oxJ .cluster-label span{color:#333;}#mermaid-svg-pMctqjmmjo1Y1oxJ .cluster-label span p{background-color:transparent;}#mermaid-svg-pMctqjmmjo1Y1oxJ .label text,#mermaid-svg-pMctqjmmjo1Y1oxJ span{fill:#333;color:#333;}#mermaid-svg-pMctqjmmjo1Y1oxJ .node rect,#mermaid-svg-pMctqjmmjo1Y1oxJ .node circle,#mermaid-svg-pMctqjmmjo1Y1oxJ .node ellipse,#mermaid-svg-pMctqjmmjo1Y1oxJ .node polygon,#mermaid-svg-pMctqjmmjo1Y1oxJ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-pMctqjmmjo1Y1oxJ .rough-node .label text,#mermaid-svg-pMctqjmmjo1Y1oxJ .node .label text,#mermaid-svg-pMctqjmmjo1Y1oxJ .image-shape .label,#mermaid-svg-pMctqjmmjo1Y1oxJ .icon-shape .label{text-anchor:middle;}#mermaid-svg-pMctqjmmjo1Y1oxJ .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-pMctqjmmjo1Y1oxJ .rough-node .label,#mermaid-svg-pMctqjmmjo1Y1oxJ .node .label,#mermaid-svg-pMctqjmmjo1Y1oxJ .image-shape .label,#mermaid-svg-pMctqjmmjo1Y1oxJ .icon-shape .label{text-align:center;}#mermaid-svg-pMctqjmmjo1Y1oxJ .node.clickable{cursor:pointer;}#mermaid-svg-pMctqjmmjo1Y1oxJ .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-pMctqjmmjo1Y1oxJ .arrowheadPath{fill:#333333;}#mermaid-svg-pMctqjmmjo1Y1oxJ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-pMctqjmmjo1Y1oxJ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-pMctqjmmjo1Y1oxJ .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-pMctqjmmjo1Y1oxJ .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-pMctqjmmjo1Y1oxJ .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-pMctqjmmjo1Y1oxJ .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-pMctqjmmjo1Y1oxJ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-pMctqjmmjo1Y1oxJ .cluster text{fill:#333;}#mermaid-svg-pMctqjmmjo1Y1oxJ .cluster span{color:#333;}#mermaid-svg-pMctqjmmjo1Y1oxJ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-pMctqjmmjo1Y1oxJ .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-pMctqjmmjo1Y1oxJ rect.text{fill:none;stroke-width:0;}#mermaid-svg-pMctqjmmjo1Y1oxJ .icon-shape,#mermaid-svg-pMctqjmmjo1Y1oxJ .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-pMctqjmmjo1Y1oxJ .icon-shape p,#mermaid-svg-pMctqjmmjo1Y1oxJ .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-pMctqjmmjo1Y1oxJ .icon-shape .label rect,#mermaid-svg-pMctqjmmjo1Y1oxJ .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-pMctqjmmjo1Y1oxJ .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-pMctqjmmjo1Y1oxJ .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-pMctqjmmjo1Y1oxJ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} PTQ
已经训练好的模型
收集权重/激活信息
计算量化参数
Quantization
低比特模型
普通训练
随机初始化
训练数据
Forward
Loss
Backward
参数更新
重复很多次
FP16 / BF16 Model

所以:PTQ 最大的优势就是成本低、速度快。


3.3 PTQ 与 QAT 到底有什么区别?

这是 LLM 量化中最重要的基本概念之一。

  • PTQ :先训练得到 FP 模型,再量化,即 Train→QuantizeTrain \rightarrow QuantizeTrain→Quantize。
  • QAT(Quantization-Aware Training) :在训练过程中让模型提前"看到"量化带来的影响,即 Train+Quantization SimulationTrain + Quantization\ SimulationTrain+Quantization Simulation。

#mermaid-svg-ZlP06MBSRkaW99RV{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ZlP06MBSRkaW99RV .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ZlP06MBSRkaW99RV .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ZlP06MBSRkaW99RV .error-icon{fill:#552222;}#mermaid-svg-ZlP06MBSRkaW99RV .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ZlP06MBSRkaW99RV .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ZlP06MBSRkaW99RV .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ZlP06MBSRkaW99RV .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ZlP06MBSRkaW99RV .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ZlP06MBSRkaW99RV .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ZlP06MBSRkaW99RV .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ZlP06MBSRkaW99RV .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ZlP06MBSRkaW99RV .marker.cross{stroke:#333333;}#mermaid-svg-ZlP06MBSRkaW99RV svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ZlP06MBSRkaW99RV p{margin:0;}#mermaid-svg-ZlP06MBSRkaW99RV .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-ZlP06MBSRkaW99RV .cluster-label text{fill:#333;}#mermaid-svg-ZlP06MBSRkaW99RV .cluster-label span{color:#333;}#mermaid-svg-ZlP06MBSRkaW99RV .cluster-label span p{background-color:transparent;}#mermaid-svg-ZlP06MBSRkaW99RV .label text,#mermaid-svg-ZlP06MBSRkaW99RV span{fill:#333;color:#333;}#mermaid-svg-ZlP06MBSRkaW99RV .node rect,#mermaid-svg-ZlP06MBSRkaW99RV .node circle,#mermaid-svg-ZlP06MBSRkaW99RV .node ellipse,#mermaid-svg-ZlP06MBSRkaW99RV .node polygon,#mermaid-svg-ZlP06MBSRkaW99RV .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ZlP06MBSRkaW99RV .rough-node .label text,#mermaid-svg-ZlP06MBSRkaW99RV .node .label text,#mermaid-svg-ZlP06MBSRkaW99RV .image-shape .label,#mermaid-svg-ZlP06MBSRkaW99RV .icon-shape .label{text-anchor:middle;}#mermaid-svg-ZlP06MBSRkaW99RV .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-ZlP06MBSRkaW99RV .rough-node .label,#mermaid-svg-ZlP06MBSRkaW99RV .node .label,#mermaid-svg-ZlP06MBSRkaW99RV .image-shape .label,#mermaid-svg-ZlP06MBSRkaW99RV .icon-shape .label{text-align:center;}#mermaid-svg-ZlP06MBSRkaW99RV .node.clickable{cursor:pointer;}#mermaid-svg-ZlP06MBSRkaW99RV .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-ZlP06MBSRkaW99RV .arrowheadPath{fill:#333333;}#mermaid-svg-ZlP06MBSRkaW99RV .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ZlP06MBSRkaW99RV .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ZlP06MBSRkaW99RV .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ZlP06MBSRkaW99RV .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-ZlP06MBSRkaW99RV .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ZlP06MBSRkaW99RV .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-ZlP06MBSRkaW99RV .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ZlP06MBSRkaW99RV .cluster text{fill:#333;}#mermaid-svg-ZlP06MBSRkaW99RV .cluster span{color:#333;}#mermaid-svg-ZlP06MBSRkaW99RV div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ZlP06MBSRkaW99RV .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-ZlP06MBSRkaW99RV rect.text{fill:none;stroke-width:0;}#mermaid-svg-ZlP06MBSRkaW99RV .icon-shape,#mermaid-svg-ZlP06MBSRkaW99RV .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ZlP06MBSRkaW99RV .icon-shape p,#mermaid-svg-ZlP06MBSRkaW99RV .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-ZlP06MBSRkaW99RV .icon-shape .label rect,#mermaid-svg-ZlP06MBSRkaW99RV .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ZlP06MBSRkaW99RV .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-ZlP06MBSRkaW99RV .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-ZlP06MBSRkaW99RV :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} QAT流程
训练
Fake Quantization
Loss
反向传播
继续训练
PTQ流程
先训练
得到 FP 模型
再量化

一个非常直观的类比

可以把模型训练比作培养一个运动员

做法 类比
PTQ 运动员已训练完成 → 突然换装备 → 检查是否还能正常比赛 事后换装备
QAT 训练过程中一直模拟新装备 → 运动员逐渐适应 边训练边适应

因此两者的优缺点:

优点 缺点
PTQ 成本低、速度快、不需要重新训练 某些极低 bit 量化下,精度可能下降比较明显
QAT 模型可在训练中适应量化误差,精度恢复能力更强 训练成本高

后面的第 12 章我们再专门深入 QAT。


3.4 LLM 特别适合先做 PTQ 的原因

一个非常现实的原因是:LLM 的参数量太大,重新训练代价太高。 如果一个 70B 模型想做一个简单的 4-bit 版本:
#mermaid-svg-vm0yeyP0EwRrk89j{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-vm0yeyP0EwRrk89j .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-vm0yeyP0EwRrk89j .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-vm0yeyP0EwRrk89j .error-icon{fill:#552222;}#mermaid-svg-vm0yeyP0EwRrk89j .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-vm0yeyP0EwRrk89j .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-vm0yeyP0EwRrk89j .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-vm0yeyP0EwRrk89j .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-vm0yeyP0EwRrk89j .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-vm0yeyP0EwRrk89j .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-vm0yeyP0EwRrk89j .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-vm0yeyP0EwRrk89j .marker{fill:#333333;stroke:#333333;}#mermaid-svg-vm0yeyP0EwRrk89j .marker.cross{stroke:#333333;}#mermaid-svg-vm0yeyP0EwRrk89j svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-vm0yeyP0EwRrk89j p{margin:0;}#mermaid-svg-vm0yeyP0EwRrk89j .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-vm0yeyP0EwRrk89j .cluster-label text{fill:#333;}#mermaid-svg-vm0yeyP0EwRrk89j .cluster-label span{color:#333;}#mermaid-svg-vm0yeyP0EwRrk89j .cluster-label span p{background-color:transparent;}#mermaid-svg-vm0yeyP0EwRrk89j .label text,#mermaid-svg-vm0yeyP0EwRrk89j span{fill:#333;color:#333;}#mermaid-svg-vm0yeyP0EwRrk89j .node rect,#mermaid-svg-vm0yeyP0EwRrk89j .node circle,#mermaid-svg-vm0yeyP0EwRrk89j .node ellipse,#mermaid-svg-vm0yeyP0EwRrk89j .node polygon,#mermaid-svg-vm0yeyP0EwRrk89j .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-vm0yeyP0EwRrk89j .rough-node .label text,#mermaid-svg-vm0yeyP0EwRrk89j .node .label text,#mermaid-svg-vm0yeyP0EwRrk89j .image-shape .label,#mermaid-svg-vm0yeyP0EwRrk89j .icon-shape .label{text-anchor:middle;}#mermaid-svg-vm0yeyP0EwRrk89j .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-vm0yeyP0EwRrk89j .rough-node .label,#mermaid-svg-vm0yeyP0EwRrk89j .node .label,#mermaid-svg-vm0yeyP0EwRrk89j .image-shape .label,#mermaid-svg-vm0yeyP0EwRrk89j .icon-shape .label{text-align:center;}#mermaid-svg-vm0yeyP0EwRrk89j .node.clickable{cursor:pointer;}#mermaid-svg-vm0yeyP0EwRrk89j .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-vm0yeyP0EwRrk89j .arrowheadPath{fill:#333333;}#mermaid-svg-vm0yeyP0EwRrk89j .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-vm0yeyP0EwRrk89j .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-vm0yeyP0EwRrk89j .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-vm0yeyP0EwRrk89j .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-vm0yeyP0EwRrk89j .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-vm0yeyP0EwRrk89j .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-vm0yeyP0EwRrk89j .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-vm0yeyP0EwRrk89j .cluster text{fill:#333;}#mermaid-svg-vm0yeyP0EwRrk89j .cluster span{color:#333;}#mermaid-svg-vm0yeyP0EwRrk89j div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-vm0yeyP0EwRrk89j .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-vm0yeyP0EwRrk89j rect.text{fill:none;stroke-width:0;}#mermaid-svg-vm0yeyP0EwRrk89j .icon-shape,#mermaid-svg-vm0yeyP0EwRrk89j .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-vm0yeyP0EwRrk89j .icon-shape p,#mermaid-svg-vm0yeyP0EwRrk89j .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-vm0yeyP0EwRrk89j .icon-shape .label rect,#mermaid-svg-vm0yeyP0EwRrk89j .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-vm0yeyP0EwRrk89j .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-vm0yeyP0EwRrk89j .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-vm0yeyP0EwRrk89j :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 方案二:PTQ(只处理已有模型)
已经训练好的 70B
PTQ
4-bit
方案一:重新训练(成本高)
70B 模型
重新进行量化感知训练
得到 4-bit 模型

所以:对已经训练完成的大模型进行低比特部署,PTQ 往往是非常有吸引力的路线。 这也是 GPTQ、AWQ 等方法重要的原因。


3.5 Weight-only Quantization

进入真正的 LLM 量化之前,我们先区分:量化到底是在量化什么? 最简单的一种方案叫 Weight-only Quantization,也就是只量化模型权重------权重从 FP16 → INT4,而激活值(Activation)仍然保持 FP16 高精度。

3.5.1 W4A16 是什么?

这时候就会出现一个非常常见的表达 W4A16\boxed{W4A16}W4A16,拆开来看:W4 → Weight 使用 4 bit,A16 → Activation 使用 16 bit。也就是 Weight=INT4Weight = INT4Weight=INT4,Activation=FP16Activation = FP16Activation=FP16。
#mermaid-svg-HniGFuxTOgI43hCQ{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-HniGFuxTOgI43hCQ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-HniGFuxTOgI43hCQ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-HniGFuxTOgI43hCQ .error-icon{fill:#552222;}#mermaid-svg-HniGFuxTOgI43hCQ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-HniGFuxTOgI43hCQ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-HniGFuxTOgI43hCQ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-HniGFuxTOgI43hCQ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-HniGFuxTOgI43hCQ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-HniGFuxTOgI43hCQ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-HniGFuxTOgI43hCQ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-HniGFuxTOgI43hCQ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-HniGFuxTOgI43hCQ .marker.cross{stroke:#333333;}#mermaid-svg-HniGFuxTOgI43hCQ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-HniGFuxTOgI43hCQ p{margin:0;}#mermaid-svg-HniGFuxTOgI43hCQ .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-HniGFuxTOgI43hCQ .cluster-label text{fill:#333;}#mermaid-svg-HniGFuxTOgI43hCQ .cluster-label span{color:#333;}#mermaid-svg-HniGFuxTOgI43hCQ .cluster-label span p{background-color:transparent;}#mermaid-svg-HniGFuxTOgI43hCQ .label text,#mermaid-svg-HniGFuxTOgI43hCQ span{fill:#333;color:#333;}#mermaid-svg-HniGFuxTOgI43hCQ .node rect,#mermaid-svg-HniGFuxTOgI43hCQ .node circle,#mermaid-svg-HniGFuxTOgI43hCQ .node ellipse,#mermaid-svg-HniGFuxTOgI43hCQ .node polygon,#mermaid-svg-HniGFuxTOgI43hCQ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-HniGFuxTOgI43hCQ .rough-node .label text,#mermaid-svg-HniGFuxTOgI43hCQ .node .label text,#mermaid-svg-HniGFuxTOgI43hCQ .image-shape .label,#mermaid-svg-HniGFuxTOgI43hCQ .icon-shape .label{text-anchor:middle;}#mermaid-svg-HniGFuxTOgI43hCQ .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-HniGFuxTOgI43hCQ .rough-node .label,#mermaid-svg-HniGFuxTOgI43hCQ .node .label,#mermaid-svg-HniGFuxTOgI43hCQ .image-shape .label,#mermaid-svg-HniGFuxTOgI43hCQ .icon-shape .label{text-align:center;}#mermaid-svg-HniGFuxTOgI43hCQ .node.clickable{cursor:pointer;}#mermaid-svg-HniGFuxTOgI43hCQ .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-HniGFuxTOgI43hCQ .arrowheadPath{fill:#333333;}#mermaid-svg-HniGFuxTOgI43hCQ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-HniGFuxTOgI43hCQ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-HniGFuxTOgI43hCQ .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-HniGFuxTOgI43hCQ .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-HniGFuxTOgI43hCQ .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-HniGFuxTOgI43hCQ .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-HniGFuxTOgI43hCQ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-HniGFuxTOgI43hCQ .cluster text{fill:#333;}#mermaid-svg-HniGFuxTOgI43hCQ .cluster span{color:#333;}#mermaid-svg-HniGFuxTOgI43hCQ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-HniGFuxTOgI43hCQ .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-HniGFuxTOgI43hCQ rect.text{fill:none;stroke-width:0;}#mermaid-svg-HniGFuxTOgI43hCQ .icon-shape,#mermaid-svg-HniGFuxTOgI43hCQ .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-HniGFuxTOgI43hCQ .icon-shape p,#mermaid-svg-HniGFuxTOgI43hCQ .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-HniGFuxTOgI43hCQ .icon-shape .label rect,#mermaid-svg-HniGFuxTOgI43hCQ .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-HniGFuxTOgI43hCQ .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-HniGFuxTOgI43hCQ .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-HniGFuxTOgI43hCQ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Weight (INT4)
Linear
Activation (FP16)

这是一种典型的 Weight-only Quantization。


3.6 Weight-only Quantization 对 LLM 很有吸引力

原因之一是:LLM 推理过程中,权重规模巨大。 例如一个 Linear Layer W∈Rdout×dinW \in \mathbb{R}^{d_{out} \times d_{in}}W∈Rdout×din,可能包含数百万甚至更多参数。如果 FP16→INT4FP16 \rightarrow INT4FP16→INT4,那么权重存储量理论上可以下降约 4 倍。

但与此同时,Activation 不一定需要同步降到 4 bit。因此可以先采用 W4A16W4A16W4A16,这样可以获得一个比较直接的资源收益,同时避免把所有计算环节都推到极低精度。


3.7 W8A16、W4A16 与 W8A8

这是学习 LLM 量化时必须看懂的几个表示:

表示 Weight Activation 特点
W8A16 INT8 FP16 权重低比特
W4A16 INT4 FP16 权重更低比特
W8A8 INT8 INT8 权重和激活都低比特

这里 W4A16 和 W8A8 有一个本质区别:W4A16 主要是权重低比特,而 W8A8 同时降低了权重和激活的精度。

看到这里可能会有一个疑问:既然 Weight-only(W4A16)又简单、又能省显存,那为什么还要费劲去量化 Activation(比如 W8A8)? 原因在于两者省下的东西不一样:

  • Weight-only 量化省的主要是"显存/存储" ------权重变小了,但推理时通常还要把它反量化回高精度,再和 FP16 的激活相乘,所以实际参与计算的仍是高精度乘法
  • 把 Activation 也量化(如 W8A8)省的是"计算" ------当权重和激活都是 INT8 时,就能直接使用 GPU 的 INT8 整数矩阵乘算子,计算吞吐更高、内存带宽压力更小。在追求高吞吐、大 batch 的生产推理里,这一点非常关键。

所以 Activation Quantization 不是可有可无的补充,而是当目标从"装得下"进一步变成"跑得快"时必须迈出的一步。这也引出了本章接下来要区分的两类量化。


3.8 Weight Quantization 与 Activation Quantization

明确了"为什么要量化 Activation"之后,就能把量化对象清晰地分成两类。这是本章非常重要的一条分界线。

Weight Quantization :模型参数 WWW,例如 FP16→INT4FP16 \rightarrow INT4FP16→INT4。特点是权重是固定的(因为模型已经训练完成),所以量化时我们可以离线分析整个权重矩阵。

Activation Quantization :激活 AAA 是在推理过程中动态产生的,A=f(X,W)A = f(X, W)A=f(X,W)。输入不同(X1≠X2X_1 \neq X_2X1=X2),那么 A1≠A2A_1 \neq A_2A1=A2。因此 Activation 的数值范围可能随输入变化,所以激活量化会更加复杂。


3.9 Activation Quantization 更难的原因

考虑一个 Linear Layer Y=XWY = XWY=XW。权重 WWW 是固定参数,我们可以提前统计它的分布、计算 Scale、量化:
#mermaid-svg-J1Ad7GjBZ7ZP7QPd{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-J1Ad7GjBZ7ZP7QPd .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-J1Ad7GjBZ7ZP7QPd .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-J1Ad7GjBZ7ZP7QPd .error-icon{fill:#552222;}#mermaid-svg-J1Ad7GjBZ7ZP7QPd .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-J1Ad7GjBZ7ZP7QPd .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-J1Ad7GjBZ7ZP7QPd .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-J1Ad7GjBZ7ZP7QPd .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-J1Ad7GjBZ7ZP7QPd .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-J1Ad7GjBZ7ZP7QPd .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-J1Ad7GjBZ7ZP7QPd .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-J1Ad7GjBZ7ZP7QPd .marker{fill:#333333;stroke:#333333;}#mermaid-svg-J1Ad7GjBZ7ZP7QPd .marker.cross{stroke:#333333;}#mermaid-svg-J1Ad7GjBZ7ZP7QPd svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-J1Ad7GjBZ7ZP7QPd p{margin:0;}#mermaid-svg-J1Ad7GjBZ7ZP7QPd .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-J1Ad7GjBZ7ZP7QPd .cluster-label text{fill:#333;}#mermaid-svg-J1Ad7GjBZ7ZP7QPd .cluster-label span{color:#333;}#mermaid-svg-J1Ad7GjBZ7ZP7QPd .cluster-label span p{background-color:transparent;}#mermaid-svg-J1Ad7GjBZ7ZP7QPd .label text,#mermaid-svg-J1Ad7GjBZ7ZP7QPd span{fill:#333;color:#333;}#mermaid-svg-J1Ad7GjBZ7ZP7QPd .node rect,#mermaid-svg-J1Ad7GjBZ7ZP7QPd .node circle,#mermaid-svg-J1Ad7GjBZ7ZP7QPd .node ellipse,#mermaid-svg-J1Ad7GjBZ7ZP7QPd .node polygon,#mermaid-svg-J1Ad7GjBZ7ZP7QPd .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-J1Ad7GjBZ7ZP7QPd .rough-node .label text,#mermaid-svg-J1Ad7GjBZ7ZP7QPd .node .label text,#mermaid-svg-J1Ad7GjBZ7ZP7QPd .image-shape .label,#mermaid-svg-J1Ad7GjBZ7ZP7QPd .icon-shape .label{text-anchor:middle;}#mermaid-svg-J1Ad7GjBZ7ZP7QPd .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-J1Ad7GjBZ7ZP7QPd .rough-node .label,#mermaid-svg-J1Ad7GjBZ7ZP7QPd .node .label,#mermaid-svg-J1Ad7GjBZ7ZP7QPd .image-shape .label,#mermaid-svg-J1Ad7GjBZ7ZP7QPd .icon-shape .label{text-align:center;}#mermaid-svg-J1Ad7GjBZ7ZP7QPd .node.clickable{cursor:pointer;}#mermaid-svg-J1Ad7GjBZ7ZP7QPd .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-J1Ad7GjBZ7ZP7QPd .arrowheadPath{fill:#333333;}#mermaid-svg-J1Ad7GjBZ7ZP7QPd .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-J1Ad7GjBZ7ZP7QPd .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-J1Ad7GjBZ7ZP7QPd .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-J1Ad7GjBZ7ZP7QPd .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-J1Ad7GjBZ7ZP7QPd .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-J1Ad7GjBZ7ZP7QPd .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-J1Ad7GjBZ7ZP7QPd .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-J1Ad7GjBZ7ZP7QPd .cluster text{fill:#333;}#mermaid-svg-J1Ad7GjBZ7ZP7QPd .cluster span{color:#333;}#mermaid-svg-J1Ad7GjBZ7ZP7QPd div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-J1Ad7GjBZ7ZP7QPd .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-J1Ad7GjBZ7ZP7QPd rect.text{fill:none;stroke-width:0;}#mermaid-svg-J1Ad7GjBZ7ZP7QPd .icon-shape,#mermaid-svg-J1Ad7GjBZ7ZP7QPd .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-J1Ad7GjBZ7ZP7QPd .icon-shape p,#mermaid-svg-J1Ad7GjBZ7ZP7QPd .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-J1Ad7GjBZ7ZP7QPd .icon-shape .label rect,#mermaid-svg-J1Ad7GjBZ7ZP7QPd .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-J1Ad7GjBZ7ZP7QPd .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-J1Ad7GjBZ7ZP7QPd .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-J1Ad7GjBZ7ZP7QPd :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} W 权重
观察分布
计算 Scale
量化

但是输入 XXX 可能每次都不同,于是 Activation=f(X)Activation = f(X)Activation=f(X) 不同输入产生不同 Activation 分布。例如:
#mermaid-svg-lFaQnQNTrFHurpjM{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-lFaQnQNTrFHurpjM .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-lFaQnQNTrFHurpjM .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-lFaQnQNTrFHurpjM .error-icon{fill:#552222;}#mermaid-svg-lFaQnQNTrFHurpjM .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-lFaQnQNTrFHurpjM .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-lFaQnQNTrFHurpjM .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-lFaQnQNTrFHurpjM .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-lFaQnQNTrFHurpjM .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-lFaQnQNTrFHurpjM .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-lFaQnQNTrFHurpjM .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-lFaQnQNTrFHurpjM .marker{fill:#333333;stroke:#333333;}#mermaid-svg-lFaQnQNTrFHurpjM .marker.cross{stroke:#333333;}#mermaid-svg-lFaQnQNTrFHurpjM svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-lFaQnQNTrFHurpjM p{margin:0;}#mermaid-svg-lFaQnQNTrFHurpjM .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-lFaQnQNTrFHurpjM .cluster-label text{fill:#333;}#mermaid-svg-lFaQnQNTrFHurpjM .cluster-label span{color:#333;}#mermaid-svg-lFaQnQNTrFHurpjM .cluster-label span p{background-color:transparent;}#mermaid-svg-lFaQnQNTrFHurpjM .label text,#mermaid-svg-lFaQnQNTrFHurpjM span{fill:#333;color:#333;}#mermaid-svg-lFaQnQNTrFHurpjM .node rect,#mermaid-svg-lFaQnQNTrFHurpjM .node circle,#mermaid-svg-lFaQnQNTrFHurpjM .node ellipse,#mermaid-svg-lFaQnQNTrFHurpjM .node polygon,#mermaid-svg-lFaQnQNTrFHurpjM .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-lFaQnQNTrFHurpjM .rough-node .label text,#mermaid-svg-lFaQnQNTrFHurpjM .node .label text,#mermaid-svg-lFaQnQNTrFHurpjM .image-shape .label,#mermaid-svg-lFaQnQNTrFHurpjM .icon-shape .label{text-anchor:middle;}#mermaid-svg-lFaQnQNTrFHurpjM .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-lFaQnQNTrFHurpjM .rough-node .label,#mermaid-svg-lFaQnQNTrFHurpjM .node .label,#mermaid-svg-lFaQnQNTrFHurpjM .image-shape .label,#mermaid-svg-lFaQnQNTrFHurpjM .icon-shape .label{text-align:center;}#mermaid-svg-lFaQnQNTrFHurpjM .node.clickable{cursor:pointer;}#mermaid-svg-lFaQnQNTrFHurpjM .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-lFaQnQNTrFHurpjM .arrowheadPath{fill:#333333;}#mermaid-svg-lFaQnQNTrFHurpjM .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-lFaQnQNTrFHurpjM .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-lFaQnQNTrFHurpjM .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-lFaQnQNTrFHurpjM .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-lFaQnQNTrFHurpjM .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-lFaQnQNTrFHurpjM .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-lFaQnQNTrFHurpjM .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-lFaQnQNTrFHurpjM .cluster text{fill:#333;}#mermaid-svg-lFaQnQNTrFHurpjM .cluster span{color:#333;}#mermaid-svg-lFaQnQNTrFHurpjM div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-lFaQnQNTrFHurpjM .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-lFaQnQNTrFHurpjM rect.text{fill:none;stroke-width:0;}#mermaid-svg-lFaQnQNTrFHurpjM .icon-shape,#mermaid-svg-lFaQnQNTrFHurpjM .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-lFaQnQNTrFHurpjM .icon-shape p,#mermaid-svg-lFaQnQNTrFHurpjM .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-lFaQnQNTrFHurpjM .icon-shape .label rect,#mermaid-svg-lFaQnQNTrFHurpjM .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-lFaQnQNTrFHurpjM .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-lFaQnQNTrFHurpjM .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-lFaQnQNTrFHurpjM :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 输入 A
Activation 范围 -1, 1
输入 B
Activation 范围 -20, 30

如果使用同一个量化范围,某些小数值就可能丢失很多精度。所以:

Activation Quantization 通常比单纯的 Weight Quantization 困难。

这也是为什么很多 LLM 量化方案会先从 W4A16W4A16W4A16 这样的 Weight-only Quantization 开始。

不过,即使暂时不量化 Activation,我们迟早也要面对一个问题:Activation 的范围既然会随输入变化,那到底该用什么范围去量化它? 权重是固定的,随时都能拿出来统计分布;可 Activation 只有在模型真正"跑起来"、有数据经过时才会出现。要给它定一个合理的量化范围,就得先想办法把这个范围"摸清楚"。这正是下一节要引入 Calibration 的原因。


3.10 什么是 Calibration?

先打一个比方。假设你要给一条经常涨落的河修一道防洪堤,堤该修多高?你不会拍脑袋决定,而是先观察这条河一段时间------看看平时水位在哪、雨季能涨到多高,再据此定堤的高度。Activation 的量化范围也是同样的道理:它随输入不断变化,我们没法凭空指定,只能先"让模型跑一批有代表性的数据、在旁边观察它的数值通常落在什么区间",再据此确定量化范围。这个"先跑数据、摸清数值范围"的过程,就是 Calibration(校准)

需要强调的是:权重是固定的,本身并不需要 Calibration------它随时都能直接统计分布。Calibration 主要是为了解决上一节提到的 Activation 难题:给那些随输入变化的数值找到一个合理的量化范围。

更正式地说,Calibration 可以理解成:

用一小批具有代表性的数据,让模型跑一遍,从中观察激活的数值分布,为量化参数提供依据。

3.10.1 Calibration 不等于训练

这一点非常重要。Calibration 的过程是:
#mermaid-svg-cvcf1GlMbvc16MWu{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-cvcf1GlMbvc16MWu .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-cvcf1GlMbvc16MWu .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-cvcf1GlMbvc16MWu .error-icon{fill:#552222;}#mermaid-svg-cvcf1GlMbvc16MWu .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-cvcf1GlMbvc16MWu .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-cvcf1GlMbvc16MWu .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-cvcf1GlMbvc16MWu .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-cvcf1GlMbvc16MWu .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-cvcf1GlMbvc16MWu .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-cvcf1GlMbvc16MWu .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-cvcf1GlMbvc16MWu .marker{fill:#333333;stroke:#333333;}#mermaid-svg-cvcf1GlMbvc16MWu .marker.cross{stroke:#333333;}#mermaid-svg-cvcf1GlMbvc16MWu svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-cvcf1GlMbvc16MWu p{margin:0;}#mermaid-svg-cvcf1GlMbvc16MWu .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-cvcf1GlMbvc16MWu .cluster-label text{fill:#333;}#mermaid-svg-cvcf1GlMbvc16MWu .cluster-label span{color:#333;}#mermaid-svg-cvcf1GlMbvc16MWu .cluster-label span p{background-color:transparent;}#mermaid-svg-cvcf1GlMbvc16MWu .label text,#mermaid-svg-cvcf1GlMbvc16MWu span{fill:#333;color:#333;}#mermaid-svg-cvcf1GlMbvc16MWu .node rect,#mermaid-svg-cvcf1GlMbvc16MWu .node circle,#mermaid-svg-cvcf1GlMbvc16MWu .node ellipse,#mermaid-svg-cvcf1GlMbvc16MWu .node polygon,#mermaid-svg-cvcf1GlMbvc16MWu .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-cvcf1GlMbvc16MWu .rough-node .label text,#mermaid-svg-cvcf1GlMbvc16MWu .node .label text,#mermaid-svg-cvcf1GlMbvc16MWu .image-shape .label,#mermaid-svg-cvcf1GlMbvc16MWu .icon-shape .label{text-anchor:middle;}#mermaid-svg-cvcf1GlMbvc16MWu .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-cvcf1GlMbvc16MWu .rough-node .label,#mermaid-svg-cvcf1GlMbvc16MWu .node .label,#mermaid-svg-cvcf1GlMbvc16MWu .image-shape .label,#mermaid-svg-cvcf1GlMbvc16MWu .icon-shape .label{text-align:center;}#mermaid-svg-cvcf1GlMbvc16MWu .node.clickable{cursor:pointer;}#mermaid-svg-cvcf1GlMbvc16MWu .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-cvcf1GlMbvc16MWu .arrowheadPath{fill:#333333;}#mermaid-svg-cvcf1GlMbvc16MWu .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-cvcf1GlMbvc16MWu .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-cvcf1GlMbvc16MWu .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-cvcf1GlMbvc16MWu .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-cvcf1GlMbvc16MWu .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-cvcf1GlMbvc16MWu .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-cvcf1GlMbvc16MWu .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-cvcf1GlMbvc16MWu .cluster text{fill:#333;}#mermaid-svg-cvcf1GlMbvc16MWu .cluster span{color:#333;}#mermaid-svg-cvcf1GlMbvc16MWu div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-cvcf1GlMbvc16MWu .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-cvcf1GlMbvc16MWu rect.text{fill:none;stroke-width:0;}#mermaid-svg-cvcf1GlMbvc16MWu .icon-shape,#mermaid-svg-cvcf1GlMbvc16MWu .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-cvcf1GlMbvc16MWu .icon-shape p,#mermaid-svg-cvcf1GlMbvc16MWu .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-cvcf1GlMbvc16MWu .icon-shape .label rect,#mermaid-svg-cvcf1GlMbvc16MWu .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-cvcf1GlMbvc16MWu .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-cvcf1GlMbvc16MWu .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-cvcf1GlMbvc16MWu :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 模型
输入少量样本
Forward
统计数值范围/分布
计算量化参数

通常不进行正常意义上的大规模参数更新。也就是说,梯度下降(Gradient descent)不是 Calibration 的核心。


3.11 需要 Calibration Dataset 的原因

假设一个激活张量 AAA,我们不知道它真实的典型范围。于是准备一些代表性输入(样本 1、样本 2、......、样本 N),让模型运行这些数据:
#mermaid-svg-9DJkJaUZROtvcmKH{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-9DJkJaUZROtvcmKH .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-9DJkJaUZROtvcmKH .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-9DJkJaUZROtvcmKH .error-icon{fill:#552222;}#mermaid-svg-9DJkJaUZROtvcmKH .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-9DJkJaUZROtvcmKH .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-9DJkJaUZROtvcmKH .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-9DJkJaUZROtvcmKH .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-9DJkJaUZROtvcmKH .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-9DJkJaUZROtvcmKH .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-9DJkJaUZROtvcmKH .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-9DJkJaUZROtvcmKH .marker{fill:#333333;stroke:#333333;}#mermaid-svg-9DJkJaUZROtvcmKH .marker.cross{stroke:#333333;}#mermaid-svg-9DJkJaUZROtvcmKH svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-9DJkJaUZROtvcmKH p{margin:0;}#mermaid-svg-9DJkJaUZROtvcmKH .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-9DJkJaUZROtvcmKH .cluster-label text{fill:#333;}#mermaid-svg-9DJkJaUZROtvcmKH .cluster-label span{color:#333;}#mermaid-svg-9DJkJaUZROtvcmKH .cluster-label span p{background-color:transparent;}#mermaid-svg-9DJkJaUZROtvcmKH .label text,#mermaid-svg-9DJkJaUZROtvcmKH span{fill:#333;color:#333;}#mermaid-svg-9DJkJaUZROtvcmKH .node rect,#mermaid-svg-9DJkJaUZROtvcmKH .node circle,#mermaid-svg-9DJkJaUZROtvcmKH .node ellipse,#mermaid-svg-9DJkJaUZROtvcmKH .node polygon,#mermaid-svg-9DJkJaUZROtvcmKH .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-9DJkJaUZROtvcmKH .rough-node .label text,#mermaid-svg-9DJkJaUZROtvcmKH .node .label text,#mermaid-svg-9DJkJaUZROtvcmKH .image-shape .label,#mermaid-svg-9DJkJaUZROtvcmKH .icon-shape .label{text-anchor:middle;}#mermaid-svg-9DJkJaUZROtvcmKH .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-9DJkJaUZROtvcmKH .rough-node .label,#mermaid-svg-9DJkJaUZROtvcmKH .node .label,#mermaid-svg-9DJkJaUZROtvcmKH .image-shape .label,#mermaid-svg-9DJkJaUZROtvcmKH .icon-shape .label{text-align:center;}#mermaid-svg-9DJkJaUZROtvcmKH .node.clickable{cursor:pointer;}#mermaid-svg-9DJkJaUZROtvcmKH .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-9DJkJaUZROtvcmKH .arrowheadPath{fill:#333333;}#mermaid-svg-9DJkJaUZROtvcmKH .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-9DJkJaUZROtvcmKH .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-9DJkJaUZROtvcmKH .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-9DJkJaUZROtvcmKH .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-9DJkJaUZROtvcmKH .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-9DJkJaUZROtvcmKH .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-9DJkJaUZROtvcmKH .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-9DJkJaUZROtvcmKH .cluster text{fill:#333;}#mermaid-svg-9DJkJaUZROtvcmKH .cluster span{color:#333;}#mermaid-svg-9DJkJaUZROtvcmKH div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-9DJkJaUZROtvcmKH .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-9DJkJaUZROtvcmKH rect.text{fill:none;stroke-width:0;}#mermaid-svg-9DJkJaUZROtvcmKH .icon-shape,#mermaid-svg-9DJkJaUZROtvcmKH .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-9DJkJaUZROtvcmKH .icon-shape p,#mermaid-svg-9DJkJaUZROtvcmKH .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-9DJkJaUZROtvcmKH .icon-shape .label rect,#mermaid-svg-9DJkJaUZROtvcmKH .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-9DJkJaUZROtvcmKH .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-9DJkJaUZROtvcmKH .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-9DJkJaUZROtvcmKH :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Calibration Dataset
Model
Activation
统计范围
Scale

这样可以估计:真实业务输入下,Activation 大概会出现什么样的数值。

3.11.1 Calibration Dataset 不需要很大吗?

不一定。Calibration 的目的不是"把模型重新训练一遍",它只是"让量化器看到一些具有代表性的输入",所以通常不需要达到训练数据集那种规模。

但这里存在一个非常重要的问题:Calibration 数据如果与真实业务分布严重不一致,量化效果可能受到影响。 例如真实业务是中文技术问答,Calibration 却用纯英文小说,那么量化器观察到的激活分布可能无法很好地代表真实业务。所以:Calibration 数据的代表性非常重要。


3.12 PTQ 的基本工作流程

现在可以把前面的概念串起来。一个非常典型的 PTQ 流程可以抽象成:
#mermaid-svg-vE934ikOwQ1SiU1s{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-vE934ikOwQ1SiU1s .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-vE934ikOwQ1SiU1s .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-vE934ikOwQ1SiU1s .error-icon{fill:#552222;}#mermaid-svg-vE934ikOwQ1SiU1s .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-vE934ikOwQ1SiU1s .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-vE934ikOwQ1SiU1s .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-vE934ikOwQ1SiU1s .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-vE934ikOwQ1SiU1s .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-vE934ikOwQ1SiU1s .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-vE934ikOwQ1SiU1s .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-vE934ikOwQ1SiU1s .marker{fill:#333333;stroke:#333333;}#mermaid-svg-vE934ikOwQ1SiU1s .marker.cross{stroke:#333333;}#mermaid-svg-vE934ikOwQ1SiU1s svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-vE934ikOwQ1SiU1s p{margin:0;}#mermaid-svg-vE934ikOwQ1SiU1s .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-vE934ikOwQ1SiU1s .cluster-label text{fill:#333;}#mermaid-svg-vE934ikOwQ1SiU1s .cluster-label span{color:#333;}#mermaid-svg-vE934ikOwQ1SiU1s .cluster-label span p{background-color:transparent;}#mermaid-svg-vE934ikOwQ1SiU1s .label text,#mermaid-svg-vE934ikOwQ1SiU1s span{fill:#333;color:#333;}#mermaid-svg-vE934ikOwQ1SiU1s .node rect,#mermaid-svg-vE934ikOwQ1SiU1s .node circle,#mermaid-svg-vE934ikOwQ1SiU1s .node ellipse,#mermaid-svg-vE934ikOwQ1SiU1s .node polygon,#mermaid-svg-vE934ikOwQ1SiU1s .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-vE934ikOwQ1SiU1s .rough-node .label text,#mermaid-svg-vE934ikOwQ1SiU1s .node .label text,#mermaid-svg-vE934ikOwQ1SiU1s .image-shape .label,#mermaid-svg-vE934ikOwQ1SiU1s .icon-shape .label{text-anchor:middle;}#mermaid-svg-vE934ikOwQ1SiU1s .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-vE934ikOwQ1SiU1s .rough-node .label,#mermaid-svg-vE934ikOwQ1SiU1s .node .label,#mermaid-svg-vE934ikOwQ1SiU1s .image-shape .label,#mermaid-svg-vE934ikOwQ1SiU1s .icon-shape .label{text-align:center;}#mermaid-svg-vE934ikOwQ1SiU1s .node.clickable{cursor:pointer;}#mermaid-svg-vE934ikOwQ1SiU1s .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-vE934ikOwQ1SiU1s .arrowheadPath{fill:#333333;}#mermaid-svg-vE934ikOwQ1SiU1s .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-vE934ikOwQ1SiU1s .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-vE934ikOwQ1SiU1s .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-vE934ikOwQ1SiU1s .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-vE934ikOwQ1SiU1s .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-vE934ikOwQ1SiU1s .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-vE934ikOwQ1SiU1s .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-vE934ikOwQ1SiU1s .cluster text{fill:#333;}#mermaid-svg-vE934ikOwQ1SiU1s .cluster span{color:#333;}#mermaid-svg-vE934ikOwQ1SiU1s div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-vE934ikOwQ1SiU1s .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-vE934ikOwQ1SiU1s rect.text{fill:none;stroke-width:0;}#mermaid-svg-vE934ikOwQ1SiU1s .icon-shape,#mermaid-svg-vE934ikOwQ1SiU1s .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-vE934ikOwQ1SiU1s .icon-shape p,#mermaid-svg-vE934ikOwQ1SiU1s .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-vE934ikOwQ1SiU1s .icon-shape .label rect,#mermaid-svg-vE934ikOwQ1SiU1s .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-vE934ikOwQ1SiU1s .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-vE934ikOwQ1SiU1s .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-vE934ikOwQ1SiU1s :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 训练完成的 FP16 LLM
准备 Calibration Data
收集权重/激活信息
计算 Quantization Parameters
Quantization
INT8 / INT4 Model
推理

其中最关键的两个阶段------CalibrationQuantization------是后续很多量化算法的基础。


3.13 一个最简单的 PTQ 实验

这一节我们先不使用 GPTQ 和 AWQ。目的只有一个:

用一个小模型实际体验"训练完成 → 量化 → 推理"的基本流程。

为了减少环境要求,我们可以先用 Hugging Face Transformers 的简单量化能力做演示,例如选择一个较小的语言模型。

3.13.1 安装环境

bash 复制代码
pip install torch transformers

如果后续使用特定量化后端,还需要额外安装对应依赖。注意:实际可用的量化 API 会随着 Transformers、PyTorch 和具体量化后端版本变化。本章的重点不是绑定某一个工具版本,而是先理解 PTQ 的工程流程。


3.14 加载一个 FP16 模型

示意代码:

python 复制代码
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM


model_name = "your-model"

tokenizer = AutoTokenizer.from_pretrained(model_name)

model = AutoModelForCausalLM.from_pretrained(
    model_name,
    torch_dtype=torch.float16,
    device_map="auto",
)

这里得到的是一个加载到 GPU 上的 FP16 Hugging Face 模型:
#mermaid-svg-ATVEqMd0Yuk8hoFU{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ATVEqMd0Yuk8hoFU .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ATVEqMd0Yuk8hoFU .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ATVEqMd0Yuk8hoFU .error-icon{fill:#552222;}#mermaid-svg-ATVEqMd0Yuk8hoFU .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ATVEqMd0Yuk8hoFU .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ATVEqMd0Yuk8hoFU .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ATVEqMd0Yuk8hoFU .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ATVEqMd0Yuk8hoFU .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ATVEqMd0Yuk8hoFU .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ATVEqMd0Yuk8hoFU .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ATVEqMd0Yuk8hoFU .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ATVEqMd0Yuk8hoFU .marker.cross{stroke:#333333;}#mermaid-svg-ATVEqMd0Yuk8hoFU svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ATVEqMd0Yuk8hoFU p{margin:0;}#mermaid-svg-ATVEqMd0Yuk8hoFU .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-ATVEqMd0Yuk8hoFU .cluster-label text{fill:#333;}#mermaid-svg-ATVEqMd0Yuk8hoFU .cluster-label span{color:#333;}#mermaid-svg-ATVEqMd0Yuk8hoFU .cluster-label span p{background-color:transparent;}#mermaid-svg-ATVEqMd0Yuk8hoFU .label text,#mermaid-svg-ATVEqMd0Yuk8hoFU span{fill:#333;color:#333;}#mermaid-svg-ATVEqMd0Yuk8hoFU .node rect,#mermaid-svg-ATVEqMd0Yuk8hoFU .node circle,#mermaid-svg-ATVEqMd0Yuk8hoFU .node ellipse,#mermaid-svg-ATVEqMd0Yuk8hoFU .node polygon,#mermaid-svg-ATVEqMd0Yuk8hoFU .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ATVEqMd0Yuk8hoFU .rough-node .label text,#mermaid-svg-ATVEqMd0Yuk8hoFU .node .label text,#mermaid-svg-ATVEqMd0Yuk8hoFU .image-shape .label,#mermaid-svg-ATVEqMd0Yuk8hoFU .icon-shape .label{text-anchor:middle;}#mermaid-svg-ATVEqMd0Yuk8hoFU .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-ATVEqMd0Yuk8hoFU .rough-node .label,#mermaid-svg-ATVEqMd0Yuk8hoFU .node .label,#mermaid-svg-ATVEqMd0Yuk8hoFU .image-shape .label,#mermaid-svg-ATVEqMd0Yuk8hoFU .icon-shape .label{text-align:center;}#mermaid-svg-ATVEqMd0Yuk8hoFU .node.clickable{cursor:pointer;}#mermaid-svg-ATVEqMd0Yuk8hoFU .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-ATVEqMd0Yuk8hoFU .arrowheadPath{fill:#333333;}#mermaid-svg-ATVEqMd0Yuk8hoFU .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ATVEqMd0Yuk8hoFU .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ATVEqMd0Yuk8hoFU .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ATVEqMd0Yuk8hoFU .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-ATVEqMd0Yuk8hoFU .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ATVEqMd0Yuk8hoFU .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-ATVEqMd0Yuk8hoFU .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ATVEqMd0Yuk8hoFU .cluster text{fill:#333;}#mermaid-svg-ATVEqMd0Yuk8hoFU .cluster span{color:#333;}#mermaid-svg-ATVEqMd0Yuk8hoFU div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ATVEqMd0Yuk8hoFU .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-ATVEqMd0Yuk8hoFU rect.text{fill:none;stroke-width:0;}#mermaid-svg-ATVEqMd0Yuk8hoFU .icon-shape,#mermaid-svg-ATVEqMd0Yuk8hoFU .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ATVEqMd0Yuk8hoFU .icon-shape p,#mermaid-svg-ATVEqMd0Yuk8hoFU .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-ATVEqMd0Yuk8hoFU .icon-shape .label rect,#mermaid-svg-ATVEqMd0Yuk8hoFU .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ATVEqMd0Yuk8hoFU .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-ATVEqMd0Yuk8hoFU .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-ATVEqMd0Yuk8hoFU :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Hugging Face Model
FP16
GPU

3.14.1 测量显存

python 复制代码
if torch.cuda.is_available():
    torch.cuda.reset_peak_memory_stats()

    print(
        "Allocated:",
        torch.cuda.memory_allocated() / 1024**3,
        "GB"
    )

    print(
        "Reserved:",
        torch.cuda.memory_reserved() / 1024**3,
        "GB"
    )

为了观察峰值:

python 复制代码
if torch.cuda.is_available():
    print(
        "Peak memory:",
        torch.cuda.max_memory_allocated() / 1024**3,
        "GB"
    )

注意区分 allocatedreservedmax_memory_allocated,它们含义不同。


3.15 一个非常简单的 INT8 权重量化演示

真正的 LLM PTQ 比下面复杂很多,这里只是为了理解流程。假设有一个权重:

python 复制代码
import torch

W = torch.randn(8, 8)

先计算最大绝对值:

python 复制代码
qmax = 127

scale = W.abs().max() / qmax

量化:

python 复制代码
W_q = torch.round(W / scale).to(torch.int8)

恢复:

python 复制代码
W_hat = W_q.float() * scale

然后计算误差:

python 复制代码
error = (W - W_hat).abs().mean()

print("Mean absolute error:", error.item())

这和第二章我们手写量化器的逻辑完全一致。区别在于:第二章量化的是一个普通 Tensor,而真正的 LLM PTQ 需要对大量 Linear Layer、Embedding、Attention/MLP 等参数进行系统化处理,并且要考虑具体推理硬件如何真正执行这些低比特权重。


3.16 "简单 Round()"远远不够

到这里,我们可能会问:如果只需要 Scale + Round,为什么还会有 GPTQ、AWQ 这么复杂的方法?

原因是:量化误差并不一定对模型输出造成相同的影响。
#mermaid-svg-mTnSTVjj3giNUPwA{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-mTnSTVjj3giNUPwA .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-mTnSTVjj3giNUPwA .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-mTnSTVjj3giNUPwA .error-icon{fill:#552222;}#mermaid-svg-mTnSTVjj3giNUPwA .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-mTnSTVjj3giNUPwA .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-mTnSTVjj3giNUPwA .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-mTnSTVjj3giNUPwA .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-mTnSTVjj3giNUPwA .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-mTnSTVjj3giNUPwA .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-mTnSTVjj3giNUPwA .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-mTnSTVjj3giNUPwA .marker{fill:#333333;stroke:#333333;}#mermaid-svg-mTnSTVjj3giNUPwA .marker.cross{stroke:#333333;}#mermaid-svg-mTnSTVjj3giNUPwA svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-mTnSTVjj3giNUPwA p{margin:0;}#mermaid-svg-mTnSTVjj3giNUPwA .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-mTnSTVjj3giNUPwA .cluster-label text{fill:#333;}#mermaid-svg-mTnSTVjj3giNUPwA .cluster-label span{color:#333;}#mermaid-svg-mTnSTVjj3giNUPwA .cluster-label span p{background-color:transparent;}#mermaid-svg-mTnSTVjj3giNUPwA .label text,#mermaid-svg-mTnSTVjj3giNUPwA span{fill:#333;color:#333;}#mermaid-svg-mTnSTVjj3giNUPwA .node rect,#mermaid-svg-mTnSTVjj3giNUPwA .node circle,#mermaid-svg-mTnSTVjj3giNUPwA .node ellipse,#mermaid-svg-mTnSTVjj3giNUPwA .node polygon,#mermaid-svg-mTnSTVjj3giNUPwA .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-mTnSTVjj3giNUPwA .rough-node .label text,#mermaid-svg-mTnSTVjj3giNUPwA .node .label text,#mermaid-svg-mTnSTVjj3giNUPwA .image-shape .label,#mermaid-svg-mTnSTVjj3giNUPwA .icon-shape .label{text-anchor:middle;}#mermaid-svg-mTnSTVjj3giNUPwA .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-mTnSTVjj3giNUPwA .rough-node .label,#mermaid-svg-mTnSTVjj3giNUPwA .node .label,#mermaid-svg-mTnSTVjj3giNUPwA .image-shape .label,#mermaid-svg-mTnSTVjj3giNUPwA .icon-shape .label{text-align:center;}#mermaid-svg-mTnSTVjj3giNUPwA .node.clickable{cursor:pointer;}#mermaid-svg-mTnSTVjj3giNUPwA .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-mTnSTVjj3giNUPwA .arrowheadPath{fill:#333333;}#mermaid-svg-mTnSTVjj3giNUPwA .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-mTnSTVjj3giNUPwA .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-mTnSTVjj3giNUPwA .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-mTnSTVjj3giNUPwA .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-mTnSTVjj3giNUPwA .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-mTnSTVjj3giNUPwA .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-mTnSTVjj3giNUPwA .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-mTnSTVjj3giNUPwA .cluster text{fill:#333;}#mermaid-svg-mTnSTVjj3giNUPwA .cluster span{color:#333;}#mermaid-svg-mTnSTVjj3giNUPwA div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-mTnSTVjj3giNUPwA .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-mTnSTVjj3giNUPwA rect.text{fill:none;stroke-width:0;}#mermaid-svg-mTnSTVjj3giNUPwA .icon-shape,#mermaid-svg-mTnSTVjj3giNUPwA .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-mTnSTVjj3giNUPwA .icon-shape p,#mermaid-svg-mTnSTVjj3giNUPwA .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-mTnSTVjj3giNUPwA .icon-shape .label rect,#mermaid-svg-mTnSTVjj3giNUPwA .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-mTnSTVjj3giNUPwA .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-mTnSTVjj3giNUPwA .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-mTnSTVjj3giNUPwA :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 权重 A
误差很大
但模型影响很小
权重 B
误差很小
但模型影响很大

也就是说:不同权重的重要程度可能不同。 因此,一个好的 LLM 量化算法,不应该只是"让每个权重数值尽可能接近原值",而应该进一步考虑:

哪些误差会真正影响模型输出?

这正是 GPTQ、AWQ 等算法值得研究的原因。


3.17 从普通 PTQ 走向 GPTQ

现在可以把量化方法的发展理解成这样:
#mermaid-svg-lQer8IqxkmJhwDjg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-lQer8IqxkmJhwDjg .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-lQer8IqxkmJhwDjg .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-lQer8IqxkmJhwDjg .error-icon{fill:#552222;}#mermaid-svg-lQer8IqxkmJhwDjg .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-lQer8IqxkmJhwDjg .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-lQer8IqxkmJhwDjg .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-lQer8IqxkmJhwDjg .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-lQer8IqxkmJhwDjg .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-lQer8IqxkmJhwDjg .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-lQer8IqxkmJhwDjg .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-lQer8IqxkmJhwDjg .marker{fill:#333333;stroke:#333333;}#mermaid-svg-lQer8IqxkmJhwDjg .marker.cross{stroke:#333333;}#mermaid-svg-lQer8IqxkmJhwDjg svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-lQer8IqxkmJhwDjg p{margin:0;}#mermaid-svg-lQer8IqxkmJhwDjg .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-lQer8IqxkmJhwDjg .cluster-label text{fill:#333;}#mermaid-svg-lQer8IqxkmJhwDjg .cluster-label span{color:#333;}#mermaid-svg-lQer8IqxkmJhwDjg .cluster-label span p{background-color:transparent;}#mermaid-svg-lQer8IqxkmJhwDjg .label text,#mermaid-svg-lQer8IqxkmJhwDjg span{fill:#333;color:#333;}#mermaid-svg-lQer8IqxkmJhwDjg .node rect,#mermaid-svg-lQer8IqxkmJhwDjg .node circle,#mermaid-svg-lQer8IqxkmJhwDjg .node ellipse,#mermaid-svg-lQer8IqxkmJhwDjg .node polygon,#mermaid-svg-lQer8IqxkmJhwDjg .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-lQer8IqxkmJhwDjg .rough-node .label text,#mermaid-svg-lQer8IqxkmJhwDjg .node .label text,#mermaid-svg-lQer8IqxkmJhwDjg .image-shape .label,#mermaid-svg-lQer8IqxkmJhwDjg .icon-shape .label{text-anchor:middle;}#mermaid-svg-lQer8IqxkmJhwDjg .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-lQer8IqxkmJhwDjg .rough-node .label,#mermaid-svg-lQer8IqxkmJhwDjg .node .label,#mermaid-svg-lQer8IqxkmJhwDjg .image-shape .label,#mermaid-svg-lQer8IqxkmJhwDjg .icon-shape .label{text-align:center;}#mermaid-svg-lQer8IqxkmJhwDjg .node.clickable{cursor:pointer;}#mermaid-svg-lQer8IqxkmJhwDjg .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-lQer8IqxkmJhwDjg .arrowheadPath{fill:#333333;}#mermaid-svg-lQer8IqxkmJhwDjg .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-lQer8IqxkmJhwDjg .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-lQer8IqxkmJhwDjg .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-lQer8IqxkmJhwDjg .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-lQer8IqxkmJhwDjg .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-lQer8IqxkmJhwDjg .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-lQer8IqxkmJhwDjg .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-lQer8IqxkmJhwDjg .cluster text{fill:#333;}#mermaid-svg-lQer8IqxkmJhwDjg .cluster span{color:#333;}#mermaid-svg-lQer8IqxkmJhwDjg div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-lQer8IqxkmJhwDjg .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-lQer8IqxkmJhwDjg rect.text{fill:none;stroke-width:0;}#mermaid-svg-lQer8IqxkmJhwDjg .icon-shape,#mermaid-svg-lQer8IqxkmJhwDjg .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-lQer8IqxkmJhwDjg .icon-shape p,#mermaid-svg-lQer8IqxkmJhwDjg .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-lQer8IqxkmJhwDjg .icon-shape .label rect,#mermaid-svg-lQer8IqxkmJhwDjg .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-lQer8IqxkmJhwDjg .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-lQer8IqxkmJhwDjg .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-lQer8IqxkmJhwDjg :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 最简单 PTQ
Scale + Round
发现误差可能影响模型行为
更聪明的误差优化
GPTQ

GPTQ 的核心目标之一,可以直观地理解成:在低比特限制下,让量化后的权重尽可能保持原模型的输出行为。 它不再单纯关心 W−W^W - \hat{W}W−W^,而会进一步考虑:怎样选择和调整量化误差,使整个 Layer 的输出变化更小。

在正式进入 GPTQ 这类算法之前,我们会先在下一章把"4-bit 到底意味着什么"讲清楚;之后的章节再展开 GPTQ、AWQ 等更聪明的量化方法。


3.18 PTQ 中最重要的三件事

学习到这里,可以把 PTQ 暂时浓缩成三个关键词:

  1. Weight --- 模型参数 WWW,通常是最直接的量化对象。
  2. Activation --- 中间激活 AAA,随输入变化,因此量化更加困难。
  3. Calibration --- 用代表性数据观察数值分布,为量化参数提供依据:

#mermaid-svg-pa8dbjQGSLRU4lUa{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-pa8dbjQGSLRU4lUa .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-pa8dbjQGSLRU4lUa .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-pa8dbjQGSLRU4lUa .error-icon{fill:#552222;}#mermaid-svg-pa8dbjQGSLRU4lUa .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-pa8dbjQGSLRU4lUa .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-pa8dbjQGSLRU4lUa .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-pa8dbjQGSLRU4lUa .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-pa8dbjQGSLRU4lUa .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-pa8dbjQGSLRU4lUa .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-pa8dbjQGSLRU4lUa .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-pa8dbjQGSLRU4lUa .marker{fill:#333333;stroke:#333333;}#mermaid-svg-pa8dbjQGSLRU4lUa .marker.cross{stroke:#333333;}#mermaid-svg-pa8dbjQGSLRU4lUa svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-pa8dbjQGSLRU4lUa p{margin:0;}#mermaid-svg-pa8dbjQGSLRU4lUa .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-pa8dbjQGSLRU4lUa .cluster-label text{fill:#333;}#mermaid-svg-pa8dbjQGSLRU4lUa .cluster-label span{color:#333;}#mermaid-svg-pa8dbjQGSLRU4lUa .cluster-label span p{background-color:transparent;}#mermaid-svg-pa8dbjQGSLRU4lUa .label text,#mermaid-svg-pa8dbjQGSLRU4lUa span{fill:#333;color:#333;}#mermaid-svg-pa8dbjQGSLRU4lUa .node rect,#mermaid-svg-pa8dbjQGSLRU4lUa .node circle,#mermaid-svg-pa8dbjQGSLRU4lUa .node ellipse,#mermaid-svg-pa8dbjQGSLRU4lUa .node polygon,#mermaid-svg-pa8dbjQGSLRU4lUa .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-pa8dbjQGSLRU4lUa .rough-node .label text,#mermaid-svg-pa8dbjQGSLRU4lUa .node .label text,#mermaid-svg-pa8dbjQGSLRU4lUa .image-shape .label,#mermaid-svg-pa8dbjQGSLRU4lUa .icon-shape .label{text-anchor:middle;}#mermaid-svg-pa8dbjQGSLRU4lUa .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-pa8dbjQGSLRU4lUa .rough-node .label,#mermaid-svg-pa8dbjQGSLRU4lUa .node .label,#mermaid-svg-pa8dbjQGSLRU4lUa .image-shape .label,#mermaid-svg-pa8dbjQGSLRU4lUa .icon-shape .label{text-align:center;}#mermaid-svg-pa8dbjQGSLRU4lUa .node.clickable{cursor:pointer;}#mermaid-svg-pa8dbjQGSLRU4lUa .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-pa8dbjQGSLRU4lUa .arrowheadPath{fill:#333333;}#mermaid-svg-pa8dbjQGSLRU4lUa .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-pa8dbjQGSLRU4lUa .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-pa8dbjQGSLRU4lUa .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-pa8dbjQGSLRU4lUa .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-pa8dbjQGSLRU4lUa .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-pa8dbjQGSLRU4lUa .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-pa8dbjQGSLRU4lUa .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-pa8dbjQGSLRU4lUa .cluster text{fill:#333;}#mermaid-svg-pa8dbjQGSLRU4lUa .cluster span{color:#333;}#mermaid-svg-pa8dbjQGSLRU4lUa div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-pa8dbjQGSLRU4lUa .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-pa8dbjQGSLRU4lUa rect.text{fill:none;stroke-width:0;}#mermaid-svg-pa8dbjQGSLRU4lUa .icon-shape,#mermaid-svg-pa8dbjQGSLRU4lUa .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-pa8dbjQGSLRU4lUa .icon-shape p,#mermaid-svg-pa8dbjQGSLRU4lUa .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-pa8dbjQGSLRU4lUa .icon-shape .label rect,#mermaid-svg-pa8dbjQGSLRU4lUa .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-pa8dbjQGSLRU4lUa .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-pa8dbjQGSLRU4lUa .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-pa8dbjQGSLRU4lUa :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Calibration Data
Model
Activation Statistics
Quantization Parameters

因此可以记住:

PTQ=Model+Calibration+Quantization\boxed{PTQ = Model + Calibration + Quantization}PTQ=Model+Calibration+Quantization


3.19 W4A16 如此常见的原因

再回到一个非常重要的问题:为什么很多 LLM 量化资料会不断出现 W4A16?因为它提供了一个非常直接的折中:
#mermaid-svg-z9bYDBgOr1pmYED4{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-z9bYDBgOr1pmYED4 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-z9bYDBgOr1pmYED4 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-z9bYDBgOr1pmYED4 .error-icon{fill:#552222;}#mermaid-svg-z9bYDBgOr1pmYED4 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-z9bYDBgOr1pmYED4 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-z9bYDBgOr1pmYED4 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-z9bYDBgOr1pmYED4 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-z9bYDBgOr1pmYED4 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-z9bYDBgOr1pmYED4 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-z9bYDBgOr1pmYED4 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-z9bYDBgOr1pmYED4 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-z9bYDBgOr1pmYED4 .marker.cross{stroke:#333333;}#mermaid-svg-z9bYDBgOr1pmYED4 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-z9bYDBgOr1pmYED4 p{margin:0;}#mermaid-svg-z9bYDBgOr1pmYED4 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-z9bYDBgOr1pmYED4 .cluster-label text{fill:#333;}#mermaid-svg-z9bYDBgOr1pmYED4 .cluster-label span{color:#333;}#mermaid-svg-z9bYDBgOr1pmYED4 .cluster-label span p{background-color:transparent;}#mermaid-svg-z9bYDBgOr1pmYED4 .label text,#mermaid-svg-z9bYDBgOr1pmYED4 span{fill:#333;color:#333;}#mermaid-svg-z9bYDBgOr1pmYED4 .node rect,#mermaid-svg-z9bYDBgOr1pmYED4 .node circle,#mermaid-svg-z9bYDBgOr1pmYED4 .node ellipse,#mermaid-svg-z9bYDBgOr1pmYED4 .node polygon,#mermaid-svg-z9bYDBgOr1pmYED4 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-z9bYDBgOr1pmYED4 .rough-node .label text,#mermaid-svg-z9bYDBgOr1pmYED4 .node .label text,#mermaid-svg-z9bYDBgOr1pmYED4 .image-shape .label,#mermaid-svg-z9bYDBgOr1pmYED4 .icon-shape .label{text-anchor:middle;}#mermaid-svg-z9bYDBgOr1pmYED4 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-z9bYDBgOr1pmYED4 .rough-node .label,#mermaid-svg-z9bYDBgOr1pmYED4 .node .label,#mermaid-svg-z9bYDBgOr1pmYED4 .image-shape .label,#mermaid-svg-z9bYDBgOr1pmYED4 .icon-shape .label{text-align:center;}#mermaid-svg-z9bYDBgOr1pmYED4 .node.clickable{cursor:pointer;}#mermaid-svg-z9bYDBgOr1pmYED4 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-z9bYDBgOr1pmYED4 .arrowheadPath{fill:#333333;}#mermaid-svg-z9bYDBgOr1pmYED4 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-z9bYDBgOr1pmYED4 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-z9bYDBgOr1pmYED4 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-z9bYDBgOr1pmYED4 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-z9bYDBgOr1pmYED4 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-z9bYDBgOr1pmYED4 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-z9bYDBgOr1pmYED4 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-z9bYDBgOr1pmYED4 .cluster text{fill:#333;}#mermaid-svg-z9bYDBgOr1pmYED4 .cluster span{color:#333;}#mermaid-svg-z9bYDBgOr1pmYED4 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-z9bYDBgOr1pmYED4 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-z9bYDBgOr1pmYED4 rect.text{fill:none;stroke-width:0;}#mermaid-svg-z9bYDBgOr1pmYED4 .icon-shape,#mermaid-svg-z9bYDBgOr1pmYED4 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-z9bYDBgOr1pmYED4 .icon-shape p,#mermaid-svg-z9bYDBgOr1pmYED4 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-z9bYDBgOr1pmYED4 .icon-shape .label rect,#mermaid-svg-z9bYDBgOr1pmYED4 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-z9bYDBgOr1pmYED4 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-z9bYDBgOr1pmYED4 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-z9bYDBgOr1pmYED4 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Weight → 4-bit
大幅降低模型存储
Activation → 16-bit
保持较高计算精度

因此:它重点解决"模型太大"的问题,同时避免把整个推理链路都压到极低精度。

当然,W4A16 并不是所有硬件、模型和任务下的最优方案。后面还会遇到 W8A8、FP8、INT4、NF4、混合精度这些方案。最终量化方案一定是算法 + 模型 + 硬件 + 推理框架共同决定的。


3.20 本章小结

本章真正完成了从"理解量化公式"到"理解如何给一个训练完成的 LLM 做量化"的过渡。最重要的知识点如下。

3.20.1 PTQ --- Post-Training Quantization\boxed{Post\text{-}Training\ Quantization}Post-Training Quantization,即训练完成之后再进行量化。流程:Train → FP Model → PTQ → Quantized Model。

3.20.2 QAT --- Quantization-Aware Training\boxed{Quantization\text{-}Aware\ Training}Quantization-Aware Training,即训练过程中模拟量化,让模型提前适应量化误差。简单对比:PTQ 是 Train → Quantize,QAT 是 Train + Fake Quant → Quantized Model

3.20.3 W4A16 --- Weight=4bit, Activation=16bit\boxed{Weight=4bit,\ Activation=16bit}Weight=4bit, Activation=16bit,重点压缩权重。

3.20.4 W8A8 --- Weight=8bit, Activation=8bit\boxed{Weight=8bit,\ Activation=8bit}Weight=8bit, Activation=8bit,同时量化权重 + 激活。

3.20.5 Calibration --- 使用少量具有代表性的输入数据,观察模型运行时的数值分布,为量化参数提供依据。它不是重新训练模型。

3.20.6 PTQ 最大的价值 --- 最核心的一句话:模型已经训练完成,不需要重新进行大规模训练,就可以尝试把 FP16/BF16 模型转换成 INT8/INT4 等低比特模型。这也是为什么 PTQ 在 LLM 部署中如此重要。


3.21 下一章:4-bit 到底意味着什么?

现在我们已经知道 FP16 Model → PTQ → Quantization 这条路径,也理解了 Weight-only Quantization 和 W4A16 这样的表示。但一个更基础的问题还没有真正讲透:

当我们说把模型量化到 4-bit 时,到底发生了什么?

4 bit 只有 16 个离散状态,这么少的取值,为什么还能表示原来范围很大的浮点权重?Scale、Group Size 在其中各起什么作用?W4A16 为什么是一个常见的折中?以及最关键的------4-bit 会带来多大的量化误差、代价在哪里?

这些问题将进入下一章:

第4章 LLM 4-bit 量化到底意味着什么?

我们会真正把"4-bit"这件事拆开来看:16 个离散状态、Scale 与 Group Size 的粒度权衡、W4A16 的含义,以及量化误差从何而来。理解了 4-bit 的本质之后,才能继续往下看更聪明的量化算法------从第 5 章开始,我们会进入 GPTQ、AWQ,去回答一个更进一步的问题:

既然不是所有权重都同样重要,如何让量化后的整个 Layer 尽可能保持原模型的行为?

相关推荐
程序员cxuan41 分钟前
真没想到,AI 圈又杀出来一匹黑马!
人工智能·后端·程序员
萌新小码农‍42 分钟前
KL散度的介绍
人工智能·深度学习·机器学习
张祥6422889041 小时前
牛顿迭代法求解开普勒方程:从RTKLIB源码到数值分析
人工智能·算法·机器学习
tq10861 小时前
归属感产生临境创造性
人工智能
Theo_xx1 小时前
声学感知基础:8.Range Bin、Range Profile 与 Range-Time Map
人工智能·无线感知·声学感知
欣欣之王来了1 小时前
AI合规学习:核心知识点梳理与学习路径规划
人工智能
二川bro1 小时前
Playwright MCP浏览器自动化实战,AI直接操控浏览器
人工智能
虞七月1 小时前
2026企业AI办公工具选型完全指南
人工智能·ai编程
一次旅行1 小时前
2026‑09‑16 AI产业深度解读|GPT‑5.5即将下线迁移、AI安全路线大辩论、Perplexity自研数据库大幅降本
人工智能·安全·开源