llama.cpp 项目发布了版本 b10532,在 Metal 后端引入了一个预处理阶段,在执行 Flash Attention 之前将量化的键值(KV)缓存反量化为 F16。
- 新内核将 Q8_0 KV 张量反量化到连续的 F16 临时缓冲区中,从而允许使用现有的 F16 Flash Attention 内核,而非在内核中进行反量化。
- 支持范围扩展至 Metal 支持的所有量化 KV 类型,包括 Q4_0、Q4_1、Q5_0 和 Q5_1。
- 对于 V 是 K 的视图的基于 MLA 的模型,实现跳过了冗余的 V 反量化步骤,并从 K 的 F16 缓冲区读取 V。
- 在 M2 Ultra 上的验证显示,q8_0 KV 的 Qwen2.5-0.5B 困惑度与 F16 参考值完全匹配(PPL 1.0008)。
此更改通过利用连续的 F16 缓冲区处理量化 KV 缓存,实现了 Metal 设备上高效的 Flash Attention 执行,并确保与标准 F16 实现的精度一致。