默认选 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 用了两个技巧:
- 分块缩放。 权重按块分组(通常 32 个一组),每块有自己的缩放因子。4 位数值是块内的偏移量,大幅值的动态范围得以幸存。
- 重要性感知的 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_M | Q4_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 量化到底该选哪档?
决策顺序,没有值得背的例外:
- 先算上下文 + KV 预算,再算权重。装不下的上下文,比测不出的质量更伤。
- 默认 Q4_K_M。 它是社区默认是有原因的——大约 1% 的困惑度,换 70% 的体积。包括 Ollama 在内,每个注册表都拿它当基线。
- 任务惩罚噪声就升 Q6_K:代码、数学、信息抽取,任何无人值守喂进管线的活。
- Q8_0 只留给参照用途——A/B 对比、量化损伤测量、微调底模。当日常驱动,它买到的主要是 VRAM 温度读数上的一点温暖。
- 低于 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.
what is this?喜欢这些文章?我的本职工作就是这样的工程。 雇用我