Closed
[Bug-Report|缺陷反馈]: MoeDistributeDispatch V2/V3/V4 未校验 commAlg 取值,非法值静默按默认算法执行 #6533
liuhanwen8Add on  24 days agoClosed at  18 days ago
liuhanwen8
liuhanwen8
24 days ago Create

问题描述

aclnnMoeDistributeDispatchV2 / V3 / V4 的 commAlg 入参没有做取值白名单校验:传入资料未列出的取值时,
第一段返回 0、第二段返回 0,算子按默认算法静默执行。

资料(docs/aclnnMoeDistributeDispatchV2.md 等)明确写出的取值范围:

  • Atlas A2:commAlg 支持 nullptr、""、"fullmesh"、"hierarchy";
  • 且 "hierarchy" 仅支持 epWorldSize = 16 / 32 / 64("fullmesh" 才支持 2/3/4/5/6/7/8…)。

实测(A2 910B2,CANN 9.2.0,2-rank 通信域):

用例 期望 实测
commAlg="bad"(枚举外取值) 161002 / 561002 rc1=0,rc2=0
commAlg="hierarchy" + epWorldSize=2 561002(不支持的组合) rc1=0,rc2=0

环境信息

  • 仓库:cann/ops-transformer,源码核对点 origin/master@4dc31cf4
  • 硬件:Atlas A2 训练系列(910B2)×8;CANN 9.2.0
  • 通信域:HcclCommInitRootInfo(2, ...),epWorldSize=2、moeExpertNum=2、K=1、BS=8、H=512

复现

在双 rank 探针里把 commAlg 换成非法值即可(其余参数与合法用例相同):

// 合法:const char *commAlg = "fullmesh";
const char *commAlg = "bad";          // 或 "hierarchy"(epWorldSize=2 时资料不支持)
acl_status = aclnnMoeDistributeDispatchV2GetWorkspaceSize(
    x, ids, nullptr, nullptr, eScales, g_group, /*epWorldSize=*/2, rank, /*moeExpertNum=*/2, "", 0, 0, 0, 0, 0,
    /*quantMode=*/0, /*globalBs=*/16, /*expertTokenNumsType=*/0, commAlg,
    expandX, dynScales, assist, expertTokenNums, epRecvCounts, tpRecvCounts, expandScales, &ws, &exec);

实测输出(V2/V3/V4 一致):

[rank 0] 第一段 rc=0 第二段 rc=0
[rank 1] 第一段 rc=0 第二段 rc=0

对照:commAlg 为空字符串时返回 161001(被当作空指针),说明该参数确实进入校验链,只是没有对取值做白名单。

期望行为

第一段对 commAlg 做取值校验:不在 {nullptr, "", "fullmesh", "hierarchy"} 内返回 161002/561002;
"hierarchy" 且 epWorldSize 不在 16/32/64 时同样拒绝。

影响

P3:用户以为启用了分层(hierarchy)通信或某个算法,实际按默认算法执行,性能/行为与预期不符且无任何告警;
非法拼写(如 "fullmeshh")也会被静默接受,排查成本高。

likedislike
周云飞
周云飞Collaborators
24 days ago Comments:

感谢提供详细的复现参数和对照结果。

问题分析

您报告的 A2 910B2、CANN 9.2.0 双 rank 结果表明,V2/V3/V4 在 commAlg="bad" 和 commAlg="hierarchy"、epWorldSize=2 两种情况下,两阶段均返回成功。这与您引用的 A2 文档取值及组合限制不一致。不过,两阶段返回成功尚不能单独证明实际使用了默认算法,具体算法选择还需确认。

V2 的第一阶段入口将 commAlg 原样传给 aclnnMoeDistributeDispatchGetWorkspaceSizeBase,入口本身没有取值检查;仅凭这一层还不能确定内部校验和算法选择的完整行为。另外,V2 的接口头文件注释仍将该参数标为“预留参数,暂未使用”,与您引用的文档说明也存在差异,需要一并确认适用版本。

处理方向

一个可行的处理方向是在第一阶段的参数检查中,按目标产品的支持范围校验 commAlg,并检查算法与 epWorldSize 的组合。若确认适用文档中的 A2 限制,应拒绝白名单外的字符串,以及 "hierarchy" 配合非 16/32/64 的通信域大小,避免不支持的请求静默通过。V2/V3/V4 应分别确认校验入口,保持相同参数含义下的行为一致;具体返回 161002 还是 561002,仍需核对公开接口的错误码映射。

您补充的空字符串返回 161001 也值得单独核查:"" 与 nullptr 是不同输入,该返回码本身不能证明空字符串被当作空指针。若两者均属于文档允许值,校验时也应保留这一支持范围。当前环境和复现参数已足够明确,后续定位重点是内部参数检查、算法选择分支及文档版本的一致性。

likedislike
游震Collaborators
23 days ago Comments:

/assign @luobaiqing

likedislike
CANN-robotCANN-robotCollaborators
23 days ago Assign luobaiqing as responsible person
luobqluobqCollaborators
22 days ago Assign SuperYuan as responsible person
luobqluobqCollaborators
22 days ago Removed responsible person luobaiqing
Simple_Bright&ManSimple_Bright&Man
20 days ago Associated pull request
CANN-robotCANN-robotCollaborators
18 days ago Close issue
CANN-robotCANN-robotCollaborators
18 days ago Added label: resolved
周云飞
周云飞Collaborators
4 days ago Comments:

PR #14593 更新了 V2/V3/V4 接口中 commAlg 的注释,提示参考对应产品文档了解支持的取值和约束。参数校验的修复情况尚无法确认。

关联 PR:PR #14593

likedislike