文件最后提交记录最后更新时间
整改mc2部分仓内重名头文件现象 Co-authored-by: chenyifan<chenyifan66@h-partners.com> # message auto-generated for no-merge-commit merge: !5637 merge clear_repeat_h into master 整改mc2部分仓内重名头文件现象 Created-by: mutex_lock Commit-by: chenyifan Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> - 整改mc2部分仓内重名头文件现象 --- | 文件名 | 源码路径|处理方式 | |-----|-----|-----| | all_gather_formulaic_tiling.h | mc2/all_gather_matmul/op_host/op_tiling/all_gather_formulaic_tiling.h,mc2/all_gather_matmul_v2/op_host/op_tiling/all_gather_formulaic_tiling.h | 都为内部头文件,但内容不同,已修改all_gather_matmul_v2算子内文件的命名 | | grouped_matmul_host_util.h | gmm/grouped_matmul/op_host/grouped_matmul_host_util.h,mc2/3rd/grouped_matmul/op_tiling/grouped_matmul_host_util.h | 都为内部头文件,但内容不完全相同,已修改mc2/3rd内文件的命名 | | grouped_matmul_tiling.h | gmm/grouped_matmul/op_host/op_tiling/grouped_matmul_tiling.h,mc2/3rd/grouped_matmul/op_tiling/grouped_matmul_tiling.h | 都为内部头文件,但内容不完全相同,已修改mc2/3rd内文件的命名 | | matmul_util.h | mc2/3rd/common/op_host/op_api/matmul_util.h,mc2/common/utils/matmul_util.h | 都为内部头文件,但内容不完全相同,已修改mc2/3rd内文件的命名,并消除宏冲突 | | runtime_kb_api.h | common/stub/op_tiling/runtime_kb_api.h,mc2/3rd/ops_legacy/op_tiling/runtime_kb_api.h | 声明完全相同,但实现侧不同,删除mc2/3rd/ops_legacy下的runtime_kb_api.h | | tiling_type.h | common/include/op_host/tiling_type.h,mc2/3rd/common/op_host/op_tiling/tiling_type.h |都为内部文件,但内容不完全相同,保留common/include/op_host/tiling_type.h统一使用 | | tuning_tiling_reflection_utils.h | common/stub/op_tiling/register/tuning_tiling_reflection_utils.h,mc2/3rd/ops_legacy/op_tiling/register/tuning_tiling_reflection_utils.h | 声明完全相同,删除mc2/3rd/ops_legacy/op_tiling/register/tuning_tiling_reflection_utils.h | | tuning_tiling_registry.h | common/stub/op_tiling/register/tuning_tiling_registry.h,mc2/3rd/ops_legacy/op_tiling/register/tuning_tiling_registry.h | 声明完全相同,删除mc2/3rd/ops_legacy/op_tiling/register/tuning_tiling_registry.h | --- ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> https://gitcode.com/cann/ops-transformer/issues/2550 ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> rdv ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [x] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!56378 天前
Fix D/C v3 graph failure Co-authored-by: GJQ<gaojiaqin@hisilicon.com> # message auto-generated for no-merge-commit merge: !2338 merge moe_context into master Fix D/C v3 graph failure Created-by: Jiaqin Commit-by: GJQ Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> 在线编译失败,找不到头文件,为头文件路径与run包展开后存在差异导致 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-transformer!23382 个月前
MC2 exception dump fit beta cann version Co-authored-by: lcttie<luchentao@huawei.com> # message auto-generated for no-merge-commit merge: !4827 merge master into master MC2 exception dump fit beta cann version Created-by: lcttie Commit-by: lcttie Merged-by: cann-robot Description: ## 描述 1、当使用社区版本(如 alpha, beta)的 cann 9.0.0 时,接口 aclsysGetVersionNum 会获取到一个小于 90000000 的版本号(依据 RTS 描述,该设计是为了通过版本号识别发布的先后顺序,因此 beta 的版本号是 90000000 减去一个小的值而不是加一个小的值)。 2、版本号判断后日志级别修正,由 ERROR 级别转为 WARNING 级别。 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> DTS2604280014971 ## 测试 本地编译/验证、黄区编译、二级冒烟 ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [x] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!482723 天前
aiv_dpu context结构体切换 Co-authored-by: zzg_code<zengzhiguo1@huawei.com> Co-authored-by: y00951989<yangshengjun3@huawei.com> # message auto-generated for no-merge-commit merge: !3665 merge dpu_pr into master aiv_dpu context结构体切换 Created-by: yangshengjun703 Commit-by: y00951989;zzg_code Merged-by: cann-robot Description: ## 描述 dispatch/combine算子实现aiv dpu直驱下A5 context结构体切换 ## 关联Issue 关联的Issue [https://gitcode.com/cann/ops-transformer/issues/1880](url) ## 测试 完成本地、线上 rdv 及 8p pod 环境用例测试,精度通过 # NPU算子代码检视报告 **项目名称**:MoE算子代码修改检视 **PR链接**:https://gitcode.com/cann/ops-transformer/pull/3665 **检视文件**:3665.diff **检视人**:Turing Team **检视日期**:2026-04-14 --- ## 检视概览 | 统计项 | 数值 | |-------|------| | 发现问题总数 | 6 个 | | 严重级(CRITICAL)问题 | 2 个 | | 中等级(MEDIUM)问题 | 2 个 | | 轻微级(LOW)问题 | 2 个 | **核心结论**:本次修改涉及 MoE 算子的 V2 到 V3 版本迁移、新增 Mc2Context 通信上下文管理类、build.sh 自动编译配置等,发现 6 处需要关注的问题,其中 2 处严重问题需要优先修复。 --- ## 问题详情及修改建议 ### 问题ID:ISSUE-001 | 严重级别:CRITICAL **关联红线条款**:cpp-secure 3.6 / cpp-general 4.2 **代码路径**:build.sh:1408-1413 **问题类型**:字符串存储越界 **问题描述**:build.sh 中使用字符串拼接将 V3 版本算子名添加到编译列表时,未检查 ascend_op_name 变量的长度是否足以容纳新增内容。若原始 ascend_op_name 长度接近变量容量,可能导致字符串截断或行为异常。 **修改建议**: ```bash # bash 变量赋值在大多数情况下会自动扩展,风险较低 # 建议在赋值前检查原始字符串长度,或使用更安全的方式 if [[ "${ascend_op_name}" == *"moe_distribute_combine_v2"* ]] && [[ "${ascend_op_name}" != *"moe_distribute_combine_v3"* ]]; then ascend_op_name="${ascend_op_name};moe_distribute_combine_v3" fi # 同样处理 dispatch ``` --- ### 问题ID:ISSUE-002 | 严重级别:CRITICAL **关联红线条款**:cpp-secure 5.1 / cpp-secure 5.2 / cpp-secure 3.5 **代码路径**:mc2_context.h - Mc2Context 类 **问题类型**:空指针未保护 / 资源泄露 **问题描述**:使用 dlopen/dlsym 动态加载 HCCL 库时,dlopen 返回的句柄和 dlsym 获取的函数指针均未进行空值检查。若库文件不存在、版本不匹配或符号导出问题,可能导致后续调用空指针引发程序崩溃。此外,dlclose 的调用路径需要与 dlopen 配对。 **修改建议**: ```cpp void* handle = dlopen(libPath.c_str(), RTLD_NOW | RTLD_GLOBAL); if (handle == nullptr) { OP_LOGE(ACLNN_ERR_INNER, "dlopen HCCL library failed: %s, error: %s", libPath.c_str(), dlerror()); return ACLNN_ERR_INNER; } void* func = dlsym(handle, "HcclRankGraphGetLinks"); if (func == nullptr) { OP_LOGE(ACLNN_ERR_INNER, "Load func=%s error=%s in lib hccl failed.", funcName.c_str(), dlerror()); dlclose(handle); return ACLNN_ERR_INNER; } ``` **修改说明**:遵循 cpp-secure 5.1 资源申请后必须判断是否成功的要求,dlopen 和 dlsym 调用后必须进行返回值检查,失败时进行错误处理并释放已申请的资源。 --- ### 问题ID:ISSUE-003 | 严重级别:MEDIUM **关联红线条款**:cpp-secure 10.11 / cpp-secure 10.12 **代码路径**:mc2_moe_context.h - epRankId 字段类型 **问题类型**:结构体 ABI 兼容性 **问题描述**:将 epRankId 从 uint64_t 改为 uint32_t,这会导致结构体大小变化,可能与原有的二进制布局不兼容。若有存量设备上的旧版本结构体数据,可能导致解析错误。新增 rankSizePerServer 字段也需要确保在结构体末尾添加。 **修改建议**: 1. 若用于进程间通信(IPC)或持久化存储,需要版本号管理 2. 若仅用于同一进程内的运行时传递,需确认所有调用方已同步更新 3. 建议添加版本号字段或使用更安全的序列化方式 --- ### 问题ID:ISSUE-004 | 严重级别:MEDIUM **关联红线条款**:ascendc-topk 1 / cpp-secure 4.1 **代码路径**:moe_distribute_combine_v2_base.cpp - Mc2Context 调用 **问题类型**:函数返回值未校验 **问题描述**:新增的 Mc2Context 相关调用(如获取通信句柄、资源等)需要检查返回值。若通信初始化失败或资源获取失败,可能导致后续操作访问无效数据。 **修改建议**: ```cpp auto ret = Mc2Aclnn::Mc2Context::GetMc2ContextTensor(groupEp, opName, hcclBuffSize, mc2Context); if (ret != ACLNN_SUCCESS) { OP_LOGE(ACLNN_ERR_INNER, "Get Mc2Context Tensor failed"); return ret; } ``` --- ### 问题ID:ISSUE-005 | 严重级别:LOW **代码路径**:CMakeLists.txt **问题类型**:依赖配置 **问题描述**:CMakeLists.txt 新增 mc2_context.cpp 编译,依赖项已正确配置。 --- ### 问题ID:ISSUE-006 | 严重级别:LOW **代码路径**:多个 cpp 文件 **问题类型**:代码风格 **问题描述**:接口调用从 aclnnInnerMoeDistributeCombineV2 改为 aclnnMoeDistributeCombineBase,逻辑正确。建议确认 V3 版本接口的兼容性。 --- ## 修改汇总 | 问题ID | 严重级别 | 状态 | 修复建议 | |--------|---------|------|---------| | ISSUE-001 | CRITICAL | 待处理 | bash 字符串拼接风险较低,建议监控 | | ISSUE-002 | CRITICAL | **需修复** | 必须增加 dlopen/dlsym 返回值检查 | | ISSUE-003 | MEDIUM | 需确认 | 确认结构体使用场景,确保 ABI 兼容 | | ISSUE-004 | MEDIUM | 建议修复 | 增加 Mc2Context 调用返回值检查 | | ISSUE-005 | LOW | 已正确 | 无需修改 | | ISSUE-006 | LOW | 已正确 | 无需修改 | --- ## 核心建议 1. **优先修复**: CRITICAL-002 - 动态库加载必须增加空值检查 2. **关注**: MEDIUM-003 - 结构体 ABI 兼容性需确认使用场景 3. **建议**: 所有 Mc2Context 调用处增加错误处理 --- ## 涉及文件清单 - build.sh - mc2/common/CMakeLists.txt - mc2/common/op_api/mc2_context.cpp (新增) - mc2/common/op_api/mc2_context.h (新增) - mc2/common/op_kernel/mc2_moe_context.h - mc2/moe_distribute_combine_v2/op_api/aclnn_moe_distribute_combine_v2.cpp - mc2/moe_distribute_combine_v2/op_api/aclnn_moe_distribute_combine_v3.cpp - mc2/moe_distribute_combine_v2/op_api/aclnn_moe_distribute_combine_v4.cpp - mc2/moe_distribute_combine_v2/op_api/moe_distribute_combine_v2_base.cpp - mc2/moe_distribute_combine_v2/op_api/moe_distribute_combine_v2_base.h - mc2/moe_distribute_combine_v2/op_host/CMakeLists.txt --- *报告生成时间:2026-04-14* See merge request: cann/ops-transformer!36651 个月前
修复mc2算子编kernel的ut编译出错的问题 Co-authored-by: hblnb<huangbolin3@huawei.com> # message auto-generated for no-merge-commit merge: !5373 merge fix_issue_2445 into master 修复mc2算子编kernel的ut编译出错的问题 Created-by: hblnb Commit-by: hblnb Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!537314 天前
op kernel of mc2Context Co-authored-by: OblivionZHU<zhujun116@huawei.com> # message auto-generated for no-merge-commit merge: !2131 merge master into master op kernel of mc2Context Created-by: OblivionZHU Commit-by: OblivionZHU Merged-by: cann-robot Description: ## 描述 更新kernel侧代码,新增接口和必选输入用于传递context信息,在kernel内部增加对新路径的判断并获取context信息。 ## 关联的Issue 关联Issue #1030需求建议: 新增动态获取context输入的方法,以便实时更新 ## 测试 静态检查、蓝区冒烟、二级冒烟、线下RDV。 ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-transformer!21312 个月前
mc2 docs fix Co-authored-by: caoqiku<caoqiku1@h-partners.com> # message auto-generated for no-merge-commit merge: !4110 merge mc2_docs_fix into master mc2 docs fix Created-by: cqk1107 Commit-by: caoqiku Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> 同步mc2文档更新商分pr上的检视意见 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [x] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!41101 个月前
README.md

