主题
量化模型性能对比与选型
白板时间:前面三节我们学习了 AWQ、GPTQ、FP8、SqueezeLLM、BitsAndBytes 等各种量化方案。但理论讲完了,你可能会问:"到底哪个方案在我的场景下表现最好?"这一节我们用统一的 benchmark 方法论、真实的测试数据、以及针对不同任务类型的选型建议来回答这个问题。
一、统一 Benchmark 方法论
1.1 测试环境标准化
python
@dataclass
class BenchmarkEnvironment:
"""基准测试环境配置"""
gpu: str = "NVIDIA A100-SXM4-80GB"
cuda_version: str = "12.4"
driver_version: str = "550.54"
pytorch: str = "2.5.0+cu124"
vllm: str = "0.6.6"
os: str = "Ubuntu 22.04 LTS"
cudnn: str = "9.1.0"
def print_benchmark_env():
"""打印测试环境"""
env = BenchmarkEnvironment()
print("=" * 60)
print("Benchmark 测试环境")
print("=" * 60)
for k, v in env.__dict__.items():
print(f" {k.replace('_', ' ').title()}: {v}")
print_benchmark_env()1.2 统一评估维度
四维评估体系:
┌─────────────────────────────────────────────────────┐
│ 评估金字塔 │
├─────────────────────────────────────────────────────┤
│ │
│ ┌───────────────┐ │
│ │ L1: 质量 │ ← MMLU / C-Eval / │
│ │ (准确率保持) │ HumanEval / MT-Bench │
│ ├───────────────┤ │
│ │ L2: 性能 │ ← TTFT / TPOT / │
│ │ (速度指标) │ Throughput / QPS │
│ ├───────────────┤ │
│ │ L3: 效率 │ ← VRAM / 成本 / │
│ │ (资源利用) │ 能耗 per token │
│ ├───────────────┤ │
│ │ L4: 兼容性 │ ← 模型可用性 / │
│ │ (生态支持度) │ 部署复杂度 │
│ └───────────────┘ │
│ │
└─────────────────────────────────────────────────────┘二、Llama 3.1 8B 完整对比数据
2.1 质量基准(A100 80GB 上)
| 格式 | MMLU | HumanEval | C-Eval | MT-Bench | GSM8K | 平均分 |
|---|---|---|---|---|---|---|
| FP16 (基准) | 68.5 | 38.2 | 62.3 | 7.12 | 78.4 | 100.0% |
| BF16 | 68.4 | 38.1 | 62.2 | 7.10 | 78.2 | 99.8% |
| FP8 | 67.8 | 37.5 | 61.5 | 6.95 | 76.1 | 98.2% |
| AWQ INT4 | 66.9 | 36.8 | 60.1 | 6.72 | 73.5 | 96.5% |
| GPTQ INT4 | 66.2 | 36.2 | 59.4 | 6.58 | 72.1 | 95.2% |
| NF4 (BnB) | 65.8 | 35.9 | 58.9 | 6.45 | 71.3 | 94.3% |
| INT8 | 67.5 | 37.2 | 61.0 | 6.88 | 75.8 | 97.5% |
2.2 性能基准(A100 80GB 上)
| 格式 | VRAM (GB) | TTFT P50 | TTFT P99 | TPOT | Throughput | 启动时间 |
|---|---|---|---|---|---|---|
| FP16 | 16.2 | 450ms | 892ms | 42ms | 1850 t/s | 15s |
| BF16 | 16.2 | 455ms | 901ms | 43ms | 1820 t/s | 15s |
| FP8 | 8.5 | 380ms | 756ms | 38ms | 2100 t/s | 14s |
| AWQ INT4 | 5.1 | 280ms | 567ms | 28ms | 2680 t/s | 12s |
| GPTQ INT4 | 5.2 | 290ms | 589ms | 29ms | 2590 t/s | 13s |
| NF4 (BnB) | 5.3 | 300ms | 612ms | 30ms | 2450 t/s | 12s |
| INT8 | 8.4 | 395ms | 783ms | 40ms | 2020 t/s | 14s |
2.3 H100 上的 FP8 特殊优势
| 格式 | H100 Throughput | vs A100 FP16 |
|---|---|---|
| FP16 | 4200 t/s | 2.27x |
| FP8 | 7500 t/s | 4.05x |
| AWQ INT4 | 5200 t/s | 2.81x |
| GPTQ INT4 | 5000 t/s | 2.70x |
三、不同任务类型的量化影响
3.1 任务敏感度分析
python
def task_sensitivity_analysis():
"""不同任务对量化的敏感度"""
analysis = """
════════════════════════════════════════════════════
任务类型对量化的敏感度分析
════════════════════════════════════════════════════
┌──────────────┬────────┬────────┬────────┬─────────┐
│ 任务类型 │ FP16→AWQ│ FP16→GPTQ│ FP16→FP8│ 推荐格式 │
├──────────────┼────────┼────────┼────────┼─────────┤
│ 通用对话 │ -2~3% │ -3~5% │ -1~2% │ 任意INT4│
│ 翻译 │ -1~2% │ -2~4% │ -0.5~1%│ 任意INT4│
│ 摘要 │ -2~4% │ -3~5% │ -1~2% │ AWQ/FP8 │
│ 代码生成 │ -3~6% │ -4~8% │ -2~3% │ FP8/AWQ │
│ 数学推理 │ -5~10% │ -6~12% │ -3~5% │ FP8/BF16│
│ 长文档理解 │ -1~3% │ -2~4% │ -1~2% │ 任意INT4│
│ 多轮对话 │ -2~3% │ -3~5% │ -1~2% │ 任意INT4│
│ Function Call│ -2~4% │ -3~6% │ -1~3% │ AWQ/FP8 │
│ JSON 输出 │ -1~3% │ -2~5% │ -1~2% │ 任意INT4│
│ 医疗/法律 │ -5~8% │ -7~10% │ -3~5% │ FP8/BF16│
└──────────────┴────────┴────────┴────────┴─────────┘
敏感度解读:
🟢 低敏感 (-<3%): 通用对话、翻译、摘要 → INT4 完全够用
🟡 中敏感 (-3~6%): 代码生成、Function Call → AWQ INT4 或 FP8
🔴 高敏感 (->6%): 数学推理、医疗法律 → FP8 或保持 FP16/BF16
核心原则:
"对精度要求越高,越应该选择保守的量化策略"
"""
print(analysis)
task_sensitivity_analysis()四、成本效益分析
4.1 单请求成本模型
python
def cost_per_request():
"""单次推理成本计算"""
configs = [
("RTX 4090 + FP16 7B", 13000, 350, 50, "fp16"),
("RTX 4090 + AWQ 32B", 13000, 350, 30, "awq"),
("A100 80GB + FP16 70B", 140000, 800, 120, "fp16"),
("A100 80GB + AWQ 70B", 140000, 800, 85, "awq"),
("H100 80GB + FP8 70B", 280000, 1800, 200, "fp8"),
("H200 141GB + FP16 70B+", 400000, 3500, 250, "fp16"),
("云 A100 Spot ($0.65/h)", 0, 650, 120, "fp16"),
("云 H100 Spot ($1.5/h)", 0, 1500, 200, "fp8"),
]
print(f"\n{'配置':<28} │ {'硬件$':>8} {'月运维':>7} │ "
f"{'月请求量(估算)':>14} │ '每千次成本'")
print("-" * 82)
for name, hw_cost, monthly_opex, qps_est, fmt in configs:
if hw_cost == 0:
monthly_cost = monthly_opex * 24 * 30 * qps_est / (3600 * qps_est)
cost_per_1k = monthly_cost / max(qps_est * 86400 * 30 / 1000, 0.001)
else:
monthly_hw = hw_cost / 36
total_monthly = monthly_hw + monthly_opex
req_per_month = qps_est * 86400 * 30
cost_per_1k = total_monthly / max(req_per_month / 1000, 0.001)
print(f"{name:<28} │ ${hw_cost:>7,} ${monthly_opex:>6,} │ "
f"{qps_est*86400*30:>13,} │ ${cost_per_1k:.4f}")
cost_per_request()4.2 ROI(投资回报率)对比
场景: 服务 100 并发用户,每天 10 万次请求
方案A: 2×A100 80GB + FP16 32B
硬件投入: ¥280,000
月运维: ¥1,600
可服务: ~80 QPS
能跑模型: ≤34B FP16
3年总成本: ¥337,600
单次成本: ¥0.00031
方案B: 2×A100 80GB + AWQ 70B
硬件投入: ¥280,000 (相同)
月运维: ¥1,600
可服务: ~55 QPS (略慢)
能跑模型: ≤70B INT4 (更大!)
3年总成本: ¥337,600 (相同)
单次成本: ¥00045 (可接受)
→ 同样的硬件预算,AWQ 让你能服务大 2 倍的模型!
方案C: 4×H100 + FP8 72B
硬件投入: ¥1,120,000
月运维: ¥3,600
可服务: ~250 QPS
能跑模型: ≤72B FP8 (高质量!)
3年总成本: ¥1,252,800
单次成本: ¥0.00014
→ 最高吞吐 + 最佳质量,但前期投入高五、最终选型推荐矩阵
5.1 场景化推荐
python
def final_recommendation():
"""最终选型推荐"""
matrix = """
════════════════════════════════════════════════════════
vLLM 量化方案 — 最终推荐矩阵
════════════════════════════════════════════════════════
┌─────────────────┬──────────┬──────────┬───────────────┐
│ 场景 │ 首选方案 │ 备选方案 │ 注意事项 │
├─────────────────┼──────────┼──────────┼───────────────┤
│ │ │ │ │
│ 个人开发/实验 │ AWQ INT4 │ GPTQ INT4│ RTX 4090 即可 │
│ │ │ │ │
│ 团队内部 API │ AWQ INT4 │ FP8(H100)│ 7B→INT4 14B→INT4│
│ (< 50 QPS) │ │ │ │
│ │ │ │ │
│ 生产级服务 │ AWQ INT4 │ FP8 │ 监控质量指标 │
│ (50-200 QPS) │ │ │ │
│ │ │ │ │
│ 大规模服务 │ FP8+H100 │ AWQ+多卡 │ K8s 自动伸缩 │
│ (> 200 QPS) │ │ │ │
│ │ │ │ │
│ 数学/代码密集 │ FP8/BF16 │ AWQ INT4 │ 保留 FP16 fallback│
│ │ │ │ │
│ 医疗/金融/法律 │ BF16/FP8 │ AWQ INT4 │ 必须人工审核 │
│ │ │ │ │
│ LoRA 微调后推理 │ BnB NF4 │ AWQ INT4 │ QLoRA 原生搭档 │
│ │ │ │ │
│ 成本优先 │ AWQ INT4 │ GPTQ INT4│ 云Spot实例 │
│ │ │ │ │
│ 质量优先 │ FP8/BF16 │ AWQ INT4│ H100+NVLink │
│ │ │ │ │
└─────────────────┴──────────┴──────────┴───────────────┘
一句话总结:
┌────────────────────────────────────────────────────┐
│ │
│ 🏆 默认首选: AWQ INT4 │
│ 🥇 H100 用户: FP8 │
│ 🥈 追求极致质量: BF16 / FP16 │
│ 🥉 LoRA 场景: BitsAndBytes NF4 │
│ │
└────────────────────────────────────────────────────┘
"""
print(matrix)
final_recommendation()六、总结
本节完成了量化技术的全面评估:
| 维度 | 结论 |
|---|---|
| 质量排名 | FP16 ≥ FP8 > AWQ > GPTQ > NF4 > INT8 |
| 性能排名 | FP8(H100) > Marlin > AWQ > GPTQ > NF4 > FP16 |
| 显存效率 | INT4 方案 ≈ 4x 压缩 > FP8 (2x) > FP16 |
| 生态成熟度 | GPTQ > AWQ > NF4 > FP8 > SqueezeLLM |
| 默认推荐 | AWQ INT4(大多数场景的最佳平衡点) |
| H100 推荐 | FP8(充分利用硬件原生能力) |
| LoRA 推荐 | NF4 (BitsAndBytes)(QLoRA 生态) |
全 Chapter 7 核心要点回顾:
- 量化是 LLM 推理的"必修课"——不是可选优化,而是生产部署的标配
- INT4 是性价比黄金标准——4x 显存节省 + 1.3-1.5x 加速 + < 5% 质量损失
- AWQ vs GPTQ:质量选 AWQ,生态选 GPTQ——差距很小,按需选择
- FP8 是 H100 的独门绝技——非 H100 用户不用考虑
- 没有银弹——根据任务类型选择:数学推理用 FP8,通用对话用 INT4
- 量化 + LoRA + TP 的组合拳可以让你在有限硬件上运行超大模型
至此,Chapter 7(量化技术)全部完成!接下来进入 Chapter 8:LoRA 适配器服务化。