| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
fix: 加固 LambNextMV 与 MaxPoolExt2 输入契约、边界溢出与特殊值语义 Co-authored-by: wyy<2137553008@qq.com> # message auto-generated for no-merge-commit merge: !12850 merge master into master fix: 加固 LambNextMV 与 MaxPoolExt2 输入契约、边界溢出与特殊值语义 Created-by: wangyuyan_44 Commit-by: wyy Merged-by: cann-robot Description: ## 描述 本 PR 围绕 LambNextMV(lamb_next_m_v)与 MaxPoolExt2(max_pool_ext2)补齐输入契约校验、边界/溢出防护与特殊值语义,修复异常输入可能进入 kernel 导致越界读写、tiling 截断或精度不一致的问题,并补充 ascend350 平台配置与文档。 ### LambNextMV - 将公共广播规划 BuildLambBrcPlan 的边界校验收敛到 lamb_brc_tiling_plan.h:校验输出 rank ≤ LAMB_BRC_MAX_DIM、原始维度/折叠后维度在 uint32 表示域内、相邻轴折叠乘法 int64 不溢出、元素总数 uint64 不溢出;LambBrcCollapse 改为返回状态码,任一越界直接 GRAPH_FAILED。 - InferShape 新增 rank ≤ 8 校验;InferDataType 要求 13 个输入 dtype 一致且仅支持 DT_FLOAT/DT_FLOAT16,与 tiling 侧口径统一。 - kernel 在 tilingData.totalNum == 0 时直接返回,跳过 UB 缓冲铺设与 FillScalarSlots,修复空 Tensor 触发 VECTOR_CORE_EXCEPTION 的问题。 - tiling data 新增 innerChunk、innerChunkCnt 字段,并补充 tiling 注册容量与 POD 对齐说明。 - 更新 README,补充动态 shape/动态 rank、空 Tensor 与 GE 图模式样例构建说明。 ### MaxPoolExt2 - proto 移除 DT_DOUBLE、DT_QINT8,与 OpDef/kernel 实际支持面统一;InferDataType 增加 dtype 白名单校验。 - tiling 新增:输出 dtype 必须与输入一致;origin/storage format 必须为 FORMAT_ND;data_format 仅允许 NHWC/NCHW;ksize/strides 空间维必须 > 0 且 ≤ INT32_MAX;输入元素总数用 __int128 校验不超过 INT64_MAX。 - kernel 将浮点归约初值由 -FLT_MAX 改为 -inf 位模式,并去掉 isnan 分支,按“忽略 NaN、全 NaN 窗口输出 -inf”的语义取最大值,与 README/golden 对齐。 - 新增 ascend350 平台配置。 - 更新 README:明确 ND format 约束、ksize/strides 空间轴、输出 shape/dtype、NaN/-inf 特殊值语义、动态 shape 说明,并更新 docs/zh/op_list.md 的平台支持标记。 ### 配套调整 - MaxPoolExt2 golden 移除旧 third_party 实现,修正全 NaN/全 -inf 窗口,增加按用例名确定性的特殊值注入并改为 binary_equal 容差。 - 两个 GEIR 示例修复宿主缓冲泄漏与 Session/AddGraph 重载二义性。 - MaxPoolExt2 tiling UT 统一 origin/storage format 为 ND,并新增非法 format、元素总数溢出、ksize 越界等期望失败用例。 ## 关联的Issue - 关联 Issue #7579 ## 测试 - 编译:ops-nn 构建通过,CI 流水线通过(ci-pipeline-passed)。 - UT:LambNextMV、MaxPoolExt2 Host UT 全量执行通过;MaxPoolExt2 新增非法 format、元素总数溢出、ksize 越界等异常用例通过。 - GEIR:根据本地测试记录,test_geir_lamb_next_m_v、test_geir_max_pool_ext2 编译运行通过;MaxPoolExt2 更新 golden 后 L0 用例通过(含 NaN/-inf 注入)。其中,MaxPoolExt2 在隔离加载私装 custom 包的环境下,GEIR 51/51 通过。 - GEIR 环境条件:测试通过临时 OPP 目录避开共享 CANN 中同名内置算子的注册/推导逻辑,不修改共享 CANN。未隔离环境仍存在同名算子加载冲突,本次结果不代表该共存问题已解决。 - 边界验证:LambNextMV 的 rank > 8、uint32 越界、折叠/元素总数溢出、非法或不一致 dtype 输入被 Host 拒绝;合法空 Tensor 正常返回,kernel 跳过 UB 缓冲铺设与 FillScalarSlots。MaxPoolExt2 的非 ND、非法 dtype、ksize/strides 越界、元素总数溢出均被 Host 拒绝。 ## 文档更新 - 更新 optim/lamb_next_m_v/README.md、pooling/max_pool_ext2/README.md 及 docs/zh/op_list.md。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 - [x] AI辅助编写 See merge request: cann/ops-nn!12850 | 3 天前 | |
fix: 加固 LambNextMV 与 MaxPoolExt2 输入契约、边界溢出与特殊值语义 Co-authored-by: wyy<2137553008@qq.com> # message auto-generated for no-merge-commit merge: !12850 merge master into master fix: 加固 LambNextMV 与 MaxPoolExt2 输入契约、边界溢出与特殊值语义 Created-by: wangyuyan_44 Commit-by: wyy Merged-by: cann-robot Description: ## 描述 本 PR 围绕 LambNextMV(lamb_next_m_v)与 MaxPoolExt2(max_pool_ext2)补齐输入契约校验、边界/溢出防护与特殊值语义,修复异常输入可能进入 kernel 导致越界读写、tiling 截断或精度不一致的问题,并补充 ascend350 平台配置与文档。 ### LambNextMV - 将公共广播规划 BuildLambBrcPlan 的边界校验收敛到 lamb_brc_tiling_plan.h:校验输出 rank ≤ LAMB_BRC_MAX_DIM、原始维度/折叠后维度在 uint32 表示域内、相邻轴折叠乘法 int64 不溢出、元素总数 uint64 不溢出;LambBrcCollapse 改为返回状态码,任一越界直接 GRAPH_FAILED。 - InferShape 新增 rank ≤ 8 校验;InferDataType 要求 13 个输入 dtype 一致且仅支持 DT_FLOAT/DT_FLOAT16,与 tiling 侧口径统一。 - kernel 在 tilingData.totalNum == 0 时直接返回,跳过 UB 缓冲铺设与 FillScalarSlots,修复空 Tensor 触发 VECTOR_CORE_EXCEPTION 的问题。 - tiling data 新增 innerChunk、innerChunkCnt 字段,并补充 tiling 注册容量与 POD 对齐说明。 - 更新 README,补充动态 shape/动态 rank、空 Tensor 与 GE 图模式样例构建说明。 ### MaxPoolExt2 - proto 移除 DT_DOUBLE、DT_QINT8,与 OpDef/kernel 实际支持面统一;InferDataType 增加 dtype 白名单校验。 - tiling 新增:输出 dtype 必须与输入一致;origin/storage format 必须为 FORMAT_ND;data_format 仅允许 NHWC/NCHW;ksize/strides 空间维必须 > 0 且 ≤ INT32_MAX;输入元素总数用 __int128 校验不超过 INT64_MAX。 - kernel 将浮点归约初值由 -FLT_MAX 改为 -inf 位模式,并去掉 isnan 分支,按“忽略 NaN、全 NaN 窗口输出 -inf”的语义取最大值,与 README/golden 对齐。 - 新增 ascend350 平台配置。 - 更新 README:明确 ND format 约束、ksize/strides 空间轴、输出 shape/dtype、NaN/-inf 特殊值语义、动态 shape 说明,并更新 docs/zh/op_list.md 的平台支持标记。 ### 配套调整 - MaxPoolExt2 golden 移除旧 third_party 实现,修正全 NaN/全 -inf 窗口,增加按用例名确定性的特殊值注入并改为 binary_equal 容差。 - 两个 GEIR 示例修复宿主缓冲泄漏与 Session/AddGraph 重载二义性。 - MaxPoolExt2 tiling UT 统一 origin/storage format 为 ND,并新增非法 format、元素总数溢出、ksize 越界等期望失败用例。 ## 关联的Issue - 关联 Issue #7579 ## 测试 - 编译:ops-nn 构建通过,CI 流水线通过(ci-pipeline-passed)。 - UT:LambNextMV、MaxPoolExt2 Host UT 全量执行通过;MaxPoolExt2 新增非法 format、元素总数溢出、ksize 越界等异常用例通过。 - GEIR:根据本地测试记录,test_geir_lamb_next_m_v、test_geir_max_pool_ext2 编译运行通过;MaxPoolExt2 更新 golden 后 L0 用例通过(含 NaN/-inf 注入)。其中,MaxPoolExt2 在隔离加载私装 custom 包的环境下,GEIR 51/51 通过。 - GEIR 环境条件:测试通过临时 OPP 目录避开共享 CANN 中同名内置算子的注册/推导逻辑,不修改共享 CANN。未隔离环境仍存在同名算子加载冲突,本次结果不代表该共存问题已解决。 - 边界验证:LambNextMV 的 rank > 8、uint32 越界、折叠/元素总数溢出、非法或不一致 dtype 输入被 Host 拒绝;合法空 Tensor 正常返回,kernel 跳过 UB 缓冲铺设与 FillScalarSlots。MaxPoolExt2 的非 ND、非法 dtype、ksize/strides 越界、元素总数溢出均被 Host 拒绝。 ## 文档更新 - 更新 optim/lamb_next_m_v/README.md、pooling/max_pool_ext2/README.md 及 docs/zh/op_list.md。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 - [x] AI辅助编写 See merge request: cann/ops-nn!12850 | 3 天前 | |
fix: 加固 LambNextMV 与 MaxPoolExt2 输入契约、边界溢出与特殊值语义 Co-authored-by: wyy<2137553008@qq.com> # message auto-generated for no-merge-commit merge: !12850 merge master into master fix: 加固 LambNextMV 与 MaxPoolExt2 输入契约、边界溢出与特殊值语义 Created-by: wangyuyan_44 Commit-by: wyy Merged-by: cann-robot Description: ## 描述 本 PR 围绕 LambNextMV(lamb_next_m_v)与 MaxPoolExt2(max_pool_ext2)补齐输入契约校验、边界/溢出防护与特殊值语义,修复异常输入可能进入 kernel 导致越界读写、tiling 截断或精度不一致的问题,并补充 ascend350 平台配置与文档。 ### LambNextMV - 将公共广播规划 BuildLambBrcPlan 的边界校验收敛到 lamb_brc_tiling_plan.h:校验输出 rank ≤ LAMB_BRC_MAX_DIM、原始维度/折叠后维度在 uint32 表示域内、相邻轴折叠乘法 int64 不溢出、元素总数 uint64 不溢出;LambBrcCollapse 改为返回状态码,任一越界直接 GRAPH_FAILED。 - InferShape 新增 rank ≤ 8 校验;InferDataType 要求 13 个输入 dtype 一致且仅支持 DT_FLOAT/DT_FLOAT16,与 tiling 侧口径统一。 - kernel 在 tilingData.totalNum == 0 时直接返回,跳过 UB 缓冲铺设与 FillScalarSlots,修复空 Tensor 触发 VECTOR_CORE_EXCEPTION 的问题。 - tiling data 新增 innerChunk、innerChunkCnt 字段,并补充 tiling 注册容量与 POD 对齐说明。 - 更新 README,补充动态 shape/动态 rank、空 Tensor 与 GE 图模式样例构建说明。 ### MaxPoolExt2 - proto 移除 DT_DOUBLE、DT_QINT8,与 OpDef/kernel 实际支持面统一;InferDataType 增加 dtype 白名单校验。 - tiling 新增:输出 dtype 必须与输入一致;origin/storage format 必须为 FORMAT_ND;data_format 仅允许 NHWC/NCHW;ksize/strides 空间维必须 > 0 且 ≤ INT32_MAX;输入元素总数用 __int128 校验不超过 INT64_MAX。 - kernel 将浮点归约初值由 -FLT_MAX 改为 -inf 位模式,并去掉 isnan 分支,按“忽略 NaN、全 NaN 窗口输出 -inf”的语义取最大值,与 README/golden 对齐。 - 新增 ascend350 平台配置。 - 更新 README:明确 ND format 约束、ksize/strides 空间轴、输出 shape/dtype、NaN/-inf 特殊值语义、动态 shape 说明,并更新 docs/zh/op_list.md 的平台支持标记。 ### 配套调整 - MaxPoolExt2 golden 移除旧 third_party 实现,修正全 NaN/全 -inf 窗口,增加按用例名确定性的特殊值注入并改为 binary_equal 容差。 - 两个 GEIR 示例修复宿主缓冲泄漏与 Session/AddGraph 重载二义性。 - MaxPoolExt2 tiling UT 统一 origin/storage format 为 ND,并新增非法 format、元素总数溢出、ksize 越界等期望失败用例。 ## 关联的Issue - 关联 Issue #7579 ## 测试 - 编译:ops-nn 构建通过,CI 流水线通过(ci-pipeline-passed)。 - UT:LambNextMV、MaxPoolExt2 Host UT 全量执行通过;MaxPoolExt2 新增非法 format、元素总数溢出、ksize 越界等异常用例通过。 - GEIR:根据本地测试记录,test_geir_lamb_next_m_v、test_geir_max_pool_ext2 编译运行通过;MaxPoolExt2 更新 golden 后 L0 用例通过(含 NaN/-inf 注入)。其中,MaxPoolExt2 在隔离加载私装 custom 包的环境下,GEIR 51/51 通过。 - GEIR 环境条件:测试通过临时 OPP 目录避开共享 CANN 中同名内置算子的注册/推导逻辑,不修改共享 CANN。未隔离环境仍存在同名算子加载冲突,本次结果不代表该共存问题已解决。 - 边界验证:LambNextMV 的 rank > 8、uint32 越界、折叠/元素总数溢出、非法或不一致 dtype 输入被 Host 拒绝;合法空 Tensor 正常返回,kernel 跳过 UB 缓冲铺设与 FillScalarSlots。MaxPoolExt2 的非 ND、非法 dtype、ksize/strides 越界、元素总数溢出均被 Host 拒绝。 ## 文档更新 - 更新 optim/lamb_next_m_v/README.md、pooling/max_pool_ext2/README.md 及 docs/zh/op_list.md。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 - [x] AI辅助编写 See merge request: cann/ops-nn!12850 | 3 天前 | |
fix: 加固 LambNextMV 与 MaxPoolExt2 输入契约、边界溢出与特殊值语义 Co-authored-by: wyy<2137553008@qq.com> # message auto-generated for no-merge-commit merge: !12850 merge master into master fix: 加固 LambNextMV 与 MaxPoolExt2 输入契约、边界溢出与特殊值语义 Created-by: wangyuyan_44 Commit-by: wyy Merged-by: cann-robot Description: ## 描述 本 PR 围绕 LambNextMV(lamb_next_m_v)与 MaxPoolExt2(max_pool_ext2)补齐输入契约校验、边界/溢出防护与特殊值语义,修复异常输入可能进入 kernel 导致越界读写、tiling 截断或精度不一致的问题,并补充 ascend350 平台配置与文档。 ### LambNextMV - 将公共广播规划 BuildLambBrcPlan 的边界校验收敛到 lamb_brc_tiling_plan.h:校验输出 rank ≤ LAMB_BRC_MAX_DIM、原始维度/折叠后维度在 uint32 表示域内、相邻轴折叠乘法 int64 不溢出、元素总数 uint64 不溢出;LambBrcCollapse 改为返回状态码,任一越界直接 GRAPH_FAILED。 - InferShape 新增 rank ≤ 8 校验;InferDataType 要求 13 个输入 dtype 一致且仅支持 DT_FLOAT/DT_FLOAT16,与 tiling 侧口径统一。 - kernel 在 tilingData.totalNum == 0 时直接返回,跳过 UB 缓冲铺设与 FillScalarSlots,修复空 Tensor 触发 VECTOR_CORE_EXCEPTION 的问题。 - tiling data 新增 innerChunk、innerChunkCnt 字段,并补充 tiling 注册容量与 POD 对齐说明。 - 更新 README,补充动态 shape/动态 rank、空 Tensor 与 GE 图模式样例构建说明。 ### MaxPoolExt2 - proto 移除 DT_DOUBLE、DT_QINT8,与 OpDef/kernel 实际支持面统一;InferDataType 增加 dtype 白名单校验。 - tiling 新增:输出 dtype 必须与输入一致;origin/storage format 必须为 FORMAT_ND;data_format 仅允许 NHWC/NCHW;ksize/strides 空间维必须 > 0 且 ≤ INT32_MAX;输入元素总数用 __int128 校验不超过 INT64_MAX。 - kernel 将浮点归约初值由 -FLT_MAX 改为 -inf 位模式,并去掉 isnan 分支,按“忽略 NaN、全 NaN 窗口输出 -inf”的语义取最大值,与 README/golden 对齐。 - 新增 ascend350 平台配置。 - 更新 README:明确 ND format 约束、ksize/strides 空间轴、输出 shape/dtype、NaN/-inf 特殊值语义、动态 shape 说明,并更新 docs/zh/op_list.md 的平台支持标记。 ### 配套调整 - MaxPoolExt2 golden 移除旧 third_party 实现,修正全 NaN/全 -inf 窗口,增加按用例名确定性的特殊值注入并改为 binary_equal 容差。 - 两个 GEIR 示例修复宿主缓冲泄漏与 Session/AddGraph 重载二义性。 - MaxPoolExt2 tiling UT 统一 origin/storage format 为 ND,并新增非法 format、元素总数溢出、ksize 越界等期望失败用例。 ## 关联的Issue - 关联 Issue #7579 ## 测试 - 编译:ops-nn 构建通过,CI 流水线通过(ci-pipeline-passed)。 - UT:LambNextMV、MaxPoolExt2 Host UT 全量执行通过;MaxPoolExt2 新增非法 format、元素总数溢出、ksize 越界等异常用例通过。 - GEIR:根据本地测试记录,test_geir_lamb_next_m_v、test_geir_max_pool_ext2 编译运行通过;MaxPoolExt2 更新 golden 后 L0 用例通过(含 NaN/-inf 注入)。其中,MaxPoolExt2 在隔离加载私装 custom 包的环境下,GEIR 51/51 通过。 - GEIR 环境条件:测试通过临时 OPP 目录避开共享 CANN 中同名内置算子的注册/推导逻辑,不修改共享 CANN。未隔离环境仍存在同名算子加载冲突,本次结果不代表该共存问题已解决。 - 边界验证:LambNextMV 的 rank > 8、uint32 越界、折叠/元素总数溢出、非法或不一致 dtype 输入被 Host 拒绝;合法空 Tensor 正常返回,kernel 跳过 UB 缓冲铺设与 FillScalarSlots。MaxPoolExt2 的非 ND、非法 dtype、ksize/strides 越界、元素总数溢出均被 Host 拒绝。 ## 文档更新 - 更新 optim/lamb_next_m_v/README.md、pooling/max_pool_ext2/README.md 及 docs/zh/op_list.md。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 - [x] AI辅助编写 See merge request: cann/ops-nn!12850 | 3 天前 | |
fix: 加固 LambNextMV 与 MaxPoolExt2 输入契约、边界溢出与特殊值语义 Co-authored-by: wyy<2137553008@qq.com> # message auto-generated for no-merge-commit merge: !12850 merge master into master fix: 加固 LambNextMV 与 MaxPoolExt2 输入契约、边界溢出与特殊值语义 Created-by: wangyuyan_44 Commit-by: wyy Merged-by: cann-robot Description: ## 描述 本 PR 围绕 LambNextMV(lamb_next_m_v)与 MaxPoolExt2(max_pool_ext2)补齐输入契约校验、边界/溢出防护与特殊值语义,修复异常输入可能进入 kernel 导致越界读写、tiling 截断或精度不一致的问题,并补充 ascend350 平台配置与文档。 ### LambNextMV - 将公共广播规划 BuildLambBrcPlan 的边界校验收敛到 lamb_brc_tiling_plan.h:校验输出 rank ≤ LAMB_BRC_MAX_DIM、原始维度/折叠后维度在 uint32 表示域内、相邻轴折叠乘法 int64 不溢出、元素总数 uint64 不溢出;LambBrcCollapse 改为返回状态码,任一越界直接 GRAPH_FAILED。 - InferShape 新增 rank ≤ 8 校验;InferDataType 要求 13 个输入 dtype 一致且仅支持 DT_FLOAT/DT_FLOAT16,与 tiling 侧口径统一。 - kernel 在 tilingData.totalNum == 0 时直接返回,跳过 UB 缓冲铺设与 FillScalarSlots,修复空 Tensor 触发 VECTOR_CORE_EXCEPTION 的问题。 - tiling data 新增 innerChunk、innerChunkCnt 字段,并补充 tiling 注册容量与 POD 对齐说明。 - 更新 README,补充动态 shape/动态 rank、空 Tensor 与 GE 图模式样例构建说明。 ### MaxPoolExt2 - proto 移除 DT_DOUBLE、DT_QINT8,与 OpDef/kernel 实际支持面统一;InferDataType 增加 dtype 白名单校验。 - tiling 新增:输出 dtype 必须与输入一致;origin/storage format 必须为 FORMAT_ND;data_format 仅允许 NHWC/NCHW;ksize/strides 空间维必须 > 0 且 ≤ INT32_MAX;输入元素总数用 __int128 校验不超过 INT64_MAX。 - kernel 将浮点归约初值由 -FLT_MAX 改为 -inf 位模式,并去掉 isnan 分支,按“忽略 NaN、全 NaN 窗口输出 -inf”的语义取最大值,与 README/golden 对齐。 - 新增 ascend350 平台配置。 - 更新 README:明确 ND format 约束、ksize/strides 空间轴、输出 shape/dtype、NaN/-inf 特殊值语义、动态 shape 说明,并更新 docs/zh/op_list.md 的平台支持标记。 ### 配套调整 - MaxPoolExt2 golden 移除旧 third_party 实现,修正全 NaN/全 -inf 窗口,增加按用例名确定性的特殊值注入并改为 binary_equal 容差。 - 两个 GEIR 示例修复宿主缓冲泄漏与 Session/AddGraph 重载二义性。 - MaxPoolExt2 tiling UT 统一 origin/storage format 为 ND,并新增非法 format、元素总数溢出、ksize 越界等期望失败用例。 ## 关联的Issue - 关联 Issue #7579 ## 测试 - 编译:ops-nn 构建通过,CI 流水线通过(ci-pipeline-passed)。 - UT:LambNextMV、MaxPoolExt2 Host UT 全量执行通过;MaxPoolExt2 新增非法 format、元素总数溢出、ksize 越界等异常用例通过。 - GEIR:根据本地测试记录,test_geir_lamb_next_m_v、test_geir_max_pool_ext2 编译运行通过;MaxPoolExt2 更新 golden 后 L0 用例通过(含 NaN/-inf 注入)。其中,MaxPoolExt2 在隔离加载私装 custom 包的环境下,GEIR 51/51 通过。 - GEIR 环境条件:测试通过临时 OPP 目录避开共享 CANN 中同名内置算子的注册/推导逻辑,不修改共享 CANN。未隔离环境仍存在同名算子加载冲突,本次结果不代表该共存问题已解决。 - 边界验证:LambNextMV 的 rank > 8、uint32 越界、折叠/元素总数溢出、非法或不一致 dtype 输入被 Host 拒绝;合法空 Tensor 正常返回,kernel 跳过 UB 缓冲铺设与 FillScalarSlots。MaxPoolExt2 的非 ND、非法 dtype、ksize/strides 越界、元素总数溢出均被 Host 拒绝。 ## 文档更新 - 更新 optim/lamb_next_m_v/README.md、pooling/max_pool_ext2/README.md 及 docs/zh/op_list.md。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 - [x] AI辅助编写 See merge request: cann/ops-nn!12850 | 3 天前 | |
fix: 加固 LambNextMV 与 MaxPoolExt2 输入契约、边界溢出与特殊值语义 Co-authored-by: wyy<2137553008@qq.com> # message auto-generated for no-merge-commit merge: !12850 merge master into master fix: 加固 LambNextMV 与 MaxPoolExt2 输入契约、边界溢出与特殊值语义 Created-by: wangyuyan_44 Commit-by: wyy Merged-by: cann-robot Description: ## 描述 本 PR 围绕 LambNextMV(lamb_next_m_v)与 MaxPoolExt2(max_pool_ext2)补齐输入契约校验、边界/溢出防护与特殊值语义,修复异常输入可能进入 kernel 导致越界读写、tiling 截断或精度不一致的问题,并补充 ascend350 平台配置与文档。 ### LambNextMV - 将公共广播规划 BuildLambBrcPlan 的边界校验收敛到 lamb_brc_tiling_plan.h:校验输出 rank ≤ LAMB_BRC_MAX_DIM、原始维度/折叠后维度在 uint32 表示域内、相邻轴折叠乘法 int64 不溢出、元素总数 uint64 不溢出;LambBrcCollapse 改为返回状态码,任一越界直接 GRAPH_FAILED。 - InferShape 新增 rank ≤ 8 校验;InferDataType 要求 13 个输入 dtype 一致且仅支持 DT_FLOAT/DT_FLOAT16,与 tiling 侧口径统一。 - kernel 在 tilingData.totalNum == 0 时直接返回,跳过 UB 缓冲铺设与 FillScalarSlots,修复空 Tensor 触发 VECTOR_CORE_EXCEPTION 的问题。 - tiling data 新增 innerChunk、innerChunkCnt 字段,并补充 tiling 注册容量与 POD 对齐说明。 - 更新 README,补充动态 shape/动态 rank、空 Tensor 与 GE 图模式样例构建说明。 ### MaxPoolExt2 - proto 移除 DT_DOUBLE、DT_QINT8,与 OpDef/kernel 实际支持面统一;InferDataType 增加 dtype 白名单校验。 - tiling 新增:输出 dtype 必须与输入一致;origin/storage format 必须为 FORMAT_ND;data_format 仅允许 NHWC/NCHW;ksize/strides 空间维必须 > 0 且 ≤ INT32_MAX;输入元素总数用 __int128 校验不超过 INT64_MAX。 - kernel 将浮点归约初值由 -FLT_MAX 改为 -inf 位模式,并去掉 isnan 分支,按“忽略 NaN、全 NaN 窗口输出 -inf”的语义取最大值,与 README/golden 对齐。 - 新增 ascend350 平台配置。 - 更新 README:明确 ND format 约束、ksize/strides 空间轴、输出 shape/dtype、NaN/-inf 特殊值语义、动态 shape 说明,并更新 docs/zh/op_list.md 的平台支持标记。 ### 配套调整 - MaxPoolExt2 golden 移除旧 third_party 实现,修正全 NaN/全 -inf 窗口,增加按用例名确定性的特殊值注入并改为 binary_equal 容差。 - 两个 GEIR 示例修复宿主缓冲泄漏与 Session/AddGraph 重载二义性。 - MaxPoolExt2 tiling UT 统一 origin/storage format 为 ND,并新增非法 format、元素总数溢出、ksize 越界等期望失败用例。 ## 关联的Issue - 关联 Issue #7579 ## 测试 - 编译:ops-nn 构建通过,CI 流水线通过(ci-pipeline-passed)。 - UT:LambNextMV、MaxPoolExt2 Host UT 全量执行通过;MaxPoolExt2 新增非法 format、元素总数溢出、ksize 越界等异常用例通过。 - GEIR:根据本地测试记录,test_geir_lamb_next_m_v、test_geir_max_pool_ext2 编译运行通过;MaxPoolExt2 更新 golden 后 L0 用例通过(含 NaN/-inf 注入)。其中,MaxPoolExt2 在隔离加载私装 custom 包的环境下,GEIR 51/51 通过。 - GEIR 环境条件:测试通过临时 OPP 目录避开共享 CANN 中同名内置算子的注册/推导逻辑,不修改共享 CANN。未隔离环境仍存在同名算子加载冲突,本次结果不代表该共存问题已解决。 - 边界验证:LambNextMV 的 rank > 8、uint32 越界、折叠/元素总数溢出、非法或不一致 dtype 输入被 Host 拒绝;合法空 Tensor 正常返回,kernel 跳过 UB 缓冲铺设与 FillScalarSlots。MaxPoolExt2 的非 ND、非法 dtype、ksize/strides 越界、元素总数溢出均被 Host 拒绝。 ## 文档更新 - 更新 optim/lamb_next_m_v/README.md、pooling/max_pool_ext2/README.md 及 docs/zh/op_list.md。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 - [x] AI辅助编写 See merge request: cann/ops-nn!12850 | 3 天前 | |
fix: 加固 LambNextMV 与 MaxPoolExt2 输入契约、边界溢出与特殊值语义 Co-authored-by: wyy<2137553008@qq.com> # message auto-generated for no-merge-commit merge: !12850 merge master into master fix: 加固 LambNextMV 与 MaxPoolExt2 输入契约、边界溢出与特殊值语义 Created-by: wangyuyan_44 Commit-by: wyy Merged-by: cann-robot Description: ## 描述 本 PR 围绕 LambNextMV(lamb_next_m_v)与 MaxPoolExt2(max_pool_ext2)补齐输入契约校验、边界/溢出防护与特殊值语义,修复异常输入可能进入 kernel 导致越界读写、tiling 截断或精度不一致的问题,并补充 ascend350 平台配置与文档。 ### LambNextMV - 将公共广播规划 BuildLambBrcPlan 的边界校验收敛到 lamb_brc_tiling_plan.h:校验输出 rank ≤ LAMB_BRC_MAX_DIM、原始维度/折叠后维度在 uint32 表示域内、相邻轴折叠乘法 int64 不溢出、元素总数 uint64 不溢出;LambBrcCollapse 改为返回状态码,任一越界直接 GRAPH_FAILED。 - InferShape 新增 rank ≤ 8 校验;InferDataType 要求 13 个输入 dtype 一致且仅支持 DT_FLOAT/DT_FLOAT16,与 tiling 侧口径统一。 - kernel 在 tilingData.totalNum == 0 时直接返回,跳过 UB 缓冲铺设与 FillScalarSlots,修复空 Tensor 触发 VECTOR_CORE_EXCEPTION 的问题。 - tiling data 新增 innerChunk、innerChunkCnt 字段,并补充 tiling 注册容量与 POD 对齐说明。 - 更新 README,补充动态 shape/动态 rank、空 Tensor 与 GE 图模式样例构建说明。 ### MaxPoolExt2 - proto 移除 DT_DOUBLE、DT_QINT8,与 OpDef/kernel 实际支持面统一;InferDataType 增加 dtype 白名单校验。 - tiling 新增:输出 dtype 必须与输入一致;origin/storage format 必须为 FORMAT_ND;data_format 仅允许 NHWC/NCHW;ksize/strides 空间维必须 > 0 且 ≤ INT32_MAX;输入元素总数用 __int128 校验不超过 INT64_MAX。 - kernel 将浮点归约初值由 -FLT_MAX 改为 -inf 位模式,并去掉 isnan 分支,按“忽略 NaN、全 NaN 窗口输出 -inf”的语义取最大值,与 README/golden 对齐。 - 新增 ascend350 平台配置。 - 更新 README:明确 ND format 约束、ksize/strides 空间轴、输出 shape/dtype、NaN/-inf 特殊值语义、动态 shape 说明,并更新 docs/zh/op_list.md 的平台支持标记。 ### 配套调整 - MaxPoolExt2 golden 移除旧 third_party 实现,修正全 NaN/全 -inf 窗口,增加按用例名确定性的特殊值注入并改为 binary_equal 容差。 - 两个 GEIR 示例修复宿主缓冲泄漏与 Session/AddGraph 重载二义性。 - MaxPoolExt2 tiling UT 统一 origin/storage format 为 ND,并新增非法 format、元素总数溢出、ksize 越界等期望失败用例。 ## 关联的Issue - 关联 Issue #7579 ## 测试 - 编译:ops-nn 构建通过,CI 流水线通过(ci-pipeline-passed)。 - UT:LambNextMV、MaxPoolExt2 Host UT 全量执行通过;MaxPoolExt2 新增非法 format、元素总数溢出、ksize 越界等异常用例通过。 - GEIR:根据本地测试记录,test_geir_lamb_next_m_v、test_geir_max_pool_ext2 编译运行通过;MaxPoolExt2 更新 golden 后 L0 用例通过(含 NaN/-inf 注入)。其中,MaxPoolExt2 在隔离加载私装 custom 包的环境下,GEIR 51/51 通过。 - GEIR 环境条件:测试通过临时 OPP 目录避开共享 CANN 中同名内置算子的注册/推导逻辑,不修改共享 CANN。未隔离环境仍存在同名算子加载冲突,本次结果不代表该共存问题已解决。 - 边界验证:LambNextMV 的 rank > 8、uint32 越界、折叠/元素总数溢出、非法或不一致 dtype 输入被 Host 拒绝;合法空 Tensor 正常返回,kernel 跳过 UB 缓冲铺设与 FillScalarSlots。MaxPoolExt2 的非 ND、非法 dtype、ksize/strides 越界、元素总数溢出均被 Host 拒绝。 ## 文档更新 - 更新 optim/lamb_next_m_v/README.md、pooling/max_pool_ext2/README.md 及 docs/zh/op_list.md。 ## 类型标签 - [x] Bug修复 - [ ] 新特性 - [ ] 性能优化 - [x] 文档更新 - [ ] 其他,请描述: ## AI/Agent生成声明 - [x] AI辅助编写 See merge request: cann/ops-nn!12850 | 3 天前 |
MaxPoolExt2
产品支持情况
| 产品 | 是否支持 |
|---|---|
| Ascend 950PR&950DT系列产品 | √ |
| Atlas A3系列产品 | √ |
| Atlas A2系列产品 | √ |
| Atlas 200I/500 A2推理产品 | x |
| Atlas推理系列产品 | × |
| Atlas训练系列产品 | × |
功能说明
- 接口功能: 对于4维的输入张量,进行最大池化(max pooling)操作。支持NHWC和NCHW两种数据格式,支持SAME和VALID两种填充模式。
- 计算公式:
-
当padding="SAME"时,out tensor的shape中H和W维度推导公式:
[Hout,Wout]=[⌈Hinsh⌉,⌈Winsw⌉][H_{out}, W_{out}]=[\lceil{\frac{H_{in}}{s_h}}\rceil, \lceil{\frac{W_{in}}{s_w}}\rceil] [Hout,Wout]=[⌈shHin⌉,⌈swWin⌉]
-
当padding="VALID"时,out tensor的shape中H和W维度推导公式:
[Hout,Wout]=[⌈Hin−kh+1sh⌉,⌈Win−kw+1sw⌉][H_{out}, W_{out}]=[\lceil{\frac{H_{in} - k_h + 1}{s_h}}\rceil, \lceil{\frac{W_{in} - k_w + 1}{s_w}}\rceil] [Hout,Wout]=[⌈shHin−kh+1⌉,⌈swWin−kw+1⌉]
当 k_h > H_in + 1(或 k_w > W_in + 1)时,公式结果为负,输出对应维度按 0 处理(与 Tiling 实现的 max(0, ·) 截断一致)。
-
参数说明
| 参数名 | 输入/输出/属性 | 描述 | 数据类型 | 数据格式 |
|---|---|---|---|---|
| x | 输入 | 输入tensor,维度为4,公式中的x。 | FLOAT16、FLOAT、INT8、INT16、INT32、INT64、UINT8、UINT16 | ND |
| y | 输出 | 输出tensor,与x同dtype,维度为4。 | FLOAT16、FLOAT、INT8、INT16、INT32、INT64、UINT8、UINT16 | ND |
| ksize | 属性 | 最大池化的窗口大小,长度为4的列表,对应公式中的k_h和k_w。 | ListInt | - |
| strides | 属性 | 窗口移动的步长,长度为4的列表,对应公式中的s_h和s_w。 | ListInt | - |
| padding | 属性 | 填充模式,取值为"SAME"或"VALID"。SAME模式表示输出大小为输入大小除以步长向上取整,VALID模式表示输出大小为输入大小减去窗口大小加1再除以步长向上取整。 | String | - |
| data_format | 属性 | 数据格式,支持"NHWC"或"NCHW",默认为"NHWC"。 | String | - |
约束说明
- 值域限制说明:
- x:输入tensor维度必须为4。
- ksize:长度为4的列表。NHWC 格式下 ksize[0]=1、ksize[3]=1,空间轴为 ksize[1](H)和ksize[2](W);NCHW 格式下 ksize[0]=1、ksize[1]=1,空间轴为 ksize[2](H)和ksize[3](W)。空间轴取值必须大于0。
- strides:长度为4的列表。NHWC 格式下 strides[0]=1、strides[3]=1,空间轴为 strides[1](H)和strides[2](W);NCHW 格式下 strides[0]=1、strides[1]=1,空间轴为 strides[2](H)和strides[3](W)。空间轴取值必须大于0。
- padding:取值必须为"SAME"或"VALID"。
- data_format:取值必须为"NHWC"或"NCHW",默认为"NHWC"。
- 输入x与输出y的数据格式(tensor format)仅支持ND(算子注册契约,见 op_host/max_pool_ext2_def.cpp 的 Format 声明);其他 format(如 FRACTAL_NZ)会被算子宿主侧拒绝。
data_format属性只决定逻辑轴序(NHWC/NCHW),不改变 tensor format 的 ND 存储契约;不要用 NCHW/NHWC 作为 storage format 传入。- 输出y的dtype与输入x的dtype相同;输出y的shape由算子根据输入shape与属性推导(恒为4维),调用方不可独立设置输出 shape。
- IR 原型 op_graph/max_pool_ext2_proto.h 的 REG_OP 在参数表 8 种 dtype 之外额外声明 DOUBLE(FLOAT64)与 QINT8(图侧原型注册范围,宽于交付实现);当前 ascend950/ascend350 后端 OpDef 仅交付参数表中 dtype,上述两种类型无对应实现,图模式构图后无可用 Kernel。
- 必选参数(x、ksize、strides、padding)缺失由框架层在构图/编译阶段拒绝,不会到达算子边界。
- 特殊值语义(与同族 max_pool_with_argmax 的 nan_prop 默认一致): 忽略 NaN——窗口内 NaN 不参与最大值比较,取非 NaN 值的最大值;窗口内全为 NaN 时结果为 -inf。Inf 正常参与比较;+0.0 与 -0.0 按 IEEE 754 比较相等。
- 动态shape说明: 支持动态shape输入。输入单个维度可标记为 -1(未知维度),此时输出对应维度推导结果为 -1;未知rank输入输出按 4 维未知 shape 处理。
调用说明
| 调用方式 | 样例代码 | 说明 |
|---|---|---|
| GE图模式 | test_geir_max_pool_ext2 | 算子IR定义:op_graph/max_pool_ext2_proto.h。构建与运行:环境需已安装 CANN-toolkit 与编译好的算子包,在仓库根目录执行 bash build.sh --run_example max_pool_ext2 graph(编译并执行样例,输入数据由样例内置生成,覆盖各 dtype 与静态/动态 shape,通过标准为输出存在且数量正确);详见算子快速调用。 |