MoeDistributeDispatchV3

产品支持情况

产品 是否支持
Ascend 950PR/Ascend 950DT ×
Atlas A3 训练系列产品/Atlas A3 推理系列产品
Atlas A2 训练系列产品/Atlas A2 推理系列产品 ×
Atlas 200I/500 A2 推理产品 ×
Atlas 推理系列产品 ×
Atlas 训练系列产品 ×

功能说明

算子功能:对token数据进行量化(可选),当存在TP域通信时,先进行EP(Expert Parallelism)域的AllToAllV通信,再进行TP(Tensor Parallelism)域的AllGatherV通信;当不存在TP域通信时,进行EP(Expert Parallelism)域的AllToAllV通信。

  • 情形1:如果quant_mode=0(非量化场景):

allToAllXOut = AllToAllV(X)\\ expand_x_out = \begin{cases} AllToAllV(X), & 无TP通信域 \\ AllGatherV(allToAllXOut), & 有TP通信域 \\ \end{cases}

  • 情形2:如果quant_mode=2(pertoken动态量化场景):

xFp32 = CastToFp32(X) \times scales \\ dynamicScales = dstTypeMax/Max(Abs(xFp32)) \\ quantOut = CastToInt8(xFp32 \times dynamicScales) \\ allToAllXOut = AllToAllV(quantOut) \\ allToAllDynamicScalesOut = AllToAllV(1.0/dynamicScales) \\ expand_x_out = \begin{cases} AllToAllV(quantOut), & 无TP通信域 \\ AllGatherV(allToAllXOut), & 有TP通信域 \\ \end{cases} \\ dynamic_scales_out = \begin{cases} AllGatherV(allToAllDynamicScalesOut), & 无TP通信域 \\ allToAllDynamicScalesOut, & 有TP通信域 \\ \end{cases}

