| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
fix(pre-commit): 全仓代码规范整改——公共 Co-authored-by: gitcode_lijd<lijiandong20@huawei.com> # message auto-generated for no-merge-commit merge: !13532 merge common into master fix(pre-commit): 全仓代码规范整改——公共 Created-by: gitcode_lijd Commit-by: gitcode_lijd Merged-by: cann-robot Description: 关联Issue https://gitcode.com/cann/ops-transformer/issues/5939 ## 描述 全仓代码规范整改系列——公共目录(common/、examples/、tests/、scripts/ 等)。基于仓库 pre-commit 门禁对存量代码做一次性规范收敛: - clang-format 按 .clang-format 统一格式(列宽 120、指针左对齐等),ruff 格式化 Python - 行尾空白、文件末尾换行修复,少量文档笔误修正 - 规模:280 个文件,+4708/-5785 行,纯格式化改动语义等价,无逻辑变更 ## 关联的Issue https://gitcode.com/cann/ops-transformer/issues/5939(全仓整改总跟踪) ## 测试 - pre-commit 全部钩子本地通过 - CI 流水线(compile/UT)验证 See merge request: cann/ops-transformer!13532 | 6 天前 | |
规范化FIA算子 split fuse 分支 error message Co-authored-by: wangsong96<wangsong109@huawei.com> # message auto-generated for no-merge-commit merge: !12494 merge master into master 规范化FIA算子 split fuse 分支 error message Created-by: wangsong96 Commit-by: wangsong96 Merged-by: cann-robot Description: ## 描述 按照 CANN error message 规范(错误码定义 log.cpp / 上报接口 log.h / Error Message 接口文档), 对 fused_infer_attention_score 算子 split fuse(usingFAI)分支的报错信息进行整改 ## 关联的Issue 关联Issue [#5624](https://gitcode.com/cann/ops-transformer/issues/5624) ## 测试 黄区构建和二级冒烟测试 ## 文档更新 无 ## 类型标签 <!-- [x] 表示选中 --> - [x ] 🐛 Bug修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!12494 | 2 天前 | |
refactor(attention): 非量化 MLA 主算子及 metadata 统一命名为 FlashMla Co-authored-by: PerrySkywalker<wangmingkang1@huawei.com> # message auto-generated for no-merge-commit merge: !13884 merge refactor/flash_mla_public_name into master refactor(attention): 非量化 MLA 主算子及 metadata 统一命名为 FlashMla Created-by: PerrySkywalker Commit-by: PerrySkywalker Merged-by: cann-robot Description: ## 描述 非量化 MLA 的 Python 接口已使用 flash_mla,但底层目录、算子注册及 ACLNN 仍采用 flash_mla_with_kvcache 命名。本次将主算子与 metadata 全链路统一为 flash_mla / FlashMla 和 flash_mla_metadata / FlashMlaMetadata。 - 同步迁移 host/kernel/AICPU、tiling/checker、Torch 绑定、测试资产及构建引用。 - 移除旧 Python 模块兼容别名和旧手写 L0 封装;ACLNN 入口继续调用自动生成的 inner 实现。 - 更新编译影响白名单与文档链接;不改变核心计算逻辑。 兼容性:使用旧模块路径或 aclnnFlashMlaWithKvcache* 符号的调用方需要迁移到新名称,不保留旧名称别名。量化 MLA 和外部 FlashMLA 参考实现不在本次改名范围。 ## 关联的Issue 关联 https://gitcode.com/cann/ops-transformer/issues/6188 ## 测试 - 本地暂存范围及相对 upstream/master merge-base 的完整 PR 文件集合均通过仓库固定版本的 pre-commit 检查。 - 头文件查重实际检查 30 个新增/重命名头文件;OAT 实际扫描 82 个文件,无缓存跳过。 - 静态检查 Python 导出、Torch schema/C++ 绑定、ACLNN 和算子注册,未发现非量化 MLA 旧接口残留。 - 本次未重新编译,未执行 NPU 精度、性能或运行时测试;远端 CI 结果以平台为准。 ## 文档更新 迁移 torchapi_flash_mla.md,更新 Ascend 950 算子列表链接及 MLA 测试资产中的路径和名称。 ## 类型标签 - [ ] 🐛 Bug修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [x] ♻️ 重构 - [ ] 🧪 测试 - [x] 📦 构建/CI - [ ] 🔧 配置变更 - [x] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [x] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!13884 | 1 天前 | |
添加pybind11依赖声明 Co-authored-by: chenyifan<chenyifan66@h-partners.com> # message auto-generated for no-merge-commit merge: !9952 merge add_module into master 添加pybind11依赖声明 Created-by: mutex_lock Commit-by: chenyifan Merged-by: cann-robot Description: ## 描述 - requirements.txt中增加pybind11依赖声明 ## 关联的Issue https://gitcode.com/cann/ops-transformer/issues/4283 ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [x] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!9952 | 2 个月前 | |
fix block_attn_res_update ut Co-authored-by: liuyufan<liuyufan9@huawei.com> # message auto-generated for no-merge-commit merge: !13890 merge fix/block-attn-res-update-ut-ci into master fix block_attn_res_update ut Created-by: liuyufan0725 Commit-by: liuyufan Merged-by: cann-robot Description: ## 描述 本 PR 修复 BlockAttnResUpdate host UT 的段错误与核数配置错误,并将该算子(及算子 BlockAttnResPrepare)纳入 CI UT 看护。 **问题 1:host UT 执行即段错误** bash build.sh -u --ophost --ops=block_attn_res_update 在 BlockAttnResUpdateTilingDirect.AcceptsMatchingNdPhysicalLayout 用例处段错误。根因链路: - 测试向 TilingContextPara 传入 nullptr compileInfo; - gert::OpTilingContextBuilder::Build()(libmetadef,op_tiling_context_builder.cc)拒绝空 compileInfo,返回空 holder,GetContext() 为 nullptr; - UT 框架 DO_TILING 宏(tiling_case_executor.cpp:174)对 context 未判空直接调用 GetPlatformInfo(),空指针解引用(fault_addr=0x10)。 修复:传入非空占位结构 BlockAttnResUpdateCompileInfo。本算子 tiling 走 TilingParsePlaceholder、仅从 TilingContext::GetPlatformInfo() 读取平台数据,不读 compileInfo,空占位语义准确,与 stem_oam_prep_paged_kv 的既有做法同构。 **问题 2:核数配置错误导致 4 个 CSV 用例失败** 段错误修复后暴露 4 个用例(explicit_eps_uneven_cores、two_buffer_typical、ub_limited_rebalanced_tile、used_core_count_exceeds_uint16)blockDim 与期望不符。根因:Run() 中 aicNum = aivNum / 2U 将 CSV aivNum 列减半后作为 faker 平台核数,而 tiling 通过 platform.GetCoreNumAiv() 读到的是减半后的值;CSV 期望值均按 aivNum 原值计算(tPerCore = ceil(T/aivNum))。修复:aivNum 直传。 **问题 3:UT 从未被 CI 执行(问题未在上库时暴露的根因)** 两算子均未在 tests/test_config.yaml 注册,PR 变更文件匹配不到任何 UT 节点时 build.sh 输出 "This PR didn't trigger any UTest" 后 exit 0,门禁静默放行(MR !9889 即如此合入);批量回归 ut_make.sh 同样按该 yaml 取 option,未注册算子标记 NA 跳过。本 PR 补注册两个节点,字段对齐 kda_input_proj 模板(ut: True 开启门禁;examples: False,example 仅 arch35 且需真机,与 block_sparse_attention 等 arch35 算子惯例一致)。 ## 关联的Issue 关联Issue [#6193](https://gitcode.com/cann/ops-transformer/issues/6193) ## 测试 - bash build.sh -u --ophost --ops=block_attn_res_update:49/49 通过(修复前段错误,修复中曾暴露 4 例核数失败,最终全过) - bash build.sh -u --opapi --ops=block_attn_res_update:60/60 通过(MR 门禁同时执行 op_host 与 op_api UT,需一并确认) - bash build.sh -u --PR_UT 全链路仿真(CI 真实入口):改算子文件触发 "Operators that need to run UT: block_attn_res_update",op_host 49 + op_api 60 全过,exit 0 - block_attn_res_prepare 注册前置确认:ophost 22/22、opapi 10/10 通过 - UT 实现与仓内惯例一致性核对:compileInfo 非空传递、空占位结构(stem 同构先例)、核数配置位置与 tiling 读取位置匹配(对照 kda/swin/gmm/block_attn_res_prepare) ## 文档更新 无。 ## 类型标签 - [x] 🐛 Bug修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [x] 🧪 测试 - [x] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!13890 | 1 天前 | |
AF分离算子性能优化(batch接口多channel) Co-authored-by: jiangxiuhan1<jiangxiuhan@huawei.com> # message auto-generated for no-merge-commit merge: !12452 merge channel_ffn into master AF分离算子性能优化(batch接口多channel) Created-by: jiangxiuhan1 Commit-by: jiangxiuhan1 Merged-by: cann-robot Description: ## 描述 <!--在这里详细描述你的改动,包括改动的原因和所采取的方法。--> ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: # PR #12452 代码检视报告 ## 检视概览 - **PR**:https://gitcode.com/cann/ops-transformer/pull/12452(AF 分离算子性能优化——URMA staging 区、多 channel、多层 Layer 支持、batch 接口) - **仓库**:ops-transformer(PR head: 950b5390e) - **变更规模**:27 个文件(26 修改 + 1 删除),diff 3680 行 - **检视范围**:mc2/attention_to_ffn(_v2)、mc2/ffn_to_attention(_v2)、mc2/common、tests/(Kernel + Tiling + op_api + torch_extension + UT + 文档 + 配置,全侧别) - **检视方法**:假设检验驱动(H0/H1、证据收集、自信值 ≥70% 判违规);规则库 cpp-secure / ascendc-topk / ascendc-api / ascendc-perf / mc2-specific / cpp-general / cpp-style / python-secure / regbase-review-checks - **检视流程**:文件分组(5 组)→ 全局预扫描(条例级匹配)→ 负载感知波次逐条检视(6 波 × 51 组,约 161 条规则实例)→ 综合研判(跨组模式识别 / 冲突解决 / 置信度过滤)→ 行号校验(红线 diff 范围校验 22/22 通过) - **检视时间**:2026-09-23 ## 检视统计 | 状态 | 条例数 | 占比 | |------|------|------| | PASS | 112 | 69.6% | | FAIL(发现问题) | 23(去重后 17 个独立问题) | 14.3% | | SUSPICIOUS(待确认附录) | 3 | 1.9% | | N/A(侧别/模式不匹配) | 22 | 13.7% | **综合研判**:系统性风险 2 项;冲突解决 2 项(MC2-04 vs MC2-18 范围互补、SEC-5.1 维持 PASS);去重 4 类根因(F2A 校验删除 7 条例、layerId 2 处、TIL-2 跨组 2 处、microBatchNum 2 条例)。 ### 全局摘要与系统性风险 本 PR 将两个 URMA 通信算子从"逐轮 SyncAll + core0 集中 WriteNbi"重构为"staging → counting-sort 建表 → 多 channel 并行 Batch WQE relay"三阶段,并引入多层 Layer(L≥1)与用户自管通信窗口。重构整体方向合理(同步完备性、DataCopy 对齐、批量搬运、资源生命周期等大量条例 PASS),但存在两类系统性回归: - **系统性风险 1(校验删除回归)**:kernel 侧与 host 侧共 4 处"删除既有防御且无替代"——F2A kernel 全部运行时元数据/窗口边界断言(7 条例独立确认)、ffn_to_attention 的 microBatchNum==1 校验、A2F 的 aivNum==0 校验、A2F 的 UB 容量校验缺失。**建议对本 PR 全部"删除 ascendc_assert / OP_TILING_CHECK"的 diff 段做一次专项全局排查**。 - **系统性风险 2(多层支持遗漏)**:allowMultiLayer 启用后,layerId 运行时校验、scales 层偏移、expertRankTable 层偏移三处仅 1 处(expertRankTable)正确实现,另 2 处遗漏。 --- ## 发现问题(HIGH 置信度) ### H1.【系统性·安全】F2A kernel 重构删除全部运行时元数据与窗口边界校验,负值/越界输入可致 GM 越界读 + 本地/远端窗口越界写 **确认条例**:SEC-2.2(105%)、SEC-1.1(120%)、SEC-1.3(95%)、SEC-3.3(85%)、SEC-3.5(105%)、MC2-05(100%)、GEN-1.1(90%)——7 个条例组独立确认同一根因 **问题描述**:本 PR 将 ReadTokenMetaData 重构为 PrefetchTokenMetaData + ReadTokenMetaDataFromLocal 时,删除了旧代码全部值域/边界断言且无任何替代: 1. actualTokenNum(int64 设备张量值)非负与 ≤maxTokenNum 两条断言被删——负值经 static_cast<uint64_t> 回绕为 ~1.8e19,scanStart/scanEnd 巨大 → PrefetchTokenMetaData 对 sessionIds/microBatchIds/tokenIds/expertOffsets 四个 GM 张量越界读;per-rank 计数越过按 maxTokenNum 分配的地址表容量。 2. curAttenWorkIds / curMicroBatchIds / curTokenBatchOffset / curTokenTopkOffset 四字段范围断言(<axisA_ / <microBatchNum_ / <axisBS_ / <expertNumPerToken_)全部被删——任一负值 int32→uint32 回绕 ~4.29e9,tokenSlot 经乘法放大为天量偏移。 3. 窗口写前断言 remoteDataOffset ≤ requiredWindowSize_、remoteFlagOffset ≤ winTokenInfoTableSize_ 与 curRankWinAddr != nullptr 判空被删——SendToLocal(本地 DataCopyPad)与 AppendRemoteDataWrite/AppendRemoteFlagWrite(URMA WriteNbi 远端 DMA 写)目标地址无界,**构成跨卡远端内存踩踏**。 4. axisH_ ≤ axisHS_ 断言被删且 FT2A tiling 无等价关系校验(对照:AT2FFN 侧本 PR 新增了 CheckUrmaWinSlotCapacity)——H>HS 时每 token 写入溢出 HS 槽位。 5. 上游无补偿:aclnn 层仅判空指针,torch 层仅校验 dim/dtype,tiling 只能校验 shape(无法校验设备张量**值**)。 **代码片段**(mc2/ffn_to_attention_v2/op_kernel/ffn_to_attention_urma.h 行 202-237): cpp inputDataAddr_ = x; xGMTensor_.SetGlobalBuffer(reinterpret_cast<__gm__ xType *>(x)); sessionIdsGMTensor_.SetGlobalBuffer(reinterpret_cast<__gm__ int32_t *>(sessionIds)); microBatchIdsGMTensor_.SetGlobalBuffer(reinterpret_cast<__gm__ int32_t *>(microBatchIds)); tokenIdsGMTensor_.SetGlobalBuffer(reinterpret_cast<__gm__ int32_t *>(tokenIds)); expertOffsetsGMTensor_.SetGlobalBuffer(reinterpret_cast<__gm__ int32_t *>(expertOffsets)); actualTokenNumGMTensor_.SetGlobalBuffer(reinterpret_cast<__gm__ int64_t *>(actualTokenNum)); if constexpr (isInputRankTable) { attnRankTableGMTensor_.SetGlobalBuffer(reinterpret_cast<__gm__ int32_t *>(attnRankTable)); } actualTokenNum_ = static_cast<uint64_t>(actualTokenNumGMTensor_.GetValue(0UL)); // 旧: >=0 与 <=maxTokenNum_ 断言已删 hSize_ = static_cast<uint64_t>(axisH_) * sizeof(xType); // 旧: axisH_<=axisHS_ 断言已删 batchSizeSendCnt_ = static_cast<uint64_t>(axisBS_) * expertNumPerToken_; const uint64_t tokenSlotNum = static_cast<uint64_t>(microBatchNum_) * batchSizeSendCnt_; winTokenInfoTableSize_ = Ceil(tokenSlotNum * sizeof(int32_t), URMA_WIN_ADDR_ALIGN) * URMA_WIN_ADDR_ALIGN; const uint64_t tokenWindowEnd = winTokenInfoTableSize_ + tokenSlotNum * axisHS_ * sizeof(xType); const uint64_t flagWindowOffset = Ceil(tokenWindowEnd, static_cast<uint64_t>(URMA_FLAG_SLOT_SIZE)) * URMA_FLAG_SLOT_SIZE; GM_ADDR localScratchAddr = GetWindowAddr(rankId_) + flagWindowOffset; localFlagAddr_ = localScratchAddr + static_cast<uint64_t>(aivId_) * URMA_FLAG_SLOT_SIZE; **代码片段**(同文件 行 314-337,六处断言全部删除): cpp __aicore__ inline void FFNToAttentionUrma<TemplateFFNToAttentionUrmaTypeFunc>::ReadTokenMetaDataFromLocal( ReadTokenMetaDataStruct &metaDataStruct, uint32_t localOffset) { int32_t curAttenWorkId = metadataTensor_.GetValue(localOffset); // 旧: assert(>=0) 已删 metaDataStruct.curAttenWorkIds = static_cast<uint32_t>(curAttenWorkId); metaDataStruct.curAttenWorkRank = metaDataStruct.curAttenWorkIds; if constexpr (isInputRankTable) { int32_t curAttenWorkRank = attnRankTableGMTensor_.GetValue(metaDataStruct.curAttenWorkIds); // OOB 读 metaDataStruct.curAttenWorkRank = static_cast<uint32_t>(curAttenWorkRank); } int32_t curMicroBatchId = metadataTensor_.GetValue(METADATA_CHUNK_TOKEN_NUM + localOffset); metaDataStruct.curMicroBatchIds = static_cast<uint32_t>(curMicroBatchId); // 旧: assert(<microBatchNum_) 已删 int32_t curTokenBatchOffset = metadataTensor_.GetValue(METADATA_TOKEN_BATCH_OFFSET_FIELD_INDEX * METADATA_CHUNK_TOKEN_NUM + localOffset); metaDataStruct.curTokenBatchOffset = static_cast<uint32_t>(curTokenBatchOffset); // 旧: assert(<axisBS_) 已删 int32_t curTokenTopkOffset = metadataTensor_.GetValue(METADATA_TOKEN_TOPK_OFFSET_FIELD_INDEX * METADATA_CHUNK_TOKEN_NUM + localOffset); metaDataStruct.curTokenTopkOffset = static_cast<uint32_t>(curTokenTopkOffset); // 旧: assert(<expertNumPerToken_) 已删 } **代码片段**(同文件 行 499-516 + 364-377,未校验值直接推导远端写地址): cpp for (uint32_t i = 0U; i < groupTokens; ++i) { uint64_t sourceTokenIndex = groupStart + i; ReadTokenMetaDataStruct metaDataStruct; ReadTokenMetaDataFromLocal(metaDataStruct, i); // Rank range was already validated in Pass 1 over the same [scanStart, scanEnd) window. uint64_t tokenSlot = (static_cast<uint64_t>(metaDataStruct.curMicroBatchIds) * axisBS_ + metaDataStruct.curTokenBatchOffset) * expertNumPerToken_ + metaDataStruct.curTokenTopkOffset; // 三分量均未校验 uint64_t remoteDataOffset = winTokenInfoTableSize_ + tokenSlot * static_cast<uint64_t>(axisHS_) * sizeof(xType); uint64_t remoteFlagOffset = tokenSlot * sizeof(int32_t); uint32_t dstRank = metaDataStruct.curAttenWorkRank; if (dstRank == rankId_) { SendToLocal(localWindowAddr + remoteDataOffset, localWindowAddr + remoteFlagOffset, sourceTokenIndex, xCopyParams); // 本地窗口越界写 continue; } ... // AppendRemoteDataWrite(行 364-377): uint64_t remoteDataOffset = winTokenInfoTableSize_ + addressEntry.tokenSlot * static_cast<uint64_t>(axisHS_) * sizeof(xType); GM_ADDR sourceDataAddr = inputDataAddr_ + addressEntry.sourceTokenIndex * hSize_; (void)hcomm_.WriteNbi<REMOTE_WQE_CONFIG>(batchHandle, remoteWindowAddr + remoteDataOffset, sourceDataAddr, static_cast<uint32_t>(hSize_)); // URMA 远端 DMA 写,目标无界 **假设检验证据**:正向——规范违反 +40%(外部数据作索引/偏移未校验、有符号→无符号裸转换、窗口写入无边界);上下文防御缺失 +30%(唯一剩余断言 curAttenWorkRank < worldSize_(:429)只覆盖 rank 字段,注释自证仅校验 rank);PR 归属 +20%(断言删除全部在 diff 删除行内);数据流/调用链风险 +15%~+15%(输入为设备张量运行时值,偏移直接进入 WriteNbi/DataCopyPad)。负向——上游校验均经验证不覆盖张量**值**(0 分)。自信值 85%~120%(各条例)≥ 70% → 判定违规。 **修复建议**: 1. Init 恢复:int64_t v = actualTokenNumGMTensor_.GetValue(0UL); ascendc_assert(v >= 0 && (uint64_t)v <= maxTokenNum_, ...);恢复 axisH_ <= axisHS_ 断言。 2. ReadTokenMetaDataFromLocal(或 Pass 1 消费点)恢复四字段范围校验;对直接决定写地址的 tokenSlot 增加硬校验 ascendc_assert(tokenSlot < tokenSlotNum)(ascendc_assert 可能被编译掉,建议至少此项使用不可编译剔除的检查)。 3. SendToLocal/AppendRemoteDataWrite/AppendRemoteFlagWrite 写前恢复以 cclBufferSize/winTokenInfoTableSize_ 为界的偏移断言。 4. FT2A tiling 增加 Host 侧 H > HS 拒绝(对齐 AT2FFN 的 CheckUrmaWinSlotCapacity)。 --- ### H2.【安全】A2F 多层支持:运行时 layerId 无 < L 校验 + layerId_ * expertRankTableCnt uint32 乘法回绕 **确认条例**:SEC-1.1(105%)、SEC-2.2 违规点3(90%) **问题描述**:本 PR 将 expert_rank_table Dim0 校验由 ==1 放宽为 ≥1 并启用 allowMultiLayer=true,文档声明"运行时 LayerId 取值需小于 L",但**该约束无任何代码 enforcement**:kernel 侧 layerId_ 取自 GM 张量后未与 axisL_(tilingData 已下发、Init 行 287 已加载但从未用于校验)比较;且 layIdsExpRankTableOffset_ = layerId_ * expertRankTableCnt 为 uint32×uint32 在 32 位空间回绕后才赋给 uint64。layerId_ ≥ L 或负值时:越界读 expertRankTable → 垃圾 rankCnt/toRankId → GetWindowAddr(toRankId_) → epHcclBuffer_[toRankId] 二次越界(该读发生在 Process 行 1131 的 toRankId 断言**之前**)。此前 L 恒为 1(layerId_ 恒 0)使该风险不可达,本 PR 首次激活。 **代码片段**(mc2/attention_to_ffn_v2/op_kernel/attention_to_ffn_urma.h 行 318-327、607-618): ```cpp DataCacheCleanAndInvalid<int32_t, CacheLine::SINGLE_CACHE_LINE, DcciDst::CACHELINE_OUT>(sessionIdGMTensor_); sessionId_ = sessionIdGMTensor_.GetValue(0); DataCacheCleanAndInvalid See merge request: cann/ops-transformer!12452 | 17 天前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 6 天前 | ||
| 2 天前 | ||
| 1 天前 | ||
| 2 个月前 | ||
| 1 天前 | ||
| 17 天前 |