| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
feat: engram 量化表SF入参从attr改为input tensor Co-authored-by: wuchenhao<wuchenhao6@huawei.com> # message auto-generated for no-merge-commit merge: !11683 merge engram-fp8-sf-v3 into master feat: engram 量化表SF入参从attr改为input tensor Created-by: wuchenhao123 Commit-by: wuchenhao Merged-by: cann-robot Description: ## 描述 量化表SF入参从attr改为input tensor ## 关联的Issue https://gitcode.com/cann/ops-transformer/issues/5196 ## 测试 本地测试 ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [X] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: - [ ] # 代码检视报告 **项目名称**:ops-transformer PR #11683 (engram-fp8-sf-v3) **检视模块**:engram_fetch SF表从attr改为input tensor, 支持FP8和SF gather **检视人**:Turing Team **检视日期**:2026-09-10 ## 检视范围 | 文件 | 侧 | 变更类型 | | ---- | ---- | ---- | | mc2/engram_fetch/op_host/engram_fetch_def.cpp | Host (op_def) | sf_table从attr改为input tensor, fetched支持FP8 dtype | | mc2/engram_fetch/op_host/op_tiling/arch35/engram_fetch_tiling.cpp | Host (Tiling) | 新增SF_TABLE_INDEX, 从fetched_sf output读取numSfPacks/sfElemSize | | mc2/engram_fetch/op_kernel/engram_fetch_tiling_data.h | Kernel (TilingData) | 移除sfTableAddr字段 | | mc2/engram_fetch/op_kernel/arch35/engram_fetch_arch35.h | Kernel | Init新增sfTable参数, GatherSf使用relayQue_ | | mc2/engram_fetch/op_kernel/arch35/engram_fetch.cpp | Kernel (Entry) | kernel入口新增sfTable参数 | | mc2/engram_fetch/op_api/aclnn_engram_fetch.cpp | Host (API) | aclnn接口新增sfTable参数 | | mc2/common/torch_extension/csrc/elastic_buffer.cpp | Host (C++ Extension) | EngramFetch签名变更 | | mc2/common/torch_extension/elastic_buffer.py | Host (Python) | schema/meta/impl参数变更 | **适用规范文件**: - references/cpp-secure.md (C++安全编码规范, 47条) - references/ascendc-api.md (Ascend C API最佳实践, 9条) - references/ascendc-topk.md (TOPK问题清单, 13条) ## 检视概览 | 统计项 | 数值 | | ---- | ---- | | 发现问题总数 | 2 个 | | 严重级(CRITICAL)问题 | 1 个 | | 中等级(MEDIUM)问题 | 0 个 | | 轻微级(LOW)问题 | 1 个 | | 误报数量 | 0 个 | **核心结论**:本次PR将SF表从attr(int64地址)改为input tensor,整体设计合理。发现1处Critical级指针未判空问题(Tiling侧hiddenSizePtr/numEntriesPerRankPtr解引用前未判空,为PR前已存在问题),1处Low级TilingData结构体字段删除的ABI兼容性存疑。 --- ## 问题详情及修改建议 ### 问题ID:ISSUE-001 | 严重级别:CRITICAL(严重) #### 假设检验过程 **代码段**:engram_fetch_tiling.cpp SetTilingData() 函数中 hiddenSizePtr / numEntriesPerRankPtr 解引用 **假设**:H0: 该代码段是安全的 | 证据序号 | 证据类型 | 规范ID | 证据描述 | 分值增量 | 累计自信值 | |---------|---------|--------|---------|---------|-----------| | 1 | 红线规范违反 | TOPK-1 / 3.5 | hiddenSizePtr 通过 attrs->GetAttrPointer<int64_t>() 获取后,直接 *hiddenSizePtr 解引用,未检查指针是否为nullptr | +40% | 40% | | 2 | 上下文防御缺失 | TOPK-1 | 作用域内无对该指针的判空防御代码 | +30% | 70% | | 3 | 同类问题 | TOPK-1 / 3.5 | numEntriesPerRankPtr 同样未判空直接解引用 *numEntriesPerRankPtr | +25% | 95% | **结论**:自信值 **95%** > 60%,**推翻原假设H0**,该代码段存在风险。 --- **关联红线条款**:TOPK-1(必须校验函数返回值)、cpp-secure 3.5(指针使用前判空) **代码路径**:mc2/engram_fetch/op_host/op_tiling/arch35/engram_fetch_tiling.cpp:503-507 **问题类型**:指针未判空直接解引用 **问题描述**:GetAttrPointer<int64_t>() 返回的指针可能为nullptr(当attr缺失时),代码直接解引用 *hiddenSizePtr 和 *numEntriesPerRankPtr,未做指针保护。违反红线规范"指针操作,必须先赋值后访问,并进行指针保护"和TOPK-1"必须校验函数返回值"。 注:此问题为PR前已存在的代码,本次PR未修改这两行。但根据检视规范,仍需指出。 #### 修改建议 **修改前代码**: cpp auto hiddenSizePtr = attrs->GetAttrPointer<int64_t>(ATTR_HIDDEN_SIZE_INDEX); tilingData.hiddenDim = *hiddenSizePtr; auto numEntriesPerRankPtr = attrs->GetAttrPointer<int64_t>(ATTR_NUM_ENTRIES_PER_RANK_INDEX); tilingData.numEntriesPerRank = static_cast<int32_t>(*numEntriesPerRankPtr); **修改后代码**: cpp auto hiddenSizePtr = attrs->GetAttrPointer<int64_t>(ATTR_HIDDEN_SIZE_INDEX); OP_TILING_CHECK(hiddenSizePtr == nullptr, OP_LOGE(nodeName, "hidden_size attr is nullptr"), return ge::GRAPH_FAILED); tilingData.hiddenDim = *hiddenSizePtr; auto numEntriesPerRankPtr = attrs->GetAttrPointer<int64_t>(ATTR_NUM_ENTRIES_PER_RANK_INDEX); OP_TILING_CHECK(numEntriesPerRankPtr == nullptr, OP_LOGE(nodeName, "num_entries_per_rank attr is nullptr"), return ge::GRAPH_FAILED); tilingData.numEntriesPerRank = static_cast<int32_t>(*numEntriesPerRankPtr); **修改说明**:在解引用前添加nullptr校验,返回GRAPH_FAILED,符合红线规范第4条和TOPK-1要求。 --- ### 问题ID:ISSUE-002 | 严重级别:LOW(轻微) #### 假设检验过程 **代码段**:engram_fetch_tiling_data.h TilingData结构体字段删除 **假设**:H0: 该结构体变更不影响兼容性 | 证据序号 | 证据类型 | 规范ID | 证据描述 | 分值增量 | 累计自信值 | |---------|---------|--------|---------|---------|-----------| | 1 | 规范违反 | cpp-secure 10.4 | 从TilingData结构体中删除了 sfTableAddr 字段(原末尾字段),结构体布局缩小。若存在新旧版本混用场景,可能导致TilingData反序列化错位 | +40% | 40% | | 2 | 上下文防御缺失 | cpp-secure 10.5 | 无版本号或兼容性标记机制 | +20% | 60% | **结论**:自信值 **60%** = 60%,**推翻原假设H0**,该代码段存在风险(边界判定)。 --- **关联条款**:cpp-secure 10.4(结构体字段末尾添加)、cpp-secure 10.5(接口变更考虑兼容性) **代码路径**:mc2/engram_fetch/op_kernel/engram_fetch_tiling_data.h:31-34 **问题类型**:结构体字段删除的ABI兼容性 **问题描述**:本次PR从 EngramFetchTilingData 结构体末尾删除了 uint64_t sfTableAddr 字段。规范10.4要求"对外结构体接口新增字段时必须在结构体最后添加",而删除末尾字段虽然不会影响前面字段的偏移,但会导致结构体大小变化。如果存在编译期和运行期版本不一致的场景(如op_host用新版本编译,op_kernel用旧版本运行),可能导致TilingData解析错位。 注:由于sfTableAddr原来就在结构体最末尾,删除它不会影响其他字段的偏移。且CANN的TilingData序列化机制通常保证host/kernel版本一致,因此风险较低。但根据规范仍需标注为存疑。 #### 修改建议 **修改说明**:确认CANN的TilingData序列化机制是否保证host/kernel版本严格一致。如果是,则此问题可忽略。如果存在版本混用可能,建议保留该字段(设为0不使用),而不是删除。或者确认该PR作为一个整体发布,不存在部分更新的场景。 --- ## 存疑问题(供自主判断) ### 存疑-1:GatherSf中relayQue_复用可能的数据竞争 **代码路径**:mc2/engram_fetch/op_kernel/arch35/engram_fetch_arch35.h:468-476 **问题描述**:GatherSf函数复用 relayQue_(TQueBind<VECIN, VECOUT>)进行SF数据的GM→UB→GM搬运。在 LocalFetchTokens 中,GatherSf在 LocalCopySlice 循环之后调用(line 348),此时relayQue_的AllocTensor/FreeTensor已由LocalCopySlice完成。在 RemoteFetchRank 中,GatherSf在 PrepareRead 之后调用(line 427),PrepareRead不使用relayQue_。因此 relayQue_ 的复用在当前调用顺序下不会产生AllocTensor/FreeTensor配对冲突。但如果未来调用顺序变更(如GatherSf在LocalCopySlice循环内部调用),可能导致relayQue_的AllocTensor在未FreeTensor时再次AllocTensor。建议在注释中说明relayQue_复用约束。 ### 存疑-2:sfBytes为0时DataCopyPad行为 **代码路径**:mc2/engram_fetch/op_kernel/arch35/engram_fetch_arch35.h:461 **问题描述**:当 numSfPacks_ 或 sfElemSize_ 为0时,sfBytes 为0。此时 DataCopyPad 的 blockLen=0 行为未定义。虽然调用前有 hasSf 检查(numSfPacks_ > 0),但如果 sfElemSize_ 为0而 numSfPacks_ > 0,hasSf 仍为true但 sfBytes 为0。建议在hasSf检查中增加 sfElemSize_ > 0 条件。 --- ## 检视检查清单 ### C++安全编码规范 (cpp-secure.md) - [x] 1.1 静态类型安全 - 无联合体/void*滥用 - [x] 1.2 内存安全 - 无越界/野指针/未初始化 - [x] 1.3 禁止未定义行为 - 无UB - [x] 2.1 有符号整数运算不溢出 - hiddenDim*bytesPerElem有溢出保护(line 513) - [x] 2.2 无符号整数运算不回绕 - sfBytes计算为uint32_t乘法,范围可控 - [x] 2.3 除法/余数除零保护 - CeilDiv有y参数,调用方保证非零 - [x] 3.1 禁止未初始化变量 - 成员变量sfTableGM_{nullptr}、fetchedSfGM_{nullptr}、numSfPacks_{0}、sfElemSize_{0}均有默认初始化(engram_fetch_arch35.h:131-134);tilingData中numSfPacks/sfElemSize在SetTilingData中初始化为0(line 500-501) - [x] 3.2 资源释放后指针置新值 - Kernel侧不适用(TQueBind管理生命周期,AllocTensor/FreeTensor配对使用) - [x] 3.3 数组索引校验 - GatherSf中globalIdx来自indicesLocal(i),indices语义为entry索引,外部保证非负;globalTokenIdx由indicesBatchStart+i计算,均为uint32_t无负值风险 - [x] 3.4 禁止sizeof指针 - 无sizeof指针操作 - [x] 3.5 指针使用前判空 - 见ISSUE-001 (hiddenSizePtr/numEntriesPerRankPtr未判空);sfTableGM_在GatherSf调用前有hasSf检查(line 338/404) - [x] 3.6 字符串存储空间 - Kernel侧不适用 - [x] 4.1 外部输入合法性校验 - tiling中有dtype/shape校验 - [x] 4.2 内存操作长度校验 - DataCopyPad使用sfBytes - [x] 10.4 结构体字段末尾添加 - 见ISSUE-002 - [x] 10.5 接口变更兼容性 - 见ISSUE-002 ### Ascend C API最佳实践 (ascendc-api.md) - [x] API-1 禁止SetValue/GetValue - 无使用 - [x] API-2 禁止std::计算函数 - 无使用 - [x] API-3 DataCopy/DataCopyPad对齐 - GatherSf使用DataCopyPad,sfBytes可能非32B对齐,但DataCopyPad支持非对齐 - [x] API-6 AllocTensor/FreeTensor配对 - GatherSf中AllocTensor→EnQue→DeQue→FreeTensor配对完整 - [x] API-7 禁止动态内存分配 - 无new/malloc - [x] API-8 repeatTimes≤255 - 无循环类API使用 - [x] API-10 DataCopyParams vs DataCopyExtParams单位 - LocalCopySlice中DataCopyPad使用DataCopyExtParams(blockLen=字节)正确,DataCopyParams(mte3Params)用于DataCopyPad时blockLen=字节正确 ### TOPK问题清单 (ascendc-topk.md) - [x] TOPK-1 必须校验函数返回值 - 见ISSUE-001 - [x] TOPK-8 gm偏移用int64 - 外部保证indices非负,int32_t→uint64_t转换安全 --- ## 综合结论 ### 总体评价 本次PR将engram_fetch算子的SF表从attr方式(int64地址)改为input tensor方式,整体架构改进合理:避免了aclgraph模式下DataPtrVariable不支持的问题,tensor生命周期由框架管理,tiling侧可从output shape/dtype获取SF参数进行校验。参数链路(op_def → tiling → kernel entry → arch35 Init → GatherSf)一致性良好,各层参数顺序对齐正确。Kernel侧GatherSf使用标准TQueBind流水线(AllocTensor→DataCopyPad→EnQue→DeQue→DataCopyPad→FreeTensor),API使用规范。 ### 问题汇总 | 问题ID | 级别 | 是否PR新增 | 是否阻塞合入 | 修复建议 | |--------|------|-----------|-------------|---------| | ISSUE-001 | CRITICAL | 否(PR前已存在) | 否(非本次引入,建议后续修复) | hiddenSizePtr/numEntriesPerRankPtr解引用前添加nullptr校验 | | ISSUE-002 | LOW | 是(删除sfTableAddr字段) | 否(字段在末尾,不影响其他字段偏移) | 确认CANN TilingData序列化保证host/kernel版本一致即可 | | 存疑-1 | - | 是 | 否 | relayQue_复用约束建议添加注释说明 | | 存疑-2 | - | 是 | 否 | hasSf检查增加sfElemSize_>0条件 | ### 合入建议 **建议直接合入**。ISSUE-001为PR前已存在问题,非本次引入,不阻塞合入但建议后续修复。ISSUE-002和存疑项为低风险,可后续评估。 ### 合规性声明 - C++安全编码规范(47条):ISSUE-001违反3.5(指针判空)和TOPK-1,ISSUE-002涉及10.4/10.5(兼容性),其余条款合规 - Ascend C API最佳实践(9条):全部合规,DataCopyPad/AllocTensor/FreeTensor使用正确 - TOPK问题清单(13条):ISSUE-001违反TOPK-1,其余合规 --- ## 报告生成时间 2026-09-10 18:00:00 ## 报告状态 已完成检视,待修复验证 See merge request: cann/ops-transformer!11683 | 4 天前 | |
feat: engram 量化表SF入参从attr改为input tensor Co-authored-by: wuchenhao<wuchenhao6@huawei.com> # message auto-generated for no-merge-commit merge: !11683 merge engram-fp8-sf-v3 into master feat: engram 量化表SF入参从attr改为input tensor Created-by: wuchenhao123 Commit-by: wuchenhao Merged-by: cann-robot Description: ## 描述 量化表SF入参从attr改为input tensor ## 关联的Issue https://gitcode.com/cann/ops-transformer/issues/5196 ## 测试 本地测试 ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [X] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: - [ ] # 代码检视报告 **项目名称**:ops-transformer PR #11683 (engram-fp8-sf-v3) **检视模块**:engram_fetch SF表从attr改为input tensor, 支持FP8和SF gather **检视人**:Turing Team **检视日期**:2026-09-10 ## 检视范围 | 文件 | 侧 | 变更类型 | | ---- | ---- | ---- | | mc2/engram_fetch/op_host/engram_fetch_def.cpp | Host (op_def) | sf_table从attr改为input tensor, fetched支持FP8 dtype | | mc2/engram_fetch/op_host/op_tiling/arch35/engram_fetch_tiling.cpp | Host (Tiling) | 新增SF_TABLE_INDEX, 从fetched_sf output读取numSfPacks/sfElemSize | | mc2/engram_fetch/op_kernel/engram_fetch_tiling_data.h | Kernel (TilingData) | 移除sfTableAddr字段 | | mc2/engram_fetch/op_kernel/arch35/engram_fetch_arch35.h | Kernel | Init新增sfTable参数, GatherSf使用relayQue_ | | mc2/engram_fetch/op_kernel/arch35/engram_fetch.cpp | Kernel (Entry) | kernel入口新增sfTable参数 | | mc2/engram_fetch/op_api/aclnn_engram_fetch.cpp | Host (API) | aclnn接口新增sfTable参数 | | mc2/common/torch_extension/csrc/elastic_buffer.cpp | Host (C++ Extension) | EngramFetch签名变更 | | mc2/common/torch_extension/elastic_buffer.py | Host (Python) | schema/meta/impl参数变更 | **适用规范文件**: - references/cpp-secure.md (C++安全编码规范, 47条) - references/ascendc-api.md (Ascend C API最佳实践, 9条) - references/ascendc-topk.md (TOPK问题清单, 13条) ## 检视概览 | 统计项 | 数值 | | ---- | ---- | | 发现问题总数 | 2 个 | | 严重级(CRITICAL)问题 | 1 个 | | 中等级(MEDIUM)问题 | 0 个 | | 轻微级(LOW)问题 | 1 个 | | 误报数量 | 0 个 | **核心结论**:本次PR将SF表从attr(int64地址)改为input tensor,整体设计合理。发现1处Critical级指针未判空问题(Tiling侧hiddenSizePtr/numEntriesPerRankPtr解引用前未判空,为PR前已存在问题),1处Low级TilingData结构体字段删除的ABI兼容性存疑。 --- ## 问题详情及修改建议 ### 问题ID:ISSUE-001 | 严重级别:CRITICAL(严重) #### 假设检验过程 **代码段**:engram_fetch_tiling.cpp SetTilingData() 函数中 hiddenSizePtr / numEntriesPerRankPtr 解引用 **假设**:H0: 该代码段是安全的 | 证据序号 | 证据类型 | 规范ID | 证据描述 | 分值增量 | 累计自信值 | |---------|---------|--------|---------|---------|-----------| | 1 | 红线规范违反 | TOPK-1 / 3.5 | hiddenSizePtr 通过 attrs->GetAttrPointer<int64_t>() 获取后,直接 *hiddenSizePtr 解引用,未检查指针是否为nullptr | +40% | 40% | | 2 | 上下文防御缺失 | TOPK-1 | 作用域内无对该指针的判空防御代码 | +30% | 70% | | 3 | 同类问题 | TOPK-1 / 3.5 | numEntriesPerRankPtr 同样未判空直接解引用 *numEntriesPerRankPtr | +25% | 95% | **结论**:自信值 **95%** > 60%,**推翻原假设H0**,该代码段存在风险。 --- **关联红线条款**:TOPK-1(必须校验函数返回值)、cpp-secure 3.5(指针使用前判空) **代码路径**:mc2/engram_fetch/op_host/op_tiling/arch35/engram_fetch_tiling.cpp:503-507 **问题类型**:指针未判空直接解引用 **问题描述**:GetAttrPointer<int64_t>() 返回的指针可能为nullptr(当attr缺失时),代码直接解引用 *hiddenSizePtr 和 *numEntriesPerRankPtr,未做指针保护。违反红线规范"指针操作,必须先赋值后访问,并进行指针保护"和TOPK-1"必须校验函数返回值"。 注:此问题为PR前已存在的代码,本次PR未修改这两行。但根据检视规范,仍需指出。 #### 修改建议 **修改前代码**: cpp auto hiddenSizePtr = attrs->GetAttrPointer<int64_t>(ATTR_HIDDEN_SIZE_INDEX); tilingData.hiddenDim = *hiddenSizePtr; auto numEntriesPerRankPtr = attrs->GetAttrPointer<int64_t>(ATTR_NUM_ENTRIES_PER_RANK_INDEX); tilingData.numEntriesPerRank = static_cast<int32_t>(*numEntriesPerRankPtr); **修改后代码**: cpp auto hiddenSizePtr = attrs->GetAttrPointer<int64_t>(ATTR_HIDDEN_SIZE_INDEX); OP_TILING_CHECK(hiddenSizePtr == nullptr, OP_LOGE(nodeName, "hidden_size attr is nullptr"), return ge::GRAPH_FAILED); tilingData.hiddenDim = *hiddenSizePtr; auto numEntriesPerRankPtr = attrs->GetAttrPointer<int64_t>(ATTR_NUM_ENTRIES_PER_RANK_INDEX); OP_TILING_CHECK(numEntriesPerRankPtr == nullptr, OP_LOGE(nodeName, "num_entries_per_rank attr is nullptr"), return ge::GRAPH_FAILED); tilingData.numEntriesPerRank = static_cast<int32_t>(*numEntriesPerRankPtr); **修改说明**:在解引用前添加nullptr校验,返回GRAPH_FAILED,符合红线规范第4条和TOPK-1要求。 --- ### 问题ID:ISSUE-002 | 严重级别:LOW(轻微) #### 假设检验过程 **代码段**:engram_fetch_tiling_data.h TilingData结构体字段删除 **假设**:H0: 该结构体变更不影响兼容性 | 证据序号 | 证据类型 | 规范ID | 证据描述 | 分值增量 | 累计自信值 | |---------|---------|--------|---------|---------|-----------| | 1 | 规范违反 | cpp-secure 10.4 | 从TilingData结构体中删除了 sfTableAddr 字段(原末尾字段),结构体布局缩小。若存在新旧版本混用场景,可能导致TilingData反序列化错位 | +40% | 40% | | 2 | 上下文防御缺失 | cpp-secure 10.5 | 无版本号或兼容性标记机制 | +20% | 60% | **结论**:自信值 **60%** = 60%,**推翻原假设H0**,该代码段存在风险(边界判定)。 --- **关联条款**:cpp-secure 10.4(结构体字段末尾添加)、cpp-secure 10.5(接口变更考虑兼容性) **代码路径**:mc2/engram_fetch/op_kernel/engram_fetch_tiling_data.h:31-34 **问题类型**:结构体字段删除的ABI兼容性 **问题描述**:本次PR从 EngramFetchTilingData 结构体末尾删除了 uint64_t sfTableAddr 字段。规范10.4要求"对外结构体接口新增字段时必须在结构体最后添加",而删除末尾字段虽然不会影响前面字段的偏移,但会导致结构体大小变化。如果存在编译期和运行期版本不一致的场景(如op_host用新版本编译,op_kernel用旧版本运行),可能导致TilingData解析错位。 注:由于sfTableAddr原来就在结构体最末尾,删除它不会影响其他字段的偏移。且CANN的TilingData序列化机制通常保证host/kernel版本一致,因此风险较低。但根据规范仍需标注为存疑。 #### 修改建议 **修改说明**:确认CANN的TilingData序列化机制是否保证host/kernel版本严格一致。如果是,则此问题可忽略。如果存在版本混用可能,建议保留该字段(设为0不使用),而不是删除。或者确认该PR作为一个整体发布,不存在部分更新的场景。 --- ## 存疑问题(供自主判断) ### 存疑-1:GatherSf中relayQue_复用可能的数据竞争 **代码路径**:mc2/engram_fetch/op_kernel/arch35/engram_fetch_arch35.h:468-476 **问题描述**:GatherSf函数复用 relayQue_(TQueBind<VECIN, VECOUT>)进行SF数据的GM→UB→GM搬运。在 LocalFetchTokens 中,GatherSf在 LocalCopySlice 循环之后调用(line 348),此时relayQue_的AllocTensor/FreeTensor已由LocalCopySlice完成。在 RemoteFetchRank 中,GatherSf在 PrepareRead 之后调用(line 427),PrepareRead不使用relayQue_。因此 relayQue_ 的复用在当前调用顺序下不会产生AllocTensor/FreeTensor配对冲突。但如果未来调用顺序变更(如GatherSf在LocalCopySlice循环内部调用),可能导致relayQue_的AllocTensor在未FreeTensor时再次AllocTensor。建议在注释中说明relayQue_复用约束。 ### 存疑-2:sfBytes为0时DataCopyPad行为 **代码路径**:mc2/engram_fetch/op_kernel/arch35/engram_fetch_arch35.h:461 **问题描述**:当 numSfPacks_ 或 sfElemSize_ 为0时,sfBytes 为0。此时 DataCopyPad 的 blockLen=0 行为未定义。虽然调用前有 hasSf 检查(numSfPacks_ > 0),但如果 sfElemSize_ 为0而 numSfPacks_ > 0,hasSf 仍为true但 sfBytes 为0。建议在hasSf检查中增加 sfElemSize_ > 0 条件。 --- ## 检视检查清单 ### C++安全编码规范 (cpp-secure.md) - [x] 1.1 静态类型安全 - 无联合体/void*滥用 - [x] 1.2 内存安全 - 无越界/野指针/未初始化 - [x] 1.3 禁止未定义行为 - 无UB - [x] 2.1 有符号整数运算不溢出 - hiddenDim*bytesPerElem有溢出保护(line 513) - [x] 2.2 无符号整数运算不回绕 - sfBytes计算为uint32_t乘法,范围可控 - [x] 2.3 除法/余数除零保护 - CeilDiv有y参数,调用方保证非零 - [x] 3.1 禁止未初始化变量 - 成员变量sfTableGM_{nullptr}、fetchedSfGM_{nullptr}、numSfPacks_{0}、sfElemSize_{0}均有默认初始化(engram_fetch_arch35.h:131-134);tilingData中numSfPacks/sfElemSize在SetTilingData中初始化为0(line 500-501) - [x] 3.2 资源释放后指针置新值 - Kernel侧不适用(TQueBind管理生命周期,AllocTensor/FreeTensor配对使用) - [x] 3.3 数组索引校验 - GatherSf中globalIdx来自indicesLocal(i),indices语义为entry索引,外部保证非负;globalTokenIdx由indicesBatchStart+i计算,均为uint32_t无负值风险 - [x] 3.4 禁止sizeof指针 - 无sizeof指针操作 - [x] 3.5 指针使用前判空 - 见ISSUE-001 (hiddenSizePtr/numEntriesPerRankPtr未判空);sfTableGM_在GatherSf调用前有hasSf检查(line 338/404) - [x] 3.6 字符串存储空间 - Kernel侧不适用 - [x] 4.1 外部输入合法性校验 - tiling中有dtype/shape校验 - [x] 4.2 内存操作长度校验 - DataCopyPad使用sfBytes - [x] 10.4 结构体字段末尾添加 - 见ISSUE-002 - [x] 10.5 接口变更兼容性 - 见ISSUE-002 ### Ascend C API最佳实践 (ascendc-api.md) - [x] API-1 禁止SetValue/GetValue - 无使用 - [x] API-2 禁止std::计算函数 - 无使用 - [x] API-3 DataCopy/DataCopyPad对齐 - GatherSf使用DataCopyPad,sfBytes可能非32B对齐,但DataCopyPad支持非对齐 - [x] API-6 AllocTensor/FreeTensor配对 - GatherSf中AllocTensor→EnQue→DeQue→FreeTensor配对完整 - [x] API-7 禁止动态内存分配 - 无new/malloc - [x] API-8 repeatTimes≤255 - 无循环类API使用 - [x] API-10 DataCopyParams vs DataCopyExtParams单位 - LocalCopySlice中DataCopyPad使用DataCopyExtParams(blockLen=字节)正确,DataCopyParams(mte3Params)用于DataCopyPad时blockLen=字节正确 ### TOPK问题清单 (ascendc-topk.md) - [x] TOPK-1 必须校验函数返回值 - 见ISSUE-001 - [x] TOPK-8 gm偏移用int64 - 外部保证indices非负,int32_t→uint64_t转换安全 --- ## 综合结论 ### 总体评价 本次PR将engram_fetch算子的SF表从attr方式(int64地址)改为input tensor方式,整体架构改进合理:避免了aclgraph模式下DataPtrVariable不支持的问题,tensor生命周期由框架管理,tiling侧可从output shape/dtype获取SF参数进行校验。参数链路(op_def → tiling → kernel entry → arch35 Init → GatherSf)一致性良好,各层参数顺序对齐正确。Kernel侧GatherSf使用标准TQueBind流水线(AllocTensor→DataCopyPad→EnQue→DeQue→DataCopyPad→FreeTensor),API使用规范。 ### 问题汇总 | 问题ID | 级别 | 是否PR新增 | 是否阻塞合入 | 修复建议 | |--------|------|-----------|-------------|---------| | ISSUE-001 | CRITICAL | 否(PR前已存在) | 否(非本次引入,建议后续修复) | hiddenSizePtr/numEntriesPerRankPtr解引用前添加nullptr校验 | | ISSUE-002 | LOW | 是(删除sfTableAddr字段) | 否(字段在末尾,不影响其他字段偏移) | 确认CANN TilingData序列化保证host/kernel版本一致即可 | | 存疑-1 | - | 是 | 否 | relayQue_复用约束建议添加注释说明 | | 存疑-2 | - | 是 | 否 | hasSf检查增加sfElemSize_>0条件 | ### 合入建议 **建议直接合入**。ISSUE-001为PR前已存在问题,非本次引入,不阻塞合入但建议后续修复。ISSUE-002和存疑项为低风险,可后续评估。 ### 合规性声明 - C++安全编码规范(47条):ISSUE-001违反3.5(指针判空)和TOPK-1,ISSUE-002涉及10.4/10.5(兼容性),其余条款合规 - Ascend C API最佳实践(9条):全部合规,DataCopyPad/AllocTensor/FreeTensor使用正确 - TOPK问题清单(13条):ISSUE-001违反TOPK-1,其余合规 --- ## 报告生成时间 2026-09-10 18:00:00 ## 报告状态 已完成检视,待修复验证 See merge request: cann/ops-transformer!11683 | 4 天前 | |
feat: engram 量化表SF入参从attr改为input tensor Co-authored-by: wuchenhao<wuchenhao6@huawei.com> # message auto-generated for no-merge-commit merge: !11683 merge engram-fp8-sf-v3 into master feat: engram 量化表SF入参从attr改为input tensor Created-by: wuchenhao123 Commit-by: wuchenhao Merged-by: cann-robot Description: ## 描述 量化表SF入参从attr改为input tensor ## 关联的Issue https://gitcode.com/cann/ops-transformer/issues/5196 ## 测试 本地测试 ## 文档更新 <!--如果这个PR包含文档的更新,请在这里指出。例如:更新了README.md文件。--> ## 类型标签 <!-- [x] 表示选中 --> - [ ] 🐛 Bug修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [X] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [ ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: - [ ] # 代码检视报告 **项目名称**:ops-transformer PR #11683 (engram-fp8-sf-v3) **检视模块**:engram_fetch SF表从attr改为input tensor, 支持FP8和SF gather **检视人**:Turing Team **检视日期**:2026-09-10 ## 检视范围 | 文件 | 侧 | 变更类型 | | ---- | ---- | ---- | | mc2/engram_fetch/op_host/engram_fetch_def.cpp | Host (op_def) | sf_table从attr改为input tensor, fetched支持FP8 dtype | | mc2/engram_fetch/op_host/op_tiling/arch35/engram_fetch_tiling.cpp | Host (Tiling) | 新增SF_TABLE_INDEX, 从fetched_sf output读取numSfPacks/sfElemSize | | mc2/engram_fetch/op_kernel/engram_fetch_tiling_data.h | Kernel (TilingData) | 移除sfTableAddr字段 | | mc2/engram_fetch/op_kernel/arch35/engram_fetch_arch35.h | Kernel | Init新增sfTable参数, GatherSf使用relayQue_ | | mc2/engram_fetch/op_kernel/arch35/engram_fetch.cpp | Kernel (Entry) | kernel入口新增sfTable参数 | | mc2/engram_fetch/op_api/aclnn_engram_fetch.cpp | Host (API) | aclnn接口新增sfTable参数 | | mc2/common/torch_extension/csrc/elastic_buffer.cpp | Host (C++ Extension) | EngramFetch签名变更 | | mc2/common/torch_extension/elastic_buffer.py | Host (Python) | schema/meta/impl参数变更 | **适用规范文件**: - references/cpp-secure.md (C++安全编码规范, 47条) - references/ascendc-api.md (Ascend C API最佳实践, 9条) - references/ascendc-topk.md (TOPK问题清单, 13条) ## 检视概览 | 统计项 | 数值 | | ---- | ---- | | 发现问题总数 | 2 个 | | 严重级(CRITICAL)问题 | 1 个 | | 中等级(MEDIUM)问题 | 0 个 | | 轻微级(LOW)问题 | 1 个 | | 误报数量 | 0 个 | **核心结论**:本次PR将SF表从attr(int64地址)改为input tensor,整体设计合理。发现1处Critical级指针未判空问题(Tiling侧hiddenSizePtr/numEntriesPerRankPtr解引用前未判空,为PR前已存在问题),1处Low级TilingData结构体字段删除的ABI兼容性存疑。 --- ## 问题详情及修改建议 ### 问题ID:ISSUE-001 | 严重级别:CRITICAL(严重) #### 假设检验过程 **代码段**:engram_fetch_tiling.cpp SetTilingData() 函数中 hiddenSizePtr / numEntriesPerRankPtr 解引用 **假设**:H0: 该代码段是安全的 | 证据序号 | 证据类型 | 规范ID | 证据描述 | 分值增量 | 累计自信值 | |---------|---------|--------|---------|---------|-----------| | 1 | 红线规范违反 | TOPK-1 / 3.5 | hiddenSizePtr 通过 attrs->GetAttrPointer<int64_t>() 获取后,直接 *hiddenSizePtr 解引用,未检查指针是否为nullptr | +40% | 40% | | 2 | 上下文防御缺失 | TOPK-1 | 作用域内无对该指针的判空防御代码 | +30% | 70% | | 3 | 同类问题 | TOPK-1 / 3.5 | numEntriesPerRankPtr 同样未判空直接解引用 *numEntriesPerRankPtr | +25% | 95% | **结论**:自信值 **95%** > 60%,**推翻原假设H0**,该代码段存在风险。 --- **关联红线条款**:TOPK-1(必须校验函数返回值)、cpp-secure 3.5(指针使用前判空) **代码路径**:mc2/engram_fetch/op_host/op_tiling/arch35/engram_fetch_tiling.cpp:503-507 **问题类型**:指针未判空直接解引用 **问题描述**:GetAttrPointer<int64_t>() 返回的指针可能为nullptr(当attr缺失时),代码直接解引用 *hiddenSizePtr 和 *numEntriesPerRankPtr,未做指针保护。违反红线规范"指针操作,必须先赋值后访问,并进行指针保护"和TOPK-1"必须校验函数返回值"。 注:此问题为PR前已存在的代码,本次PR未修改这两行。但根据检视规范,仍需指出。 #### 修改建议 **修改前代码**: cpp auto hiddenSizePtr = attrs->GetAttrPointer<int64_t>(ATTR_HIDDEN_SIZE_INDEX); tilingData.hiddenDim = *hiddenSizePtr; auto numEntriesPerRankPtr = attrs->GetAttrPointer<int64_t>(ATTR_NUM_ENTRIES_PER_RANK_INDEX); tilingData.numEntriesPerRank = static_cast<int32_t>(*numEntriesPerRankPtr); **修改后代码**: cpp auto hiddenSizePtr = attrs->GetAttrPointer<int64_t>(ATTR_HIDDEN_SIZE_INDEX); OP_TILING_CHECK(hiddenSizePtr == nullptr, OP_LOGE(nodeName, "hidden_size attr is nullptr"), return ge::GRAPH_FAILED); tilingData.hiddenDim = *hiddenSizePtr; auto numEntriesPerRankPtr = attrs->GetAttrPointer<int64_t>(ATTR_NUM_ENTRIES_PER_RANK_INDEX); OP_TILING_CHECK(numEntriesPerRankPtr == nullptr, OP_LOGE(nodeName, "num_entries_per_rank attr is nullptr"), return ge::GRAPH_FAILED); tilingData.numEntriesPerRank = static_cast<int32_t>(*numEntriesPerRankPtr); **修改说明**:在解引用前添加nullptr校验,返回GRAPH_FAILED,符合红线规范第4条和TOPK-1要求。 --- ### 问题ID:ISSUE-002 | 严重级别:LOW(轻微) #### 假设检验过程 **代码段**:engram_fetch_tiling_data.h TilingData结构体字段删除 **假设**:H0: 该结构体变更不影响兼容性 | 证据序号 | 证据类型 | 规范ID | 证据描述 | 分值增量 | 累计自信值 | |---------|---------|--------|---------|---------|-----------| | 1 | 规范违反 | cpp-secure 10.4 | 从TilingData结构体中删除了 sfTableAddr 字段(原末尾字段),结构体布局缩小。若存在新旧版本混用场景,可能导致TilingData反序列化错位 | +40% | 40% | | 2 | 上下文防御缺失 | cpp-secure 10.5 | 无版本号或兼容性标记机制 | +20% | 60% | **结论**:自信值 **60%** = 60%,**推翻原假设H0**,该代码段存在风险(边界判定)。 --- **关联条款**:cpp-secure 10.4(结构体字段末尾添加)、cpp-secure 10.5(接口变更考虑兼容性) **代码路径**:mc2/engram_fetch/op_kernel/engram_fetch_tiling_data.h:31-34 **问题类型**:结构体字段删除的ABI兼容性 **问题描述**:本次PR从 EngramFetchTilingData 结构体末尾删除了 uint64_t sfTableAddr 字段。规范10.4要求"对外结构体接口新增字段时必须在结构体最后添加",而删除末尾字段虽然不会影响前面字段的偏移,但会导致结构体大小变化。如果存在编译期和运行期版本不一致的场景(如op_host用新版本编译,op_kernel用旧版本运行),可能导致TilingData解析错位。 注:由于sfTableAddr原来就在结构体最末尾,删除它不会影响其他字段的偏移。且CANN的TilingData序列化机制通常保证host/kernel版本一致,因此风险较低。但根据规范仍需标注为存疑。 #### 修改建议 **修改说明**:确认CANN的TilingData序列化机制是否保证host/kernel版本严格一致。如果是,则此问题可忽略。如果存在版本混用可能,建议保留该字段(设为0不使用),而不是删除。或者确认该PR作为一个整体发布,不存在部分更新的场景。 --- ## 存疑问题(供自主判断) ### 存疑-1:GatherSf中relayQue_复用可能的数据竞争 **代码路径**:mc2/engram_fetch/op_kernel/arch35/engram_fetch_arch35.h:468-476 **问题描述**:GatherSf函数复用 relayQue_(TQueBind<VECIN, VECOUT>)进行SF数据的GM→UB→GM搬运。在 LocalFetchTokens 中,GatherSf在 LocalCopySlice 循环之后调用(line 348),此时relayQue_的AllocTensor/FreeTensor已由LocalCopySlice完成。在 RemoteFetchRank 中,GatherSf在 PrepareRead 之后调用(line 427),PrepareRead不使用relayQue_。因此 relayQue_ 的复用在当前调用顺序下不会产生AllocTensor/FreeTensor配对冲突。但如果未来调用顺序变更(如GatherSf在LocalCopySlice循环内部调用),可能导致relayQue_的AllocTensor在未FreeTensor时再次AllocTensor。建议在注释中说明relayQue_复用约束。 ### 存疑-2:sfBytes为0时DataCopyPad行为 **代码路径**:mc2/engram_fetch/op_kernel/arch35/engram_fetch_arch35.h:461 **问题描述**:当 numSfPacks_ 或 sfElemSize_ 为0时,sfBytes 为0。此时 DataCopyPad 的 blockLen=0 行为未定义。虽然调用前有 hasSf 检查(numSfPacks_ > 0),但如果 sfElemSize_ 为0而 numSfPacks_ > 0,hasSf 仍为true但 sfBytes 为0。建议在hasSf检查中增加 sfElemSize_ > 0 条件。 --- ## 检视检查清单 ### C++安全编码规范 (cpp-secure.md) - [x] 1.1 静态类型安全 - 无联合体/void*滥用 - [x] 1.2 内存安全 - 无越界/野指针/未初始化 - [x] 1.3 禁止未定义行为 - 无UB - [x] 2.1 有符号整数运算不溢出 - hiddenDim*bytesPerElem有溢出保护(line 513) - [x] 2.2 无符号整数运算不回绕 - sfBytes计算为uint32_t乘法,范围可控 - [x] 2.3 除法/余数除零保护 - CeilDiv有y参数,调用方保证非零 - [x] 3.1 禁止未初始化变量 - 成员变量sfTableGM_{nullptr}、fetchedSfGM_{nullptr}、numSfPacks_{0}、sfElemSize_{0}均有默认初始化(engram_fetch_arch35.h:131-134);tilingData中numSfPacks/sfElemSize在SetTilingData中初始化为0(line 500-501) - [x] 3.2 资源释放后指针置新值 - Kernel侧不适用(TQueBind管理生命周期,AllocTensor/FreeTensor配对使用) - [x] 3.3 数组索引校验 - GatherSf中globalIdx来自indicesLocal(i),indices语义为entry索引,外部保证非负;globalTokenIdx由indicesBatchStart+i计算,均为uint32_t无负值风险 - [x] 3.4 禁止sizeof指针 - 无sizeof指针操作 - [x] 3.5 指针使用前判空 - 见ISSUE-001 (hiddenSizePtr/numEntriesPerRankPtr未判空);sfTableGM_在GatherSf调用前有hasSf检查(line 338/404) - [x] 3.6 字符串存储空间 - Kernel侧不适用 - [x] 4.1 外部输入合法性校验 - tiling中有dtype/shape校验 - [x] 4.2 内存操作长度校验 - DataCopyPad使用sfBytes - [x] 10.4 结构体字段末尾添加 - 见ISSUE-002 - [x] 10.5 接口变更兼容性 - 见ISSUE-002 ### Ascend C API最佳实践 (ascendc-api.md) - [x] API-1 禁止SetValue/GetValue - 无使用 - [x] API-2 禁止std::计算函数 - 无使用 - [x] API-3 DataCopy/DataCopyPad对齐 - GatherSf使用DataCopyPad,sfBytes可能非32B对齐,但DataCopyPad支持非对齐 - [x] API-6 AllocTensor/FreeTensor配对 - GatherSf中AllocTensor→EnQue→DeQue→FreeTensor配对完整 - [x] API-7 禁止动态内存分配 - 无new/malloc - [x] API-8 repeatTimes≤255 - 无循环类API使用 - [x] API-10 DataCopyParams vs DataCopyExtParams单位 - LocalCopySlice中DataCopyPad使用DataCopyExtParams(blockLen=字节)正确,DataCopyParams(mte3Params)用于DataCopyPad时blockLen=字节正确 ### TOPK问题清单 (ascendc-topk.md) - [x] TOPK-1 必须校验函数返回值 - 见ISSUE-001 - [x] TOPK-8 gm偏移用int64 - 外部保证indices非负,int32_t→uint64_t转换安全 --- ## 综合结论 ### 总体评价 本次PR将engram_fetch算子的SF表从attr方式(int64地址)改为input tensor方式,整体架构改进合理:避免了aclgraph模式下DataPtrVariable不支持的问题,tensor生命周期由框架管理,tiling侧可从output shape/dtype获取SF参数进行校验。参数链路(op_def → tiling → kernel entry → arch35 Init → GatherSf)一致性良好,各层参数顺序对齐正确。Kernel侧GatherSf使用标准TQueBind流水线(AllocTensor→DataCopyPad→EnQue→DeQue→DataCopyPad→FreeTensor),API使用规范。 ### 问题汇总 | 问题ID | 级别 | 是否PR新增 | 是否阻塞合入 | 修复建议 | |--------|------|-----------|-------------|---------| | ISSUE-001 | CRITICAL | 否(PR前已存在) | 否(非本次引入,建议后续修复) | hiddenSizePtr/numEntriesPerRankPtr解引用前添加nullptr校验 | | ISSUE-002 | LOW | 是(删除sfTableAddr字段) | 否(字段在末尾,不影响其他字段偏移) | 确认CANN TilingData序列化保证host/kernel版本一致即可 | | 存疑-1 | - | 是 | 否 | relayQue_复用约束建议添加注释说明 | | 存疑-2 | - | 是 | 否 | hasSf检查增加sfElemSize_>0条件 | ### 合入建议 **建议直接合入**。ISSUE-001为PR前已存在问题,非本次引入,不阻塞合入但建议后续修复。ISSUE-002和存疑项为低风险,可后续评估。 ### 合规性声明 - C++安全编码规范(47条):ISSUE-001违反3.5(指针判空)和TOPK-1,ISSUE-002涉及10.4/10.5(兼容性),其余条款合规 - Ascend C API最佳实践(9条):全部合规,DataCopyPad/AllocTensor/FreeTensor使用正确 - TOPK问题清单(13条):ISSUE-001违反TOPK-1,其余合规 --- ## 报告生成时间 2026-09-10 18:00:00 ## 报告状态 已完成检视,待修复验证 See merge request: cann/ops-transformer!11683 | 4 天前 | |
ElasticBuffer 修改hidden拦截校验 Co-authored-by: liuyibin<liuyibin5@huawei.com> # message auto-generated for no-merge-commit merge: !10990 merge hidden into master ElasticBuffer 修改hidden拦截校验 Created-by: liuyibin Commit-by: liuyibin Merged-by: cann-robot Description: ## 描述 ElasticBuffer 去掉对hidden的拦截 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在这里提供Issue链接。例如:关联Issue #000--> <!-- 如果这个PR是为了解决特定的问题单,请在这里描述问题单单号。--> ## 测试 <!--描述进行了哪些测试来验证你的改动。包括但不限于二级冒烟、算子泛化等。--> ## 文档更新 ElasticBuffer.md ## 类型标签 <!-- [x] 表示选中 --> - [ x] 🐛 Bug修复 - [ ] ✨ 新特性 - [ ] ⚡ 性能优化 - [ ] ♻️ 重构 - [ ] 🧪 测试 - [ ] 📦 构建/CI - [ ] 🔧 配置变更 - [x ] 📝 文档更新 - [ ] ⬆️ 依赖升级 - [ ] 🔒 安全修复 - [ ] 🧹 代码清理 - [ ] ❓ 其他,请描述: See merge request: cann/ops-transformer!10990 | 10 天前 | |
Pre-Commit 规范整改 — MC2 大EP Co-authored-by: gitcode_lijd<lijiandong20@huawei.com> # message auto-generated for no-merge-commit merge: !2597 merge clean into master Pre-Commit 规范整改 — MC2 大EP Created-by: gitcode_lijd Commit-by: gitcode_lijd Merged-by: cann-robot Description: pre-commit是一个Git Hooks框架,用于在 git commit时自动运行代码检查和格式化工具。: | Hook | 功能 | 说明 | |------|------|------| | **clang-format** | C/C++ 代码格式化 | 自动格式化代码,保持风格一致 | | **OAT Check** | 开源合规检查 | 检测许可证头、禁止二进制文件提交 | 本PR对于MC2文件进行了pre-commit检查 See merge request: cann/ops-transformer!2597 | 2 个月前 |