文件最后提交记录最后更新时间
Update Dispatch v3v4 docs Co-authored-by: tgwsakiko_<linwei69@huawei.com> # message auto-generated for no-merge-commit merge: !4182 merge docs into master Update Dispatch v3v4 docs Created-by: tgwsakiko_ Commit-by: tgwsakiko_ Merged-by: cann-robot Description: ## 描述 Update the support scope of Dispatch v3 and v4 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [x] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!41821 个月前
D&C 示例代码修复 Co-authored-by: jiangxiuhan1<jiangxiuhan@huawei.com> # message auto-generated for no-merge-commit merge: !4371 merge master into master D&C 示例代码修复 Created-by: jiangxiuhan1 Commit-by: jiangxiuhan1 Merged-by: cann-robot Description: ## 描述 IS_TEST_* 需要手动设置,直接运行示例代码,没有设置IS_TEST_* 会导致 example 运行失败,example daily会运行失败; 修复上述问题,将原先独立的IS_TEST_A3和IS_TEST_A5布尔标志合并为统一的IS_TEST_A3A5标志,并设置为true,可直接运行示例代码。 ## 关联的Issue https://gitcode.com/cann/ops-transformer/issues/1948 ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [x] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: # 代码检视报告 **检视文件**:test_aclnn_moe_distribute_combine_v2.cpp **检视类别**:C++ 安全编码规范(Host 侧测试代码) **规范来源**:cpp-secure.mdascendc-topk.md **检视时间**:2026-04-20 --- ## 风险点列表 ### 【中风险】问题1:LOG 参数类型不匹配 **代码位置**:116-118 行、80 行 ```cpp LOG_PRINT("[INFO] rank = %d, ...", args.rankId, ...); // args.rankId 是 uint32_t,应用 %u LOG_PRINT("[ERROR] aclrtMalloc failed. ret: %d\n", ret); // ret 是 int,%d 正确 ``` **假设检验过程**: | 证据类型 | 分析动作 | 分值 | |---------|---------|------| | 规范违反 | 规则 11.3:LOG 参数类型与格式化说明符不匹配 | +40% | | 上下文防御缺失 | 无类型检查 | +30% | **自信值**:70%(> 60%,判定存在风险) **规范条款**:规则 11.3 LOG API 参数类型必须与格式化说明符匹配 [适用: Tiling] **建议修复**:uint32_t 类型使用 %u 而非 %d。 --- ### 【中风险】问题2:资源释放后未置空 **代码位置**:315-320 行、576-581 行 ```cpp if (dispatchV2WorkspaceSize > 0) { aclrtFree(dispatchV2WorkspaceAddr); // 释放后未置 nullptr } ``` **假设检验过程**: | 证据类型 | 分析动作 | 分值 | |---------|---------|------| | 规范违反 | 规则 3.2:资源释放后指针应置新值 | +40% | | 上下文防御缺失 | 后续无重复使用,但不符合规范 | +20% | **自信值**:60%(= 60%,判定存在风险) **规范条款**:规则 3.2 指向资源句柄的变量,在资源释放后立即赋予新值 [适用: Tiling] **建议修复**: ```cpp if (dispatchV2WorkspaceSize > 0) { aclrtFree(dispatchV2WorkspaceAddr); dispatchV2WorkspaceAddr = nullptr; } ``` --- ### 【中风险】问题3:函数返回值未校验 **代码位置**:768-772 行 ```cpp if (IS_TEST_A2) { int ret = run_example_on_A2(); // 返回值未使用 } else if (IS_TEST_A3A5) { int ret = run_example_on_A3A5(); // 返回值未使用 } ``` **假设检验过程**: | 证据类型 | 分析动作 | 分值 | |---------|---------|------| | 规范违反 | TOPK 问题1:必须校验函数返回值 | +40% | | 上下文防御缺失 | 未处理执行失败情况 | +30% | **自信值**:70%(> 60%,判定存在风险) **规范条款**:TOPK 问题清单 规则 1 必须校验函数返回值 [适用: Host] --- ## 检视总结 | 风险级别 | 数量 | 问题类型 | |---------|------|---------| | 中风险 | 3 | LOG类型不匹配、资源释放后未置空、返回值未校验 | # 代码检视报告 **检视文件**:test_aclnn_moe_distribute_dispatch_v2.cpp **检视类别**:C++ 安全编码规范(Host 侧测试代码) **规范来源**:cpp-secure.mdascendc-topk.md **检视时间**:2026-04-20 --- ## 风险点列表 ### 【中风险】问题1:LOG 参数类型不匹配 **代码位置**:115 行、361 行 ```cpp LOG_PRINT("[INFO] rank = %d, ...", args.rankId, ...); // args.rankId 是 uint32_t,应用 %u ``` **假设检验过程**: | 证据类型 | 分析动作 | 分值 | |---------|---------|------| | 规范违反 | 规则 11.3:LOG 参数类型与格式化说明符不匹配 | +40% | | 上下文防御缺失 | 无类型检查 | +30% | **自信值**:70%(> 60%,判定存在风险) **规范条款**:规则 11.3 LOG API 参数类型必须与格式化说明符匹配 [适用: Tiling] --- ### 【中风险】问题2:资源释放后未置空 **代码位置**:314-318 行、572-577 行 ```cpp if (dispatchV2WorkspaceSize > 0) { aclrtFree(dispatchV2WorkspaceAddr); // 释放后未置 nullptr } ``` **假设检验过程**: | 证据类型 | 分析动作 | 分值 | |---------|---------|------| | 规范违反 | 规则 3.2:资源释放后指针应置新值 | +40% | | 上下文防御缺失 | 后续无重复使用,但不符合规范 | +20% | **自信值**:60%(= 60%,判定存在风险) **规范条款**:规则 3.2 指向资源句柄的变量,在资源释放后立即赋予新值 [适用: Tiling] --- ### 【中风险】问题3:函数返回值未校验 **代码位置**:763 行、767 行 ```cpp if (IS_TEST_A2) { LOG_PRINT("Example on <Atlas A2> will be executed!\n"); int ret = run_example_on_A2(); // 返回值未使用 } else if (IS_TEST_A3A5) { LOG_PRINT("Example on <Atlas A3> or <Atlas A5> will be executed!\n"); int ret = run_example_on_A3A5(); // 返回值未使用 } ``` **假设检验过程**: | 证据类型 | 分析动作 | 分值 | |---------|---------|------| | 规范违反 | TOPK 问题1:必须校验函数返回值 | +40% | | 上下文防御缺失 | 未处理执行失败情况 | +30% | **自信值**:70%(> 60%,判定存在风险) **规范条款**:TOPK 问题清单 规则 1 必须校验函数返回值 [适用: Host] --- ## 检视总结 | 风险级别 | 数量 | 问题类型 | |---------|------|---------| | 中风险 | 3 | LOG类型不匹配、资源释放后未置空、返回值未校验 | See merge request: cann/ops-transformer!43711 个月前
修改Dspatch&combine红线问题 Co-authored-by: zzg_code<zengzhiguo1@huawei.com> # message auto-generated for no-merge-commit merge: !5194 merge temp into master 修改Dspatch&combine红线问题 Created-by: zzg_code Commit-by: zzg_code Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> ## 关联的Issue https://gitcode.com/cann/ops-transformer/issues/2365 ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!519417 天前
move fallback files to op graph lib Co-authored-by: liusixia<liusixia@h-partners.com> # message auto-generated for no-merge-commit merge: !4133 merge master into master move fallback files to op graph lib Created-by: liusixia_gitcode Commit-by: liusixia Merged-by: cann-robot Description: ## 描述 动态图相关:仓内aclnn回调的fallback文件,在内置工程(built-in pkg)下,由ophost.so 改为编入opgraph.so中;自定义工程(custom pkg)下,保持不变。 其中,mc2算子的fallback文件当前均include了依赖tiling的头文件(mc2_log.h),统一将其与tiling解耦,使用mc2_common_log.h。 ## 关联的Issue https://gitcode.com/cann/ops-transformer/issues/1844 ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [x] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!41331 个月前
combine support 10240 hidden size and 1024 moe expert num Co-authored-by: ryan_li<liyang843@h-partners.com> # message auto-generated for no-merge-commit merge: !2402 merge combine_h10240 into master combine support 10240 hidden size and 1024 moe expert num Created-by: ryan_li Commit-by: ryan_li Merged-by: cann-robot Description: ## 描述 combine support 10240 hidden size and 1024 moe expert num ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-transformer!240217 天前
fix: correct smoothScales buffer allocation size for pergroup quantization Co-authored-by: zhong-zixin<zhongzixin@huawei.com> # message auto-generated for no-merge-commit merge: !4770 merge nan_bug into master fix: correct smoothScales buffer allocation size for pergroup quantization Created-by: zhong-zixin Commit-by: zhong-zixin Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> 修复 pergroup 量化场景下,外部传入 smoothScale 时,量化计算时可能引入脏数据的问题。具体来说,量化计算时会以128个元素为一组计算 dynamicScale,但 TBuf 分配内存和 smoothScale 搬运时未按照 128 元素大小对齐,导致量化计算时引入脏数据。 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [x] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: # Ascend C 代码检视报告 ## 检视信息 | 项目 | 内容 | |------|------| | **Commit ID** | 864ca861e83245c7a8e4df20d890e6153809c8a8 | | **Commit Message** | fix: correct smoothScales buffer allocation size for pergroup quantization | | **检视时间** | 2026-04-29 | | **检视规范** | cpp-secure.md + cpp-general.md + ascendc-topk.md | | **检视范围** | C++ 安全规范 + 通用编码规范 + TOPK高频问题 | | **检视结论** | **PASS** | | **风险点数量** | 0 | --- ## 变更文件清单 | 序号 | 文件路径 | 变更行数 | 检视范围 | |-----|---------|---------|---------| | 1 | mc2/moe_distribute_dispatch_v2/op_host/op_tiling/moe_distribute_dispatch_v2_tiling.cpp | +5 | Tiling侧(Host) | | 2 | mc2/moe_distribute_dispatch_v2/op_kernel/arch35/moe_distribute_dispatch_v2_host_kfc.h | +5 | Kernel侧 | | 3 | mc2/moe_distribute_dispatch_v2/op_kernel/moe_distribute_dispatch_v2.h | +6 | Kernel侧 | | 4 | mc2/moe_distribute_dispatch_v2/op_kernel/moe_distribute_dispatch_v2_quant.h | +13 | Kernel侧 | --- ## 假设检验过程 ### 代码段1:tiling.cpp(行1601-1611) **原假设 H0**:新增的 scalesStorageShape 指针判空和 hFp32Size 计算逻辑是安全的。 **备择假设 H1**:存在指针解引用或整数运算风险。 **自信值初始化**:0% --- #### 证据收集与评估 | 证据类型 | 分析动作 | 分析结果 | 证据分值 | |---------|---------|---------|---------| | **规范违反** | 检查指针判空(TOPK-1) | scalesStorageShape != nullptr 判断正确,符合要求 | 无违规 | | **规范违反** | 检查整数溢出(规范2.1/2.2) | 发现潜在溢出风险点 | +40% | | **上下文防御** | 检查业务约束保护 | **发现有效防御**:hMax=8192校验保护(行1119) | 无需额外防御 | | **工具验证** | GCC builtin溢出检测 | 业务范围内(h≤8192)无溢出 | 无溢出 | --- #### 业务约束证据链 **约束定义**(moe_distribute_dispatch_v2_tiling.cpp:116-118): ```cpp constexpr int64_t H_MIN = 1024; constexpr int64_t H_MAX = 8192; constexpr int64_t H_MAX_LAYERED = 7168; ``` **约束校验**(moe_distribute_dispatch_v2_tiling.cpp:1119-1120): ```cpp OP_TILING_CHECK((xDim1 < hMin) || (xDim1 > hMax), OP_LOGE(nodeName, "xShape dims1(H) should be in [%ld, %ld], but got %ld.", hMin, hMax, xDim1), return ge::GRAPH_FAILED); ``` **工具验证结果**: 使用 GCC builtin 函数在业务约束边界(h=8192)验证: ```bash # 测试行1609: Ceil(hSize * sizeof(float), UB_ALIGN) uint32_t dividend = 8192 * 4 = 32768 Ceil internal add overflow: NO Ceil result = 32768 # 测试行1611: Ceil(hSize, PERGROUP_BLOCK_SIZE) * sizeof(float) uint32_t ceilResult = Ceil(8192, 128) = 8192 ceilResult * 4 = 32768 (overflow: NO) ``` --- #### 自信值计算与决策 **证据汇总**: - 发现潜在溢出风险:+40%(理论风险) - 发现业务约束保护:-40%(有效防御) - 工具验证无溢出:-40%(实际安全) **自信值** = 40% - 40% - 40% = **-40%** < 60% **决策**:**PASS**(业务约束保护 + 工具验证确认) --- ### 代码段2:quant.h(行94-97) **原假设 H0**:新增的 smoothTailOffset_smoothTailCount_ 计算逻辑是安全的。 **备择假设 H1**:存在未初始化或整数运算风险。 **自信值初始化**:0% --- #### 证据收集与评估 | 证据类型 | 分析动作 | 分析结果 | 证据分值 | |---------|---------|---------|---------| | **规范违反** | 检查变量初始化(规范3.1) | 成员初始化器 {0} 确保初始化 | 无违规 | | **规范违反** | 检查整数溢出(规范2.2) | 发现潜在溢出风险点 | +40% | | **上下文防御** | 检查业务约束保护 | axisH_ 来自 TilingData,已校验范围 | 有效防御 | | **工具验证** | GCC builtin溢出检测 | 业务范围内无溢出 | 无溢出 | --- #### 变量初始化证据 **类定义**(moe_distribute_dispatch_v2_quant.h:36-37): ```cpp uint32_t smoothTailOffset_{0}; // ✅ 成员初始化器 uint32_t smoothTailCount_{0}; // ✅ 成员初始化器 ``` 符合规范 3.1:"变量使用前必须进行有效初始化"。 --- #### 工具验证结果 在业务约束边界(axisH_=8192)验证: ```bash # 测试行94: Ceil(axisH * sizeof(float), UB_ALIGN) * UB_ALIGN / sizeof(float) uint32_t ceilResult = Ceil(8192 * 4, 32) = 32768 ceilResult * 32 = 1048576 (overflow: NO) ``` --- #### 自信值计算与决策 **证据汇总**: - 发现潜在溢出风险:+40%(理论风险) - 变量已初始化:-40%(符合规范) - 业务约束保护:-40%(有效防御) - 工具验证无溢出:-40%(实际安全) **自信值** = 40% - 40% - 40% - 40% = **-80%** < 60% **决策**:**PASS**(初始化正确 + 业务约束保护 + 工具验证确认) --- ## 规范条款对照表 ### C++ 安全编码规范(cpp-secure.md) | 规范编号 | 规范名称 | 适用范围 | 检视结果 | 证据 | |---------|---------|---------|---------|------| | **2.1** | 有符号整数运算不溢出 | All | ✅ PASS | 业务约束(h≤8192)保护 | | **2.2** | 无符号整数运算不回绕 | All | ✅ PASS | 业务约束保护 + 工具验证 | | **2.3** | 除法/余数运算除零保护 | All | ✅ PASS | Ceil函数内置除零校验 | | **3.1** | 禁止未初始化变量 | All | ✅ PASS | 成员初始化器 {0} | | **TOPK-1** | 必须校验函数返回值 | Host | ✅ PASS | scalesStorageShape != nullptr | | **TOPK-7** | 外部输入校验 | Host | ✅ PASS | hSize来自TilingData已校验 | --- ### C++ 通用编码规范(cpp-general.md) | 规范编号 | 规范名称 | 适用范围 | 检视结果 | 证据 | |---------|---------|---------|---------|------| | **1.1** | 外部数据合法性检查 | All | ✅ PASS | OP_TILING_CHECK校验链 | | **15.2** | 入参用const T&,出参用T* | All | ✅ PASS | 参数传递符合规范 | --- ### TOPK 高频问题清单(ascendc-topk.md) | 序号 | 问题类型 | 适用范围 | 检视结果 | 证据 | |-----|---------|---------|---------|------| | **1** | 必须校验函数返回值 | Host | ✅ PASS | GetOptionalInputShape判空 | | **7** | 融合规则/InferShape/Tiling外部输入校验 | Host | ✅ PASS | h参数范围校验 | | **8** | gm内存偏移或大小必须用int64表示 | All | ✅ 不适用 | 本变更涉及UB大小计算 | --- ## 代码质量评估 ### 变更意图与实现 **变更意图**:修正 PERGROUP_DYNAMIC_QUANT 模式下 smoothScales buffer 分配大小计算逻辑。 **实现评估**: - ✅ 逻辑正确:从 Ceil(hSize * sizeof(float), UB_ALIGN) 改为 Ceil(hSize, PERGROUP_BLOCK_SIZE) * sizeof(float) - ✅ 覆盖完整:Tiling侧 + Kernel侧(三个文件)同步修改 - ✅ 条件准确:仅在 PERGROUP_DYNAMIC_QUANTisScales 时生效 - ✅ 注释更新:从 BS * K * 4B 改为 hAlign * 4B,语义更准确 ### 安全性评估 | 评估项 | 评分 | 说明 | |--------|------|------| | **数值安全** | 100/100 | 业务约束保护 + 工具验证确认无溢出 | | **内存安全** | 100/100 | 指针判空正确,变量初始化完整 | | **输入验证** | 100/100 | h参数范围校验链完整 | | **资源管理** | 100/100 | Buffer静态分配,无动态资源管理 | --- ## 检视结论 ### 最终判定:**PASS** **判定依据**: 1. **业务约束保护**:h参数在 Tiling 阶段校验范围 [1024, 8192],确保整数运算不会溢出 2. **工具验证确认**:使用 GCC builtin 函数在业务边界验证,无溢出触发 3. **代码规范合规**: - TOPK-1:函数返回值判空正确 - 规范 3.1:变量初始化完整(成员初始化器 {0}) - 规范 2.3:Ceil 函数内置除零保护 4. **变更质量高**:意图清晰,实现正确,覆盖完整 ### 安全边界说明 | 约束条件 | 具体内容 | 保护位置 | |---------|---------|---------| | **h范围** | [1024, 8192] (普通) / [1024, 7168] (layered) | moe_distribute_dispatch_v2_tiling.cpp:1119-1120 | | **校验方式** | OP_TILING_CHECK((xDim1 < hMin) || (xDim1 > hMax), ...) | Tiling 阶段强制校验 | ### 未来扩展风险提示 **风险点**:若未来业务需求扩展 h 超过 8192,整数溢出风险将被激活。 **应对建议**: - 若需支持更大 h(如 h > 268435456),应将 Ceil 函数返回值及中间变量改为 uint64_t - 或在 Tiling 阶段增加额外校验:OP_TILING_CHECK(h * sizeof(float) > UINT32_MAX, ...) --- ## 附录:工具验证详细数据 ### GCC builtin 溢出检测代码 ```cpp // 测试 Ceil 函数内部溢出 uint32_t dividend = 4294967292; // UINT32_MAX - 3 uint32_t divisor = 32; bool addOverflow = __builtin_uadd_overflow(dividend, divisor - 1, &dividend); // 结果:YES(dividend接近UINT32_MAX时溢出) // 测试业务约束边界(h=8192) uint32_t hSize = 8192; uint32_t dividend2 = hSize * 4; // 32768 bool mulOverflow = __builtin_umul_overflow(hSize, 4U, &dividend2); // 结果:NO(业务范围内安全) ``` ### 大类型对比验证代码 ```cpp // uint32_t vs uint64_t 对比 uint32_t hSize = 8192; uint32_t result32 = Ceil(hSize * 4, 32); uint64_t result64 = Ceil((uint64_t)hSize * 4, 32); // result32 = result64 = 32768(无截断) ``` --- ## 检视签名 **检视人**:Ascend C Code Review Skill **检视时间**:2026-04-29 **检视方法**:假设检验驱动 + 工具组合验证 **检视结论**:**PASS**(业务约束保护 + 代码规范合规) See merge request: cann/ops-transformer!477030 天前
提升moe_distribue_dispatch_setup,moe_distribue_dispatch_teardown算子以及相关依赖ut覆盖率 Co-authored-by: chenyifan<chenyifan66@h-partners.com> # message auto-generated for no-merge-commit merge: !5162 merge mdd_v2_ut into master 提升moe_distribue_dispatch_setup,moe_distribue_dispatch_teardown算子以及相关依赖ut覆盖率 Created-by: mutex_lock Commit-by: chenyifan Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> 提升moe_distribue_dispatch_setup,moe_distribue_dispatch_teardown算子以及相关依赖ut覆盖率 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> https://gitcode.com/cann/ops-transformer/issues/2341 ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [x] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!516217 天前
mc2新特性开发 Co-authored-by: xutianze<xutianze2@huawei.com> # message auto-generated for no-merge-commit merge: !500 merge feature_mc2 into master mc2新特性开发 Created-by: xutianze Commit-by: xutianze Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-transformer!5005 个月前
docs of MegaMoe Co-authored-by: OblivionZHU<zhujun116@huawei.com> # message auto-generated for no-merge-commit merge: !4833 merge master into master docs of MegaMoe Created-by: OblivionZHU Commit-by: OblivionZHU Merged-by: cann-robot Description: ## 描述 为MegaMoe算子添加文档说明,顺带更新D&C算子跨超说明 ## 关联的Issue [Requirement|需求建议]: 单一算子实现MoE Feed-Forward Network (FFN) 的完整计算流程 ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 更新了README.md文件等。 ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [x] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!483329 天前
README.md

