已关闭
[Requirement|需求建议]: 新增 M3 MSA Index Score 算子 #4117
oscillated创建于 8月4日关闭于 8月20日
8月4日 添加了label:requirement
8月4日 修改了issue 的描述
oscillated
8月4日 评论:
8月4日 评论:
/assign


8月4日 将 oscillated 设为负责人
8月4日 关联了pull request:[WIP]新增 msa index score 算子
8月4日 修改了issue 的描述
8月4日 修改了issue 的描述
8月4日 修改了issue 的描述
8月4日 修改了issue 的描述
8月20日 关闭了 issue
8月20日 添加了label:resolved
8月21日 关联了pull request:新增 MsaIndexScore 算子 (A2/A3)
Thanks for sending an requirement! Please fill in the following template to help quickly solve your problem.
Backgroud(背景信息)
MiniMax M3模型中,稀疏注意力MSA(Minimax Sparse Attention)模块的 Indexer 支路用轻量级的 index Q/K 为每个 KV sparse block 打分,再由 topk 选块喂给正式的 sparse attention。其中的“打分”计算流程当前无高性能算子实现,只能通过小算子拼接实现,性能较差且在模型中占比高,存在使用AscendC开发融合算子实现上述计算过程的性能优化空间。
Benefit / Necessity (价值/作用)
价值:开发融合算子实现,可优化性能,提升推理速度。
应用场景:Minimax M3相关模型部署场景。
Design(设计方案)
算子名:MsaIndexScore
aclnn接口名:aclnnMsaIndexScore
torch_extension:msa_index_score
具体实现路径为:基于当前ops-transformer仓已引入的catlass三方库,进行模板化组装,最终以对应功能的torch接口形式交付调用。
算子参数说明
计算过程
设:
q_len以 cumsum 形式给出,cuq[b] 为第 b 个请求首个 query token 的全局扁平下标,Lq(b)=cuq[b+1]−cuq[b];start_loc[b]为该请求首个 query token 在自身 KV 序列中的位置(等价于 Triton 的prefix_lens/context_lens);kv_len[b]为该请求当前可见的 KV 总长度;block_size=P(默认 128),block 数 NB(b)=⌈kv_len[b]/P⌉。对全局 token t(属于请求 b)、head h、逻辑 block β:
qpos(t)=start_loc[b]+(t−cuq[b])
score[h,t,β]=j∈[βP, βP+P)j≤qpos(t)j<kv_len[b]max⟨qt,h, k~j,hkv⟩
其中非量化:k~=key_cache[block_table[…]](与 query 同 dtype)。
int8 前融合量化(MSA 预量化 K cache):
k~j,hkv=castfp(key_cacheint8[page,jmodP,hkv,:])⋅scale[page,hkv,jmodP]
scaleshape = [NP,Nkv,P](per-token + per-head 反量化)。实现上:AIV 将 int8 page
DataCopy+Cast到 GM scratch → FFTSK_READY→ AICMmad(Q, cast(K))→S_READY→ AIV 在 mask 前对 S 做列乘scale(因 Q⋅(Ks)=(Q⋅cast(K))⋅s)。若窗口内无任何可见 j,则 score=fill_value(默认 −∞)。
核心运算 = 矩阵乘(
Mmad)+ 段长为 P 的行方向分段最大值(ReduceMax)。顺序:DOT →(可选 DEQUANT 列乘)→ MASK → MAX。