Skip to content

量化 (Quantization) 将模型权重从高精度浮点数压缩为低比特整数,减少内存占用和计算量。

为什么需要 quantization

LLM 模型通常需要数十 GB 内存(如 LLaMA-70B F16 需要 ~140GB)。量化将权重量化到 4-8 bits,使模型能在消费级硬件上运行,同时保持可接受的精度损失。

核心原理

GGML 使用 Block Quantization 方案,以 block(通常 32 个权重)为量化单位:

Block Q4_0 (18 bytes / 32 weights = 4.5 bits/weight):
┌──────────┬─────────────────────────┐
│ d (F16)  │ 16 × uint8              │
│ 缩放因子  │ 每个 uint8 存 2 个 4-bit 值 │
└──────────┴─────────────────────────┘

反量化: weight[i] = (quantized[i] - 8) × d

量化类型层级:

  • 基础量化 — Q4_0, Q4_1, Q5_0, Q5_1, Q8_0
  • K-quant — Q2_K, Q3_K, Q4_K, Q5_K, Q6_K(混合精度)
  • I-quant — IQ2, IQ3, IQ4(重要性加权的超低比特)

精度排序:F16 > Q8_0 > Q6_K > Q5_K > Q4_K > Q3_K > Q2_K

在源码中的实现

  • ggml/include/ggml.hggml_type 枚举定义
  • ggml/src/ggml-quants.c — 量化/反量化实现
  • ggml/src/ggml-cpu/ggml-cpu-quants.c — CPU 量化 kernel
  • tools/quantize/ — 量化命令行工具

相关概念

  • ggml — 量化数据类型的定义
  • tensor — 量化张量的存储
  • imatrix — 提升量化质量的校准技术
  • backend — 各后端的量化运算实现