已开启
[Performance]: HSTU Paged Attention 流水化分页 KV cache 搬运 #1281
zkdliushuo创建于  7月21日
zkdliushuo
7月21日 创建

提交提案之前,请先检索仓库内是否已有相同的提案,如已有请在同一提案中进行讨论。

性能优化具体描述

背景与优化特性

HSTU Paged Attention 从分页 KV cache 读取历史 K/V,并将其整理到 attention 计算使用的 workspace。当前 develop@64b6118d4f6fc534e1bc3f6792ad74c4974a05fa 的 v220 kernel 在 CopyFromKvCache() 中按 page 串行执行 K、V 的 GM→UB→GM 搬运:上一批数据写回 workspace 后才开始下一批读取,MTE2 输入与 MTE3 输出之间没有形成跨 chunk 的流水重叠。

在增量推理的小 Q、大 KV 场景中,分页 KV cache 搬运量远大于新增 Q 的数据量。建议复用现有 UB,通过 K/V 双缓冲和 MTE2/MTE3 event,将下一 chunk 的 GM→UB 输入与上一 chunk 的 UB→GM 输出重叠,降低搬运路径的等待时间。

使用场景与适用范围

项目 范围
目标分支 develop
基线快照 64b6118d4f6fc534e1bc3f6792ad74c4974a05fa
算子路径 HSTU Paged Attention v220 CopyFromKvCache()
硬件 Ascend 910B3,单卡
目标 dtype BF16
目标 shape H=16,D=256,page size=32;Q=8/16/24/32/48/64;(B, KV)(2, 16384)(4, 8192)(8, 4096)

本次性能结论只适用于上表中的 Ascend 910B3 小 Q、大 KV 矩阵。以下范围尚未形成性能结论:

  • 其他 Ascend 型号;
  • 目标矩阵以外的 Q、KV、head dimension、head 数和 page size;
  • FP16/FP32 的性能;
  • 多卡或端到端模型性能。

优化方案

  • 只修改 CopyFromKvCache(),复用既有 queKv_ UB,不增加 UB 总预算。
  • 将既有 UB 划分为 K/V 两类 tensor 和两个 ping-pong stage。
  • 使用 MTE2→MTE3 与 MTE3→MTE2 event 管理输入就绪和输出完成状态。
  • 在相邻 chunk 间重叠下一批 K/V 输入与上一批 workspace 输出。
  • chunk 容量由 kvLtUbSize_sizeof(qType) 和运行时 headDim_ 推导。
  • 保持 host tiling、tiling key、算子 API、输入输出格式和数值语义不变。

性能劣化说明

测试方法

  • Baseline:develop@64b6118d4f6fc534e1bc3f6792ad74c4974a05fa 的 RecSDK 算子包中的 paged hstu attention 算子;
  • Optimized:基于上述优化后的 paged hstu attention 算子;
  • 测试矩阵:BF16,H=16,D=256,page size=32,3 个 (B, KV) × 6 个 Q,共 18 个 shape;
  • 正确性:每个 shape 使用 seed 2026/2029/2039,共 54 个用例;只有正确性全部通过才运行性能测试;
  • 性能统计:固定随机 shape 顺序,每个 shape 预热 16 次,使用 NPU Event 仅统计 device kernel 执行时间,每种形状采样 51 次,以 median 作为该 shape 延迟;
  • 聚合方法:对 18 个 shape 的 median 计算几何均值;
  • 加速比定义:baseline latency / optimized latency,低于 1.0x 表示性能劣化。
  • 硬件:Ascend 910B3 单卡

详细性能数据

B KV Q Baseline (ms) Optimized (ms) 加速比 是否劣化
2 16384 8 0.929000 0.866440 1.072204x
2 16384 16 0.933840 0.870460 1.072812x
2 16384 24 0.943960 0.880400 1.072194x
2 16384 32 0.954600 0.888400 1.074516x
2 16384 48 0.976700 0.910500 1.072707x
2 16384 64 1.002760 0.938220 1.068790x
4 8192 8 0.927800 0.863260 1.074763x
4 8192 16 0.935340 0.869320 1.075944x
4 8192 24 0.941780 0.880800 1.069232x
4 8192 32 0.955260 0.891200 1.071881x
4 8192 48 0.975120 0.912440 1.068695x
4 8192 64 1.002080 0.939060 1.067110x
8 4096 8 0.930980 0.869620 1.070560x
8 4096 16 0.939680 0.878760 1.069325x
8 4096 24 0.950680 0.889780 1.068444x
8 4096 32 0.962000 0.900580 1.068201x
8 4096 48 0.982840 0.922780 1.065086x
8 4096 64 1.010520 0.950280 1.063392x

汇总与劣化结论

  • Baseline 的 18-shape median 几何均值:0.9582518845 ms
  • Optimized 的 18-shape median 几何均值:0.8952944909 ms
  • 总体加速比:1.070320318x,延迟下降 6.5700%
  • 加速 shape:18/18;劣化 shape:0/18;
  • 单 shape 加速比范围:1.063392x1.075944x

其他相关讨论

执行了完整的正确性测试

目标矩阵的正确性验证情况:

  • Baseline:54/54 通过 CPU FP32 reference,rtol=atol=8e-3
  • Optimized:54/54 通过,输出有限值;
  • Optimized 对 Baseline:54/54 bitwise 一致,最大绝对误差为 0;
  • Optimized 对 CPU FP32 reference:最大绝对误差 3.293827e-4
  • eager 重复执行:54/54 bitwise 一致;
  • eager/Graph:54/54 bitwise 一致;
  • 仓库既有代表性 pytest:5 passed,覆盖 BF16/FP32/FP16、page size 32/128/256、
    batch 32、GQA 和多种 mask。

