文件最后提交记录最后更新时间
layered_doc add bs limit Co-authored-by: wangchenfeng6<wangchenfeng6@h-partners.com> # message auto-generated for no-merge-commit merge: !5828 merge master into master layered_doc add bs limit Created-by: wangchenfeng6 Commit-by: wangchenfeng6 Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!58284 天前
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 个月前
优化多线程访问下化context可能存在竞争导致的数据错误问题 Co-authored-by: zzg_code<zengzhiguo1@huawei.com> # message auto-generated for no-merge-commit merge: !5851 merge updatacontext into master 优化多线程访问下化context可能存在竞争导致的数据错误问题 Created-by: zzg_code Commit-by: zzg_code Merged-by: cann-robot Description: ## 描述 cm2 context在设计之初只考虑了dispatch 和combine算子,因此在代码中定义了静态对象,但是目前随着发展context需要被多个的mc2算子引用,这种情况下静态成员可能导致在多线程情况下的数据竞争问题,因此修改设计逻辑 ## 关联的Issue https://gitcode.com/cann/ops-transformer/issues/2648 ## 测试 # MC2 Context 代码检视报告 **检视日期**: 2026-05-25 **检视文件**: 5851.diff **变更模块**: mc2/common/op_api, mc2/moe_distribute_* --- ## 1. 总体概述 本次代码变更主要涉及 MC2 通信上下文管理模块的重构,核心变更包括: 1. **架构调整**:移除单例模式,改为每次调用时创建实例(解决多线程数据冲突问题) 2. **缓存机制重构**:将"获取或创建"合并逻辑拆分为"检查缓存"和"创建"两步 3. **接口调整**:修改方法签名和参数顺序 4. **日志优化**:提升关键日志级别从 DEBUG 到 INFO,修正格式化字符串类型 5. **版本兼容性调整**:降低 HCCL_CHANNEL_SUPPORT_VERSION 版本号 变更范围涉及 3 个文件,约 100+ 行代码修改。 --- ## 2. 代码变更清单 | 文件 | 变更类型 | 变更内容 | |------|---------|---------| | mc2_context.h | 接口修改 | 删除 GetInstance() 静态方法声明;修改 CreatMc2Context 参数顺序;删除 GetOrCreateMc2Context;新增 CheckContextCache;修改版本宏定义 | | mc2_context.cpp | 实现修改 | 删除单例实现;重构 GetMc2ContextTensor 逻辑;日志级别提升;格式化字符串修复;缓存检查逻辑拆分 | | moe_distribute_combine_v2_base.cpp | 调用方修改 | 修改 opName 从 "moe_distribute_dispatch_combine_v2""moe_distribute_v2" | | moe_distribute_dispatch_v2_base.cpp | 调用方修改 | 修改 opName 从 "moe_distribute_dispatch_combine_v2""moe_distribute_v2" | --- ## 3. 检视问题列表 ### 🔴 严重问题 无 ### 🟡 中等问题 #### P1-1: 方法签名参数顺序调整可能破坏调用方 **问题描述**: CreatMc2Context 方法的参数顺序从 (hcclHandle, mc2ContextTag, engine, protocol, ctx, mc2ContextStruct) 改为 (hcclHandle, mc2ContextTag, engine, protocol, mc2ContextStruct, ctx, hcclBuffSize),参数顺序和位置调整可能影响代码可读性和调用方兼容性。 **代码位置**: ```cpp // mc2_context.h:58-59 - aclnnStatus CreatMc2Context(const HcclComm &hcclHandle, const std::string &mc2ContextTag, - const CommEngine &engine, const CommProtocol &protocol, void *&ctx, Mc2MoeContext *mc2ContextStruct); + aclnnStatus CreatMc2Context(const HcclComm &hcclHandle, const std::string &mc2ContextTag, + const CommEngine &engine, const CommProtocol &protocol, + Mc2MoeContext *mc2ContextStruct, void *&ctx, uint64_t &hcclBuffSize); ``` **修改建议**: 1. 参数顺序应遵循:输入参数 -> 输入输出参数 -> 输出参数 2. 当前调整后 mc2ContextStruct(输入)在前,ctx(输出)在后,符合规范 ✅ 3. 建议在函数注释中明确标注每个参数的方向 **状态**: 已符合规范,无需修改 --- #### P1-2: 版本号降低可能导致不兼容 **问题描述**: HCCL_CHANNEL_SUPPORT_VERSION90000000 降低到 89999700,可能导致在版本号在 [89999700, 90000000) 范围内的环境上,功能从"不启用"变为"启用",引入不稳定风险。 **代码位置**: ```cpp // mc2_context.h:21 - #define HCCL_CHANNEL_SUPPORT_VERSION 90000000 + #define HCCL_CHANNEL_SUPPORT_VERSION 89999700 ``` **修改建议**: 1. 确认降低版本号的原因(是否为了兼容旧版本 HCCL?) 2. 在代码注释中说明版本号的含义和选择依据 3. 建议在 CHANGELOG 中记录此兼容性变更 **状态**: 待确认版本兼容范围 --- #### P1-3: 日志级别提升可能影响生产环境性能 **问题描述**: 多处日志从 OP_LOGD(DEBUG)提升到 OP_LOGI(INFO),在高频调用场景下可能导致生产环境日志量激增。 **代码位置**: ```cpp // mc2_context.cpp 多处,示例: - OP_LOGD("Start to get HCCL communication handle, groupEp: %s", groupEp); + OP_LOGI("Start to get HCCL communication handle, groupEp: %s", groupEp); ``` **修改建议**: 1. 评估这些日志的打印频率(每秒多少次) 2. 高频日志建议保持 DEBUG 级别 3. 或添加调用频率限制机制(如每 N 次打印一次) **状态**: 需评估高频场景影响 --- #### P1-4: 错误处理路径可优化 **问题描述**: CheckContextCache 方法中,当缓存查找失败(hcclRet != HCCL_SUCCESS)时,仅设置 hcclBuffSize = 0 并返回成功,但未清理可能的残留状态。 **代码位置**: ```cpp // mc2_context.cpp:481-484 if (hcclRet != HCCL_SUCCESS) { // 没找到缓存,创建context hcclBuffSize = 0; OP_LOGI("Context cache not found, need to create"); return ACLNN_SUCCESS; } ``` **修改建议**: 1. 确认 ctx 参数在此场景下是否需要显式设置为 nullptr 2. 添加注释说明"缓存不存在是正常流程,非错误情况" **状态**: 建议优化 --- ### 🔵 建议优化 #### P2-1: 重复代码可抽取 **问题描述**: moe_distribute_combine_v2_base.cppmoe_distribute_dispatch_v2_base.cpp 中的 opName 定义完全相同,可抽取为公共常量。 **代码位置**: ```cpp // 两个文件中相同代码 const char *opName = "moe_distribute_v2"; ``` **修改建议**: ```cpp // 建议在头文件中定义 namespace Mc2Aclnn { constexpr const char* MOE_DISTRIBUTE_V2_OP_NAME = "moe_distribute_v2"; } ``` --- #### P2-2: 注释风格不一致 **问题描述**: 新增注释使用中文,但其他代码注释为英文或无注释,风格不统一。 **代码位置**: ```cpp // mc2_context.cpp:481 if (hcclRet != HCCL_SUCCESS) { // 没找到缓存,创建context ``` **修改建议**: 统一使用英文注释: ```cpp if (hcclRet != HCCL_SUCCESS) { // Cache not found, need to create context ``` --- #### P2-3: 魔法数字需注释 **问题描述**: hcclBuffSize = 0; 作为特殊状态标记,建议使用常量或添加注释。 **代码位置**: ```cpp // mc2_context.cpp:497 hcclBuffSize = 0; // 先默认为0,后续根据缓存情况赋值 ``` **修改建议**: ```cpp constexpr uint64_t HCCL_BUFF_SIZE_NOT_INITIALIZED = 0; hcclBuffSize = HCCL_BUFF_SIZE_NOT_INITIALIZED; ``` --- ## 4. 优点总结 ✅ **日志格式修复**:将 %d 改为 %u 匹配 uint32_t 类型,避免未定义行为 ✅ **代码职责分离**:将 GetOrCreateMc2Context 拆分为 CheckContextCacheCreatMc2Context,职责更清晰 ✅ **输出参数规范化**:CreatMc2ContexthcclBuffSize 从成员变量改为输出参数,减少隐式状态依赖 ✅ **缓存流程优化**:明确区分"命中缓存"和"需要创建"两种路径,便于问题定位 ✅ **日志可观测性提升**:关键路径日志提升到 INFO 级别,便于生产环境监控 ✅ **多线程安全**:移除单例模式,改为临时变量,解决多线程数据冲突问题 --- ## 5. 风险评估 | 风险项 | 风险等级 | 影响范围 | 状态 | |--------|---------|---------|------| | 单例移除导致状态丢失 | ~~🔴 高~~ | 功能正确性 | ✅ 已澄清 - 多线程安全设计 | | 缓存键名变更导致不兼容 | ~~🔴 高~~ | 生产环境缓存 | ✅ 已澄清 - 首次创建无兼容问题 | | 版本号降低导致功能变更 | 🟡 中 | 版本兼容性 | 待确认版本依赖范围 | | 日志级别提升影响性能 | 🟡 中 | 生产环境性能 | 需评估日志频率 | | 方法签名变更影响调用方 | 🟢 低 | 编译兼容性 | ✅ 已同步修改所有调用方 | --- ## 6. 代码质量评分 **总分**: 85/100 | 维度 | 得分 | 说明 | |------|------|------| | 架构设计 | 90 | 单例移除解决多线程问题,职责分离清晰 | | 代码规范 | 85 | 格式化字符串修复正确,注释风格可统一 | | 错误处理 | 80 | CheckContextCache 路径可优化 | | 可维护性 | 85 | 重复代码可抽取,魔法数字可常量化 | | 安全性 | 90 | 多线程安全,无明显安全风险 | --- ## 7. 建议与总结 ### 必须处理 无严重问题需处理 ### 建议处理 1. 统一注释风格(中文→英文) 2. 评估 INFO 日志在高频场景的性能影响 3. 确认版本号降低的兼容性范围 ### 可选优化 1. 抽取重复的 opName 为公共常量 2. 使用常量替代魔法数字 0 --- **检视结论**: 代码变更整体质量良好,架构设计合理(多线程安全优化),可合并。建议处理中等问题后合入主分支。 ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!58511 天前
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 个月前
Add 8k stride for win addr offset Co-authored-by: tgwsakiko_<linwei69@huawei.com> # message auto-generated for no-merge-commit merge: !5666 merge 512-pd into master Add 8k stride for win addr offset Created-by: tgwsakiko_ Commit-by: tgwsakiko_ Merged-by: cann-robot Description: ## 描述 This PR introduces a rank-strided addressing scheme with EP_RANK_OFFSET_STEP = 8192, applying an epRankId * 8 KB offset to CCL buffer base-address derivation in both context setup and kernel helpers, and synchronizing tiling-side capacity checks to reserve epWorldSize * 8 KB of offset space. The change eliminates cross-rank same-address aliasing in status updates and improves performance on Ascend 950. ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新特性 - [x] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!56663 天前
清理cleancode Co-authored-by: zzg_code<zengzhiguo1@huawei.com> # message auto-generated for no-merge-commit merge: !6046 merge newkfc into master 清理cleancode Created-by: zzg_code Commit-by: zzg_code Merged-by: cann-robot Description: ## 描述 清理cleancode ## 关联的Issue https://gitcode.com/cann/ops-transformer/issues/2735 ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!604613 小时前
提升moe_distribute_combine_v2,moe_update_expert等算子ut覆盖率 Co-authored-by: chenyifan<chenyifan66@h-partners.com> # message auto-generated for no-merge-commit merge: !5221 merge mdd_mdc_ut into master 提升moe_distribute_combine_v2,moe_update_expert等算子ut覆盖率 Created-by: mutex_lock Commit-by: chenyifan Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> - 提升moe_distribute_combine_v2,moe_update_expert等算子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!522114 天前
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 个月前
layered_doc add bs limit Co-authored-by: wangchenfeng6<wangchenfeng6@h-partners.com> # message auto-generated for no-merge-commit merge: !5828 merge master into master layered_doc add bs limit Created-by: wangchenfeng6 Commit-by: wangchenfeng6 Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!58284 天前
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:依commAlg取值,"fullmesh"支持(0, 1024],"hierarchy"支持(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隐藏层大小,取值范围(0, 10240]且为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": 使能ROCE分层直驱能力,需要根据不同的逻辑超节点设置环境变量HCCL_LOGIC_SUPERPOD_ID,例如两机分别设为export HCCL_LOGIC_SUPERPOD_ID=0export HCCL_LOGIC_SUPERPOD_ID=1
        • 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数量,依commAlg取值,"fullmesh_v2"和"hierarchy"取值范围为 (0 < BS ≤ 256), "fullmesh_v1"和""取值范围为 (0 < BS ≤ 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算子。