量化是什么,为什么需要它
Hermes 3 系列有多个参数规模:8B、70B、405B。以 70B 为例,原始的 FP16(半精度浮点)权重文件大约 140GB——光是把模型载入显存就需要两三张 A100 80GB。这对绝大多数个人用户和中小团队来说门槛太高了。
量化(Quantization)做的事情就是:降低模型权重的数值精度,从而缩小模型体积、减少显存占用。比如把 FP16(16位浮点)压缩到 INT4(4位整数),模型体积直接缩小到原来的 1/4 左右。
当然,压缩不是免费的——精度降低意味着模型质量会有一定损失。不同的量化方法在”压缩比”和”质量损失”之间做了不同的权衡,选对方案是关键。
四种主流量化方案概览
目前在 Hermes 模型上常用的量化方案有四种:
| 方案 | 量化位数 | 主要运行环境 | 核心特点 |
|---|---|---|---|
| GGUF | 2-8 bit | CPU / CPU+GPU 混合 | llama.cpp 原生,灵活度最高 |
| AWQ | 4 bit | GPU | 速度快,服务端首选 |
| GPTQ | 4 bit | GPU | 老牌方案,生态成熟 |
| FP8 | 8 bit | GPU(Ampere+) | 精度最接近原始,需要较新硬件 |
下面逐个拆开讲。
GGUF:个人玩家的第一选择
GGUF 是 llama.cpp 项目定义的模型格式,也是目前开源社区最流行的量化格式。如果你只有一台消费级电脑(没有或只有一张游戏显卡),GGUF 基本上是唯一的选择。
为什么 GGUF 这么受欢迎?
- CPU 也能跑 — 不需要 NVIDIA 显卡,纯 CPU 推理虽然慢但能用
- CPU+GPU 混合推理 — 把一部分层放 GPU、一部分放 CPU,充分利用现有硬件
- 量化粒度选择多 — 从 Q2_K(2bit)到 Q8_0(8bit),十几种量化等级任选
- 单文件 — 一个 .gguf 文件包含所有信息,复制粘贴就能用
常见量化等级和推荐场景:
| 量化等级 | 每参数位数 | 8B 模型体积 | 70B 模型体积 | 质量评估 |
|---|---|---|---|---|
| Q2_K | ~2.5 bit | ~3.1 GB | ~27 GB | 明显劣化,仅用于测试 |
| Q3_K_M | ~3.5 bit | ~3.9 GB | ~34 GB | 勉强可用,简单任务 |
| Q4_K_M | ~4.5 bit | ~4.9 GB | ~43 GB | 性价比最高,推荐 |
| Q5_K_M | ~5.5 bit | ~5.7 GB | ~50 GB | 接近原始质量 |
| Q6_K | ~6.5 bit | ~6.6 GB | ~57 GB | 非常接近原始 |
| Q8_0 | 8 bit | ~8.5 GB | ~74 GB | 几乎无损 |
我的推荐:
- 内存/显存紧张:Q4_K_M,这是精度和体积的最佳平衡点
- 内存/显存充裕:Q5_K_M 或 Q6_K,值得多花那点内存
- 追求极致质量:Q8_0,但此时可能不如直接用 FP8
使用 Ollama 部署 Hermes 的话,默认拉取的就是 Q4_K_M 量化版本,开箱即用。
如何自己量化成 GGUF:
1 | # 安装 llama.cpp |
量化过程在 CPU 上完成,8B 模型大约需要几分钟,70B 可能需要 20-40 分钟。
AWQ:服务端的效率之王
AWQ(Activation-aware Weight Quantization)是目前服务端 GPU 推理最受欢迎的 4-bit 量化方案。它的核心思路很有意思——不是所有权重都同等重要。
AWQ 通过分析模型在校准数据上的激活值(activation),找出哪些权重通道对模型输出影响最大,然后对这些重要通道保留更高精度,不重要的通道压缩得更狠。这比均匀地把所有权重压到 4-bit 要聪明得多。
AWQ 的优势:
- 推理速度快 — 和 vLLM、TGI 这类推理框架的集成度很高,kernel 优化好
- 精度损失小 — 在 4-bit 量化里,AWQ 的精度通常优于同等位数的 GPTQ
- 量化过程快 — 比 GPTQ 快很多,8B 模型几分钟搞定
AWQ 量化实操:
1 | from awq import AutoAWQForCausalLM |
在 vLLM 中使用 AWQ 模型:
1 | from vllm import LLM, SamplingParams |
AWQ 模型跑在 vLLM 上的吞吐量比 FP16 模型高不少——显存占用少了,意味着同样的显卡能跑更大的 batch size。
GPTQ:老牌方案,稳定可靠
GPTQ 是最早被广泛使用的 LLM 量化方案之一,比 AWQ 出现得更早。它基于 Optimal Brain Quantization(OBQ)理论,通过逐层量化并用 Hessian 矩阵补偿量化误差。
GPTQ vs AWQ 的区别:
两者都是 4-bit GPU 量化方案,实际使用中的差异:
- 精度:AWQ 在大部分 benchmark 上略优于 GPTQ,但差距不大
- 速度:推理速度差不多,AWQ 在 vLLM 上可能略快(kernel 优化更新)
- 量化时间:GPTQ 显著慢于 AWQ,70B 模型量化可能需要数小时
- 生态:GPTQ 的 Hugging Face 集成更成熟,AutoGPTQ 库用户基数大
GPTQ 量化示例:
1 | from transformers import AutoTokenizer |
如果你看到 Hugging Face 上某个 Hermes 量化版本标注了 GPTQ,可以直接用 transformers 加载:
1 | from transformers import AutoModelForCausalLM, AutoTokenizer |
FP8:高端硬件的精度守护者
FP8(8-bit 浮点)是这四种方案里精度最高的。它把 FP16 的权重从 16 bit 压缩到 8 bit,体积减半,但精度损失极小——小到在大部分任务上和原始模型几乎测不出差别。
不过 FP8 有个硬件门槛:需要 NVIDIA Ampere 架构(A100/A10)或更新的 Hopper 架构(H100) 才能获得硬件级 FP8 支持。在老架构的卡上也能用,但没有硬件加速,速度反而可能不如 4-bit 方案。
FP8 在 vLLM 中的使用:
1 | from vllm import LLM |
vLLM 支持在线 FP8 量化——加载 FP16 模型时实时转成 FP8,不需要预先量化。这在 H100 上特别方便。
什么时候选 FP8:
- 你有 A100/H100 且显存足够
- 你对输出质量要求极高(比如做 benchmark、做微调数据生成)
- 你不介意比 4-bit 方案多用一倍显存
精度损失实测对比
光说理论没用,下面是 Hermes-3 8B 在不同量化下的粗略质量对比(基于我自己的主观测试和社区反馈,不是严格 benchmark):
| 量化方案 | MMLU 近似 | 代码质量 | 中文能力 | 长文本连贯性 |
|---|---|---|---|---|
| FP16(原始) | 基准 | 基准 | 基准 | 基准 |
| FP8 | -0.5% | 几乎无差 | 几乎无差 | 几乎无差 |
| AWQ 4-bit | -2~3% | 轻微下降 | 轻微下降 | 基本不变 |
| GPTQ 4-bit | -2~4% | 轻微下降 | 轻微下降 | 偶尔跑题 |
| GGUF Q5_K_M | -1~2% | 轻微下降 | 基本不变 | 基本不变 |
| GGUF Q4_K_M | -2~3% | 轻微下降 | 轻微下降 | 偶尔重复 |
| GGUF Q3_K_M | -5~8% | 明显下降 | 中文表述变生硬 | 容易重复 |
| GGUF Q2_K | -10~15% | 大幅下降 | 严重劣化 | 频繁重复/跑题 |
几个观察:
- 4-bit 是甜蜜点 — 无论 GGUF Q4_K_M、AWQ 还是 GPTQ,4-bit 量化的质量损失对大多数应用来说完全可以接受
- 低于 3-bit 急剧恶化 — Q2_K 基本只能用来做功能测试,不要拿来干正事
- 中文比英文更敏感 — 量化对中文的影响比英文稍大一点,因为中文 token 的信息密度更高
- 长文本是试金石 — 想检验量化质量,让模型写一篇 2000 字的长文就能看出差别
显存占用对比
以 Hermes-3 8B 和 70B 为例(推理时的近似显存占用):
8B 模型:
| 方案 | 显存占用 | 一张 RTX 3060 12GB 能跑吗 |
|---|---|---|
| FP16 | ~16 GB | 不行 |
| FP8 | ~8 GB | 勉强(ctx 要短) |
| AWQ/GPTQ 4-bit | ~5 GB | 可以 |
| GGUF Q4_K_M | ~5 GB(纯GPU) | 可以 |
| GGUF Q4_K_M | ~2 GB GPU + 3GB RAM(混合) | 可以 |
70B 模型:
| 方案 | 显存占用 | 最低硬件要求 |
|---|---|---|
| FP16 | ~140 GB | 2x A100 80GB |
| FP8 | ~70 GB | 1x A100 80GB |
| AWQ/GPTQ 4-bit | ~37 GB | 1x A100 40GB 或 2x RTX 4090 |
| GGUF Q4_K_M | ~43 GB | 64GB RAM(纯CPU) |
我的选择建议
根据你的使用场景选:
个人本地玩玩: GGUF Q4_K_M 或 Q5_K_M,搭配 llama.cpp 或 Ollama。入门看 Hermes 入门指南。
个人追求质量: GGUF Q6_K 或 Q8_0,如果你的电脑内存够大的话。
服务端部署(低成本): AWQ 4-bit + vLLM,这是目前性价比最高的服务端方案。
服务端部署(高质量): FP8 + vLLM,需要 A100/H100。
做微调基座: 不量化,用 FP16/BF16 原始权重。量化模型不适合做微调起点。关于微调的具体方法,可以看 Hermes 微调实操。
量化模型的一些注意事项
最后说几个容易被忽略的点:
1. 量化后不要再微调
量化模型的权重已经不是连续的浮点数了,直接对量化模型做微调效果很差。正确的流程是:先用 FP16 原始模型微调,微调完之后再做量化。
2. 校准数据会影响量化质量
AWQ 和 GPTQ 都需要校准数据(calibration data)。如果你的实际使用场景主要是中文,用中文语料做校准效果会更好。默认的英文校准数据(如 C4 数据集)不一定是最优的。
3. KV Cache 也占显存
上面说的显存数字只是模型权重部分。推理时还需要 KV Cache 来存储上下文,上下文越长,KV Cache 越大。一个 8B 模型用 8K 上下文,KV Cache 可能额外占用 1-2GB。
4. 不同量化工具的 4-bit 不完全一样
GGUF 的 Q4_K_M、AWQ 的 4-bit、GPTQ 的 4-bit 虽然都是”4-bit 量化”,但具体算法不同,质量和速度表现也不同。别简单地认为”都是4位精度应该差不多”。
量化看起来只是一个”压缩”步骤,但选对方案可以在硬件成本和模型质量之间找到一个非常好的平衡点。在 cocoloop 社区里经常能看到大家分享各种量化方案的实测数据,建议多参考别人的经验。