MoeDistributeDispatchV2

产品支持情况

产品 是否支持
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:如果quantMode=0(非量化场景):

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

  • 情形2:如果quantMode=1(静态量化场景):

xFp32=CastToFp32(X)×scalesquantOut=Cast(xFp32,dstType)allToAllXOut=AllToAllV(quantOut)expandXOut={AllToAllV(quantOut),无TP通信域AllGatherV(allToAllXOut),有TP通信域xFp32 = CastToFp32(X) \times scales \\ quantOut = Cast(xFp32, dstType) \\ allToAllXOut = AllToAllV(quantOut)\\ expandXOut = \begin{cases} AllToAllV(quantOut), & 无TP通信域 \\ AllGatherV(allToAllXOut), & 有TP通信域 \\ \end{cases}

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

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

  • 情形4:如果quantMode=3(pertile动态量化场景):

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

  • 情形5:如果quantMode=4(mx量化场景):

sharedExp=Floor(log2(max(x)))−emaxdynamicScales=2sharedExpquantOut=CastToFp8(X/dynamicScales)allToAllXOut=AllToAllV(quantOut)allToAllDynamicScalesOut=AllToAllV(1.0/dynamicScales)expandXOut={AllToAllV(quantOut),无TP通信域AllGatherV(allToAllXOut),有TP通信域dynamicScalesOut={allToAllDynamicScalesOut,无TP通信域AllGatherV(allToAllDynamicScalesOut),有TP通信域sharedExp = Floor(log_2(max(x))) - emax \\ dynamicScales = 2^{sharedExp} \\ quantOut = CastToFp8(X / dynamicScales) \\ allToAllXOut = AllToAllV(quantOut) \\ allToAllDynamicScalesOut = AllToAllV(1.0 / dynamicScales) \\ expandXOut = \begin{cases} AllToAllV(quantOut), & 无TP通信域 \\ AllGatherV(allToAllXOut), & 有TP通信域 \\ \end{cases} \\ dynamicScalesOut = \begin{cases} allToAllDynamicScalesOut, & 无TP通信域 \\ AllGatherV(allToAllDynamicScalesOut), & 有TP通信域 \\ \end{cases}

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

  • Atlas A2 训练系列产品/Atlas A2 推理系列产品:该算子必须与MoeDistributeCombineV2配套使用。
  • Atlas A3 训练系列产品/Atlas A3 推理系列产品/Ascend 950PR/Ascend 950DT:该算子必须与MoeDistributeCombineV2MoeDistributeCombineAddRmsNorm配套使用。

说明:MoeDistributeCombineV2、MoeDistributeCombineAddRmsNorm算子在后续文档中统称为CombineV2系列算子。 ・ 相较于MoeDistributeDispatch算子,该算子变更如下:

  • 输出了更详细的token信息辅助CombineV2系列算子高效地进行全卡同步,因此原算子中shape为(BS * K,)的expandIdx出参替换为shape为(A * 128,)的assistInfoForCombineOut参数;
  • 新增commAlg入参,代替HCCL_INTRA_PCIE_ENABLEHCCL_INTRA_ROCE_ENABLE环境变量。

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

参数说明

参数名 输入/输出/属性 描述 数据类型 数据格式
x 输入 本卡发送的token数据。 FLOAT16、BFLOAT16、FLOAT8_E5M2、FLOAT8_E4M3FN、HIFLOAT8、FLOAT4_E2M1、FLOAT4_E1M2 ND
expertIds 输入 每个token的topK个专家索引。 INT32 ND
scalesOptional 可选输入 每个专家的量化平滑参数。 FLOAT32、FLOAT8_E8M0 ND
xActiveMaskOptional 可选输入 表示token是否参与通信,可传有效数据或空指针;1D时true需排在false前(例:{true, false, true}非法),2D时token对应K个值全为false则不参与通信;默认所有token参与通信;各卡BS不一致时所有token需有效。 BOOL ND
expertScalesOptional 可选输入 每个token的topK个专家权重。 FLOAT32 ND
elasticInfoOptional 可选输入 EP通信域动态缩容信息。当某些通信卡因异常而从通信域中剔除,实际参与通信的卡数可从本参数中获取。 FLOAT32 ND
performanceInfoOptional 可选输入 表示本卡等待各卡数据的通信时间,单位为us(微秒)。单次算子调用各卡通信耗时会累加到该Tensor上,算子内部不进行自动清零,因此用户每次启用此Tensor开始记录耗时前需对Tensor清零。 INT64 ND
groupEp 属性 EP通信域名称(专家并行通信域),字符串长度范围为[1, 128),不能和groupTp相同。 STRING ND
epWorldSize 属性 EP通信域大小。 INT64 ND
epRankId 属性 EP域本卡ID,取值范围[0, epWorldSize),同一个EP通信域中各卡的epRankId不重复。 INT64 ND
moeExpertNum 属性 MoE专家数量,满足moeExpertNum % (epWorldSize - sharedExpertRankNum) = 0。 INT64 ND
groupTp 可选属性
  • TP通信域名称(数据并行通信域)。
  • 默认值为""。
  • STRING ND
    tpWorldSize 可选属性
  • TP通信域大小,取值范围[0, 2],0和1表示无TP域通信,有TP域通信时仅支持2。
  • 默认值为0。
  • INT64 ND
    tpRankId 可选属性
  • TP域本卡ID,取值范围[0, 1],同一个TP通信域中各卡的tpRankId不重复;无TP域通信时传0即可。
  • 默认值为0。
  • INT64 ND
    expertShardType 可选属性
  • 表示共享专家卡分布类型,当前仅支持传0,表示共享专家卡排在MoE专家卡前面。
  • 默认值为0。
  • INT64 ND
    sharedExpertNum 可选属性
  • 表示共享专家数量(一个共享专家可复制部署到多个卡上)。
  • 默认值为1。
  • INT64 ND
    sharedExpertRankNum 可选属性
  • 表示共享专家卡数量,取值范围[0, epWorldSize);为0时需满足sharedExpertNum为0或1,不为0时需满足sharedExpertRankNum % sharedExpertNum = 0。
  • 默认值为0。
  • INT64 ND
    quantMode 可选属性
  • 表示量化模式。默认值为0。
  • INT64 ND
    globalBS 可选属性
  • EP域全局的batch size大小;各rank BS一致时,globalBS = BS * epWorldSize 或 0;各rank BS不一致时,globalBS = maxBS * epWorldSize(maxBS为单卡BS最大值)。
  • 默认值为0。
  • INT64 ND
    expertTokenNumsType 可选属性
  • 输出expertTokenNums中值的语义类型,支持0:expertTokenNums中的输出为每个专家处理的token数的前缀和,1:expertTokenNums中的输出为每个专家处理的token数量。
  • 默认值为1。
  • INT64 ND
    commAlg 可选属性
  • 表示通信亲和内存布局算法。
  • 默认值为""。
  • STRING ND
    zeroExpertNum 可选属性
  • 零专家数量。
  • 默认值为0。
  • INT64 ND
    copyExpertNum 可选属性
  • copy专家数量。
  • 默认值为0。
  • INT64 ND
    constExpertNum 可选属性
  • 常量专家数量。
  • 默认值为0。
  • INT64 ND
    expandXOut 输出 根据expertIds进行扩展过的token特征。 FLOAT16、BFLOAT16、INT8、FLOAT8_E4M3FN、FLOAT8_E5M2、HIFLOAT8、FLOAT4_E2M1、FLOAT4_E1M2 ND
    dynamicScalesOut 输出 量化场景下,表示本卡输出Token的量化系数。 FLOAT32、FLOAT8_E8M0 ND
    assistInfoForCombineOut 输出 表示给同一专家发送的token个数(对应CombineV2系列算子中的assistInfoForCombine)。 INT32 ND
    expertTokenNumsOut 输出 表示每个专家收到的token个数。 INT64 ND
    epRecvCountsOut 输出 从EP通信域各卡接收的token数(对应CombineV2系列算子中的epSendCounts)。 INT32 ND
    tpRecvCountsOut 输出 从TP通信域各卡接收的token数(对应CombineV2系列算子中的tpSendCountsOptional),有TP域通信则有该输出,无TP域通信则无该输出。 INT32 ND
    expandScalesOut 输出 表示本卡输出token的权重(对应CombineV2系列算子中的expandScalesOptional)。 FLOAT32 ND
    • Atlas A2 训练系列产品/Atlas A2 推理系列产品:
      • 不支持共享专家场景,不支持expertShardTypesharedExpertNumsharedExpertRankNum属性。
      • 仅支持EP域,无TP域,不支持groupTptpWorldSizetpRankId属性,且tpRecvCounts输出无有效内容。
      • 不支持elasticInfoOptional
      • commAlg = "hierarchy",expandScalesOut内容有效。
      • 不支持常量专家场景,不支持constExpertNum,使用默认值即可。
    • Atlas A3 训练系列产品/Atlas A3 推理系列产品:
      • commAlg 支持"","fullmesh_v1","fullmesh_v2", "hierarchy"三种输入方式。"":默认值,不使能fullmesh_v2模板;"fullmesh_v1":不使能fullmesh_v2模板;"fullmesh_v2":使能fullmesh_v2模板,该模板仅支持tpWorldSize为1场景;"hierarchy": 使能跨超模板,该模板仅支持tpWorldSize为1、共享专家为0的场景,且不支持可变BS、二维mask、特殊专家、performanceInfo场景。
      • expertScalesOptional 当commAlg="hierarchy"场景时,要求为2D Tensor,shape为(BS, K);当commAlg="","fullmesh_v1",
      • epWorldSize 取值范围[2, 768];当commAlg="hierarchy"场景时,取值范围为[16, 256],且为16的整数倍。
      • moeExpertNum 取值范围(0, 1024];当commAlg="hierarchy"场景时,取值范围为(0, 512]。
      • expandScalesOut 当commAlg="hierarchy"场景时,要求为1D Tensor,shape为(A,);当commAlg="","fullmesh_v1","fullmesh_v2"场景时,暂不支持该输出。
    • Ascend 950PR/Ascend 950DT:
      • 仅支持EP域,无TP域,不支持groupTptpWorldSizetpRankId属性,且tpRecvCounts输出无有效内容。
      • 不支持expandScalesOut

    约束说明

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

    • 算子通信域各节点的驱动版本应当相同。

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

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

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

      • A:表示本卡可能接收的最大token数量,取值范围如下:
        • 对于共享专家,要满足A = BS * epWorldSize * sharedExpertNum / sharedExpertRankNum
        • 对于MoE专家,当globalBS为0时,要满足A >= BS * epWorldSize * min(localExpertNum, K);当globalBS非0时,要满足A >= globalBS * min(localExpertNum, K)。
      • K:表示选取topK个专家,取值范围为0 < K ≤ 16同时满足0 < KmoeExpertNum + zeroExpertNum + copyExpertNum + constExpertNum
      • localExpertNum:表示本卡专家数量。
        • 对于共享专家卡,localExpertNum = 1
        • 对于MoE专家卡,localExpertNum = moeExpertNum / (epWorldSize - sharedExpertRankNum),localExpertNum > 1时,不支持TP域通信。
    • 属性约束:

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

    • 通信域使用约束:

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

      • 参数约束:
        • commAlg:当前版本支持nullptr, "", "fullmesh", "hierarchy"四种输入方式,若配置"hierarchy",建议搭配搭配25.0.RC1.1及以上版本驱动使用。
          • nullptr和"":仅在此场景下,HCCL_INTRA_PCIE_ENABLEHCCL_INTRA_ROCE_ENABLE配置生效。当HCCL_INTRA_PCIE_ENABLE=1&&HCCL_INTRA_ROCE_ENABLE=0时,调用"hierarchy"算法,否则调用"fullmesh"算法。不推荐使用该方式。
          • "fullmesh":token数据直接通过RDMA方式发往topk个目标专家所在的卡。
          • "hierarchy":token数据经过跨机、机内两次发送,仅不同server同号卡之间使用RDMA通信,server内使用HCCS通信。
        • epWorldSize:依commAlg取值,"fullmesh"支持2、3、4、5、6、7、8、16、32、64、128、192、256、384;"hierarchy"支持16、32、64。
        • moeExpertNum:取值范围(0, 512]。
        • epRecvCountsOut:要求shape为 (moeExpertNum + 2 * globalBS * K * serverNum, ),前moeExpertNum个数表示从EP通信域各卡接收的token数,2 * globalBS * K * serverNum存储了机间机内做通信前combine可以提前做reduce的token个数和token在通信区中的偏移,globalBS传入0时在此处应当按照BS * epWorldSize计算。
        • performanceInfoOptional:可选择传入有效数据或填空指针,传入空指针时表示不使能记录通信耗时功能;当传入有效数据时,要求是一个1D的Tensor,shape为(ep_world_size,),数据类型支持int64;数据格式要求为ND。
      • HCCL_INTRA_PCIE_ENABLEHCCL_INTRA_ROCE_ENABLE:不推荐使用该环境变量控制通信算法,原HCCL_INTRA_PCIE_ENABLE=1&&HCCL_INTRA_ROCE_ENABLE=0场景,下文均通过commAlg = "hierarchy"替代,默认场景使用commAlg = "fullmesh"替代。
      • commAlg配置"hierarchy"时,不支持scalesOptionalxActiveMaskOptionaloriXOptionalzeroExpertNumcopyExpertNum
      • quantMode支持0(非量化)、2(pertoken动态量化)。
      • 参数说明里shape格式说明:
        • H:表示hidden size隐藏层大小。
          • commAlg = "fullmesh":取值范围(0, 7168],且保证是32的整数倍。
          • commAlg = "hierarchy":取值范围(0, 10 * 1024],且保证是32的整数倍。
        • BS:表示batch sequence size,即本卡最终输出的token数量。
          • commAlg = "fullmesh":取值范围(0, 256]。
          • commAlg = "hierarchy":取值范围(0, 512]。
      • HCCL_BUFFSIZE:调用本算子前需检查HCCL_BUFFSIZE环境变量取值是否合理,该环境变量表示单个通信域占用内存大小,单位MB,不配置时默认为200MB。
        • commAlg = "fullmesh":要求 >= (BS * epWorldSize * min(localExpertNum, K) * H * 4B + 4MB)。
        • commAlg = "hierarchy":要求 >= (moeExpertNum + epWorldSize / 4) * Align512(maxBS * (H * 2 + 16 * Align8(K))) * 1B + 8MB,其中Align8(x) = ((x + 8 - 1) / 8) * 8,Align512(x) = ((x + 512 - 1) / 512) * 512。
      • 组网约束:多机场景仅支持交换机组网,不支持双机直连组网。
    • Atlas A3 训练系列产品/Atlas A3 推理系列产品:

      • 该场景下单卡包含双DIE(简称为“晶粒”或“裸片”),因此参数说明里的“本卡”均表示单DIE。
      • 参数约束:
        • elasticInfoOptional:当前版本不支持,传空指针即可。
        • epWorldSize:取值范围[2, 768]。
        • moeExpertNum:取值范围(0, 1024]。
        • groupTp:字符串长度范围为[1, 128),不能和groupEp相同。
        • sharedExpertNum:取值支持[0, 4]。
        • commAlg:当前版本仅支持"","fullmesh_v1","fullmesh_v2","hierarchy"三种输入方式。
          • "":默认值,使能fullmesh_v1模板。
          • "fullmesh_v1":使能fullmesh_v1模板。
          • "fullmesh_v2":使能fullmesh_v2模板,其中commAlg仅在tpWorldSize取值为1时生效,且不支持在各卡BS不一致、输入xActiveMask和特殊专家场景下使能。
          • "hierarchy": 使能通信域跨超模板。
        • epRecvCountsOut:要求shape为 (epWorldSize * max(tpWorldSize, 1) * localExpertNum, )。
        • performanceInfoOptional:预留参数,当前版本不支持,传空指针即可。
      • 参数说明里shape格式说明:
        • H:表示hidden size隐藏层大小,取值范围[1024, 8192]。
        • BS:表示batch sequence size,即本卡最终输出的token数量,取值范围为[1, 512]。
      • HCCL_BUFFSIZE:调用本算子前需检查HCCL_BUFFSIZE环境变量取值是否合理,该环境变量表示单个通信域占用内存大小,单位MB,不配置时默认为200MB。要求 >= 2且满足>= 2 * (localExpertNum * maxBS * epWorldSize * Align512(Align32(2 * H) + 64) + (K + sharedExpertNum) * maxBS * Align512(2 * H)),localExpertNum需使用MoE专家卡的本卡专家数,其中Align512(x) = ((x + 512 - 1) / 512) * 512,Align32(x) = ((x + 32 - 1) / 32) * 32。
    • Ascend 950PR/Ascend 950DT:

      • 参数约束:
        • elasticInfoOptional:当前版本不支持,传空指针即可。
        • epWorldSize:取值范围[2, 768]。
        • moeExpertNum:取值范围(0, 1024]。
        • sharedExpertNum:取值支持[0, 4]。
        • commAlg:当前版本仅支持"","fullmesh_v1","fullmesh_v2"三种输入方式。
          • "":默认值,使能fullmesh_v1模板。
          • "fullmesh_v1":使能fullmesh_v1模板。
          • "fullmesh_v2":使能fullmesh_v2模板,其中commAlg仅在tpWorldSize取值为1时生效,且不支持在各卡BS不一致、输入xActiveMask和特殊专家场景下使能。
        • epRecvCountsOut:要求shape为 (epWorldSize * max(tpWorldSize, 1) * localExpertNum, )。
        • performanceInfoOptional:预留参数,当前版本不支持,传空指针即可。
        • expertShardType当前仅支持传0,表示共享专家卡排在MoE专家卡前面。
        • quantMode支持0(非量化)、1(静态量化)、2(pertoken动态量化)、3(pergroup动态量化)、4(mx动态量化)。
      • 参数说明里shape格式说明:
        • H:表示hidden size隐藏层大小,取值范围[1024, 8192]。
        • BS:表示batch sequence size,即本卡最终输出的token数量,取值范围为[1, 512]。
      • HCCL_BUFFSIZE:调用本算子前需检查HCCL_BUFFSIZE环境变量取值是否合理,该环境变量表示单个通信域占用内存大小,单位MB,不配置时默认为200MB。要求 >= 2且满足>= 2 * (localExpertNum * maxBS * epWorldSize * Align512(Align32(2 * H) + 64) + (K + sharedExpertNum) * maxBS * Align512(2 * H)),localExpertNum需使用MoE专家卡的本卡专家数,其中Align512(x) = ((x + 512 - 1) / 512) * 512,Align32(x) = ((x + 32 - 1) / 32) * 32。

    调用说明

    调用方式 样例代码 说明
    aclnn接口 test_aclnn_moe_distribute_dispatch_v2.cpp 通过aclnnMoeDistributeDispatchV2接口方式调用moe_distribute_dispatch_v2算子。