返回博客

GGUF 量化:该选哪一档?

2026年9月13日

默认选 Q4_K_M;显存有富余、又需要最后几个百分点的质量时,上 Q6_K 或 Q8_0。 GGUF 量化把模型权重从 16 位压到更少——Q4_K_M 每个权重约存 4.85 比特,7B 模型从 ~14 GB 掉到 ~4.1 GB,困惑度通常只差不到 1%。“gguf 量化该用哪个”这个问题有一个无聊而稳定的答案,只是被网上的各种 drama 盖住了。下面:量化到底对权重做了什么、每一档损失多少质量、体积怎么自己算,以及一条在你自己的硬件上测量损失(而不是信陌生人的跑分)的命令。

GGUF 量化到底做了什么?

模型以 16 位浮点(FP16 或 BF16)训练:它那几十亿个权重,每一个都是一个 2 字节的数。量化把每个权重压进更少的比特。天真的做法——把每个权重四舍五入成 4 位整数——会毁掉那些小而重要的值,所以 GGUF 用了两个技巧:

  1. 分块缩放。 权重按块分组(通常 32 个一组),每块有自己的缩放因子。4 位数值是块内的偏移量,大幅值的动态范围得以幸存。
  2. 重要性感知的 k-quants。 Q4_K_M 里的”K”指 scale 的超块,外加把 attention 层和前馈层区别对待——它们对压缩的耐受度不一样。

“I” 家族(IQ4_XS 及其伙伴)更进一步,借用了图像压缩的信息论码本。同一个思路,更花哨的编码:每权重比特更少、质量相近,代价是某些后端上推理略慢。

一个能避免大多数困惑的澄清:量化只改存储的权重。架构、tokenizer、上下文处理都原封不动。同一个模型的 Q4 文件和 Q8 文件是同一个模型,换了件外套。

Q4 对 Q8:量化等级越高越好吗?

技术上:是;体感上:未必。以 llama.cpp 自己在 Llama 模型上的困惑度实测为参照:Q8_0 距 FP16 约 0.02% 以内——对任何实际用途都是无损。Q6_K 几乎无法区分。Q4_K_M 困惑度大约涨 1–2%,Q4_0 再多一点,而 Q2_K 是小模型开始语无伦次的地方。

数字背后有两条规律:

  • 模型越大,量化余量越大。 70B 模型扛 Q2/Q3 的能力远好于 7B,因为更大的模型更冗余。把 7B 量化到 Q2 是截肢;把 70B 量化到 Q3 是裁缝活。
  • 质量下限随任务移动。 聊天容忍 Q4。精确代码生成、数学、对着严谨文档做 RAG 会更早暴露量化噪声。如果一个 Q4 模型反复写出”看着对其实错”的代码,先用同一个模型的 Q6_K 测一遍,再怪模型。
等级每权重比特体积相对 FP16质量损失什么时候用
Q2_K~3.4~21%13B 以下很惨实在放不下,且只限大模型
Q3_K_M~3.9~25%可感知显存紧张,≥14B 模型
Q4_K_S~4.6~29%较小Q4_K_M 放不下且差距不大时
Q4_K_M~4.85~30%困惑度约 +1%默认项。质量/体积的最佳交易
Q5_K_M~5.7~35%约 +0.5%显存充裕、质量敏感的任务
Q6_K~6.6~41%几乎为零代码/数学,装下还有富余
Q8_0~8.5~53%实际无损参照基线、微调底模
IQ4_XS~4.3~27%≈Q4_K_MQ4_K_M 略大一点、后端支持 i-quant 时

每一档要多少显存?

体积自己算,别背表——一行的事:

size_GB ≈ (bits_per_weight × params) / 8
# 8B 模型 @ Q4_K_M:4.85 × 8 / 8 ≈ 4.9 GB
# 8B 模型 @ Q8_0:  8.50 × 8 / 8 ≈ 8.5 GB