其中,emaxemax表示该类型最大正规数对应的指数部分的值。

  • Atlas A3 训练系列产品/Atlas A3 推理系列产品:该算子必须与MoeDistributeCombineV3一起使用。

相较于MoeDistributeDispatchV3算子,该算子变更如下:

  • 新增context入参,存入通信域相关信息;
  • 新增ccl_buffer_size入参,指定当前通信域大小;
  • 减少group_ep以及group_tp通信域名称入参;

详细说明请参考以下参数说明。

参数说明

参数名 输入/输出/属性 描述 数据类型 数据格式
context 输入 本卡通信域信息数据。 FLOAT16、BFLOAT16 ND
x 输入 本卡发送的token数据。 FLOAT16、BFLOAT16 ND
expert_ids 输入 每个token的topK个专家索引。 INT32 ND
scales_optional 可选输入 每个专家的量化平滑参数,非量化场景传空指针,动态量化可传有效数据或空指针。 FLOAT32 ND
x_active_mask_optional 可选输入 表示token是否参与通信,可传有效数据或空指针;1D时true需排在false前(例:{true, false, true}非法),2D时token对应K个值全为false则不参与通信;默认所有token参与通信;各卡BS不一致时所有token需有效。 BOOL ND
expert_scales_optional 可选输入 每个token的topK个专家权重。 FLOAT32 ND
elastic_info_optional 可选输入 EP通信域动态缩容信息。 FLOAT32 ND
performance_info_optional 可选输入 表示本卡等待各卡数据的通信时间,单位为us(微秒)。单次算子调用各卡通信耗时会累加到该Tensor上,算子内部不进行自动清零,因此用户每次启用此Tensor开始记录耗时前需对Tensor清零。 INT64 ND
ep_world_size 属性 EP通信域大小。 INT64 ND
ep_rank_id 属性 EP域本卡Id,取值范围[0, ep_world_size),同一个EP通信域中各卡的ep_rank_id不重复。 INT64 ND
moe_expert_num 属性 MoE专家数量,满足moe_expert_num % (ep_world_size - shared_expert_num) = 0。 INT64 ND
ccl_buffer_size 属性
  • 当前通信域Buffer大小。
  • 默认值为""。
  • STRING ND
    tp_world_size 可选属性
  • TP通信域大小,取值范围[0, 2],0和1表示无TP域通信,有TP域通信时仅支持2。
  • 默认值为0。
  • INT64 ND
    tp_rank_id 可选属性
  • TP域本卡Id,取值范围[0, 1],同一个TP通信域中各卡的tp_rank_id不重复;无TP域通信时传0即可。
  • 默认值为0。
  • INT64 ND
    expert_shard_type 可选属性
  • 表示共享专家卡分布类型,当前仅支持传0,表示共享专家卡排在MoE专家卡前面。
  • 默认值为0。
  • INT64 ND
    shared_expert_num 可选属性
  • 表示共享专家数量(一个共享专家可复制部署到多个卡上)。
  • 默认值为1。
  • INT64 ND
    shared_expert_rank_num 可选属性
  • 表示共享专家卡数量,取值范围[0, ep_world_size);为0时需满足shared_expert_num为0或1,不为0时需满足shared_expert_rank_num % shared_expert_num = 0。
  • 默认值为0。
  • INT64 ND
    quant_mode 可选属性
  • 表示量化模式,支持0:非量化,2:动态量化。
  • 默认值为0。
  • INT64 ND
    global_bs 可选属性
  • EP域全局的batch size大小;各rank BS一致时,global_bs = BS * ep_world_size 或 0;各rank BS不一致时,global_bs = max_bs * ep_world_size(max_bs为单卡BS最大值)。
  • 默认值为0。
  • INT64 ND
    expert_token_nums_type 可选属性
  • 输出expert_token_nums中值的语义类型,支持0:expert_token_nums中的输出为每个专家处理的token数的前缀和,1:expert_token_nums中的输出为每个专家处理的token数量。
  • 默认值为1。
  • INT64 ND
    comm_alg 可选属性
  • 表示通信亲和内存布局算法。
  • 默认值为""。
  • STRING ND
    zero_expert_num 可选属性
  • 零专家数量。
  • 默认值为0。
  • INT64 ND
    copy_expert_num 可选属性
  • copy专家数量。
  • 默认值为0。
  • INT64 ND
    const_expert_num 可选属性
  • 常量专家数量。
  • 默认值为0。
  • INT64 ND
    expand_x_out 输出 根据expert_ids进行扩展过的token特征。 FLOAT16、BFLOAT16、INT8 ND
    dynamic_scales_out 输出 量化场景下,表示本卡输出Token的量化系数,仅quant_mode=2时有该输出。 FLOAT32 ND
    assist_info_for_combine_out 输出 表示给同一专家发送的token个数。 INT32 ND
    expert_token_nums_out 输出 表示每个专家收到的token个数。 INT64 ND
    ep_recv_count_out 输出 从EP通信域各卡接收的token数。 INT32 ND
    tp_recv_count_out 输出 从TP通信域各卡接收的token数,有TP域通信则有该输出,无TP域通信则无该输出。 INT32 ND
    expand_scales_out 输出 表示本卡输出token的权重。 FLOAT32 ND
    • Atlas A3 训练系列产品/Atlas A3 推理系列产品:
      • 不支持expand_scales_out

    约束说明

    • MoeDistributeDispatchV3CombineV3系列算子必须配套使用,具体参考调用示例。

    • 在不同产品型号、不同通信算法或不同版本中,MoeDistributeDispatchV3的Tensor输出assist_info_for_combine_outep_recv_count_outtp_recv_count_outexpand_scales_out中的元素值可能不同,使用时直接将上述Tensor传给CombineV3系列算子对应参数即可,模型其他业务逻辑不应对其存在依赖。

    • 调用算子过程中使用的ep_world_sizemoe_expert_numccl_buffer_sizetp_world_sizeexpert_shard_typeshared_expert_numshared_expert_rank_numglobal_bscomm_alg参数取值所有卡需保持一致,网络中不同层中也需保持一致,且和CombineV3系列算子对应参数也保持一致。

    • 参数说明里shape格式说明:

      • A:表示本卡可能接收的最大token数量,取值范围如下:
        • 对于共享专家,要满足A = BS * ep_world_size * shared_expert_num / shared_expert_rank_num
        • 对于MoE专家,当global_bs为0时,要满足A >= BS * ep_world_size * min(local_expert_num, K);当global_bs非0时,要满足A >= global_bs * min(local_expert_num, K)。
      • K:表示选取topK个专家,取值范围为0 < K ≤ 16同时满足0 < Kmoe_expert_num + zero_expert_num + copy_expert_num + const_expert_num
      • local_expert_num:表示本卡专家数量。
        • 对于共享专家卡,local_expert_num = 1
        • 对于MoE专家卡,local_expert_num = moe_expert_num / (ep_world_size - shared_expert_rank_num),local_expert_num > 1时,不支持TP域通信。
    • 属性约束:

      • zero_expert_num:取值范围:[0, MAX_INT32),MAX_INT32 = 2^31 - 1, 合法的零专家的ID的值是[moe_expert_num, moe_expert_num + zero_expert_num)。
      • copy_expert_num:取值范围:[0, MAX_INT32),MAX_INT32 = 2^31 - 1, 合法的copy专家的ID的值是[moe_expert_num + zero_expert_num, moe_expert_num + zero_expert_num + copy_expert_num)。
      • const_expert_num:取值范围:[0, MAX_INT32),MAX_INT32 = 2^31 - 1, 合法的常量专家的ID的值是[moe_expert_num + zero_expert_num + copy_expert_num, moe_expert_num + zero_expert_num + copy_expert_num + const_expert_num)。
    • 本文公式中的"/"表示整除。

    • 通信域使用约束:

      • 一个模型中的CombineV3系列算子和MoeDistributeDispatchV3仅支持相同EP通信域,且该通信域中不允许有其他算子。
      • 一个模型中的CombineV3系列算子和MoeDistributeDispatchV3仅支持相同TP通信域或都不支持TP通信域,有TP通信域时该通信域中不允许有其他算子。
    • Atlas A3 训练系列产品/Atlas A3 推理系列产品:

      • 该场景下单卡包含双DIE(简称为“晶粒”或“裸片”),因此参数说明里的“本卡”均表示单DIE。
      • 参数约束:
        • elastic_info_optional:当前版本不支持,传空指针即可。
        • ep_world_size:取值范围[2, 768]。
        • moe_expert_num:取值范围(0, 1024]。
        • shared_expert_num:取值支持[0, 4]。
        • comm_alg:当前版本仅支持"","fullmesh_v1","fullmesh_v2"三种输入方式。
          • "":默认值,使能fullmesh_v1模板。
          • "fullmesh_v1":使能fullmesh_v1模板。
          • "fullmesh_v2":使能fullmesh_v2模板,其中comm_alg仅在tp_world_size取值为1时生效,且不支持在各卡BS不一致、输入xActiveMask和特殊专家场景下使能。
        • ep_recv_count_out:要求shape为 (ep_world_size * max(tp_world_size, 1) * local_expert_num, )。
        • performance_Info_optional:预留参数,当前版本不支持,传空指针即可。
        • ccl_buffer_size:调用get_low_latency_ccl_buffer_size接口(../../torch_extension/npu_ops_transformer/ops/deep_ep.py)。
      • 参数说明里shape格式说明:
        • H:表示hidden size隐藏层大小,取值范围[1024, 8192]。
        • BS:表示batch sequence size,即本卡最终输出的token数量,取值范围为[1, 512]。

    调用说明

    调用方式 样例代码 说明
    npu_low_latency_dispatch接口 deepep.py 通过npu_low_latency_dispatch接口方式调用moe_distribute_dispatch_v3算子。