高通 QNN 部署生成式 LLM 至 AI Edge Box,流式推理出现 KV 缓存越界报错,完整修复方案和缓存复用代码是什么?

摄影毁三代 2026-08-06 11:55:02

高通 QNN 部署生成式 LLM 至 AI Edge Box,流式推理出现 KV 缓存越界报错,完整修复方案和缓存复用代码是什么?
 

...全文
25 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
老杨261 08-06 20:36
  • 打赏
  • 举报
回复

报错根源
流式生成时未固定 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)

7,651

社区成员

发帖
与我相关
我的任务
社区描述
本论坛以AI、WoS 、XR、IoT、Auto、生成式AI等核心板块组成,为开发者提供便捷及高效的学习和交流平台。 高通开发者专区主页:https://qualcomm.csdn.net/
人工智能物联网机器学习 技术论坛(原bbs) 北京·东城区
社区管理员
  • csdnsqst0050
  • chipseeker
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