Appearance
模型量化——将 32-bit 浮点权重压缩到 2~8 bit,用精度换内存和速度,是本地推理的核心技术。
为什么需要量化
DeepSeek V4 Flash 有 284B 参数。如果用 F32 存储:
284B × 4 bytes = 1.136 TB — 消费级硬件完全无法容纳量化将每个权重从 32 bit 压缩到 2~8 bit:
Q2_K: 284B × ~0.33 bytes ≈ 94GB → 实际文件约 81GB(含元数据)
Q4_K: 284B × ~0.56 bytes ≈ 159GB
Q8_0: 284B × 1 byte ≈ 284GB量化是本地推理的前提——没有量化,消费级硬件无法运行这个模型。
核心原理
块量化(Block Quantization): 每 256 个权重为一组
Q2_K 块(84 字节 / 256 权重 = 2.625 bit/权重):
scales[16] — 16 组缩放因子(每组 16 个权重共享)
qs[64] — 256 个 2-bit 值(64 × 4 = 256 bits)
d — 全局缩放(float16)
dmin — 全局最小值偏移(float16)
反量化: weight_float = (qs_value - dmin) × scales[group] × d非对称量化:缩放因子和偏移允许权重分布不对称(不像对称量化强制零中心),对 2-bit 这种极端量化特别重要。
在 ds4.c 中的实现
| 量化类型 | 用途 | 每权重 bit |
|---|---|---|
| Q2_K / IQ2_XXS | MoE 路由专家 | ~2-2.6 |
| Q4_K | 注意力投影、MoE 门控 | ~4.5 |
| Q8_0 / Q8_K | 共享专家、高精度路径 | 8 |
| F16 | 嵌入层、输出层 | 16 |
| MXFP4 | Flash 0731 路由专家(原生浮点) | ~4.25 |
dequantize_row_*() 函数族将量化块还原为 float32 进行计算。GPU kernel 内联反量化。
Q4_K 路由专家(PRO 模型)
DeepSeek V4 PRO 模型的路由专家全部使用 Q4_K 量化。ds4 新增了 CPU 端的 Q4_K 路由专家推理支持:
block_q4_K:144 字节/block,256 元素/block,含 super-block scales 和 min valuesds4_vec_dot_q4_K_q8_K():Q4_K × Q8_K 点积,ARM NEON dot-product 指令加速matvec_q4_k_experts_mid_prequant():使用预量化 Q8_K 激活执行 gate+up 矩阵-向量乘matvec_q4_k_experts_accum_prequant():down 投影累积
MXFP4 —— 微缩浮点(Flash 0731 原生格式)
MXFP4 是 OCP Microscaling FP4——真正的 4-bit 浮点,不是 Q4_K 那种"4-bit 定点 + 缩放"。每 32 个权重共享一个 E8M0 指数(幂次缩放 2^(e−127)),每个权重是一个 4-bit 码表索引:
c
#define QK_MXFP4 32
typedef struct {
uint8_t e; // E8M0 共享指数:2^(e-127),e=0 视为零
uint8_t qs[QK_MXFP4/2]; // 16 字节 = 32 个 4-bit 码表索引
} block_mxfp4; // sizeof == 17 → 4.25 bit/权重
// E2M1 码表:4-bit 直接编码浮点值(含符号)
static const float ds4_mxfp4_values[16] = {
0.0f, 0.5f, 1.0f, 1.5f, 2.0f, 3.0f, 4.0f, 6.0f,
-0.0f, -0.5f,-1.0f,-1.5f,-2.0f,-3.0f,-4.0f,-6.0f,
};
// 反量化(标量参考实现):weight = 共享指数 × 码表值
float d = e8m0_to_f32(block.e); // e==0 ? 2^-7 的特殊零 : 2^(e-127)
sum += d * ds4_mxfp4_values[nibble] * activation;GGUF 张量类型 39。两个关键差异让它和 Q4_K 分工明确:
| Q4_K | MXFP4 | |
|---|---|---|
| 编码 | 4-bit 定点 + min/scale | 4-bit 浮点(E2M1 码表) |
| 缩放 | 每 16 权重一对 f16 scale/min | 每 32 权重一个 E8M0 共享指数 |
| GPU 计算 | 先反量化再 matmul | 直接喂张量核的 block-scaled MXFP4 指令(CUDA SM121 / Blackwell sm_120a) |
DeepSeek 原生就把 Flash 的路由专家存成 MXFP4,所以 ds4 的 GGUF 转换是无损的——按字节搬,没有 dequant→requant 损耗。Flash 0731(DS4F)检查点以 MXFP4 为原生格式,L40S server 默认就用它。CUDA(67d97ab)与 Metal(7bec128)都有原生 MXFP4 推理路径;标量参考点积 ds4_vec_dot_mxfp4_f32() 用于正确性验证。
相关概念
详见 Part 3 — 量化与矩阵运算。