一个 70B 参数的 LLM,FP16 精度需要 140GB 显存 ------这超出了绝大多数人的预算。模型量化就是通过牺牲一点点精度,把模型体积压缩到原来的 1/4 甚至 1/8,让大模型跑在消费级显卡甚至笔记本电脑上成为可能。
📑 目录
- 什么是量化:用精度换空间
- [INT8 vs INT4:精度的取舍](#INT8 vs INT4:精度的取舍)
- 主流量化方案对比
- GPTQ:训练后量化的标杆
- AWQ:激活感知的量化
- [GGUF:llama.cpp 的专属格式](#GGUF:llama.cpp 的专属格式)
- 量化实战指南
什么是量化:用精度换空间
一句话定义
将模型的权重参数从高精度(FP32/FP16)转换为低精度(INT8/INT4),大幅减少显存占用和加速推理。
本质大白话
原始模型(FP16):
每个参数用 16 位浮点数存储
例如:3.14159265358979(很精确)
70B 参数 × 2字节 = 140GB 显存 😱
INT4 量化后:
每个参数只用 4 位整数(0~15 的范围)
例如:7(粗糙多了,但够用)
70B 参数 × 0.5字节 ≈ 35GB 显存 ✅(RTX 3090 24GB×2 就够了)
代价是什么?
准确率可能下降 1%-3%
但对于大多数场景,这个损失完全可接受
量化前后对比
| 指标 | FP16 (原版) | INT8 量化 | INT4 量化 |
|---|---|---|---|
| 7B 模型显存 | ~14 GB | ~7 GB | ~3.5 GB |
| 13B 模型显存 | ~26 GB | ~13 GB | ~6.5 GB |
| 70B 模型显存 | ~140 GB | ~35 GB | ~17.5 GB |
| 推理速度 | 1x(基线) | 1.5-2x | 2-3x |
| 精度损失 | 无 | <1% | 1-3% |
| 单卡可跑 | 7B 以下 | 13B 以下 | 70B 以下 |
主流量化方案对比
| 方案 | 类型 | 精度 | 特点 |
|---|---|---|---|
| GPTQ | 训练后量化 | INT4 | 业界标准,效果稳定 |
| AWQ | 训练后量化 | INT4 | 保护重要权重,效果更好 |
| GGUF | 量化格式 | INT4/INT5/INT8 | llama.cpp 专用,生态丰富 |
| Bitsandbytes | 即时量化 | INT8/INT4 | HuggingFace 一行代码 |
| Quip# | 代码本量化 | INT2/INT4 | 极致压缩(研究阶段) |
GPTQ:训练后量化的标杆
一句话定义
Post-Training Quantization,通过对权重进行逐层近似求解,将模型压缩为 INT4 精度。是目前使用最广泛的 4-bit 量化方案之一。
python
# GPTQ 量化流程(AutoGPTQ)
from auto_gptq import AutoGPTQForCausalLM, BaseQuantizeConfig
# 1. 加载原始 FP16 模型
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Llama-2-70b-hf", device_map="auto", torch_dtype=torch.float16
)
# 2. 配置 GPTQ 量化参数
quantize_config = BaseQuantizeConfig(
bits=4, # 4-bit 量化
group_size=128, # 每 128 个参数一组量化
desc_act=True, # 使用激活值排序
)
# 3. 执行量化(需要校准数据)
model.quantize(quantize_config, calibration_data)
# 4. 保存量化后的模型
model.save_quantized("Llama-2-70b-GPTQ-Int4")
# 原始 140GB → 量化后约 35GB,缩小 75%!
AWQ:激活感知的量化
一句话定义
Activation-aware Weight Quantization,在量化时会保留那些对模型输出影响最大的权重的高精度(即「重要权重」),整体效果通常优于 GPTQ。
GPTQ vs AWQ
| 维度 | GPTQ | AWQ |
|---|---|---|
| 核心思想 | 整体最小化量化误差 | 保护重要权重不被粗化 |
| 效果 | 好 | 通常更好(尤其小模型) |
| 速度 | 量化较快 | 需要额外分析激活值 |
| 社区支持 | 更多预量化模型 | 增长中 |
| 推荐场景 | 通用 | 追求极致效果的 4-bit 选择 |
GGUF:llama.cpp 的专属格式
一句话定义
Georges GPU Format,专为 llama.cpp 推理引擎设计的量化格式。特点是可以在 CPU 上高效运行大模型,不需要 GPU。
GGUF 的独特之处
其他量化方案(GPTQ/AWQ):
→ 主要针对 GPU 推理优化
→ 需要大量显存(虽然比 FP16 少很多)
GGUF + llama.cpp:
→ 可以在 Mac M1/M2/M3 的统一内存上运行 70B 模型!
→ 可以在纯 CPU 上运行(慢但能用)
→ 支持多种量化等级:q4_k_m / q5_k_m / q8_0 ...
→ 生态极其丰富:Ollama / LM Studio / text-generation-webui 都用 GGUF
典型配置:
MacBook Pro M2 Pro (18GB RAM) → Llama-3-8B-q4 (约 5GB)
→ 流畅运行,本地隐私,免费!
bash
# Ollama 一键运行 GGUF 模型
ollama run llama3:8b-instruct-q4_K_M
# 或者手动用 llama.cpp
./main -m llama-3-8b-Q4_K_M.gguf -p "你好,介绍一下你自己" -n 256
量化实战指南
不同硬件的推荐方案
| 你的硬件 | 推荐方案 | 能跑多大模型 |
|---|---|---|
| RTX 3060 12GB | AWQ-INT4 / GGUF | 7B-13B |
| RTX 4090 24GB | GPTQ-INT4 / AWQ-INT4 | 34B-70B |
| 双卡 A100 80GB | FP16 或轻度量化 | 全尺寸 70B+ |
| Mac M1/M2 16GB | GGUF (llama.cpp) | 7B-8B |
| Mac M2 Pro 32GB+ | GGUF q4 | 13B-20B |
| 无 GPU(纯 CPU) | GGUF q4 (llama.cpp) | 7B(较慢) |
❌ 常见误区
- ❌ 量化 = 模型变笨 --- 1-3% 的精度损失对大多数任务可忽略
- ❌ INT4 总是够用 --- 复杂推理/数学/代码生成任务可能需要 INT8 或 FP16
- ❌ 所有模型都能量化到 INT4 --- 有些模型对量化敏感,需要测试效果
- ❌ 量化是一次性操作 --- 不同场景可以准备不同精度的版本灵活切换