大模型量化详解:从 FP16 到 Q4_K_M 该怎么选

大模型量化详解:从 FP16 到 Q4_K_M 该怎么选

本地部署大模型时,你一定会遇到一个问题:该下哪个版本?HuggingFace 上同一个模型往往有十几个文件——Q4_K_M、Q5_K_S、Q8_0、FP16……它们之间到底差多少?选错了要么跑不动,要么浪费内存。

这篇文章把量化的原理、各级别的真实区别、以及不同硬件该怎么选一次讲清楚。

量化在做什么

一个训练好的模型,就是几十亿到几千亿个小数。比如 0.8723

FP16(半精度浮点)用 16 位(2 字节)存储这个数,精度很高。量化做的事情就是:用更少的位数来存同一个数,牺牲一点精度换空间。

python
# 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 参数的稠密模型):

量化级别每参数位数模型大小质量损失适用场景
FP1616 bit~54 GB零损失有 64GB+ 内存且追求极致质量
Q8_08 bit~28 GB几乎无感32GB+ 内存,接近无损体验
Q6_K6 bit~22 GB极小32GB 内存舒适使用
Q5_K_M5 bit~18.5 GB很小24GB 内存的甜点选择
Q4_K_M4 bit~16.5 GB小,可感知但完全可用大多数人的首选
Q3 / Q23-2 bit~11-14 GB明显变笨仅限极端内存不足时

再以更小的 Qwen3.5-9B 为例(适合 16GB 内存的入门机器):

量化级别模型大小含 32K 上下文总占用16GB 够不够
Q4_K_M5.3 GB~7.3 GB够用,推荐
Q5_K_M6.0 GB~8.0 GB可以
Q6_K7.0 GB~9.0 GB偏紧
Q8_09.6 GB~11.6 GB太挤
FP1618.5 GB20+ 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,模型需要把所有参数从内存读到计算单元一次。生成速度的上限约等于:

text
最大速度 ≈ 内存带宽 ÷ 模型大小

以 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 的五倍多。

实际建议

如果你刚开始尝试本地部署,路径如下:

bash
# 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 留给学术研究。