端侧 LLM 的 KV Cache 量化

在只有 2 GB RAM 的 Android 设备上运行 Llama 3.2 3B 非常困难。大多数开发者都专注于模型权重,这是一个错误。真正的内存杀手是 KV cache。

随着对话的进行,KV cache 会不断增长。如果你使用标准的 FP16 精度,缓存会占用数百 MB 的内存。这会导致你的应用在仅进行几次对话后就崩溃。

你可以通过以下三个具体步骤来解决这个问题。

  1. 使用混合精度量化 (Mixed-Precision Quantization) Key 和 Value 不需要相同的精度。Key cache 对低精度的容忍度较高,而 Value cache 则不然。

这种方法可以将缓存大小减少 62%。对于 2048 token 的上下文,内存占用将从 224 MB 降至 84 MB。这一切都不需要改变模型权重。

  1. 实现滑动窗口逐出机制 (Sliding Window Eviction) 你无法将所有 token 都保留在活跃内存中。使用滑动窗口仅保留最近的 1536 个 token。保留前 64 个 token 作为锚点 (anchors),以保留系统提示词 (system prompt)。

  2. 使用 Flash Spilling 当 token 离开滑动窗口时,将其移动到闪存存储中。在 Android 上使用内存映射文件 (memory-mapped files)。现代 UFS 4.0 存储的速度足以将这些数据重新分页 (page) 回内存,而不会产生延迟。

效果非常显著。在骁龙 8 Gen 3 上:

避免以下错误:

在开发功能之前,先规划好你的内存预算。

来源:https://dev.to/software_mvp-factory/kv-cache-quantization-for-on-device-llms-kf