| Files | Last commit | Last update |
|---|---|---|
fix(pre-commit): 全仓代码规范整改——mc2 Co-authored-by: gitcode_lijd<lijiandong20@huawei.com> # message auto-generated for no-merge-commit merge: !11457 merge ci into master fix(pre-commit): 全仓代码规范整改——mc2 Created-by: gitcode_lijd Commit-by: gitcode_lijd Merged-by: cann-robot Description: 关联Issue https://gitcode.com/cann/ops-transformer/issues/5939(全仓代码规范整改总跟踪) ## 描述 全仓代码规范整改系列——mc2 目录。基于仓库 pre-commit 门禁对存量代码做一次性规范收敛: - clang-format 按 .clang-format 统一格式(列宽 120、指针左对齐 T* p、引用对齐 T& r 等) - 行尾空白、文件末尾换行修复 - 规模:1380 个文件,+22820/-22840 行,纯格式化改动语义等价,无逻辑变更 > 注:本 PR 早期版本曾包含 mc2 算子 kernel cpp 入口注释行补充(仓镜像替换链路验证),该内容已不在当前分支,当前为纯格式化整改。 ## 关联的Issue https://gitcode.com/cann/ops-transformer/issues/5939(全仓整改总跟踪) ## 测试 - pre-commit 全部钩子本地通过 - CI 流水线(compile/UT)验证 See merge request: cann/ops-transformer!11457 | 1 month ago | |
sort/a2a分核版本并抽取apace & scatteradd smit/vf优化 & 代码重构优化 Co-authored-by: wangliangpei<wangliangpei@huawei.com> # message auto-generated for no-merge-commit merge: !14043 merge master-1018 into master sort/a2a分核版本并抽取apace & scatteradd smit/vf优化 & 代码重构优化 Created-by: wangliangpei Commit-by: wangliangpei Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> 进行alltoallv和sort的分核模式改造,实现了alltoallv和sort可以通过分配核数实现并行。 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> [Requirement|需求建议]:engram_fetch_grad反向优化v3 #6299 ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!14043 | 27 days ago | |
fix(engram): 反向排序radix裁轮值域改用全局索引域 Co-authored-by: luozhonglin222<luozhonglin1@huawei.com> # message auto-generated for no-merge-commit merge: !15243 merge engram_new into master fix(engram): 反向排序radix裁轮值域改用全局索引域 Created-by: luozhonglin222 Commit-by: luozhonglin222 Merged-by: cann-robot Description: ## 描述 反向排序radix裁轮值域改用全局索引域 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [x] 🐛 Bug修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!15243 | 10 days ago | |
提升mc2算子ut覆盖率 Co-authored-by: mutex_lock<chenyifan66@h-partners.com> # message auto-generated for no-merge-commit merge: !14693 merge ut_cov2 into master 提升mc2算子ut覆盖率 Created-by: mutex_lock Commit-by: mutex_lock Merged-by: cann-robot Description: ## 描述 提升部分 mc2 算子 UT 行覆盖率(分支 ut_cov2):补齐 engram_fetch_wait 脚手架,并为 matmul / allto_all / barrier / engram 等低覆盖算子增补 api、infershape、tiling 用例与 CSV。 主要改动: 1. **新建 UT**:为 engram_fetch_wait 新增完整 tests/ut(op_api / op_host / arch35 tiling、infershape、CMake)。 2. **增补用例**:allto_all_matmul、allto_allv_quant_grouped_mat_mul、distribute_barrier_extend、engram_fetch_grad、grouped_mat_mul_all_reduce、inplace_matmul_all_reduce_add_rms_norm(含 arch22 tiling)、matmul_all_reduce_add_rms_norm、matmul_allto_all、matmul_reduce_scatter_v2(api / infershape / tiling CSV)。 ### 覆盖率提升算子列表 | 算子 | 变更前 LINE% | 变更后 LINE% | 变更前 STATUS | 变更后 STATUS | |------|-------------:|-------------:|:-------------:|:-------------:| | engram_fetch_grad | 13.0% | 94.2% | BELOW | OK | | matmul_reduce_scatter_v2 | 82.6% | 90.9% | BELOW | OK | | grouped_mat_mul_all_reduce | 82.8% | 91.1% | BELOW | OK | | allto_allv_quant_grouped_mat_mul | 83.6% | 91.4% | BELOW | OK | | distribute_barrier_extend | 84.6% | 98.7% | BELOW | OK | | allto_all_matmul | 85.7% | 91.8% | BELOW | OK | | inplace_matmul_all_reduce_add_rms_norm | 87.5% | 93.2% | BELOW | OK | | matmul_all_reduce_add_rms_norm | 89.1% | 90.9% | BELOW | OK | | matmul_allto_all | 89.1% | 91.5% | BELOW | OK | | engram_fetch_wait | N/A | 95.3% | NO_DATA | OK | ## 关联的Issue 无 ## 测试 - bash scripts/ci/ut_make.sh "$(pwd)"(本分支涉及算子 host 多 SoC + api)全绿 ## 文档更新 无 ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [x] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!14693 | 16 days ago | |
engram support training Co-authored-by: luozhonglin222<luozhonglin1@huawei.com> # message auto-generated for no-merge-commit merge: !8914 merge master into master engram support training Created-by: luozhonglin222 Commit-by: luozhonglin222 Merged-by: cann-robot Description: ## 描述 engram算子支持训练HOST代码,前向复用现有接口,增加相应参数,反向增加新接口 ## 关联的Issue https://gitcode.com/cann/ops-transformer/issues/3838 ## 测试 本地验证 ## 文档更新 不涉及 ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug修复 - [x] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: # PR #8914 代码检视报告 ## 检视概览 - **PR URL**:https://gitcode.com/cann/ops-transformer/pull/8914 - **算子名**:engram_fetch_grad / engram_fetch_train / elastic_buffer - **代码侧别**:Kernel + Tiling + 混合(torch_extension) - **变更文件数**:21 - **文件组数**:6(K1, K2, H1, H2, S, E) - **总条例数**:346 - **检视时间**:2026-07-21 - **检视模式**:大型 PR 检视(21 文件 > 10 阈值) ## 检视统计 | 状态 | 条例数 | 占比 | |------|--------|------| | PASS | 341 | 98.6% | | FAIL(发现问题) | 5 | 1.4% | | SUSPICIOUS(需关注) | 0 | 0% | ### 逐文件组统计 | 文件组 | 侧别 | 文件数 | PASS | FAIL | |--------|------|--------|------|------| | engram_fetch_grad_kernel_G1 (K1) | Kernel | 3 | 27 | 0 | | engram_fetch_train_kernel_G1 (K2) | Kernel | 3 | 37 | 0 | | engram_fetch_grad_host_G1 (H1) | Tiling | 3 | 66 | 2 | | engram_fetch_train_host_G1 (H2) | Tiling | 3 | 70 | 2 | | shared (S) | 混合 | 6 | 61 | 1 | | elastic_buffer (E) | 混合 | 3 | 80 | 0 | | **合计** | — | **21** | **341** | **5** | ### 系统性风险 **SEC-4.1 / TOPK-7 在 H1 和 H2 中均失败**:两个 Tiling 侧文件组(engram_fetch_grad 和 engram_fetch_train)均存在 sendCounts/recvLocalEntry(或 sendCountsOut/recvLocalEntryOut)的 dim(0) 值未做非负/范围校验的问题。两个算子的 tiling 代码结构高度相似,校验缺失模式相同,建议全局排查并统一修复。 --- ## 发现问题(HIGH 置信度) ### 1. [engram_fetch_grad_host_G1] SEC-4.1 外部输入数据需要做合法性校验 - **问题描述**:sendCounts 的 dim(0) 和 recvLocalEntry 的 dim(0) 作为外部输入(来自 graph shape)仅校验了维度数(1D),未对 dim(0) 的值做合法性校验,违反 SEC-4.1「外部输入数据需要做合法性校验且确保校验范围正确」。同一函数中 commContext(行 206 GetDim(0) <= 0)和 gradFetched(行 221 numTokens < 0、行 226 hiddenDim <= 0)均对 dim 值做了显式校验,sendCounts/recvLocalEntry 缺失同类校验,形成不一致的安全缺口。 **风险链路 1(sendCounts)**:dim(0) 若为负值或超过 UINT32_MAX,行 260 static_cast<uint32_t> 会发生窄化截断/回绕,rankSize 变为巨大错误值 → SetBlockDim 和 workspace 计算均受影响。 **风险链路 2(recvLocalEntry)**:dim(0) 赋值给 int64_t totalRecv(行 281),若为负值则保留负数 → wsRecvGrad = totalRecv * hiddenBytes 为负 → wsTotal 求和可能为负 → static_cast<size_t>(wsTotal) 将负数回绕为极大 size_t 值,导致 workspace 申请异常。 - **代码片段**(mc2/engram_fetch_grad/op_host/op_tiling/engram_fetch_grad_tiling.cpp 行 251-281): cpp // sendCounts: 1D (W,) const gert::StorageShape *sendCountsShape = context->GetInputShape(IN_SEND_COUNTS); OP_TILING_CHECK(sendCountsShape == nullptr, OP_LOGE_WITH_INVALID_INPUT(nodeName, "sendCounts"), return ge::GRAPH_FAILED); OP_TILING_CHECK(sendCountsShape->GetStorageShape().GetDimNum() != DIM_ONE, OP_LOGE_FOR_INVALID_SHAPEDIM_WITH_REASON(nodeName, "sendCounts", (std::to_string(sendCountsShape->GetStorageShape().GetDimNum()) + "D").c_str(), "The shape dim of sendCounts must be 1D."), return ge::GRAPH_FAILED); rankSize = static_cast<uint32_t>(sendCountsShape->GetStorageShape().GetDim(0)); // recvCounts: 1D (W,) const gert::StorageShape *recvCountsShape = context->GetInputShape(IN_RECV_COUNTS); OP_TILING_CHECK(recvCountsShape == nullptr, OP_LOGE_WITH_INVALID_INPUT(nodeName, "recvCounts"), return ge::GRAPH_FAILED); OP_TILING_CHECK(recvCountsShape->GetStorageShape().GetDimNum() != DIM_ONE, OP_LOGE_FOR_INVALID_SHAPEDIM_WITH_REASON(nodeName, "recvCounts", (std::to_string(recvCountsShape->GetStorageShape().GetDimNum()) + "D").c_str(), "The shape dim of recvCounts must be 1D."), return ge::GRAPH_FAILED); // recvLocalEntry: 1D (R,) const gert::StorageShape *recvLocalEntryShape = context->GetInputShape(IN_RECV_LOCAL_ENTRY); OP_TILING_CHECK(recvLocalEntryShape == nullptr, OP_LOGE_WITH_INVALID_INPUT(nodeName, "recvLocalEntry"), return ge::GRAPH_FAILED); OP_TILING_CHECK(recvLocalEntryShape->GetStorageShape().GetDimNum() != DIM_ONE, OP_LOGE_FOR_INVALID_SHAPEDIM_WITH_REASON(nodeName, "recvLocalEntry", (std::to_string(recvLocalEntryShape->GetStorageShape().GetDimNum()) + "D").c_str(), "The shape dim of recvLocalEntry must be 1D."), return ge::GRAPH_FAILED); totalRecv = recvLocalEntryShape->GetStorageShape().GetDim(0); - **假设检验证据**: - (+40%) 规范违反:SEC-4.1 要求外部输入数据需做合法性校验,sendCounts dim(0) 直接 cast uint32_t、recvLocalEntry dim(0) 直接赋值 int64_t,均无值范围校验 - (+30%) 上下文防御缺失:同函数内 commContext/gradFetched 均有非负校验,唯独 sendCounts/recvLocalEntry 缺失 - (+20%) PR 归属:新增文件,全部行在 diff 变更范围内 - (+15%) 数据流风险:rankSize 负值回绕 / totalRecv 负值导致 workspace 回绕为巨大值 - 自信值 = 105% ≥ 70% → 判定违规 - **修复建议**: 1. 在行 260 之前增加 sendCounts dim(0) 值校验(> 0) 2. 在行 281 之前增加 recvLocalEntry dim(0) 值校验(>= 0) 3. 参照同函数内 commContext/gradFetched 的校验模式 --- ### 2. [engram_fetch_grad_host_G1] TOPK-7 融合规则/InferShape/Tiling 外部输入校验 - **问题描述**:TOPK-7 要求「Tiling 外部输入使用时必须进行合法性校验」,校验内容包括「Shape 维度是否合法(不为负数、不超过限制)」。sendCounts dim(0) 和 recvLocalEntry dim(0) 作为外部输入被提取后直接使用,未做非负/范围校验。同函数内 commContext dim0(<=0 校验)、gradFetched dim0(<0 校验)、hiddenDim(<=0 校验)均有非负防御,唯独 sendCounts 和 recvLocalEntry 缺失。此问题与 SEC-4.1 同构。 - **代码片段**(mc2/engram_fetch_grad/op_host/op_tiling/engram_fetch_grad_tiling.cpp 行 251-281): cpp // sendCounts: 1D (W,) const gert::StorageShape *sendCountsShape = context->GetInputShape(IN_SEND_COUNTS); OP_TILING_CHECK(sendCountsShape == nullptr, OP_LOGE_WITH_INVALID_INPUT(nodeName, "sendCounts"), return ge::GRAPH_FAILED); OP_TILING_CHECK(sendCountsShape->GetStorageShape().GetDimNum() != DIM_ONE, OP_LOGE_FOR_INVALID_SHAPEDIM_WITH_REASON(nodeName, "sendCounts", (std::to_string(sendCountsShape->GetStorageShape().GetDimNum()) + "D").c_str(), "The shape dim of sendCounts must be 1D."), return ge::GRAPH_FAILED); rankSize = static_cast<uint32_t>(sendCountsShape->GetStorageShape().GetDim(0)); // ...(recvLocalEntry 同理) totalRecv = recvLocalEntryShape->GetStorageShape().GetDim(0); - **假设检验证据**: - (+40%) 规范违反:TOPK-7 要求 Shape 维度不为负数 - (+30%) 上下文防御缺失:同函数内其他 tensor 均有非负校验 - (+20%) PR 归属:新增文件 - (+15%) 数据流风险:负值 dim0 经 static_cast 回绕或以负 int64_t 传播至 workspace 计算 - 自信值 = 105% ≥ 70% → 判定违规 - **修复建议**:与 SEC-4.1 同一问题,修复方案一致。 --- ### 3. [engram_fetch_train_host_G1] SEC-4.1 外部输入数据需要做合法性校验 - **问题描述**:CheckTensorDim 中 sendCountsOut 和 recvLocalEntryOut 的 dim0 值作为外部输入未做范围校验。rankSize(uint32_t)通过 static_cast 从 int64_t 缩窄转换,若 dim0 为负或超过 UINT32_MAX 将静默截断/回绕为巨大值;totalRecv(int64_t)未校验非负,若为负值将导致 wsLocalData = totalRecv * hiddenBytes 为负,进而 wsTotal 为负,再经 static_cast<size_t>(wsTotal) 回绕为约 1.8e19 的巨大 workspace 申请。同函数内 commContextShape dim0 > 0(行 188)、numTokens >= 0(行 202)、numRecvOutShape dim0 == 1(行 272)均已校验,此处校验明显不一致。 - **代码片段**(mc2/engram_fetch_train/op_host/op_tiling/engram_fetch_train_tiling.cpp 行 235-262): cpp const gert::StorageShape *sendCountsOutShape = context->GetOutputShape(OUT_SEND_COUNTS); OP_TILING_CHECK(sendCountsOutShape == nullptr, OP_LOGE_WITH_INVALID_INPUT(nodeName, "sendCountsOut"), return ge::GRAPH_FAILED); OP_TILING_CHECK(sendCountsOutShape->GetStorageShape().GetDimNum() != DIM_ONE, OP_LOGE_FOR_INVALID_SHAPEDIM_WITH_REASON(nodeName, "sendCountsOut", (std::to_string(sendCountsOutShape->GetStorageShape().GetDimNum()) + "D").c_str(), "The shape dim of sendCountsOut must be 1D."), return ge::GRAPH_FAILED); rankSize = static_cast<uint32_t>(sendCountsOutShape->GetStorageShape().GetDim(0)); const gert::StorageShape *recvCountsOutShape = context->GetOutputShape(OUT_RECV_COUNTS); OP_TILING_CHECK(recvCountsOutShape == nullptr, OP_LOGE_WITH_INVALID_INPUT(nodeName, "recvCountsOut"), return ge::GRAPH_FAILED); OP_TILING_CHECK(recvCountsOutShape->GetStorageShape().GetDimNum() != DIM_ONE, OP_LOGE_FOR_INVALID_SHAPEDIM_WITH_REASON(nodeName, "recvCountsOut", (std::to_string(recvCountsOutShape->GetStorageShape().GetDimNum()) + "D").c_str(), "The shape dim of recvCountsOut must be 1D."), return ge::GRAPH_FAILED); const gert::StorageShape *recvLocalEntryOutShape = context->GetOutputShape(OUT_RECV_LOCAL_ENTRY); OP_TILING_CHECK(recvLocalEntryOutShape == nullptr, OP_LOGE_WITH_INVALID_INPUT(nodeName, "recvLocalEntryOut"), return ge::GRAPH_FAILED); OP_TILING_CHECK(recvLocalEntryOutShape->GetStorageShape().GetDimNum() != DIM_ONE, OP_LOGE_FOR_INVALID_SHAPEDIM_WITH_REASON(nodeName, "recvLocalEntryOut", (std::to_string(recvLocalEntryOutShape->GetStorageShape().GetDimNum()) + "D").c_str(), "The shape dim of recvLocalEntryOut must be 1D."), return ge::GRAPH_FAILED); totalRecv = recvLocalEntryOutShape->GetStorageShape().GetDim(0); - **假设检验证据**: - (+40%) 规范违反:外部 shape dim 值未做范围/非负校验 - (+30%) 上下文防御缺失:作用域内仅校验 dim 数,无 dim 值范围校验 - (+20%) PR 归属:新文件,全量代码均在 diff 范围 - (+15%) 数据流风险:rankSize 缩窄截断 / totalRecv 负值 → workspace 回绕 - 自信值 = 105% ≥ 70% → 判定违规 - **修复建议**: 1. 在行 243 前增加 sendCountsOut dim(0) 非负及 <= UINT32_MAX 校验 2. 在行 262 前增加 recvLocalEntryOut dim(0) >= 0 校验 3. 参照同函数内 numTokens(行 202-205)的校验模式 --- ### 4. [engram_fetch_train_host_G1] TOPK-7 融合规则/InferShape/Tiling 外部输入校验 - **问题描述**:与 SEC-4.1 同一问题。TOPK-7 要求 Tiling 外部输入的 Shape 维度不为负数、不超过限制。sendCountsOut dim0(赋值给 rankSize,缩窄为 uint32_t)和 recvLocalEntryOut dim0(赋值给 totalRecv)均未做非负/范围校验。同函数内 commContextShape dim0 > 0(行 188)、indicesShape numTokens >= 0(行 202)均已校验,存在校验不一致。 - **代码片段**(mc2/engram_fetch_train/op_host/op_tiling/engram_fetch_train_tiling.cpp 行 235-262):(同 SEC-4.1) - **假设检验证据**: - (+40%) 规范违反:Tiling 外部 shape dim 值未做非负/范围校验 - (+30%) 上下文防御缺失:仅校验 dim 数无 dim 值校验 - (+20%) PR 归属:新文件全量在 diff 范围 - (+15%) 数据流风险:rankSize 缩窄截断 / totalRecv 负值 → work See merge request: cann/ops-transformer!8914 | 3 months ago |