Open
[Documentation|文档反馈]: MoeDistributeDispatch 的预留参数 groupTp 未说明会被当作 TP 通信域名解析,设置后第一段回 361001 而非参数非法码 #7221
liuhanwen8Add on 1 day ago
1 day ago Added label: documentation
周云飞
1 day ago Comments:
1 day ago Comments:
问题说明
从您提供的 CANN 9.2.0-beta.2 对照结果和日志看,groupTp 非空时会参与通信域解析,并非被忽略;未注册域名在第一段返回 361001。这里需要澄清的是预留参数的实际行为及错误码归类,与执行段的 507035 分开处理。tpWorldSize/tpRankId=99/7 返回 561002 的现象也需单独核对,不能直接归为同一原因。
处理建议
若该平台确实不支持 TP,可考虑在 host 参数检查中拒绝非空 groupTp,返回 161002 并明确提示必须为空;需评估对现有传入有效域名调用的兼容影响。若保留解析行为,则应补齐文档中的非空语义、域名注册要求及第一段错误码说明。当前使用可先保持 groupTp 为空、其余 TP 参数为默认值;这仅避开本条触发条件,不代表执行段问题已解决。


[Documentation|文档反馈]: MoeDistributeDispatch 的预留参数 groupTp 未说明会被当作 TP 通信域名解析,未注册域名时第一段只回 361001
现象
关联:#6951(同接口族的另一个现象:那条是 EP8/EP16 多机同步 507035,本条是 groupTp 域名解析失配回 361001,根因不同;本条不重复其证据)
资料把 groupTp 写作「TP通信域名称(预留参数,当前版本不支持),默认值为空串」(mc2/moe_distribute_dispatch/docs/aclnnMoeDistributeDispatch.md:213),
约束说明另写「仅支持EP域,无TP域,不支持 groupTp、tpWorldSize、tpRankId 属性」(同文件 :396)。按这两处表述该属性应被忽略或被拒,实测它没有被忽略:非空值会被当作 HCCL 通信域名去查句柄。
期望
以下任一可收敛。支撑点不是「预留参数不许解析」,而是错误码归类:调用方按资料把该属性当保留字段,误设后拿到的却是 361001(ACLNN_ERR_RUNTIME_ERROR,指向 runtime/hccl 内部)或 561002(内部错误),而不是参数非法码 161002 —— 调用方无法从错误码判断是自己传错参数:
环境
复现步骤
复现脚本
单文件,只依赖 CANN 头文件与库(acl / hccl / opapi / nnopbase),无任何内部脚手架。groupTp 之外的全部参数在三次运行中完全一致。
// build: g++ -std=c++17 repro.cpp -o repro -I$ASCEND_HOME_PATH/include \ // -I$ASCEND_HOME_PATH/x86_64-linux/include -L$ASCEND_HOME_PATH/x86_64-linux/lib64 \ // -lascendcl -lhccl -lopapi -lnnopbase #include <cstdio> #include <cstring> #include <unistd.h> #include <thread> #include <vector> #include "acl/acl.h" #include "hccl/hccl.h" #include "aclnnop/aclnn_moe_distribute_dispatch.h" static const int R = 2, BS = 8, H = 7168, K = 2, NE = 2, A = 16; static HcclRootInfo gRoot; static char gName[128]; static aclTensor* mk(void* p, std::vector<int64_t> d, aclDataType t) { std::vector<int64_t> s(d.size(), 1); for (int i = (int)d.size() - 2; i >= 0; --i) s[i] = s[i + 1] * d[i + 1]; return aclCreateTensor(d.data(), d.size(), t, s.data(), 0, ACL_FORMAT_ND, d.data(), d.size(), p); } static void* al(size_t n) { void* p = nullptr; aclrtMalloc(&p, n, ACL_MEM_MALLOC_HUGE_FIRST); return p; } static void run(int r, const char* tp) { aclrtSetDevice(r); HcclComm c; if (HcclCommInitRootInfo(R, &gRoot, r, &c)) { printf("comm init fail\n"); return; } HcclGetCommName(c, gName); if (r == 0) printf("[setup] commName=%s\n", gName); if (!strcmp(tp, "SAME")) tp = gName; aclTensor* x = mk(al(BS * H * 2), {BS, H}, ACL_FLOAT16); aclTensor* eid = mk(al(BS * K * 4), {BS, K}, ACL_INT32); aclTensor* es = mk(al(BS * K * 4), {BS, K}, ACL_FLOAT); aclTensor* ex = mk(al(A * H * 2), {A, H}, ACL_FLOAT16); aclTensor* ds = mk(al(A * 4), {A}, ACL_FLOAT); aclTensor* ei = mk(al(BS * K * 4), {BS * K}, ACL_INT32); aclTensor* etn = mk(al(8), {1}, ACL_INT64); aclTensor* erc = mk(al(R * 4), {R}, ACL_INT32); aclTensor* tpc = mk(al(4), {0}, ACL_INT32); aclTensor* es2 = mk(al(A * 4), {A}, ACL_FLOAT); uint64_t ws = 0; aclOpExecutor* op = nullptr; int ret = aclnnMoeDistributeDispatchGetWorkspaceSize(x, eid, nullptr, nullptr, es, gName, R, r, NE, tp, 0, 0, 0, 1, 0, 0, BS * R, 1, ex, ds, ei, etn, erc, tpc, es2, &ws, &op); printf("rank%d groupTp=\"%s\" ret=%d ws=%llu\n", r, tp, ret, (unsigned long long)ws); } int main(int argc, char** argv) { const char* tp = argc > 1 ? argv[1] : ""; aclInit(nullptr); aclrtSetDevice(0); if (HcclGetRootInfo(&gRoot)) { printf("rootinfo fail\n"); return -1; } std::thread t0(run, 0, tp), t1(run, 1, tp); t0.join(); t1.join(); fflush(stdout); _exit(0); }实测输出(已脱敏;tpRecvCounts 为预留出参,传 nullptr 得 161001,故给零元素张量):
影响
把 group/groupTp 一起透传的调用方碰到 361001 时拿不到定位线索:错误码归类是 ACLNN_ERR_RUNTIME_ERROR,必须把 plog 拉到 ERROR 级才能看到 groupTpOptional。实际排查中我们先后怀疑过 EP 通信域未建、epWorldSize 不匹配、通信引擎配置缺失。
建议
预留参数既然声明不支持,就在 host 侧显式拒绝并回 161002(标量字符串,host 侧已有值,校验成本为零);若要保留按名解析,请在参数表补齐语义、取值范围与错误码。
闸门自检