文件最后提交记录最后更新时间
gmmalltoallv增加通信引擎说明 Co-authored-by: huangshuai<huangshuai59@huawei.com> # message auto-generated for no-merge-commit merge: !5075 merge dts into master gmmalltoallv增加通信引擎说明 Created-by: huangshuai59 Commit-by: huangshuai Merged-by: cann-robot Description: ## 描述 gmmalltoallv增加通信引擎说明 ## 关联的Issue https://gitcode.com/cann/ops-transformer/issues/2315 ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 https://gitcode.com/cann/ops-transformer/blob/master/mc2/quant_grouped_mat_mul_allto_allv/README.md https://gitcode.com/cann/ops-transformer/blob/master/mc2/quant_grouped_mat_mul_allto_allv/docs/aclnnQuantGroupedMatMulAlltoAllv.md https://gitcode.com/cann/ops-transformer/blob/master/mc2/grouped_mat_mul_allto_allv/README.md https://gitcode.com/cann/ops-transformer/blob/master/mc2/grouped_mat_mul_allto_allv/docs/aclnnGroupedMatMulAlltoAllv.md ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!507517 天前
tiling增加命名空间&examples增加执行成功日志 Co-authored-by: huangshuai<huangshuai59@huawei.com> # message auto-generated for no-merge-commit merge: !3076 merge master into master tiling增加命名空间&examples增加执行成功日志 Created-by: huangshuai59 Commit-by: huangshuai Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!30761 个月前
alltoallv日志格式修改 Co-authored-by: huangshuai<huangshuai59@huawei.com> # message auto-generated for no-merge-commit merge: !5524 merge fix_log into master alltoallv日志格式修改 Created-by: huangshuai59 Commit-by: huangshuai Merged-by: cann-robot Description: ## 描述 alltoallv日志格式修改 ## 关联的Issue https://gitcode.com/cann/ops-transformer/issues/2522 ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!552410 天前
gmmalltoallv算子AICPU适配 Co-authored-by: huangshuai<huangshuai59@huawei.com> # message auto-generated for no-merge-commit merge: !4970 merge AICPU_dev into master gmmalltoallv算子AICPU适配 Created-by: huangshuai59 Commit-by: huangshuai Merged-by: cann-robot Description: ## 描述 gmmalltoallv算子AICPU适配 ## 关联的Issue https://gitcode.com/cann/ops-transformer/issues/2410 ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: # PR #4970 代码检视报告 **检视对象**: https://gitcode.com/cann/ops-transformer/pull/4970 **检视时间**: 2026-05-12 **检视模式**: PR检视(重点关注红线和TOPK问题) **检视范围**: Host侧代码(op_api、op_graph、op_host目录) --- ## 一、变更概览 本次PR实现**通信模式可配置化**,允许通过环境变量 ENV_MC2_COMM_MODE_AICPU 在A5平台选择AICPU或CCU通信模式。 **变更文件统计**: - op_api层:2个文件 - op_graph层:2个文件 - op_host层:4个文件 - op_kernel层:4个文件(本次重点检视Host侧) - 测试文件:1个 --- ## 二、红线问题检视结果 ### ✅ 红线1: Host侧除法/求余除零保护 **结论**: PASS **依据**: 本次变更未新增除法或求余运算,无需除零保护。 --- ### ✅ 红线2: Host侧数组访问越界保护 **结论**: PASS **依据**: 本次变更未新增数组访问逻辑,无需越界保护。 --- ### ✅ 红线3: Host侧数值运算溢出保护 **结论**: PASS **依据**: - 新增的 commMode 变量为 uint8_t 类型,取值范围有限(0-255) - 未涉及大数值运算,不存在溢出风险 --- ### ✅ 红线4: Host侧指针操作安全性 **结论**: PASS(附带建议) **分析**: 涉及指针初始化的代码: ```cpp const char* serverType = nullptr; const char* streamType = nullptr; if (commMode == Mc2Comm::COMM_MODE_AICPU) { streamType = "kfc_stream"; serverType = "aicpu kfc server"; } else if (isA5) { streamType = "ccu_stream"; serverType = "ccu server"; } else { streamType = "kfc_stream"; serverType = "aicpu kfc server"; } return Mc2GenTaskOpsUtils::CommonKFCMc2CalcParamFunc(context, serverType, streamType); ``` **安全性验证**: 1. if-else分支覆盖所有情况(commMode-AICPU、A5-CCU、其他),不存在未赋值的路径 2. 赋值为字符串常量,非动态内存,无需释放 3. serverType/streamType 调用时已确保非nullptr **建议**: 虽然逻辑安全,但初始化为nullptr可能引起疑虑。可考虑: ```cpp const char* serverType = "aicpu kfc server"; // 默认值 const char* streamType = "kfc_stream"; ``` --- ### ✅ 红线5: 变量初始化检查 **结论**: PASS **依据**: - 所有新增变量均有初始化:uint8_t commMode = Mc2Comm::GetCommModeFromEnv() - 指针变量显式初始化为nullptr,符合规范 --- ### ✅ 纠线6: 资源申请释放匹配 **结论**: PASS **依据**: 本次变更未新增资源申请(malloc/new等),无需匹配检查。 --- ## 三、TOPK问题检视结果 ### ✅ TOPK-1: 函数返回值校验 **结论**: PASS **分析**: Mc2Comm::GetCommModeFromEnv() 返回 uint8_t 类型,非指针类型,无需判空检查。 **代码示例**: ```cpp uint8_t commMode = Mc2Comm::GetCommModeFromEnv(); if (commMode == Mc2Comm::COMM_MODE_AICPU) { // 直接比较,无指针风险 ... } ``` **建议**: 需确认 mc2_comm_utils.h 中该函数实现有默认返回值,避免环境变量未设置时返回未定义值。 --- ### ✅ TOPK-2: 使用GetInputDesc获取Dtype **结论**: 未涉及 **依据**: 本次变更未涉及Shape/Dtype获取逻辑。 --- ### ✅ TOPK-4: 属性从context获取 **结论**: 未涉及 **依据**: 本次变更未新增属性获取逻辑。 --- ### ✅ TOPK-8: GM内存偏移用int64 **结论**: PASS **依据**: Kernel侧变更未新增GM内存偏移计算,现有代码已符合规范。 --- ### ✅ TOPK-10: 可整数计算不转浮点 **结论**: PASS **依据**: 本次变更未新增数值计算,未涉及浮点转换。 --- ### ✅ TOPK-12: 宏定义变量命名冲突 **结论**: PASS **依据**: 本次变更未新增宏定义。 --- ## 四、其他发现 ### 1. LOG API使用规范性检查 ✅ **分析**: 所有新增日志调用符合规范: - 参数数量与占位符匹配 - 类型匹配正确(commModeuint8_t,使用 %u) - 无空指针传入风险 **示例**: ```cpp OP_LOGD(context->GetNodeName(), "GmmAlltoAllv tiling: commMode=%u", commMode); ``` --- ### 2. 条件编译改为运行时配置 ⚠️(需关注) **变更**: 原Kernel侧使用 #if defined(__NPU_ARCH__) 条件编译选择HCCL类型,现改为模板参数。 **影响**: - 提升灵活性,支持运行时切换 - 需确保 TilingKey 计算正确反映 commMode **代码验证**: ```cpp template<int commMode = CCU_COMM_MODE> struct HcclTypeSelector { using type = Hccl<HcclServerType::HCCL_SERVER_TYPE_CCU>; }; template<> struct HcclTypeSelector<AICPU_COMM_MODE> { using type = Hccl<HcclServerType::HCCL_SERVER_TYPE_AICPU>; }; ``` **建议**: 模板特化实现正确,确保编译期选择符合预期。 --- ## 五、检视总结 | 检视维度 | 结果 | 风险等级 | |---------|------|---------| | **红线问题** | 6项全部PASS | 无高风险 | | **TOPK问题** | 重点项全部PASS | 无高风险 | | **LOG API规范** | 符合规范 | 无风险 | | **架构变更** | 合理,需关注测试 | 中等 | --- ## 六、建议事项 ### 1. 测试覆盖(必做) - 验证环境变量 ENV_MC2_COMM_MODE_AICPU 未设置时的默认行为 - 验证A5平台CCU模式、AICPU模式的正确性 - 验证非A5平台的行为一致性 ### 2. 文档更新(建议) - 补充环境变量配置说明 - 说明通信模式选择的影响范围 ### 3. 代码优化(可选) - 考虑为 serverType/streamType 设置明确的默认值,避免nullptr初始化疑虑 --- ## 七、检视结论 **最终判定**: **PASS WITH NOTES** **依据**: - 红线和TOPK问题全部通过,无阻塞性缺陷 - 代码逻辑清晰,符合安全规范 - 唯一需关注:新增运行时配置逻辑需充分测试验证 **建议后续**: 1. 补充单元测试覆盖通信模式切换 2. 更新测试用例 expectTilingKey 已正确调整(137→1),需验证其他场景 3. 提交前确认环境变量解析函数有默认返回值 --- **检视人**: CANNBot Agent **检视日期**: 2026-05-12 See merge request: cann/ops-transformer!497016 天前
grouped_mat_mul_allto_allv算子性能优化 Co-authored-by: huangshuai<huangshuai59@huawei.com> # message auto-generated for no-merge-commit merge: !5704 merge prof_1 into master grouped_mat_mul_allto_allv算子性能优化 Created-by: huangshuai59 Commit-by: huangshuai Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> ## 关联的Issue https://gitcode.com/cann/ops-transformer/issues/2707 ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: # 代码检视报告(更新版) ## 检视概览 - 代码文件:PR #5704 (https://gitcode.com/cann/ops-transformer/pull/5704) - 代码侧别:混合(Tiling + Kernel) - 检视文档:cpp-secure + cpp-general + ascendc-api + ascendc-perf + ascendc-topk + mc2-specific - 总条例数:24(适用条例,过滤后,含重叠合并) - 检视时间:2026-05-26(代码更新后重新检视) - 与上次检视对比:代码已更新,上次发现的 5 个 HIGH 问题中 **4 个已修复** ## 检视统计 | 状态 | 条例数 | 占比 | |-----|--------|------| | PASS(已修复) | 4 | 16.7% | | PASS(持续通过) | 12 | 50.0% | | FAIL(新发现) | 0 | 0% | | SUSPICIOUS(需关注) | 2 | 8.3% | | MED(残余未修复) | 2 | 8.3% | | LOW(信息性) | 4 | 16.7% | ## 上次检视问题修复状态 | # | 上次问题 | 条例 | 上次置信度 | 修复状态 | 修复行号 | |---|---------|------|---------|---------|------| | 1 | BsK == 0 未拦截 | SEC-4.1+TOPK-7 | HIGH | ✅ **已修复** | quant_tiling_common.cpp:637 | | 2 | send/recv 逐元素上界缺失 | SEC-4.1+TOPK-7 | HIGH | ✅ **已修复** | quant_tiling_common.cpp:617-624 | | 3 | GetInputDesc 6处未判空 | SEC-3.5+TOPK-1 | HIGH | ✅ **已修复** | gmm_allto_allv_tiling.cpp:92-94,103-105,118-119,161-166,187-188 | | 4 | L0C CeilAlign 反弹 | TIL-2 | HIGH | ✅ **已修复** | gmm_qbmm_tiling.cpp:954-956 (CeilAlign→FloorAlign) | | 5 | transMmWeight 日志缺值 | MC2-07 | MED | ✅ **已修复** | gmm_allto_allv_tiling.cpp:232-235 | ## 修复验证详情 ### [SEC-4.1+TOPK-7] BsK == 0 校验修复 - **修复行号**: quant_grouped_mat_mul_allto_allv_tiling_common.cpp:637 - **修复内容**: (localParams_.BsK >= MAX_BSK_VALUE)(localParams_.BsK == 0) || (localParams_.BsK >= MAX_BSK_VALUE) - **验证**: ✅ 修复正确,与 H1/N1 检查模式保持一致(H1 == 0 || H1 >= MAX_H1_VALUE) ### [SEC-4.1+TOPK-7] send/recv 逐元素上界修复 - **修复行号**: quant_grouped_mat_mul_allto_allv_tiling_common.cpp:617-624 - **修复内容**: 仅 sendCounts[i] < 0sendCounts[i] < 0 || sendCounts[i] > static_cast<int64_t>(localParams_.A);同理 recvCounts 增加 > BsK 上界 - **验证**: ✅ 修复正确,与同类算子(allto_allv_grouped_mat_mul、allto_allv_quant_grouped_mat_mul)保持一致,且数学合理性已证明(总量+非负约束下逐元素上界是冗余但合理的防御性编程) ### [SEC-3.5+TOPK-1] GetInputDesc 判空修复 - **修复行号**: gmm_allto_allv_tiling.cpp:92-94, 103-105, 118-119, 161-166, 187-188 - **修复内容**: 所有 GetInputDesc/GetOptionalInputDesc/GetOutputDesc 调用先赋值到局部变量,再判空后解引用 - **验证**: ✅ 6处全部修复,无遗漏。模式为 auto desc = context_->GetXxxDesc(index); OP_TILING_CHECK(desc == nullptr, ...); localParams_.dtype = desc->GetDataType(); ### [TIL-2] FloorAlign 替代 CeilAlign 修复 - **修复行号**: gmm_qbmm_tiling.cpp:954-956 - **修复内容**: CeilAlign(basicTiling_.baseN, CUBE_BLOCK)FloorAlign(basicTiling_.baseN, CUBE_BLOCK) - **验证**: ✅ FloorAlign 向下对齐,确保 baseN ≤ maxBaseN,不再超过 L0C 限制 ### [MC2-07] transMmWeight 日志补值修复 - **修复行号**: gmm_allto_allv_tiling.cpp:232-235 - **修复内容**: "transMmWeight should not be true when mmX is null!""transMmWeight should not be true when mmX is null! transMmWeight=%d, hasSharedMm=%d.", *transMmWeightPtr, localParams_.hasSharedMm) - **验证**: ✅ 日志包含参数名和实际值,符合 MC2-07 要求 ## 需关注(MED 置信度 — 残余未修复) ### [MC2-19] send/recv 逐卡 per-rank 数据量校验缺失 - **问题描述**: 老代码 A3 架构验证每卡 ∑ recvCounts[j] * H∑ sendCounts[j] * H 的合理性,新代码无此校验。总量一致性已覆盖全局,但单卡数据量合理性(如 UB 容量是否足够)未校验。 - **影响**: A3 架构特有校验(A5 不执行),总量校验已覆盖全局一致性。属于增强型校验而非安全底线。 - **置信度**: MED (60-80%) - **备注**: 新代码已有 sendCounts[i] > ArecvCounts[i] > BsK 的逐元素上界,在总量+非负+逐元素上界三重约束下,per-card H-multiply sum 校验的数学必要性已降低 ### [MC2-18] HCCL InitV2/Finalize 核类型不匹配 - **问题描述**: HcclA2avOp.Init()hccl_.InitV2()hccl_.SetCcTilingV2() 在所有核上调用(无 AIC/AIV 过滤),但 HcclA2avOp.End()hccl_.Finalize() 仅在非 AIC 核上调用。HCCL 文档要求"Finalize 在 AIC 或 AIV 核上调用必须与对应 Prepare 接口的调用核保持一致"。 - **代码位置**: hccl_a2av_op.h:48-65 (Init) + 行 274-280 (End) - **影响**: 此代码不在 diff 变更范围内,属于预存设计模式。旧代码也存在此模式。需与 HCCL 框架团队确认是否为已知例外。 - **置信度**: MED (65%) ## 通过条例(持续通过 — 与上次检视一致) SEC-2.1 有符号整数运算不溢出 SEC-2.2 无符号整数运算不回绕 SEC-2.3 除法/余数运算除零保护(qbmm: DATA_SIZE_L0C=4 constexpr,baseM 上游保证非零) SEC-3.3 数组索引校验 TOPK-2 使用GetInputDesc获取Dtype,context获取Shape TOPK-5+MC2-08 属性获取类型需与ir原型一致 MC2-01 核间同步必要性(GmmA2avScheduler 循环内 compute→SyncAll<false>→hccl.Launch,同步完整) MC2-03 SyncAll 同步生效(所有核 SyncAll 总次数一致) MC2-04 全局操作一致性(无 rankId 分支导致参数差异) MC2-10 量化模式校验完整性(gqmm DEFAULT bug fix 正确) MC2-11 量化精度保护(无 Cast 在 diff 茦围围内) MC2-19 AlltoAllV 跨 rank 参数一致性(总量+逐元素约束下跨 rank 一致性通过) API-6 AllocTensor/FreeTensor 必须配对使用(委托模板框架管理) PERF-2 禁止写死硬件参数(新代码无硬编码,旧硬编码已删除) SEC-1.2 保证内存安全(引用绑定生命周期安全) SEC-3.1 禁止使用未初始化的变量(所有变量已初始化) GEN-1.1 外部数据合法性检查(通过 — BsK==0 已在基类修复) MC2-14 Tiling 校验与结构规范(通过 — BsK==0 修复、send/recv 上界修复、FloorAlign 修复) --- ## 被检视代码 > 本次检视的完整 diff 来自 PR #5704(更新版) **PR diff 文件路径**: ./operators/.pr_diff/5704_v2.diff **完整源码路径**: ./operators/.pr_repo/5704/ **代码概要路径**: ./operators/pr-5704/code_summary.md **diff 行数**:2704 行 See merge request: cann/ops-transformer!57042 天前
gmmalltoallv算子AICPU适配 Co-authored-by: huangshuai<huangshuai59@huawei.com> # message auto-generated for no-merge-commit merge: !4970 merge AICPU_dev into master gmmalltoallv算子AICPU适配 Created-by: huangshuai59 Commit-by: huangshuai Merged-by: cann-robot Description: ## 描述 gmmalltoallv算子AICPU适配 ## 关联的Issue https://gitcode.com/cann/ops-transformer/issues/2410 ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: # PR #4970 代码检视报告 **检视对象**: https://gitcode.com/cann/ops-transformer/pull/4970 **检视时间**: 2026-05-12 **检视模式**: PR检视(重点关注红线和TOPK问题) **检视范围**: Host侧代码(op_api、op_graph、op_host目录) --- ## 一、变更概览 本次PR实现**通信模式可配置化**,允许通过环境变量 ENV_MC2_COMM_MODE_AICPU 在A5平台选择AICPU或CCU通信模式。 **变更文件统计**: - op_api层:2个文件 - op_graph层:2个文件 - op_host层:4个文件 - op_kernel层:4个文件(本次重点检视Host侧) - 测试文件:1个 --- ## 二、红线问题检视结果 ### ✅ 红线1: Host侧除法/求余除零保护 **结论**: PASS **依据**: 本次变更未新增除法或求余运算,无需除零保护。 --- ### ✅ 红线2: Host侧数组访问越界保护 **结论**: PASS **依据**: 本次变更未新增数组访问逻辑,无需越界保护。 --- ### ✅ 红线3: Host侧数值运算溢出保护 **结论**: PASS **依据**: - 新增的 commMode 变量为 uint8_t 类型,取值范围有限(0-255) - 未涉及大数值运算,不存在溢出风险 --- ### ✅ 红线4: Host侧指针操作安全性 **结论**: PASS(附带建议) **分析**: 涉及指针初始化的代码: ```cpp const char* serverType = nullptr; const char* streamType = nullptr; if (commMode == Mc2Comm::COMM_MODE_AICPU) { streamType = "kfc_stream"; serverType = "aicpu kfc server"; } else if (isA5) { streamType = "ccu_stream"; serverType = "ccu server"; } else { streamType = "kfc_stream"; serverType = "aicpu kfc server"; } return Mc2GenTaskOpsUtils::CommonKFCMc2CalcParamFunc(context, serverType, streamType); ``` **安全性验证**: 1. if-else分支覆盖所有情况(commMode-AICPU、A5-CCU、其他),不存在未赋值的路径 2. 赋值为字符串常量,非动态内存,无需释放 3. serverType/streamType 调用时已确保非nullptr **建议**: 虽然逻辑安全,但初始化为nullptr可能引起疑虑。可考虑: ```cpp const char* serverType = "aicpu kfc server"; // 默认值 const char* streamType = "kfc_stream"; ``` --- ### ✅ 红线5: 变量初始化检查 **结论**: PASS **依据**: - 所有新增变量均有初始化:uint8_t commMode = Mc2Comm::GetCommModeFromEnv() - 指针变量显式初始化为nullptr,符合规范 --- ### ✅ 纠线6: 资源申请释放匹配 **结论**: PASS **依据**: 本次变更未新增资源申请(malloc/new等),无需匹配检查。 --- ## 三、TOPK问题检视结果 ### ✅ TOPK-1: 函数返回值校验 **结论**: PASS **分析**: Mc2Comm::GetCommModeFromEnv() 返回 uint8_t 类型,非指针类型,无需判空检查。 **代码示例**: ```cpp uint8_t commMode = Mc2Comm::GetCommModeFromEnv(); if (commMode == Mc2Comm::COMM_MODE_AICPU) { // 直接比较,无指针风险 ... } ``` **建议**: 需确认 mc2_comm_utils.h 中该函数实现有默认返回值,避免环境变量未设置时返回未定义值。 --- ### ✅ TOPK-2: 使用GetInputDesc获取Dtype **结论**: 未涉及 **依据**: 本次变更未涉及Shape/Dtype获取逻辑。 --- ### ✅ TOPK-4: 属性从context获取 **结论**: 未涉及 **依据**: 本次变更未新增属性获取逻辑。 --- ### ✅ TOPK-8: GM内存偏移用int64 **结论**: PASS **依据**: Kernel侧变更未新增GM内存偏移计算,现有代码已符合规范。 --- ### ✅ TOPK-10: 可整数计算不转浮点 **结论**: PASS **依据**: 本次变更未新增数值计算,未涉及浮点转换。 --- ### ✅ TOPK-12: 宏定义变量命名冲突 **结论**: PASS **依据**: 本次变更未新增宏定义。 --- ## 四、其他发现 ### 1. LOG API使用规范性检查 ✅ **分析**: 所有新增日志调用符合规范: - 参数数量与占位符匹配 - 类型匹配正确(commModeuint8_t,使用 %u) - 无空指针传入风险 **示例**: ```cpp OP_LOGD(context->GetNodeName(), "GmmAlltoAllv tiling: commMode=%u", commMode); ``` --- ### 2. 条件编译改为运行时配置 ⚠️(需关注) **变更**: 原Kernel侧使用 #if defined(__NPU_ARCH__) 条件编译选择HCCL类型,现改为模板参数。 **影响**: - 提升灵活性,支持运行时切换 - 需确保 TilingKey 计算正确反映 commMode **代码验证**: ```cpp template<int commMode = CCU_COMM_MODE> struct HcclTypeSelector { using type = Hccl<HcclServerType::HCCL_SERVER_TYPE_CCU>; }; template<> struct HcclTypeSelector<AICPU_COMM_MODE> { using type = Hccl<HcclServerType::HCCL_SERVER_TYPE_AICPU>; }; ``` **建议**: 模板特化实现正确,确保编译期选择符合预期。 --- ## 五、检视总结 | 检视维度 | 结果 | 风险等级 | |---------|------|---------| | **红线问题** | 6项全部PASS | 无高风险 | | **TOPK问题** | 重点项全部PASS | 无高风险 | | **LOG API规范** | 符合规范 | 无风险 | | **架构变更** | 合理,需关注测试 | 中等 | --- ## 六、建议事项 ### 1. 测试覆盖(必做) - 验证环境变量 ENV_MC2_COMM_MODE_AICPU 未设置时的默认行为 - 验证A5平台CCU模式、AICPU模式的正确性 - 验证非A5平台的行为一致性 ### 2. 文档更新(建议) - 补充环境变量配置说明 - 说明通信模式选择的影响范围 ### 3. 代码优化(可选) - 考虑为 serverType/streamType 设置明确的默认值,避免nullptr初始化疑虑 --- ## 七、检视结论 **最终判定**: **PASS WITH NOTES** **依据**: - 红线和TOPK问题全部通过,无阻塞性缺陷 - 代码逻辑清晰,符合安全规范 - 唯一需关注:新增运行时配置逻辑需充分测试验证 **建议后续**: 1. 补充单元测试覆盖通信模式切换 2. 更新测试用例 expectTilingKey 已正确调整(137→1),需验证其他场景 3. 提交前确认环境变量解析函数有默认返回值 --- **检视人**: CANNBot Agent **检视日期**: 2026-05-12 See merge request: cann/ops-transformer!497016 天前
提升quant_grouped_mat_mul_allto_allv算子ut覆盖率 Co-authored-by: chenyifan<chenyifan66@h-partners.com> # message auto-generated for no-merge-commit merge: !5677 merge qgma_ut into master 提升quant_grouped_mat_mul_allto_allv算子ut覆盖率 Created-by: mutex_lock Commit-by: chenyifan Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> - 提升quant_grouped_mat_mul_allto_allv算子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!56777 天前
新增AlltoAllvQuantGroupedMatmul、QuantGroupedMatmulAlltoAllv算子 Co-authored-by: libohao6<libohao3@huawei.com> Co-authored-by: huangshuai<huangshuai59@huawei.com> # message auto-generated for no-merge-commit merge: !2548 merge alltoallv_v2 into master 新增AlltoAllvQuantGroupedMatmul、QuantGroupedMatmulAlltoAllv算子 Created-by: libohao6 Commit-by: huangshuai;libohao6 Merged-by: cann-robot Description: ## 描述 新增AlltoAllvQuantGroupedMatmul、QuantGroupedMatmulAlltoAllv算子 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> ## 测试 二级冒烟 ## 文档更新 更新了AlltoAllvQuantGroupedMatmul、QuantGroupedMatmulAlltoAllv的aclnn文档。 ## 类型标签 <!-- [x] 表示选中 --> - [X] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!25482 个月前
gmmalltoallv增加通信引擎说明 Co-authored-by: huangshuai<huangshuai59@huawei.com> # message auto-generated for no-merge-commit merge: !5075 merge dts into master gmmalltoallv增加通信引擎说明 Created-by: huangshuai59 Commit-by: huangshuai Merged-by: cann-robot Description: ## 描述 gmmalltoallv增加通信引擎说明 ## 关联的Issue https://gitcode.com/cann/ops-transformer/issues/2315 ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 https://gitcode.com/cann/ops-transformer/blob/master/mc2/quant_grouped_mat_mul_allto_allv/README.md https://gitcode.com/cann/ops-transformer/blob/master/mc2/quant_grouped_mat_mul_allto_allv/docs/aclnnQuantGroupedMatMulAlltoAllv.md https://gitcode.com/cann/ops-transformer/blob/master/mc2/grouped_mat_mul_allto_allv/README.md https://gitcode.com/cann/ops-transformer/blob/master/mc2/grouped_mat_mul_allto_allv/docs/aclnnGroupedMatMulAlltoAllv.md ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!507517 天前
README.md

