文件最后提交记录最后更新时间
MatmulAlltoAll和AlltoAllMatmul增加通信引擎约束描述 Co-authored-by: adamlwang<wangjingquan2@huawei.com> # message auto-generated for no-merge-commit merge: !5068 merge doc into master MatmulAlltoAll和AlltoAllMatmul增加通信引擎约束描述 Created-by: adamlwang Commit-by: adamlwang Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> 增加MatmulAlltoAll和AlltoAllMatmul的通信约束描述。 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> https://gitcode.com/cann/ops-transformer/issues/2310 ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [x] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!506820 天前
MC2算子资料完善 Co-authored-by: lyt_claire<luyitong1@huawei.com> # message auto-generated for no-merge-commit merge: !2997 merge mc2AIDD into master MC2算子资料完善 Created-by: lyt_claire Commit-by: lyt_claire Merged-by: cann-robot Description: ## 描述 修改MC2相关算子资料和示例代码 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [X] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!29971 个月前
aicpu Co-authored-by: qq_43844249<fanglin17@huawei.com> # message auto-generated for no-merge-commit merge: !4948 merge aicpu into master aicpu Created-by: qq_43844249 Commit-by: qq_43844249 Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> # 代码检视报告 **项目名称**:ops-transformer mc2 模块检视报告 **检视模块**:mc2/allto_all_matmul (提交 3aa780ab) **检视人**:Ascend C Code Review Agent **检视日期**:2026-05-13 ## 🔍 检视概览 | 统计项 | 数值 | | ---- | ---- | | 发现问题总数 | 2 个 | | 严重级(CRITICAL)问题 | 0 个 | | 中等级(MEDIUM)问题 | 2 个 | | 轻微级(LOW)问题 | 0 个 | | 存疑数量 | 1 个 | **核心结论**:本次提交主要修改通信模式配置方式,通过环境变量动态选择 CCU/AICPU 通信引擎。代码变更涉及 Host侧、Tiling侧和 Kernel侧的多个文件。发现 2 处中等风险问题:外部输入未显式校验(防御性编程缺失)。存疑 1 处核间同步问题需人工确认。建议优先修复防御性编程问题,确保代码健壮性。 --- ## ❌ 问题详情及修改建议 ### 问题ID:ISSUE-001 | 严重级别:MEDIUM(中等) #### 🔬 假设检验过程 **代码段**:GetCommModeFromEnv() 调用未显式校验返回值 **假设**:H0: 该代码段是安全的 | 证据序号 | 证据类型 | 规范ID | 证据描述 | 分值增量 | 累计自信值 | |---------|---------|--------|---------|---------|-----------| | 1 | 规范违反 | TOPK-1 | Host侧代码调用函数后未显式校验返回值,违反"必须校验函数返回值"条款 | +40% | 40% | | 2 | 函数实现缓解 | - | 查看 GetCommModeFromEnv() 实现,函数内部保证返回值只能是 0 或 1,缓解风险 | -20% | 20% | | 3 | 上下文防御缺失 | TOPK-7 | 调用侧无防御性编程校验,依赖函数内部逻辑 | +20% | 40% | **结论**:自信值 **40%** > 60%阈值未达到,但存在防御性编程缺失,判定为**中等风险**。 --- **关联红线条款**:TOPK-1(必须校验函数返回值)+ TOPK-7(外部输入校验) **代码路径**:多处文件 - mc2/allto_all_matmul/op_api/aclnn_allto_all_matmul.cpp:318-326 - mc2/allto_all_matmul/op_api/aclnn_allto_all_quant_matmul.cpp:544-552 - mc2/allto_all_matmul/op_graph/allto_all_matmul_gen_task.cpp:35-48 - mc2/allto_all_matmul/op_host/op_tiling/arch35/allto_all_fp_matmul_tiling_base.cpp:191-192, 218-220 - mc2/allto_all_matmul/op_host/op_tiling/arch35/allto_all_kc_quant_matmul_tiling_base.cpp:232-233, 553-555 - mc2/allto_all_matmul/op_host/op_tiling/arch35/allto_all_mx_quant_matmul_tiling_base.cpp:491-493, 797-800 **问题类型**:外部输入未显式校验(防御性编程缺失) **问题描述**: 代码中调用 Mc2Comm::GetCommModeFromEnv() 获取通信模式,返回值 commMode 未显式校验合法性。虽然函数实现(mc2/common/utils/mc2_comm_utils.h:27-34)保证返回值只能是 COMM_MODE_CCU (0)COMM_MODE_AICPU (1),但调用侧缺乏防御性编程校验,违反 TOPK-1(必须校验函数返回值)和 TOPK-7(外部输入校验)条款要求。如果函数实现发生变更或环境变量配置异常,可能导致通信类型设置错误,影响算子正确性。 #### 修改建议 **修改前代码**(aclnn_allto_all_matmul.cpp:318-326): ```cpp uint8_t commMode = Mc2Comm::GetCommModeFromEnv(); if (commMode == Mc2Comm::COMM_MODE_CCU) { NnopbaseSetHcclServerType(executor, NnopbaseHcclServerType::NNOPBASE_HCCL_SERVER_TYPE_CCU); } else { NnopbaseSetHcclServerType(executor, NnopbaseHcclServerType::NNOPBASE_HCCL_SERVER_TYPE_AICPU); } ``` **修改后代码**: ```cpp uint8_t commMode = Mc2Comm::GetCommModeFromEnv(); // 显式校验返回值合法性 if (commMode != Mc2Comm::COMM_MODE_CCU && commMode != Mc2Comm::COMM_MODE_AICPU) { OPS_LOGE("aclnnAlltoAllMatmul", "Invalid commMode from env: %u", commMode); return ACLNN_ERR_INNER; } if (commMode == Mc2Comm::COMM_MODE_CCU) { NnopbaseSetHcclServerType(executor, NnopbaseHcclServerType::NNOPBASE_HCCL_SERVER_TYPE_CCU); } else { NnopbaseSetHcclServerType(executor, NnopbaseHcclServerType::NNOPBASE_HCCL_SERVER_TYPE_AICPU); } ``` **修改说明**: 在调用 GetCommModeFromEnv() 后添加显式返回值校验,确保 commMode 在合法范围内(COMM_MODE_CCU 或 COMM_MODE_AICPU)。若返回非法值,记录错误日志并返回错误码,避免后续通信类型设置错误。符合 TOPK-1(必须校验函数返回值)和 TOPK-7(外部输入校验)条款要求,增强代码健壮性和防御性编程能力。建议在其他调用位置同步修改。 --- ### 问题ID:ISSUE-002 | 严重级别:MEDIUM(中等) #### 🔬 假设检验过程 **代码段**:Tiling侧 hcclServerType 参数未校验范围 **假设**:H0: 该代码段是安全的 | 证据序号 | 证据类型 | 规范ID | 证据描述 | 分值增量 | 累计自信值 | |---------|---------|--------|---------|---------|-----------| | 1 | 规范违反 | TOPK-7 | Tiling外部输入 hcclServerType 来自环境变量,未显式校验合法性 | +40% | 40% | | 2 | 函数实现缓解 | - | GetCommModeFromEnv() 保证返回值范围 | -20% | 20% | | 3 | TilingKey 计算风险 | - | hcclServerType 直接用于 TilingKey 计算,若非法可能导致模板选择错误 | +20% | 40% | **结论**:自信值 **40%**,存在防御性编程缺失,判定为**中等风险**。 --- **关联红线条款**:TOPK-7(融合规则/InferShape/Tiling外部输入校验) **代码路径**: - mc2/allto_all_matmul/op_host/op_tiling/arch35/allto_all_fp_matmul_tiling_base.cpp:218-220 - mc2/allto_all_matmul/op_host/op_tiling/arch35/allto_all_kc_quant_matmul_tiling_base.cpp:553-555 - mc2/allto_all_matmul/op_host/op_tiling/arch35/allto_all_mx_quant_matmul_tiling_base.cpp:797-800 **问题类型**:Tiling 外部输入未校验 **问题描述**: Tiling 代码中 hcclServerType 来自环境变量(外部输入),未显式校验是否在合法范围内。该值直接用于 TilingKey 计算(GET_TPL_TILING_KEY),若为非法值可能导致 TilingKey 计算错误,进而选择错误的 Kernel 模板,影响算子正确性。虽然函数实现保证返回值范围,但 Tiling侧应遵循防御性编程原则,显式校验外部输入。 #### 修改建议 **修改前代码**(allto_all_fp_matmul_tiling_base.cpp:218-220): ```cpp uint8_t hcclServerType = Mc2Comm::GetCommModeFromEnv(); const uint64_t tilingKey = GET_TPL_TILING_KEY(NON_QUANT_MODE, x2TransposeFlag, biasDType, false, hcclServerType); OP_LOGD(opName_, "QUANTMODE,X2TRANSPOSE,DTYPEBIAS,ISSMALLK,COMMTYPE is: [%d,%d,%d,0,%d], and tilingKey is [%lu].", NON_QUANT_MODE, x2TransposeFlag, biasDType, hcclServerType, tilingKey); ``` **修改后代码**: ```cpp uint8_t hcclServerType = Mc2Comm::GetCommModeFromEnv(); // 显式校验外部输入合法性 if (hcclServerType != Mc2Comm::COMM_MODE_CCU && hcclServerType != Mc2Comm::COMM_MODE_AICPU) { OP_LOGE(opName_, "Invalid hcclServerType from env: %u", hcclServerType); return ge::GRAPH_FAILED; } const uint64_t tilingKey = GET_TPL_TILING_KEY(NON_QUANT_MODE, x2TransposeFlag, biasDType, false, hcclServerType); OP_LOGD(opName_, "QUANTMODE,X2TRANSPOSE,DTYPEBIAS,ISSMALLK,COMMTYPE is: [%d,%d,%d,0,%d], and tilingKey is [%lu].", NON_QUANT_MODE, x2TransposeFlag, biasDType, hcclServerType, tilingKey); ``` **修改说明**: 在 TilingKey 计算前添加显式校验,确保 hcclServerType 在合法范围内。若为非法值,记录错误日志并返回失败状态,避免 TilingKey 计算错误。符合 TOPK-7(Tiling外部输入校验)条款要求,增强防御性编程能力。建议在其他 Tiling 文件中同步修改。 --- ## ⚠️ 存疑问题 ### 存疑ID:SUSPICIOUS-001 | 核间同步确认 **问题描述**: Kernel 侧代码变更修改了通信宏定义(DEFINE_MC2_HCCL_FOR_COMMUNICATION),涉及通信算子融合。根据 TOPK-11条款,通信算子融合需核间同步(使用 SyncAll() 等 API)。由于宏定义内部逻辑未在 diff 中展示,无法确认是否包含核间同步操作,需要人工查看完整宏定义实现进行确认。 **建议确认项**: 1. 查看 DEFINE_MC2_HCCL_FOR_COMMUNICATION 宏的完整定义 2. 确认宏内部是否包含 AscendC::SyncAll() 或其他核间同步 API 3. 确认同步时机是否合理(多轮计算和集合通信之间) **相关代码路径**: - mc2/allto_all_matmul/op_kernel/allto_all_matmul_apt.cpp:31-33, 54-56, 77-79 --- ## ✅ 通过条款 以下条款检视未发现问题,代码符合规范要求: | 条款ID | 条款名称 | 检视结论 | |-------|---------|---------| | TOPK-2 | 使用GetInputDesc获取Dtype,context获取Shape | 通过(未涉及) | | TOPK-3 | 生命周期内使用局部变量指针,避免野指针 | 通过 | | TOPK-4 | 属性从context获取,禁止CompileInfo传递 | 通过(未涉及) | | TOPK-5 | 属性获取类型需与ir原型一致 | 通过(未涉及) | | TOPK-6 | 必须考虑nan/inf/+0/-0等特殊值和边界值处理 | 通过 | | TOPK-8 | gm内存偏移或大小必须用int64表示 | 通过 | | TOPK-9 | atomic累加需src(ub)与dst(gm)清零处理 | 通过(未涉及) | | TOPK-10 | 可整数计算时不允许转浮点数计算 | 通过 | | TOPK-12 | 宏定义中临时变量命名不能和外部变量冲突 | 通过 | | TOPK-13 | dlopen管理的so禁用thread_local | 通过(未涉及) | | CPP-SEC-2.1 | 有符号整数运算不溢出 | 通过 | | CPP-SEC-2.2 | 无符号整数运算不回绕 | 通过 | | CPP-SEC-2.3 | 除法/余数运算除零保护 | 通过(未涉及) | | CPP-SEC-3.1 | 禁止使用未初始化的变量 | 通过 | | CPP-SEC-3.3 | 数组索引校验 | 通过(未涉及) | | CPP-SEC-3.5 | 指针使用前判空 | 通过(未涉及) | --- ## 📊 检视统计 ### 按严重级别统计 - CRITICAL(严重):0 个 - MEDIUM(中等):2 个 - LOW(轻微):0 个 ### 按条款来源统计 - TOPK 问题清单:2 个问题(TOPK-1、TOPK-7) - C++ 安全编码规范:0 个问题 ### 按代码侧别统计 - Host侧(API层):1 个问题(ISSUE-001,多文件) - Tiling侧:1 个问题(ISSUE-002,多文件) - Kernel侧:1 个存疑(SUSPICIOUS-001) --- ## 💡 总结与建议 ### 核心问题 本次提交引入环境变量配置通信模式的功能,但缺乏防御性编程校验。虽然 GetCommModeFromEnv() 函数内部保证返回值安全性,但调用侧(Host侧和Tiling侧)未显式校验外部输入,违反 TOPK-1 和 TOPK-7条款要求,存在中等风险。 ### 建议措施 1. **立即修复**:在所有 GetCommModeFromEnv() 调用位置添加显式返回值校验(共6个文件,多处位置) 2. **优先级**:中等风险,建议在下个迭代中修复 3. **影响范围**:Host侧、Tiling侧,不影响 Kernel侧编译和执行 4. **人工确认**:查看通信宏定义内部逻辑,确认核间同步机制 ### 代码质量评估 - 整体代码变更符合 Ascend C 编程规范 - 数值安全、内存安全方面无明显问题 - 输入验证和防御性编程方面存在改进空间 - 建议加强外部输入校验,提升代码健壮性 --- ## 报告生成时间 2026-05-13 14:30:00 ## 报告状态 已完成检视,待修复验证 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [x] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!494816 天前
bugfix: groupSize Co-authored-by: yifux<xiongyifu1@huawei.com> # message auto-generated for no-merge-commit merge: !5215 merge pr_groupsize into master bugfix: groupSize Created-by: xiongyifu Commit-by: yifux Merged-by: cann-robot Description: ## 描述 修改all_to_all_matmul和matmul_all_to_all算子的fallback,添加修饰符static ## 关联的Issue https://gitcode.com/cann/ops-transformer/issues/2406 ## 测试 线上出子包验证 ![image.png](https://raw.gitcode.com/user-images/assets/7673863/173b82b6-771d-4c04-9731-11a3f8684ab9/image.png 'image.png') ![image.png](https://raw.gitcode.com/user-images/assets/7673863/5a057c61-6d9f-4e18-a512-e8ecd0465413/image.png 'image.png') rdv验证 ## 文档更新 不涉及 ## 类型标签 <!-- [x] 表示选中 --> - [x] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!521516 天前
增加A2 A2AQMM tiling中对smoothscale的shape校验 Co-authored-by: SimpleBright_Man<tangpanrui1@huawei.com> # message auto-generated for no-merge-commit merge: !5751 merge fixTilingCheck into master 增加A2 A2AQMM tiling中对smoothscale的shape校验 Created-by: SimpleBright_Man Commit-by: SimpleBright_Man Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> 缺少对smoothscale的shape校验,用户出错后不明确问题原因 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [x] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!57514 天前
修改setBuffFlag同步问题,以及setBuffFlag与checkBuffFlag同步问题 Co-authored-by: gcw_xe6QyzGC<gcw_xe6QyzGC@noreply.gitcode.com> # message auto-generated for no-merge-commit merge: !5556 merge yuhuangqi_AllGatherMM into master 修改setBuffFlag同步问题,以及setBuffFlag与checkBuffFlag同步问题 Created-by: gcw_xe6QyzGC Commit-by: gcw_xe6QyzGC Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> 1、all2allmatmul、matmulall2all、allgathermatmulv2、matmulreducescatterv2四个算子都使用了SetBuffFlag函数,经检视,发现同步问题,补充MTE3_S信号 2、修复allgathermatmulv2中setBuffFlag与checkBuffFlag之间的冲突问题 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> https://gitcode.com/cann/ops-transformer/issues/2127 https://gitcode.com/cann/ops-transformer/issues/2384 ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!55569 天前
新增多个算子的UT覆盖率到90% Co-authored-by: lixiawei<lixiawei2@h-partners.com> # message auto-generated for no-merge-commit merge: !5937 merge add_ut_case_0525 into master 新增多个算子的UT覆盖率到90% Created-by: lixiawei Commit-by: lixiawei Merged-by: cann-robot Description: ## 描述 提升allto_allv_grouped_mat_mul、grouped_mat_mul_allto_allv、distribute_barrier、allto_all_matmul算子UT覆盖率 ## 关联的Issue https://gitcode.com/cann/ops-transformer/issues/2717 ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!59371 天前
add new ops: alltoallMM; update MMalltoall to support Ascend950 Co-authored-by: lidongsheng<lidongsheng43@huawei.com> # message auto-generated for no-merge-commit merge: !1146 merge 910_lds into master add new ops: alltoallMM; update MMalltoall to support Ascend950 Created-by: qq_46353993 Commit-by: lidongsheng Merged-by: cann-robot Description: ## 描述 1. 支持新算子alltoallMM; 2. 算子MMalltoall支持Ascend950; ## 关联的Issue [ISSUE610](https://gitcode.com/cann/ops-transformer/issues/610) <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] Bug修复 - [x] 新特性 - [ ] 性能优化 - [ ] 文档更新 - [ ] 其他,请描述: See merge request: cann/ops-transformer!11463 个月前
MatmulAlltoAll和AlltoAllMatmul增加通信引擎约束描述 Co-authored-by: adamlwang<wangjingquan2@huawei.com> # message auto-generated for no-merge-commit merge: !5068 merge doc into master MatmulAlltoAll和AlltoAllMatmul增加通信引擎约束描述 Created-by: adamlwang Commit-by: adamlwang Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> 增加MatmulAlltoAll和AlltoAllMatmul的通信约束描述。 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> https://gitcode.com/cann/ops-transformer/issues/2310 ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [x] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!506820 天前
README.md

