7,651
社区成员
发帖
与我相关
我的任务
分享高通 QNN 部署生成式 LLM 至 AI Edge Box,流式推理出现 KV 缓存越界报错,完整修复方案和缓存复用代码是什么?
报错根源
流式生成时未固定 KV 缓存最大长度,持续扩容超出 NPU 分配内存;
QNN 张量未做分片绑定,新增 token 写入时覆盖原有缓存数据;
多轮对话未重置缓存指针,上下文叠加造成缓存溢出。
完整修复方案
模型转换阶段配置固定 KV 缓存长度,匹配业务最大上下文窗口;
采用环形缓存结构复用 KV 空间,达到上限自动执行旧内容淘汰;
每次新开对话会话自动重置缓存下标与张量内存;
开启 HTP 内存静态分配模式,禁止缓存动态扩容。
缓存复用核心代码
python
运行
class EdgeKVManager:
def init(self, max_ctx_len=1024):
self.max_len = max_ctx_len
self.cache_ptr = 0
# 预分配固定大小KV张量
self.k_cache = np.zeros((1, 32, max_ctx_len, 128), dtype=np.float16)
self.v_cache = np.zeros((1, 32, max_ctx_len, 128), dtype=np.float16)
def write_cache(self, new_k, new_v):
new_token_num = new_k.shape[-2]
end = self.cache_ptr + new_token_num
# 环形复用缓存
if end > self.max_len:
self.cache_ptr = 0
end = new_token_num
self.k_cache[:, :, self.cache_ptr:end, :] = new_k
self.v_cache[:, :, self.cache_ptr:end, :] = new_v
self.cache_ptr = end
def reset(self):
self.cache_ptr = 0
kv_mgr = EdgeKVManager(max_ctx_len=1024)
kv_mgr.reset()
while generate_token:
pred_token, k_new, v_new = qnn_infer(prompt_tokens, kv_mgr.k_cache, kv_mgr.v_cache)
kv_mgr.write_cache(k_new, v_new)