
大模型量化详解:从 FP16 到 Q4_K_M 该怎么选
本地部署大模型时,你一定会遇到一个问题:该下哪个版本?HuggingFace 上同一个模型往往有十几个文件——Q4_K_M、Q5_K_S、Q8_0、FP16……它们之间到底差多少?选错了要么跑不动,要么浪费内存。
这篇文章把量化的原理、各级别的真实区别、以及不同硬件该怎么选一次讲清楚。
量化在做什么
一个训练好的模型,就是几十亿到几千亿个小数。比如 0.8723。
FP16(半精度浮点)用 16 位(2 字节)存储这个数,精度很高。量化做的事情就是:用更少的位数来存同一个数,牺牲一点精度换空间。
# FP16:16 位存一个参数
原值 = 0.8723 # 占 2 字节
# INT8 量化:8 位存
缩放系数 = 100
量化值 = round(0.8723 * 100) = 87 # 占 1 字节
# 还原:87 / 100 = 0.87,误差 0.0023
# Q4 量化:4 位存
缩放系数 = 7 # 4 位只能表示 0~15
量化值 = round(0.8723 * 7) = 6 # 占 0.5 字节
# 还原:6 / 7 = 0.857,误差 0.015每个参数从 2 字节压到 0.5 至 1 字节,一个 27B 模型就能从 54GB 缩到 16 至 28GB。16GB 内存的 Mac mini 也能跑了。
各级别对照
以 Qwen3.5-27B 为例(27B 参数的稠密模型):
| 量化级别 | 每参数位数 | 模型大小 | 质量损失 | 适用场景 |
|---|---|---|---|---|
| FP16 | 16 bit | ~54 GB | 零损失 | 有 64GB+ 内存且追求极致质量 |
| Q8_0 | 8 bit | ~28 GB | 几乎无感 | 32GB+ 内存,接近无损体验 |
| Q6_K | 6 bit | ~22 GB | 极小 | 32GB 内存舒适使用 |
| Q5_K_M | 5 bit | ~18.5 GB | 很小 | 24GB 内存的甜点选择 |
| Q4_K_M | 4 bit | ~16.5 GB | 小,可感知但完全可用 | 大多数人的首选 |
| Q3 / Q2 | 3-2 bit | ~11-14 GB | 明显变笨 | 仅限极端内存不足时 |
再以更小的 Qwen3.5-9B 为例(适合 16GB 内存的入门机器):
| 量化级别 | 模型大小 | 含 32K 上下文总占用 | 16GB 够不够 |
|---|---|---|---|
| Q4_K_M | 5.3 GB | ~7.3 GB | 够用,推荐 |
| Q5_K_M | 6.0 GB | ~8.0 GB | 可以 |
| Q6_K | 7.0 GB | ~9.0 GB | 偏紧 |
| Q8_0 | 9.6 GB | ~11.6 GB | 太挤 |
| FP16 | 18.5 GB | 20+ GB | 跑不了 |
一般用哪个
Q4_K_M。
这是本地部署社区的共识甜点,原因三条:
质量损失可接受。 Q4 相比 FP16,主流 benchmark 掉 1-3 分。日常对话、写代码、做摘要几乎感觉不到差别。只有在需要极高精度的数学推理或细腻的语言生成场景,才能察觉到细微退化。
内存占用降到 1/4。 27B 模型从 54GB 压到 16.5GB,16GB 内存的机器靠 swap 也能跑起来;32GB 机器舒适使用。
推理速度更快。 LLM 生成每个 token 都要把整个模型从内存读一遍。模型越小,每次读取的数据越少,生成速度越快。在 Apple M4 基础款(120 GB/s 内存带宽)上,27B Q4 理论速度约 7 tok/s,Q8 降到约 4 tok/s。
具体到不同硬件配置:
- 16GB(Mac mini M4 基础款):9B Q4_K_M 是最佳选择,实测 22-28 tok/s,完全可用的交互速度
- 24-32GB:9B 可以上 Q5 甚至 Q8;27B Q4 能跑但余量不大
- 48GB(Mac mini M4 Pro):27B Q8 接近无损,或者跑 Q4 留大量余量给长上下文
- 128GB(Mac Studio M4 Max):Q8 已经足够,FP16 也能跑但速度太慢(约 7-8 tok/s),没有实际意义
Q4_K_M 的后缀是什么意思
你可能看到 Q4_K_M、Q4_K_S、Q4_0 这些变体,后缀含义如下:
- K = k-quant,一种更聪明的压缩算法。它不会一刀切把所有参数压到 4 位,而是对模型中不同重要程度的层使用不同精度。关键层用高精度,次要层用低精度,总体积差不多但质量更好。
- M(Medium)= 质量稍高的变体,体积比 S 略大
- S(Small)= 体积更小的变体,质量略低
同一个 Q4 级别里,Q4_K_M 比 Q4_0 质量更好。Ollama 默认拉的就是 Q4_K_M。
看不懂后缀没关系,认准 Q4_K_M 就行。
量化不影响模型的"知识"
一个常见疑问:量化会不会让模型变笨?
不会丢知识,会丢精度。模型在预训练阶段学到的知识(语法、常识、推理模式)存储在参数的相对关系中——哪个参数大、哪个小、它们的比例关系。量化压缩了每个参数的绝对精度,但保留了相对大小。
打个比方,你知道一个人的身高是 178.3cm 还是 178cm,对判断"他高不高"没有影响。量化丢失的是那个 0.3,不是 178 这个量级。
只有在极端压缩(Q2/Q3)时,参数间的相对关系才会被破坏到影响模型判断——就像把 178cm 和 173cm 都四舍五入到"170cm 档",就分不出谁更高了。
速度为什么和模型大小成反比
LLM 推理的瓶颈不是算力,是内存带宽。
每生成一个 token,模型需要把所有参数从内存读到计算单元一次。生成速度的上限约等于:
最大速度 ≈ 内存带宽 ÷ 模型大小以 Apple M4 基础款为例(120 GB/s 内存带宽):
- 9B Q4_K_M(5.3 GB):120 ÷ 5.3 ≈ 22 tok/s
- 9B Q8_0(9.6 GB):120 ÷ 9.6 ≈ 12 tok/s
- 27B Q4_K_M(16.5 GB):120 ÷ 16.5 ≈ 7 tok/s
这就是为什么量化不仅省内存还提速——模型越小,每次读取的数据越少。
更高阶的芯片(M4 Max 546 GB/s、M3 Ultra 800 GB/s)通过更大的带宽大幅提升速度。同一个 27B Q4 模型,M4 Max 上能跑到 35-40 tok/s,是基础 M4 的五倍多。
实际建议
如果你刚开始尝试本地部署,路径如下:
# Ollama 默认拉的就是 Q4_K_M
ollama pull qwen3.5:9b
# 或者在 MLX 上指定 4-bit 量化版本
pip install mlx-lm
mlx_lm.generate --model mlx-community/Qwen3.5-9B-MLX-4bit --prompt "你好"不用纠结量化级别的选择,Q4_K_M 闭眼选。除非你有明确的精度需求(比如做数学推理)且有充足内存,才考虑上 Q6 或 Q8。FP16 留给学术研究。