Closed
【社区任务】[Requirement|需求建议]: 新增 SplitQkvRmsnormMrope 算子 #6240
gcw_xAjKNLcrAdd on Oct 16Closed at 23 days ago
gcw_xAjKNLcr
Oct 16 Comments:
Oct 16 Comments:
/assign


Oct 16 Assign gcw_xAjKNLcr as responsible person
Oct 16 Associated pull request
23 days ago Close issue
23 days ago Added label: resolved
Backgroud(背景信息)
Qwen3-VL 注意力模块在进入 Attention 计算前,需要从融合输入中拆分 Q、K、V 和 Gate,
并对 Q/K 执行 RMSNorm、weight/bias 仿射以及三轴 MRoPE。若分别调用多个算子,会产生多个中间 Tensor、
多次 Kernel Launch 和重复 GM 读写。
SplitQkvRmsnormMrope 将上述步骤融合到一个 Ascend C Kernel 中;Q/K 使用 FP32 中间计算,
V/Gate 保持 BF16 原始位直通,适用于 Qwen3-VL Decode 和 Prefill 场景。
本算子来源于 CANN 社区任务,设计文档和验收已经按社区任务流程完成。
Benefit / Necessity (价值/作用)
支持设备:
Design(设计方案)
主要输入输出:
[T,W][256][256][3,T,64][256][256][T,Nq*256][T,Nkv*256][T,Nkv*256][T,Nq*256]或[T,0]host侧设计
1. Shape 和 dtype 推导
根据
T、num_q_heads、num_kv_heads和has_gate推导 Q/K/V/Gate 输出二维 shape,输出 dtype 跟随 BF16 输入。
2. 分核策略
min(tokens, AIV core num),至少为 1;(Nq+Nkv)/2个 head group 分配任务。3. Tiling 数据和 workspace
Tiling 下发 token 数、Q/KV head 数、block 数、eps、bias/Gate/interleaved 标志。
正式 Kernel 入口内根据 tiling data 选择短路径或常规路径,TilingKey 为 0,workspace 为 0。
kernel侧设计
1. 数据拆分
根据
has_gate和interleaved从融合输入中提取 Q、K、V 和 Gate。V/Gate 直接搬运到输出,保证 BF16 原始字节一致。
2. RMSNorm 和仿射
Q/K 从 BF16 转为 FP32,计算平方和、均值、
rsqrt,再乘以 weight,并按需加 bias。3. 三轴 MRoPE
加载
[3,T,64]cos/sin,根据 section[11,11,10]生成三轴映射,对 Q/K 前 64 维完成旋转,其余维度保持仿射结果。