AlltoAllMatmul

产品支持情况

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

功能说明

  • 算子功能:完成AlltoAll通信、Permute(保证通信后地址连续)和Matmul计算的融合,先通信后计算,支持非量化、K-C量化、K-C动态量化和mx量化模式

  • 计算公式:假设x1输入shape为(BS, H),mx量化场景下x1Scale输入shape为(BS, ceil(H/64), 2),rankSize为NPU卡数

    • Atlas A2 训练系列产品/Atlas A2 推理系列产品:

      • 非量化场景:

        commOut=AlltoAll(x1.view(rankSize,BS/rankSize,H))permutedOut=commOut.permute(1,0,2).view(BS/rankSize,rankSize∗H)output=permutedOut@x2+biascommOut = AlltoAll(x1.view(rankSize, BS/rankSize, H)) \\ permutedOut = commOut.permute(1, 0, 2).view(BS/rankSize, rankSize*H) \\ output = permutedOut @ x2 + bias \\

      • K-C量化场景:

        commOut=AlltoAll(x1.view(rankSize,BS/rankSize,H))permutedOut=commOut.permute(1,0,2).view(BS/rankSize,rankSize∗H)outputquant=x1@x2output=outputquant×x1scale×x2scaleoutput=output+biascommOut = AlltoAll(x1.view(rankSize, BS/rankSize, H)) \\ permutedOut = commOut.permute(1, 0, 2).view(BS/rankSize, rankSize*H) \\ output_{quant} = x1 @ x2 \\ output = output_{quant} \times x1_{scale} \times x2_{scale} \\ output = output + bias

      • K-C动态量化场景:

        commOut=AlltoAll(x1.view(rankSize,BS/rankSize,H))permutedOut=commOut.permute(1,0,2).view(BS/rankSize,rankSize∗H)x1quant,x1scale=Quant(permutedOut)outputquant=x1quant@x2output=outputquant×x1scale×x2scaleoutput=output+biascommOut = AlltoAll(x1.view(rankSize, BS/rankSize, H)) \\ permutedOut = commOut.permute(1, 0, 2).view(BS/rankSize, rankSize*H) \\ x1_{quant}, x1_{scale} = Quant(permutedOut) \\ output_{quant} = x1_{quant} @ x2 \\ output = output_{quant} \times x1_{scale} \times x2_{scale} \\ output = output + bias

    • Atlas A3 训练系列产品/Atlas A3 推理系列产品:

      • 非量化场景:

        commOut=AlltoAll(x1.view(rankSize,BS/rankSize,H))permutedOut=commOut.permute(1,0,2).view(BS/rankSize,rankSize∗H)output=permutedOut@x2+biascommOut = AlltoAll(x1.view(rankSize, BS/rankSize, H)) \\ permutedOut = commOut.permute(1, 0, 2).view(BS/rankSize, rankSize*H) \\ output = permutedOut @ x2 + bias \\

    • Ascend 950PR/Ascend 950DT:

      • 非量化场景:

        commOut=AlltoAll(x1.view(rankSize,BS/rankSize,H))permutedOut=commOut.permute(1,0,2).view(BS/rankSize,rankSize∗H)output=permutedOut@x2+biascommOut = AlltoAll(x1.view(rankSize, BS/rankSize, H)) \\ permutedOut = commOut.permute(1, 0, 2).view(BS/rankSize, rankSize*H) \\ output = permutedOut @ x2 + bias \\

      • K-C动态量化场景:

        commOut=AlltoAll(x1.view(rankSize,BS/rankSize,H))permutedOut=commOut.permute(1,0,2).view(BS/rankSize,rankSize∗H)dynQuantX1,dynQuantX1Scale=dynamicQuant(permutedOut)output=(dynQuantX1@x2+bias)×dynQuantX1Scale×x2ScalecommOut = AlltoAll(x1.view(rankSize, BS/rankSize, H)) \\ permutedOut = commOut.permute(1, 0, 2).view(BS/rankSize, rankSize*H) \\ dynQuantX1, dynQuantX1Scale = dynamicQuant(permutedOut) \\ output = (dynQuantX1@x2 + bias) \times dynQuantX1Scale \times x2Scale

      • mx量化场景:

        commOut=AlltoAll(x1.view(rankSize,BS/rankSize,H))permutedOut=commOut.permute(1,0,2).view(BS/rankSize,rankSize∗H)commScale=AlltoAll(x1Scale.view(rankSize,BS/rankSize,ceil(H/64),2))permutedScale=commScale.permute(1,0,2,3).view(BS/rankSize,ceil(H/64)∗rankSize,2)output=∑0⌊kblockSize=32⌋(permutedOut@x2∗(permutedScale∗x2Scale))+biascommOut = AlltoAll(x1.view(rankSize, BS/rankSize, H)) \\ permutedOut = commOut.permute(1, 0, 2).view(BS/rankSize, rankSize*H) \\ commScale = AlltoAll(x1Scale.view(rankSize, BS/rankSize, ceil(H/64), 2)) \\ permutedScale = commScale.permute(1, 0, 2, 3).view(BS/rankSize, ceil(H/64)*rankSize, 2) \\ output = \sum_{0}^{\left \lfloor \frac{k}{blockSize=32} \right \rfloor} (permutedOut @ x2 * (permutedScale * x2Scale)) + bias

