Closed
[Bug-Report|缺陷反馈]: MoeDistributeDispatch V2/V3/V4 未校验 commAlg 取值,非法值静默按默认算法执行 #6533
liuhanwen8Add on 24 days agoClosed at 18 days ago
周云飞
24 days ago Comments:
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 是不同输入,该返回码本身不能证明空字符串被当作空指针。若两者均属于文档允许值,校验时也应保留这一支持范围。当前环境和复现参数已足够明确,后续定位重点是内部参数检查、算法选择分支及文档版本的一致性。


游震
23 days ago Comments:
23 days ago Comments:
/assign @luobaiqing


23 days ago Assign luobaiqing as responsible person
22 days ago Assign SuperYuan as responsible person
22 days ago Removed responsible person luobaiqing
20 days ago Associated pull request
18 days ago Close issue
18 days ago Added label: resolved
问题描述
aclnnMoeDistributeDispatchV2/V3/V4的commAlg入参没有做取值白名单校验:传入资料未列出的取值时,第一段返回
0、第二段返回0,算子按默认算法静默执行。资料(
docs/aclnnMoeDistributeDispatchV2.md等)明确写出的取值范围: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"(枚举外取值)commAlg="hierarchy"+epWorldSize=2环境信息
cann/ops-transformer,源码核对点origin/master@4dc31cf4HcclCommInitRootInfo(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 一致):
对照:
commAlg为空字符串时返回161001(被当作空指针),说明该参数确实进入校验链,只是没有对取值做白名单。期望行为
第一段对
commAlg做取值校验:不在{nullptr, "", "fullmesh", "hierarchy"}内返回161002/561002;"hierarchy"且epWorldSize不在 16/32/64 时同样拒绝。影响
P3:用户以为启用了分层(hierarchy)通信或某个算法,实际按默认算法执行,性能/行为与预期不符且无任何告警;
非法拼写(如
"fullmeshh")也会被静默接受,排查成本高。