QuantGroupedMatMulAlltoAllv

产品支持情况

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

功能说明

  • 算子功能:完成路由专家GroupedMatMul、Unpermute、AlltoAllv融合并实现与共享专家MatMul并行融合,先计算后通信

  • 计算公式:

    • 路由专家:

      gmmY=(gmmX@gmmWeight)∗gmmXScale∗gmmWeightScaleunpermuteOut=Unpermute(gmmY)y=AlltoAllv(unpermuteOut)gmmY = (gmmX @ gmmWeight) * gmmXScale * gmmWeightScale \\ unpermuteOut = Unpermute(gmmY) \\ y = AlltoAllv(unpermuteOut)

    • 共享专家:

      mmY=(mmX@mmWeight)∗mmXScaleOptional∗mmWeightScaleOptionalmmY = (mmX @ mmWeight) * mmXScaleOptional * mmWeightScaleOptional

参数说明

参数名 输入/输出 描述 使用说明 数据类型 数据格式 维度(shape) 非连续Tensor
gmmX 输入 公式中的输入 gmmX。 shape (A, H1)。 HIFLOAT8、FLOAT8_E4M3FN、FLOAT8_E5M2、FLOAT4_E2M1 ND 2 x
gmmWeight 输入 公式中的输入 gmmWeight。 shape (e, H1, N1)。e 为每卡部署的专家数,H1 为 hidden size,N1 为路由专家 FFN 中间维度。 HIFLOAT8、FLOAT8_E4M3FN、FLOAT8_E5M2、FLOAT4_E2M1 ND 3 x
gmmXScale 输入 gmmX 的量化系数。
  • pertensor量化:shape (1)。
  • mx量化:shape (A, ceil(H1/64), 2)
  • FLOAT32、FLOAT8_E8M0 ND
  • pertensor量化:1
  • mx量化:3
  • x
    gmmWeightScale 输入 gmmWeight 的量化系数。
  • pertensor量化:shape (1)。
  • mx量化:shape (e, N1, ceil(H1/64), 2),weight转置时为(e, ceil(H1/64), N1, 2)
  • FLOAT32、FLOAT8_E8M0 ND
  • pertensor量化:1
  • mx量化:3
  • x
    sendCountsTensorOptional 输入 AlltoAllv 使用的 send count。 当前仅支持空。shape (e * ep, )。e 为每卡部署的专家个数,ep 为 ep 域大小。 INT64 ND 1 x
    recvCountsTensorOptional 输入 AlltoAllv 使用的 recv count。 默认为空 Tensor。shape (e * ep, )。e 为每卡部署的专家个数,ep 为 ep 域大小。 INT64 ND 1 x
    mmXOptional 输入 公式中的输入 mmX。 shape (bs, H2)。bs 为每卡部署的专家个数,H2 为 hidden size。 HIFLOAT8、FLOAT8_E4M3FN、FLOAT8_E5M2、FLOAT4_E2M1 ND 2 x
    mmWeightOptional 输入 公式中的输入 mmWeight。 shape (H2, N2)。H2 为 hidden size,N2 为共享专家 FFN 的中间层维度。 HIFLOAT8、FLOAT8_E4M3FN、FLOAT8_E5M2、FLOAT4_E2M1 ND 2 x
    mmXScaleOptional 输入 mmX 的量化系数。
  • pertensor量化:shape (1)。
  • mx量化:shape (BS, ceil(H2/64), 2)
  • FLOAT32、FLOAT8_E8M0 ND
  • pertensor量化:1
  • mx量化:3
  • x
    mmWeightScaleOptional 输入 mmWeight 的量化系数。
  • pertensor量化:shape(1)。
  • mx量化: shape (N2, ceil(H2/64), 2),weight转置时为(ceil(H2/64), N2, 2)
  • FLOAT32、FLOAT8_E8M0 ND
  • pertensor量化:1
  • mx量化:3
  • x
    commQuantScaleOptional 输入 低比特通信量化系数。 预留参数,当前仅支持空。 FLOAT32 ND 1 x
    gmmXQuantMode 输入 gmmX 的量化模式。 必须传入量化模式,当前支持 1 (pertensor量化)和 6(mx量化)。 INT64 - 1 x
    gmmWeightQuantMode 输入 gmmWeight 的量化模式。 必须传入量化模式,当前支持 1 (pertensor量化)和 6(mx量化)。 INT64 - 1 x
    mmXQuantMode 输入 mmX 的量化模式。 mmX 非空,则必须传入量化模式,当前支持 1 (pertensor量化)和 6(mx量化)。 INT64 - 1 x
    mmWeightQuantMode 输入 mmWeight 的量化模式。 mmWeight 不为空,则必须传入量化模式,当前支持 1 (pertensor量化)和 6(mx量化)。 INT64 - 1 x
    commQuantMode 输入 低比特通信量化模式。 当前低比特功能预留,必须传入 0,表示不量化。 INT64 - 1 x
    commQuantDtypeOptional 输入 低比特通信的数据类型。 当前低比特功能预留,必须传入 -1。 INT64 - 1 x
    groupSize 输入 PerGroup 量化分组大小。 用于 Matmul 计算三个方向上的量化分组大小,预留参数,仅支持配置为 0,取值不生效。groupSize 输入由 3 个方向的 groupSizeM,groupSizeN,groupSizeK 三个值拼接组成,每个值占 16 位,共占用 int64_t 类型 groupSize 的低 48 位(高 16 位无效),计算公式为:groupSize = groupSizeK | groupSizeN << 16 | groupSizeM << 32。 INT64 - - -
    group 输入 通信域标识。 字符串长度需大于 0,小于 128。 char* - - -
    epWorldSize 输入 通信域大小。 支持 2/4/8/16/32/64/128/256。 INT64 - - -
    sendCounts 输入 AlltoAllv 使用的 send count。表示其他Rank向当前rank上各expert发送的token数量。 支持的维度为 e * ep。按sendCounts[fromRank][expertId]一维展开, 例如e=3时顺序为e0,e1,e2,e0,e1,e2, ... aclIntArray*(元素类型 INT64) ND - -
    recvCounts 输入 AlltoAllv 使用的 recv count。表示AlltoAllv后本卡需要接收到的token数量。 支持的维度为 e * ep。按recvCounts[fromRank][expertId]一维展开, 例如e=3时顺序为e0,e1,e2,e0,e1,e2, ... aclIntArray*(元素类型 INT64) ND - -
    transGmmWeight 输入 gmm 的右矩阵是否转置。 必须传入,无默认值。 BOOL ND - -
    transMmWeight 输入 mm 的右矩阵是否转置。 必须传入,无默认值。 BOOL ND - -
    y 输出 grouped matmul 计算输出。 不支持空 Tensor。shape (BSK, N1)。 FLOAT16、BFLOAT16 ND 2 x
    mmYOptional 输出 matmul 计算输出。 shape (bs, N2)。 FLOAT16、BFLOAT16 ND 2 x
    workspaceSize 输出 返回需要在 Device 侧申请的 workspace 大小。 - UINT64 ND - -
    executor 输出 返回 op 执行器,包含了算子计算流程。 - aclOpExecutor* ND - -

    gmmXQuantMode、gmmWeightQuantMode、mmXQuantMode、mmWeightQuantMode、commQuantMode的枚举值跟量化模式关系如下:

    • 0: 非量化--当前不支持
    • 1: pertensor
    • 2: perchannel
    • 3: pertoken
    • 4: pergroup
    • 5: perblock
    • 6: mx量化
    • 7: pertoken动态量化

    约束说明

    • 确定性计算:

      • aclnnQuantGroupedMatMulAlltoAllv默认确定性实现。
    • 通信引擎约束:

      • Ascend 950PR/Ascend 950DT:支持CCU通信。
    • e * epWorldSize最大支持256,e表示单卡上的专家数量,最大支持到32,epWorldSize支持2/4/8/16/32/64/128/256;

    • gmmX的shape(A, H1),A为sendCounts之和,H1取值范围(0, 65536);

    • gmmWeight的shape(e, H1, N1),N1取值范围(0, 65536);

    • y的shape为(BSK, N1),第一维其中K的范围[2, 8],BSK为recvCounts之和;

    • mmX是共享专家的左矩阵,shape为(BS, H2),H2的取值范围(0, 12288];

    • mmWeight是共享专家的右矩阵,shape为(H2, N2),N2的取值范围(0, 65536);

    • sendCounts为发送到其他卡的token数,数组大小为e * epWorldSize;

    • recvCounts从其他卡的token数,数组大小为e * epWorldSize;

    • 路由专家和共享专家量化Scale、Mode等均为必选;

    • 低比特通信Mode为必选参数,DType和Scale为可选,当Mode为非0时需要提供DType和Scale;

    • 参数说明里shape使用的变量:

      • BSK:本卡接收的token数,是recvCounts参数累加之和,取值范围(0, 52428800)。
      • H1:表示路由专家hidden size隐藏层大小,取值范围(0, 65536)。
      • H2:表示共享专家hidden size隐藏层大小,取值范围(0, 12288]。
      • e:表示单卡上专家个数,0<e<=32,e * epWorldSize最大支持256。
      • N1:表示路由专家 FFN 的中间层维度,取值范围(0, 65536)。
      • N2:表示共享专家 FFN 的中间层维度,取值范围(0, 65536)。
      • BS:batch sequence size。
      • K:表示选取TopK个专家,K的范围[2, 8]。
      • A:本卡发送的token数,是sendCounts参数累加之和。
      • ep通信域内所有卡的 A 参数的累加和等于所有卡上的 BSK 参数的累加和。
      • mx量化且gmmX与gmmWeight为FLOAT4_E2M1时,H1和H2必须为偶数且不能为2,同时transGmmWeight和transMmWeight为false情况下,N1和N2必须为偶数。
      • gmmWeight和gmmWeightScale的转置状态必须保持一致:同时转置或同时不转置。mmWeight和mmWeightScale同样需要保持转置状态一致。
      • groupSize:
        • 仅当gmmXScale/gmmWeightScale/mmXScale/mmWeightScale输入都是2维及以上数据时,groupSize取值有效,其他场景需传入0。
        • groupSize值支持公式推导:传入的groupSize内部会按如下公式分解得到groupSizeM、groupSizeN、groupSizeK,当其中有1个或多个为0,会根据gmmX/gmmWeight/mmX/mmWeight/gmmXScale/gmmWeightScale/mmXScale/mmWeightScale输入shape重新设置groupSizeM、groupSizeN、groupSizeK用于计算。设置原理:如果groupSizeM=0,表示m方向量化分组值由接口推导,推导公式为groupSizeM = m / scaleM(需保证m能被scaleM整除),其中m与gmmX/mmX shape中的m一致,scaleM与gmmXScale/mmXScale shape中的m一致;如果groupSizeK=0,表示k方向量化分组值由接口推导,推导公式为groupSizeK = k / scaleK(需保证k能被scaleK整除),其中k与gmmX/mmX shape中的k一致,scaleK与gmmXScale/mmXScale shape中的k一致;如果groupSizeN=0,表示n方向量化分组值由接口推导,推导公式为groupSizeN = n / scaleN(需保证n能被scaleN整除),其中n与gmmWeight/mmWeight shape中的n一致,scaleN与gmmWeightScale/mmWeightScale shape中的n一致。

        groupSize=groupSizeK∣groupSizeN<<16∣groupSizeM<<32groupSize = groupSizeK | groupSizeN << 16 | groupSizeM << 32

        • 如果满足重新设置条件,当gmmXScale/gmmWeightScale/mmXScale/mmWeightScale输入是2维及以上时,且数据类型都为FLOAT8_E8M0时,[groupSizeM,groupSizeN,groupSizeK]取值组合会推导为[1, 1, 32],对应groupSize的值为4295032864。
    • 量化参数约束:

      • 当前版本支持pertensor量化、mx量化。
    • 类型约束

      • pertensor量化

        gmmX gmmWeight gmmXScale gmmWeightScale mmXScale mmWeightScale y
        HIFLOAT8 HIFLOAT8 FLOAT32 FLOAT32 FLOAT32 FLOAT32 FLOAT16/BFLOAT16
      • mx量化

        gmmX gmmWeight gmmXScale gmmWeightScale mmXScale mmWeightScale y
        FLOAT8_E4M3FN FLOAT8_E4M3FN FLOAT8_E8M0 FLOAT8_E8M0 FLOAT8_E8M0 FLOAT8_E8M0 FLOAT16/BFLOAT16
        FLOAT8_E4M3FN FLOAT8_E5M2 FLOAT8_E8M0 FLOAT8_E8M0 FLOAT8_E8M0 FLOAT8_E8M0 FLOAT16/BFLOAT16
        FLOAT8_E5M2 FLOAT8_E4M3FN FLOAT8_E8M0 FLOAT8_E8M0 FLOAT8_E8M0 FLOAT8_E8M0 FLOAT16/BFLOAT16
        FLOAT8_E5M2 FLOAT8_E5M2 FLOAT8_E8M0 FLOAT8_E8M0 FLOAT8_E8M0 FLOAT8_E8M0 FLOAT16/BFLOAT16
        FLOAT4_E2M1 FLOAT4_E2M1 FLOAT8_E8M0 FLOAT8_E8M0 FLOAT8_E8M0 FLOAT8_E8M0 FLOAT16/BFLOAT16
      • mmX类型与gmmX类型保持一致,mmWeight类型与gmmWeight类型保持一致,mmY类型与y类型保持一致。

    调用说明

    调用方式 样例代码 说明
    aclnn接口 test_aclnn_quant_grouped_mat_mul_allto_allv.cpp 通过aclnnQuantGroupedMatMulAlltoAllv接口方式调用量化场景的quant_grouped_mat_mul_allto_allv算子。