2.2 校准集:后训练量化靠什么数据定参数 上一节(2.1)我们把量化的数学内核拆开了:INT4 量化本质是「用一对 scale / zeropoint 把浮点权重线性映射到 16 个整数格子」,而高级方法还会对权重做补偿。可有一个更现实的问题一直悬在那里——这些 scale、补偿系数到底从哪算出来的? 如果是训练时量化(QAT),模型在训练过程中自己就把量化参数学出来了。但我们做本地部署,几乎永远用的是后训练量化(PTQ,Post-Training Quantization):拿到一个已经训好的 FP16/BF16 模型,不重新训练,直接把它压成 INT4。既然不重训,那「定量化参数」这件事,就只能靠额外喂给模型的一小批数据来估计。这批数据,就是校准集(calibration set)。
上一节(2.1)我们把量化的数学内核拆开了:INT4 量化本质是「用一对 scale / zero_point 把浮点权重线性映射到 16 个整数格子」,而高级方法还会对权重做补偿。可有一个更现实的问题一直悬在那里——这些 scale、补偿系数到底从哪算出来的?
如果是训练时量化(QAT),模型在训练过程中自己就把量化参数学出来了。但我们做本地部署,几乎永远用的是后训练量化(PTQ,Post-Training Quantization):拿到一个已经训好的 FP16/BF16 模型,不重新训练,直接把它压成 INT4。既然不重训,那「定量化参数」这件事,就只能靠额外喂给模型的一小批数据来估计。这批数据,就是校准集(calibration set)。
读完整节,你应该能用一句话回答「校准集是干什么的」:它是 PTQ 唯一的信息来源——模型通过这一小批样本,去估计该用多大的 scale、哪些权重需要补偿,从而在不重训的前提下,尽量保住原本的智能。
先建立一个反直觉的认知:量化参数不是凭空拍脑袋定的,也不是只取决于权重本身。
以对称量化的 scale = max(|w|)/7 为例,这看似只用了权重的最大值,似乎「不需要数据」。但那只是最粗糙的 RTN。一旦你进入 GPTQ / AWQ 这一档,事情就变了:
一句话:权重是死的,但「怎么量化权重损失最小」是数据相关的。 校准集就是模型在不重训的前提下,唯一能「偷看」真实分布的机会。没有它,所有高级量化方法都会退化成粗糙的 RTN,INT4 质量会断崖下跌。
下面这张图串起整个 PTQ 的信息流:校准集是源头,量化参数是产物。
不同方法「看」校准集的角度不一样,但归根结底都在估计两件事:权重的重要性 和 激活的分布。
1. 估计 scale 与 clip 范围(所有方法都要)
最基础的一层,就是从校准数据的前向激活里,统计每层、每通道、每组的数值范围,据此定 scale 和 clip 阈值。校准数据分布越接近真实推理分布,定出来的格子越「贴」真实数据,舍入/截断损失越小。
2. 估计二阶重要性(GPTQ 路线)
GPTQ 的思想源自 OBQ(Optimal Brain Quantization):当一个权重被量化、产生误差时,这个误差会「污染」后续的未量化权重。它用一个基于激活的 Hessian 矩阵,把这层误差分配到还没量化的权重上做补偿。Hessian 怎么来?就从校准集前向传播的激活里估计。校准集越有代表性,Hessian 越准,补偿越到位。
3. 定位「显著权重」(AWQ 路线)
AWQ 的核心观察是:绝大多数权重对结果影响很小,只有约 1% 的「显著权重(salient weights)」是命门,而这些权重恰好对应大的激活值。所以 AWQ 不去直接量化这些权重,而是给它们通道级地乘一个缩放系数、把它们的数值「挪」到一个更易量化的区间,量化完再缩放回来。判断「哪个权重对应大激活」,靠的就是校准集前向得到的激活幅值。
这是被问得最多的问题,也是最容易焦虑的点。先给结论:校准集通常不需要大,但要有「质」。
实践里常见的区间是 128 ~ 512 条短样本(每条几十到几百个 token)。原因有两层:
但要注意,「条数少」不等于「随便凑」。下面这张示意曲线表达的是普遍规律:误差随样本数先快速下降、后趋于平缓,而过少样本会偏高——具体拐点因模型而异,请以你自己的校准+评估为准。
经验建议:先拿 128 条、每条一个完整短句/短段落起步;如果目标领域很专(比如纯代码、纯医疗),再针对性加到 256~512 条。不要为了「显得认真」而堆到几千条——那只拖慢量化,质量不增反可能因分布偏移而下降。
比「多少条」更重要的是「是什么」。校准集必须满足一个铁律:它的分布要尽可能贴近你真正要跑的任务分布。
这里有个高频坑:直接拿 Wikipedia 全文当校准集。Wikipedia 文本偏书面、长句、低代码占比,对通用聊天尚可,但如果你本地的真实负载是「短指令 + 代码块」,分布错配会让量化模型在真实任务上掉点,而你在校准评估里看不出来。所以——校准集 = 你真实流量的「迷你抽样」,而不是「越权威越好」的语料。
下面这张图点出问题本质:校准分布和真实分布错配,量化参数就定偏。
前面说了三种「看数据」的角度,这里把它们和具体方法对齐,你以后看工具文档就不慌:
关键认知:方法越「聪明」,越依赖校准集的质量;方法越「统计化」,对校准集依赖越低但天花板也越低。 这解释了为什么「同一个模型,用错校准集的 GPTQ」可能还不如「用对分布的简单量化」。
我整理了本地部署里最典型的几个校准集翻车姿势,逐条对照避坑:
具体到工程,不同工具的「喂校准集」方式略有差异,这里给形态说明(具体参数名与默认值请以各项目官方文档为准,版本间可能变动):
./llama-quantize 相关):GGUF 量化多在权重统计层面完成,很多档位不需要你显式提供校准文本;当你使用带校准的高级路径时,工具会按内置或指定样本估计分布。calibration_dataset(如从公开数据集采样,或你自己的文本列表),指定 dataset 与 nsamples、seqlen 等,工具自动前向估计 Hessian。无论哪个工具,输入形态都高度一致:一个「短样本列表」。所以你真正要花心思的,永远是「这批短样本是不是我真实流量的代表」,而不是某个神秘参数。
为了把这件事「焊」进脑子,建议你在第 4 章实战时亲手做一个对照实验:
你会直观看到:B 在目标领域上的回答质量往往明显优于 A,哪怕两者都是 INT4、压缩比完全相同。这个结果会让你彻底相信——「量化不只是压比特,更是用校准集给模型『定向保留智能』」。这也是为什么我反复强调:校准集是 PTQ 的灵魂,而不是可有可无的附属品。
动手前,先用这张清单核对你的校准集:
回到开头:后训练量化不重训,校准集就是它唯一能「偷看」真实分布的机会——模型靠这小批样本估计 scale、重要性、显著权重,从而在不训练的前提下尽量保住智能。 校准集的质量与代表性,往往比「选哪个 INT4 档位」更能决定你量化后模型聪不聪明。下一节(2.3)我们顺着这条线,正面比较三条主流 INT4 量化路线(GPTQ / AWQ / GGUF k-quants),告诉你「到底该用哪一个、为什么」。