接口、兼容性与回退

  • 对外 API、参数、输入输出 shape/格式:无变化;
  • host tiling、tiling key、环境变量:无变化;
  • 第三方开源软件:无新增;
  • 用户资料:调用方式和约束未变化,无需修改用户文档;
  • 安全:未新增外部输入、网络访问、文件访问或权限处理逻辑;
  • 回退:回退候选的单个 squash commit 即可,不涉及数据格式或配置迁移。

风险边界:改动位于 v220 通用 Paged 搬运路径,非目标平台和非目标 shape 的正确性依赖既有回归与 PR CI,性能尚未系统测量。当前实现没有运行时性能回退或 shape gate;这是为了避免把测试矩阵中的 Q、KV 或 D 数值硬编码成分派条件。若社区要求扩展到更激进的特化路径,应另建 Issue/PR,并基于 UB/L1/寄存器容量、页/chunk 数、MTE 搬运量、计算量及平台 API 返回的 core 数建立可解释的成本模型,再跨 dtype、D、page size 和 Q/K 范围确定分派边界。

待社区确认

  1. 本次仅承诺 Ascend 910B 小 Q、大 KV 性能收益,但实现位于无 shape gate 的 v220 通用路径;请确认该最小通用流水方案及回归范围是否可接受。
  2. 其他平台/shape 若需要性能分派,请确认是否接受后续基于资源/成本模型的独立 Issue/PR;本 issue 的方案不接受直接写入 Q、KV、D、SoC 型号或固定 core 数阈值。

环境信息

类别 环境信息
操作系统 Ubuntu 22.04.5 LTS,aarch64;Kernel 5.10.0-60.18.0.50.oe2203.aarch64
昇腾硬件 Ascend 910B3;HBM 65536 MiB
驱动/固件 驱动 25.3.rc1,Innerversion V100R001C23SPC002B212;独立 firmware 版本未记录
CANN 9.0.0
Python 3.11.15/usr/local/python3.11.15/bin/python3
相关软件 PyTorch 2.7.1+cpu,torch_npu 2.7.1.post4,GCC 11.4.0,CMake 3.22.1
已测代码版本 Baseline 64b6118d4f6fc534e1bc3f6792ad74c4974a05fa

欢迎加入社区,感谢您对社区的贡献 🎉!

likedislike
xiangjie10成员
7月21日 评论:

👋 您好,感谢向 RecSDK 提交 Issue!
🎉 我们已收到您的反馈,感谢你对开源社区的支持!

📅 处理时效 维护团队将在工作日 24 小时内查看并回复您的问题。
🔍 自助排查(推荐优先查看) 在等待回复期间,您可以先查阅仓库README以及历史 Issue 中相似问题的解决方案,多数问题可快速解决。
💡 为了更快定位问题,请您确保 Issue 包含:

  • 清晰的问题描述
  • 可复现的操作步骤
  • 相关日志、截图或环境信息
    我们会尽快跟进,感谢您的理解与配合!
likedislike
ascend-robotascend-robot成员
7月21日 添加了label:performance
xiangjie10成员
7月21日 评论:

/label add triaged

likedislike
ascend-robotascend-robot成员
7月21日 添加了label:triaged
Zzkdliushuo
7月21日 关联了pull request:perf(op): pipeline paged kv cache copies
taoqiuyu1998
taoqiuyu1998成员
7月24日 评论:

/label add feature

likedislike
ascend-robotascend-robot成员
7月24日 添加了label:feature
taoqiuyu1998
taoqiuyu1998成员
7月29日 评论:

开发者你好,针对你的两个提案邀请你参加RecSDK的sig会议进行串讲,议题申报链接:https://etherpad.ascend.osinfra.cn/p/sig-RecSDK

likedislike
zkdliushuo
7月30日 评论:

开发者你好,针对你的两个提案邀请你参加RecSDK的sig会议进行串讲,议题申报链接:https://etherpad.ascend.osinfra.cn/p/sig-RecSDK

@tqy1998

您好,昨天没有看到此消息, 发现今天下午已经开完sig会议了。请问是需要等下个月的 RecSDK sig 会议吗?此外,现在是否需要在这个链接登记?

likedislike
taoqiuyu1998
taoqiuyu1998成员
28 天前 评论:

开发者你好,针对你的两个提案邀请你参加RecSDK的sig会议进行串讲,议题申报链接:https://etherpad.ascend.osinfra.cn/p/sig-RecSDK

@tqy1998

您好,昨天没有看到此消息, 发现今天下午已经开完sig会议了。请问是需要等下个月的 RecSDK sig 会议吗?此外,现在是否需要在这个链接登记?

@zkdliushuo
你好,RecSDK sig每月召开一次,您可以现在登记,另外RecSDK开源社区贡献可以加群进行交流:
22dff4d6f0e055b26d5f0ac0b75dd9e2.jpg

likedislike
Zzkdliushuo
25 天前 修改标题为 “[Performance]: HSTU Paged Attention 流水化分页 KV cache 搬运”,原标题为“[Performance]: 流水化分页 KV cache 搬运”
huangleihuanglei成员
20 天前 关联了看板:MindSDK版本issue看板
taoqiuyu1998
taoqiuyu1998成员
7 天前 评论:

@zkdliushuo 开发者你好,邀请您周五参加sig例会,进行代码方案串讲~
会议时间:2026/08/28 16:00-17:00
会议链接:
https://meeting.huaweicloud.com:36443/#/j/960746395
会议纪要&签到链接:
https://etherpad.ascend.osinfra.cn/p/sig-RecSDK

likedislike