1.3 量化方法速览与 INT4 工具链:从 GPTQ、AWQ 到 GGUF/llama.cpp 读完前两节,你已经知道「为什么要把大模型压到 INT4」(显存墙),也明白了「量化到底在算什么」(scale、zeropoint、对称/非对称、per-group、校准)。这一节我们把视角从数学拉到工程:当你真的要动手时,面前摆着哪几条路?它们各自适合谁?背后对应的工具链又是怎样的?把这张地图在脑子里铺开,下一章我带你深入每条路的内部机理时,你才不会被参数淹没。 一、先厘清:量化方法 ≠ 文件格式 ≠ 推理引擎 新手最容易混乱的一点,是把「量化方法」和「文件格式」「推理引擎」混为一谈。
读完前两节,你已经知道「为什么要把大模型压到 INT4」(显存墙),也明白了「量化到底在算什么」(scale、zero_point、对称/非对称、per-group、校准)。这一节我们把视角从数学拉到工程:当你真的要动手时,面前摆着哪几条路?它们各自适合谁?背后对应的工具链又是怎样的?把这张地图在脑子里铺开,下一章我带你深入每条路的内部机理时,你才不会被参数淹没。
新手最容易混乱的一点,是把「量化方法」和「文件格式」「推理引擎」混为一谈。它们其实是三个不同层面的东西,搞清楚边界,后面所有选型都清晰:
一个常见组合是「GPTQ 方法 + GPTQ 格式 + 对应加载库」,而 llama.cpp 生态则是「自己的量化方法 + GGUF 格式 + llama.cpp 引擎」三位一体的闭环。理解了这点,你就不会再问「GGUF 和 GPTQ 哪个好」这种把层面对错配的问题——它们根本不在同一层比较。
回到你最关心的选择问题。当前社区最主流的 INT4 量化路径就三条,我把它们的性格画像列清楚:
路径一:GPTQ(训练后量化,二阶补偿派)。它的核心思想是:量化一层、就立刻用校准数据算这一层量化引入的误差,并把它「补偿」到下一层的权重上,像流水线一样逐层把精度损失压下去。INT4 下质量通常很好,尤其对「固定在一张或几张 N 卡上、追求单卡吞吐」的场景非常合适。代价是量化过程需要跑校准、相对慢,且生成的格式更绑定 N 卡生态。
路径二:AWQ(Activation-aware Weight Quantization,激活感知保权派)。它有一个很妙的洞察:不是所有权重都同等重要,那些「激活值幅度大」的通道,对输出影响最显著,量化它们损失最大。所以 AWQ 只保护少量(约 1%)显著权重、其余照常量化,且不需要反量化即可在硬件上直接加速。它对硬件更友好,适合「兼顾速度与精度、且用现代推理框架」的场景。和 GPTQ 相比,AWQ 量化更快、对硬件适配更轻,是很多新部署的默认选择。
路径三:GGUF + llama.cpp(自包含跨平台派)。这条路径把「量化方法 + 文件格式 + 推理引擎」打包成一条最省心的链路:用 llama.cpp 体系做量化,产出自包含的 GGUF 文件,再用 llama.cpp(或基于它的 Ollama)在 CPU、GPU、甚至手机上统一运行。它的 k-quants 系列(如 Q4_K_M)在 INT4 附近做了精细的混合比特分配——不是所有层都死板地 4 bit,而是重要的层多给一点、不重要的层少给一点。这是「跨平台、纯本地、折腾成本低」的首选。本教程第 4 章的实战主线,就走这条路径。
一句话主张:想省心跨硬件跑通,闭眼选 GGUF;想在某张卡上压到极致且用现代框架,选 AWQ 或 GPTQ。 这不是谁碾压谁,而是约束不同、最优解不同。
你可能会问:既然 GPTQ/AWQ 质量好,为什么第 4 章实战不以它们为主线?这里我替你做了一次取舍,理由说清楚:
同时,我会在实战章节给出 GPTQ/AWQ 的对照说明,让你在需要极致单卡性能时能平滑切换。这是作者该替读者做的取舍,而不是把三条路平铺给你自己纠结。
把前面提到的工具,按「方法—格式—引擎」三层摆好,你以后看任何教程都不会迷路:
记住这张图,你就能判断任何一篇博客里提到的工具到底在哪一层、能不能替换。
把前面所有内容收口成一张可执行的选择树,写代码前先对自己过一遍:
决策要点再强调一次:硬件跨平台优先 GGUF;固定 N 卡再在 GPTQ/AWQ 间选;无论选哪条,量化后务必用你自己的任务样本跑一轮回归测试,别只看平台宣称的平均精度。
很多新手以为「跑一条量化命令就完事」。现实是,量化更像调参:同一份权重,换不同方法、不同校准集、不同 group_size,出来的质量可能天差地别。我建议你养成这样的工作流——
这条「先跑通、再提质量」的节奏,能帮你避开 90% 的半途而废。
如果你走 GGUF 路径,第一个撞见的具体选择就是「量化类型」。llama.cpp 的命名初看像天书,其实有规律可循。以 INT4 附近的常见档位为例:
给读者的实操建议:第一次量化直接上 Q4_K_M,它几乎从不出大错;若你的模型较小(7B/13B)且想要更稳,试 IQ4_XS;只有在极端追求体积时才降档到 Q4_0。不要一上来就追 IQ4_XXS 之类更激进的档——那是用肉眼可感的质量换几百 MB,多数本地场景不值得。
为了让你对「方法的选择真的重要」有体感,下面用一段示意性对话说明(注意:这是为讲清原理构造的示例,不是某次真实运行的输出,请勿当作实测数据):
提问:一个篮子里有 3 个苹果、5 个橘子,再加 2 个苹果,一共几个水果?
FP16 原模型:3 + 5 + 2 = 10,一共 10 个水果。正确。
RTN(无校准直接四舍五入)量化后的 INT4:直觉上该答对,但 RTN 把每层误差简单累加,遇到需要「先算 3+5=8、再算 8+2」的链式步骤时,某层权重被压到相邻整数导致中间表示偏移,可能输出「约 9 个」或直接跳步。
GPTQ / AWQ 量化后的 INT4:因为做了误差补偿或重要权重保护,链式推理基本保留,输出「10 个」。正确。
这段示例想传递的核心不是具体数字,而是那个机制:INT4 的误差会沿推理链累积,越需要精确保持中间状态的任务越容易暴露 RTN 的短板;而 GPTQ/AWQ 正是为抑制这种累积而生。 所以当你发现「INT4 模型变傻」,先别怪 INT4,换个带校准的方法往往就回来了。
无论用哪条路径,量化完成后工具通常会给你一份报告。作为责任编辑,我告诉你该盯哪三个数,其余大多可忽略:
记住:体积对,说明量化真的做了;PPL 稳,说明没崩;回归分数不塌,说明对你的任务还有用。 三件套齐过,这版量化才算合格。
Q:GGUF 和 GPTQ 的文件,能互相转吗? 大体可以,但属于「跨层搬运」,转换过程可能损失一些量化元数据或需要重新对齐。最稳妥的做法是:从原始 FP16 权重出发,直接量化成你目标格式,而不是在量化格式之间反复横跳。
Q:我该一次量化到 INT4,还是先 INT8 再 INT4? 直接量化到 INT4 即可。中间多一步 INT8 不会挽回精度,反而多一次误差引入,纯属多余。
Q:混合精度(部分层留 FP16)在哪里设? GGUF 的 k-quants 已在格式内混合;GPTQ 可通过逐层配置把敏感层排除在量化之外;具体开关随工具版本变,请对照你所用工具的文档,本教程不替你编造参数。
Q:量化一次要多久? 取决于模型规模与硬件。GGUF 的 Q4_K_M 在消费级机器上通常几十分钟到一两小时;GPTQ/AWQ 因要跑校准,往往更久。这是一次性投入,量化完可反复加载,不必每次重做。
读到这里,你应该能用一句话回答「面对 INT4 我该选哪条路」:量化方法、文件格式、推理引擎是三个不同层面——固定 N 卡追求极致可选 GPTQ/AWQ,要跨硬件省心就走 GGUF + llama.cpp(本教程实战主干),但无论哪条,校准集与回归测试才是 INT4 质量的最终裁判。
第一章的三节到此收口:你既知道了动机(显存墙),也掌握了概念(scale/校准),更拿到了工具链地图。下一章,我们正式钻进 GPTQ、AWQ、GGUF 这三条路的内部机理,看它们各自如何用聪明的方式「保住精度」。