再加上公式没算进去的部分:KV cache(随上下文长度增长——几百 MB 到几个 GB)、激活值和计算缓冲区。实操余量:一个”4.9 GB”的模型在 4k 上下文想要一张 6 GB 卡,要到 16k 还得开 flash-attention 加 KV cache 量化才守得住。权重是头条,不是全部账单。

GGUF 量化到底该选哪档?

决策顺序,没有值得背的例外:

  1. 先算上下文 + KV 预算,再算权重。装不下的上下文,比测不出的质量更伤。
  2. 默认 Q4_K_M。 它是社区默认是有原因的——大约 1% 的困惑度,换 70% 的体积。包括 Ollama 在内,每个注册表都拿它当基线。
  3. 任务惩罚噪声就升 Q6_K:代码、数学、信息抽取,任何无人值守喂进管线的活。
  4. Q8_0 只留给参照用途——A/B 对比、量化损伤测量、微调底模。当日常驱动,它买到的主要是 VRAM 温度读数上的一点温暖。
  5. 低于 Q4 只在被迫时使用,且只限大模型。信任它之前,先用一道已知很难的 prompt 测一测。

如果你在 Hugging Face 上挑的是文件,优先单个 Q4_K_M.gguf 而不是分片,除非上传者只发了分片——活动部件少一点。如果你挑的是在哪跑,引擎选择是另一条轴:见 llama.cpp 对比 Ollama

怎么自己测量化损伤?

跑分各有各的;你的 prompt 是常量。编译一次 llama.cpp,下载同一模型的两个档位,同时测困惑度(越低越好)和 tokens/秒:

git clone https://github.com/ggml-org/llama.cpp && cd llama.cpp
cmake -B build && cmake --build build --config Release -j

huggingface-cli download bartowski/Meta-Llama-3.1-8B-Instruct-GGUF 
  Meta-Llama-3.1-8B-Instruct-Q4_K_M.gguf Meta-Llama-3.1-8B-Instruct-Q8_0.gguf 
  --local-dir models

# 在一段 wiki 文本上测困惑度(越低 = 越接近原始模型)
./build/bin/llama-perplexity -m models/Meta-Llama-3.1-8B-Instruct-Q4_K_M.gguf -ngl 99
./build/bin/llama-perplexity -m models/Meta-Llama-3.1-8B-Instruct-Q8_0.gguf  -ngl 99

# 以及同一块硬件上的速度
./build/bin/llama-bench -m models/Meta-Llama-3.1-8B-Instruct-Q4_K_M.gguf -ngl 99

Q4_K_M 的数字会比 Q8_0 差百分之零点几,而文件小 ~40%。如果你的下游任务分不出区别——大多数任务分不出——答案就有了,谁的排行榜都不用看。

量化会伤害隐私或”纯本地”的说法吗?

不会——它是对权重做算术,全程离线,量化文件只是同一组参数的更小容器。本地跑 Q4_K_M 泄露的和本地跑全精度模型一样多(或少):什么都不离开这台机器。和隐私相关的变量是推理跑在哪,不是比特宽度。关于模型来源的老警告对每一档量化同样成立:偷来的底模做的 Q8 “无审查”微调,并不比同一组权重的 Q4 更安全。文件格式这一侧的内容,见 本地运行 GGUF 模型

该选哪一档?

Q4_K_M,然后别再逛论坛了。 显存允许的话,精度饥饿的活升 Q6_K;留一个 Q8_0 做 A/B 对照;Q4 以下一律当作大模型专属的应急口粮。唯一值得避开的错误是对称的:纠结 Q4 还是 Q5,却无视上下文长度——它搞坏的本地部署比任何量化都多。

— mrsaynothing

Get the next one by email

One email per post. No spam, no algorithms.

self-hosted · no third parties · one-click unsubscribe

what is this?

Git Cherry Pick:多提交、跨分支与冲突

喜欢这些文章?我的本职工作就是这样的工程。 雇用我