参数说明​

参数名 输入/输出/属性 描述 数据类型 数据格式
x1 输入 融合算子的左矩阵,即公式中的输入x1。 FLOAT16、BFLOAT16、INT4、FLOAT8_E4M3FN、FLOAT8_E5M2、FLOAT4_E2M1 ND
x2 输入 融合算子的右矩阵,也是Matmul的右矩阵,即公式中的输入x2。 FLOAT16、BFLOAT16、INT8、INT4、FLOAT8_E4M3FN、FLOAT8_E5M2、FLOAT4_E2M1 ND
bias 可选输入 可选输入,阵乘运算后累加的偏置,对应公式中的bias。 FLOAT16、BFLOAT16、FLOAT32 ND
x1_scale 可选输入 左矩阵的量化系数,对应公式中的x1Scale。 FLOAT32、FLOAT8_E8M0 ND
x2_scale 可选输入 右矩阵的量化系数,对应公式中的x2Scale。 FLOAT32、FLOAT8_E8M0 ND
comm_scale 可选输入 预留参数,低比特通信的量化系数。 - -
x1_offset 可选输入 预留参数,左矩阵的量化偏置。 - -
x2_offset 可选输入 预留参数,右矩阵的量化偏置。 - -
y 输出 计算+通信的结果,即公式中的输出output。 FLOAT16、BFLOAT16、FLOAT32 ND
alltoall_out 输出 接收AlltoAll和Permute后的结果,即公式中的输出permutedOut。 与输入x1保持一致 ND
group 必选属性 Host侧标识列组的字符串,即通信域名称,通过Hccl接口HcclGetCommName获取commName作为该参数,字符串长度要求(0, 128)。 STRING -
world_size 必选属性 使用的npu卡数,公式中的rankSize。 INT -
all2all_axes 可选属性 AlltoAll和Permute数据交换的方向,支持配置空或者[-2, -1],传入空时默认按[-2, -1]处理,表示将输入由(BS, H)转为(BS/rankSize, H*rankSize)。 aclIntArray*(元素类型INT64) ND
x1_quant_mode 可选属性 左矩阵的量化方式,按照实际场景配置。 INT -
x2_quant_mode 可选属性 右矩阵的量化方式,按照实际场景配置。 INT -
comm_quant_mode 可选属性 低比特通信的量化方式,预留参数,当前仅支持配置为0,表示不量化。 INT -
comm_quant_dtype 可选属性 低比特通信的量化类型,预留参数,当前仅支持配置为-1,表示ACL_DT_UNDEFINED。 INT -
x1_quant_dtype 可选属性 量化Matmul左矩阵的量化类型,AlltoAll通信与Permute后的结果,按照该参数配置量化后作为Matmul计算的左矩阵输入,按照实际场景配置。 INT -
transpose_x1 可选属性 标识左矩阵是否转置过,暂不支持配置为True。 bool -
transpose_x2 可选属性 标识右矩阵是否转置过,配置为True时右矩阵Shape为(N,H*rankSize)。 bool -
group_size 可选属性 用于Matmul计算三个方向上的量化分组大小,仅在scale输入都是2维及以上数据时取值有效,其他场景默认传入0即可。 INT -
alltoall_out_flag 可选属性 用于标识是否需要保留AlltoAll和Permute后的结果。 bool -

x1QuantMode、x2QuantMode、commQuantMode的枚举值与量化模式关系如下:

  • 0: 不量化
  • 1: pertensor
  • 2: perchannel
  • 3: pertoken
  • 4: pergroup
  • 5: perblock
  • 6: mx量化
  • 7: pertoken动态量化

约束说明

  • 默认支持确定性计算。
  • NPU卡数(rankSize),根据设备型号有不同限制:
    • Atlas A2 训练系列产品/Atlas A2 推理系列产品:支持2、4、8卡。
    • Atlas A3 训练系列产品/Atlas A3 推理系列产品:支持2、4、8、16卡。
    • Ascend 950PR/Ascend 950DT:支持2、4、8、16卡。
  • 空tensor和非连续tensor的支持度根据不同设备型号有不同的限制:
    • Atlas A2 训练系列产品/Atlas A2 推理系列产品:不支持任何空tensor;不支持任何非连续tensor。
    • Atlas A3 训练系列产品/Atlas A3 推理系列产品、Ascend 950PR/Ascend 950DT:仅支持非量化场景下输入x1的第一维度(BS)为0的空tensor,其它空tensor均不支持;仅支持输入x2的转置非连续tensor,其它非连续tensor均不支持。
  • 输入x1必须是2维,其shape为(BS, H),BS必须整除NPU卡数,BS和N的值不得超过2147483647(INT32_MAX),不支持转置。
  • 输入x2必须是2维,其shape为(H*rankSize, N),H*rankSize范围根据芯片型号和场景不同有不同约束,详见量化aclnn约束说明非量化aclnn约束说明。当处于mx量化场景时,x2必须转置,其shape为(N, H*rankSize),transpose_x2配置为True。
  • bias若非空,其维度必须为1维,shape为(N)。
  • x1_scale若非空,在mx量化场景时,其维度为3维,shape为(BS, ceil(H/64), 2);在K-C量化场景时,其维度为1维,shape为(BS);在K-C动态量化场景时,其维度为1维,shape为(H*rankSize)。
  • x2_scale若非空,在mx量化场景时,其维度为3维,shape为(N, ceil(H*rankSize/64), 2);其它场景中其维度为1维,shape为(N)。
  • all2all_axes为1维数组,shape必须为(2)。
  • 目前支持的量化模式,根据设备型号有不同限制:
    • Atlas A2 训练系列产品/Atlas A2 推理系列产品:支持K-C量化和K-C动态量化模式,x1QuantMode=3或7,x2QuantMode=2。
    • Atlas A3 训练系列产品/Atlas A3 推理系列产品:目前不支持量化场景。
    • Ascend 950PR/Ascend 950DT:支持K-C动态量化模式,x1QuantMode=7,x2QuantMode=2;mx量化模式,x1QuantMode=6,x2QuantMode=6。
  • 非量化场景x1、x2计算输入的数据类型要和output、alltoAllOutOptional计算输出的数据类型一致,传入的x1、x2与output均不为空指针。
  • 量化场景x1和alltoAllOutOptional的数据类型一致,传入的x1、x2、x2Scale与output均不为空指针。
  • x1、x2和bias计算输入的数据类型根据不同设备型号有不同的限制:
    • Atlas A2 训练系列产品/Atlas A2 推理系列产品:
      • 非量化场景下,output计算输出的数据类型为FLOAT16时,bias计算输入的数据类型支持FLOAT16;output计算输出的数据类型为BFLOAT16时,bias计算输入的数据类型支持FLOAT32。
      • 量化场景下,数据类型组合详见量化aclnn约束说明
    • Atlas A3 训练系列产品/Atlas A3 推理系列产品:
      • 非量化场景下,output计算输出的数据类型为FLOAT16时,bias计算输入的数据类型支持FLOAT16;output计算输出的数据类型为BFLOAT16时,bias计算输入的数据类型支持FLOAT32。
      • A3目前不支持量化场景。
    • Ascend 950PR/Ascend 950DT:
      • 非量化场景下,x1/x2计算输入的数据类型为FLOAT16时,bias计算输入的数据类型支持FLOAT16和FLOAT32;x1/x2计算输入的数据类型为BFLOAT16时,bias计算输入的数据类型支持BFLOAT16和FLOAT32。
      • 量化场景下,支持K-C动态量化模式和mx量化模式,x1计算输入的数据类型为FLOAT16、BFLOAT16、FLOAT8_E4M3FN、FLOAT8_E5M2、FLOAT4_E2M1,x2计算输入的数据类型为FLOAT8_E4M3FN、FLOAT8_E5M2、FLOAT4_E2M1,bias的数据类型为FLOAT32或者bias为空,具体类型组合详见量化aclnn约束说明
      • mx量化模式下,当x1和x2的数据类型为FLOAT4_E2M1时,两者的数据类型必须一致。
  • 通算融合算子不支持并发调用,不同的通算融合算子也不支持并发调用。
  • 不支持跨超节点通信,只支持超节点内。
  • 通信引擎约束:
    • Atlas A2 训练系列产品/Atlas A2 推理系列产品:支持MTE通信。
    • Atlas A3 训练系列产品/Atlas A3 推理系列产品:支持AICPU通信。
    • Ascend 950PR/Ascend 950DT:支持CCU通信。

调用说明

调用方式 样例代码 说明
aclnn接口 test_aclnn_allto_all_matmul.cpp 通过aclnnAlltoAllMatMul接口方式调用非量化场景的AlltoAllMatMul算子。
aclnn接口 test_aclnn_allto_all_quant_matmul.cpp 通过aclnnAlltoAllQuantMatMul接口方式调用量化场景的AlltoAllMatMul算子。