| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
fix(python): enforce unsigned constant and graph output contracts (#639,#640) Co-authored-by: gcw_Z57idahf<liaopinyi714@outlook.com> # message auto-generated for no-merge-commit merge: !5300 merge codex/fix-ge-builder-constant-and-output-contracts-batch04-final into develop fix(python): enforce unsigned constant and graph output contracts (#639,#640) Created-by: gcw_Z57idahf Commit-by: gcw_Z57idahf Merged-by: cann-robot Description: ## 描述 本 PR 修复 GraphBuilder 的两项独立契约问题,并处理本文件的扫描告警。目标为 cann/ge:develop,已合入当前上游 d970d595b71c054a7a8ca74753fdec906875700e;当前源提交 cb3a6304d1fa3bcb56f1839db6cb6e4fd7334d1d。更新保留原 PR 和源分支历史,未强制推送。 ### 无符号常量值域检查(Issue #639) 原行为:create_const_uint32([-1, 0]) 在 ctypes 数组转换时将 -1 静默回绕为 4294967295,而单元素/标量入口会报错。uint64 列表及超过 2^64-1 的标量同样缺少完整范围检查,导致实际图常量不同于输入值。 修复:uint32/uint64 列表在 ctypes 转换前验证相应值域,补齐 uint64 标量上界。非法值在原生调用前抛出 ValueError,合法两端逐位保留,既有负 uint64 错误文本不变。该问题建议 L2,由维护者确认。 ### 图输出归属检查(Issue #640) 原行为:receiver.set_graph_output(source.create_input(0), 0) 接受外来 builder 的 TensorHolder。EsSetGraphOutput 仅接收 tensor 指针,按该 tensor 所属图操作,无法验证 Python 接收方。 修复:要求 tensor.get_owner_builder() is self,外来输出在原生调用前抛出 ValueError;build_and_reset(outputs=...) 复用该检查。正常同图输出保持有效。该问题建议 L2;本地证明的是实际 Python/ABI 路由,未推定真实原生图结果。 ### 扫描整改与兼容性 前一轮整理保留了整数值域与输出归属修复,并抽取四种整数常量的共同准备逻辑;六种 tensor/node 属性设置使用 TensorHolder 的只读 ctypes _as_parameter_ 协议,保留指针类型、借用关系、UTF-8 参数和值。 2026-10-09 22:44 的新版未解决导出包含 36 条,所有代码片段与被扫描源提交 6f577a47e79ef94d551b605ad62213cefb8fa6c6 逐行匹配。上次只按公有/私有排列的处理不符合该扫描器的方法类别规则,现已纠正: | 规则 | 数量 | 本次处理 | | --- | --- | --- | | G.CLS.06 / function-order | 32 | 两个类依次排列魔法方法、属性、静态方法、类方法、普通方法、受保护实例辅助方法;类别内部保持原相对顺序,方法体保持等价。 | | G.CLS.11 / protected-access | 4 | 将原作用域协作方法明确为 apply_scope_infos_to_node,GraphBuilder 与 TensorHolder 的调用统一使用该名称;保留先属性、后控制依赖、返回原 holder 的流程,TensorHolder 的这四处调用不再跨类调用受保护方法。原 _apply_scope_infos_to_node 名称保留为内部转发入口,供仓库现有算子生成器及已有 Python 包装代码使用;不修改生成器、不重复施加作用域。 | 这 36 条是扫描诊断,不能当作 36 个活动缺陷。保持原 PR、源分支和两个原独立 Issue;未新增活动计数。仓库扫描规则、忽略项和产品依赖均未改动。 ## 关联的Issue - [Issue #639](https://gitcode.com/cann/ge/issues/639):无符号常量范围检查。 - [Issue #640](https://gitcode.com/cann/ge/issues/640):图输出 builder 归属。 两项独立缺陷修改同一生产文件,集中在本 PR。目标仍为 cann/ge:develop,已包含当前上游 d970d595b71c054a7a8ca74753fdec906875700e;当前源提交 cb3a6304d1fa3bcb56f1839db6cb6e4fd7334d1d,保留已有历史并正常推送。 ## 如何测试 shell python -m pytest -q -p no:cacheprovider --confcutdir=tests/ge/ut/ge/graph/pyge_tests tests/ge/ut/ge/graph/pyge_tests/graph_output_owner_cpu_test.py tests/ge/ut/ge/graph/pyge_tests/unsigned_constant_range_cpu_test.py - 当前最终代码 **85 passed**:原有 16 项缺陷回归、32 项整数常量兼容性用例、12 项真实 CFUNCTYPE/类型指针属性调用、1 项只读借用参数协议、24 项四种算术结果和已有生成包装代码的属性/控制依赖/同时作用域用例。 - 同一份最终测试对照本轮整改前的实际源码 6f577a47e79ef94d551b605ad62213cefb8fa6c6 亦为 **85 passed**,证明本轮顺序整理和协作方法改名保留已有行为;这不是未修复上游缺陷的基线,原缺陷复现见关联 Issue。 - 新作用域用例核对结果 holder、owner、节点属性名称和值、控制边的实际指针与数量,并执行离开作用域后的第二次算术,验证上下文无残留。对相同四种算术与三种作用域,额外覆盖现有生成器的 _create_from → 旧作用域入口调用方式,确认两种路径都有属性/控制边且仅应用一次。 - AST 对照确认两个生产类所有方法仅调整排列及作用域方法名/调用名,既有方法体其余内容不变;另保留一个委托统一实现的内部兼容入口。 - 原 .pre-commit-config.yaml 适用检查通过:Ruff 0.14.14 check/format、codespell、文本/冲突/私钥检查、原 OAT v1.0.5。完整最终 PR 文件按原 OAT.xml 扫描,文件类型、许可证、版权违规均为 0;git diff --check 通过。 - CPU 测试执行实际 Python 类和 ctypes 转换,原生库边界使用替身;未运行真实 GE 原生库、CANN/NPU 或全量 C++ UT/ST。远端完整 CI 尚待当前源提交结果,不以本地通过代替。 ## 文档与核对清单 - [x] 同步中英文特性与模块文档,纠正之前的方法排序说明,说明作用域协作。 - [x] 原 Issue、PR 与目标 develop 对应,确认当前上游时效性。 - [x] 原提交门禁和 CPU 回归通过。 - [x] 当前源提交完整 CI 已通过(以实际 checkout 和全部任务结果为准)。 - [x] 使用 Codex 辅助核查、实现和验证;验证范围如上。 ## 当前 CI 状态 前一轮源提交 6f577a47e79ef94d551b605ad62213cefb8fa6c6 在 Codecheck_dt 失败,作者提供的 36 条新版诊断已逐项定位并修改。此前一次整理提交的 Codecheck_dt 已通过,但 Python UT/ST 与 parser 失败日志明确指出生成包装代码调用的旧作用域方法缺失。复查全仓调用后确认同一兼容遗漏,当前提交 cb3a6304d1fa3bcb56f1839db6cb6e4fd7334d1d 已保留兼容入口并补齐回归。当前源码仅触发一轮复检;完整 CI 结果待按实际 checkout 和源提交确认,未将此前失败或未完成任务视为通过。 感谢各位维护者检视,后续会根据具体扫描或评审结果继续完善。 ## 当前源提交最终 CI 结果 当前源提交 cb3a6304d1fa3bcb56f1839db6cb6e4fd7334d1d 对应流水线 323552cba83646c5b97c2e75ba06f27d 已 **COMPLETED**;任务为 COMPLETED 98,没有失败任务,Codecheck_dt 与此前失败的 Python UT/ST、GE common、parser ST 均通过。 实际 checkout 的测试合并提交、源提交为直接父节点、以及全部修改文件内容均已核对一致。这是兼容修复后仅触发一次的同一轮运行;前一轮缺少旧方法入口的失败记录不作为当前结果。 当前源提交完整 CI 待核实的条目现已由上述实际结果完成。本地 85 项 CPU 回归和原提交门禁的验证范围不变,未声称本机执行过真实 CANN/NPU 全量构建。 See merge request: cann/ge!5300 | 9 天前 | |
fix(python): dispatch DataType lists before integer attributes (#633) Co-authored-by: gcw_Z57idahf<liaopinyi714@outlook.com> # message auto-generated for no-merge-commit merge: !5294 merge codex/fix-ge-list-datatype-dispatch-batch02 into develop fix(python): dispatch DataType lists before integer attributes (#633) Created-by: gcw_Z57idahf Commit-by: gcw_Z57idahf Merged-by: cann-robot Description: ## AI 参与情况 - [x] 是:Codex 辅助源码核查、修复与回归;测试边界如下。 ## 问题与修改 DataType 继承 IntEnum,也满足 int 判断。Node.set_attr("types", [DataType.DT_FLOAT16, DataType.DT_INT32]) 原来会先命中整数列表分支,调用 SetListInt,未写入应有的 LIST_DATA_TYPE 属性。读取相应数据类型属性时因此发生类型不匹配。 将完整 DataType 列表的分派放到普通 int 列表之前;普通 int/bool/float/string 列表维持既有分派。建议问题等级 L3,最终由维护者确认。 Fixes #633:https://gitcode.com/cann/ge/issues/633 ## 实际 CodeCheck 修复 [2026-10-03 04:52:51 的实际报告](https://www.openlibing.com/apps/entryCheckDashCode/MR_853437fcfb1542c089d047fa95459d73/d5112315b7df87360fce192c29fcf532?projectId=300033&codeHostingPlatformFlag=gitcode) 在 _attr.py 原第 44、45、46 行列出 3 项 G.CLS.11:装饰器从类外访问 _cached_value / _value_type。 将缓存操作放到所属类的 get_or_cache,装饰器仅转发 getter、预期类型与参数;辅助方法排在 __repr__ 后,getter 异常自然向上传播。缓存命中与成功更新语句在去除原无意义重抛包装后 AST 一致,所有既有类方法 AST 完全一致,包括本 PR 的 DataType 分派修复。同步更新原有四份中英文说明,原有 5 项回归和断言保持不变。 ## 分支与范围 目标仍为 **cann/ge:develop**。发布前合入新上游 d970d595b71c054a7a8ca74753fdec906875700e;旧源 619a995079218d70279daa0dd4a2ac69cb2c0f67 保留在历史中,本轮采用普通快进推送。当前修复提交 e2566fccca3e36984dd86dc9145189eeef189a6a。相对最新 develop 仍仅包含原 PR 的生产文件、现有回归及四份说明。 ## 验证 2026-10-10:Windows / Python 3.12 与 Ubuntu / Python 3 各执行现有回归,均 **5 passed**、零跳过,检查实际 Node.set_attr、setter 选择和 ctypes 缓冲值,以及普通列表分派。 sh python -m pytest -q -p no:cacheprovider --confcutdir=tests/ge/ut/ge/graph/pyge_tests tests/ge/ut/ge/graph/pyge_tests/attr_list_datatype_dispatch_test.py 每个平台另执行 24 组缓存封装前后生产实现对照:返回值、getter 参数及调用次数、缓存状态均一致,覆盖 None、false/zero、空列表、类型变化、异常与 setter 成败。原门禁、Ruff check/format、codespell、OAT 与 git diff --check 通过;OAT 文件类型、许可证头和版权头问题数均为 0。未修改钩子、许可证头或扫描规则。 测试使用实际 Python 实现;原生 C API、原生 pass 类型及未使用的 descriptor 边界仍按既有 CPU 用例替换。未验证真实 CANN/NPU、原生 ABI 或全量 C++ UT/ST。本地通过不代表远端完整 CI 通过,本轮提交已请求远端验证,最终结果待确认。 本轮维护既有 PR,不新增 Issue、PR 或活动计数。烦请重点检视 DataType 分派和缓存行为的兼容性;如需补充材料或修改,我会继续配合。 ## 2026-10-10 最新源提交远端 CI 核验 源提交 e2566fccca3e36984dd86dc9145189eeef189a6a 对应的[本轮 Actions](https://gitcode.com/cann/ge/actions/runs/ff45f470e9834a95b6c8e0c0b00ccdb4)已结束:**98 项作业全部 COMPLETED,失败项为 0**,包含 Codecheck_dt、SCA 以及本轮实际执行的构建/测试作业。 已读取实际 checkout 日志,核实它与测试合并提交 45cd99239990c0631b9eb5e43d045dbea0e4bad6 一致;该合并提交的直接父提交包含当前源提交,PR 全部修改文件的内容也与已测试源码逐个一致。此结论对应本轮新源码,替代上文该轮远端结果待确认的状态。 另在隔离检验目录组合 #5294 与 #5298 的当前修改,无合并冲突;两份原有回归合计 **10 项**在 Windows、Linux 分别全部通过、无跳过。组合检验未改动两个公开分支,也未替代各 PR 自身的远端 CI。本地真实 C API ABI、CANN/NPU 与全量 UT/ST 的验证边界仍以上文说明为准。 See merge request: cann/ge!5294 | 9 天前 | |
fix(python): restore DataType enums when reading list attributes (#637) Co-authored-by: gcw_Z57idahf<liaopinyi714@outlook.com> # message auto-generated for no-merge-commit merge: !5298 merge codex/fix-ge-list-datatype-readback-batch03-final into develop fix(python): restore DataType enums when reading list attributes (#637) Created-by: gcw_Z57idahf Commit-by: gcw_Z57idahf Merged-by: cann-robot Description: ## AI 参与情况 - [x] 是:Codex 辅助核查、修复与回归;验证范围如下。 ## 问题与修改 读取 LIST_DATA_TYPE 属性时,原生 ctypes 整数数组被直接转换为 Python int 列表。将 get_list_data_type() 的结果交给 set_list_data_type() 会因为元素不是 DataType 抛出 TypeError,也无法使用枚举的 name 属性。 在公共 list getter 中,仅对 VT_LIST_DATA_TYPE 将各元素恢复为 DataType 枚举;普通 int/float/bool 列表维持原类型。原生数组仍在 finally 中释放,包括非法枚举转换失败的路径。关联 Issue 的建议等级为 L2,最终等级由维护者确认。 Fixes #637:https://gitcode.com/cann/ge/issues/637 ## CodeCheck 修复 2026-10-03 06:06:57 的实际报告在 _attr.py 原第 44、45、46 行报告 G.CLS.11:装饰器从类外直接访问 _cached_value / _value_type。 将原缓存操作移入 _AttrValue.get_or_cache,装饰器只调用该方法并转发 getter、预期类型、args 和 kwargs。缓存命中和成功更新语句保持一致;缓存命中、类型不匹配、None、异常及 setter 成败语义保持一致。同步更新中英文已有说明,现有 5 项回归及断言保持不变。 ## 目标与基线 目标仍为 cann/ge:develop。本轮合入发布前刷新的上游 d970d595b71c054a7a8ca74753fdec906875700e;旧源提交 7d1628a0a15c70fa3df5cd10e004a2e316d0e2f3 保留在历史中,采用普通快进推送。相对新 develop 的差异仍只包含原 PR 的生产文件、现有回归和四份配套说明。 本轮提交:5e0f8a45d4b814d73c2380648bfbd72b9a3aeef4。 ## 验证 2026-10-10,Windows / Python 3.12 与 Ubuntu / Python 3 分别运行现有测试:各 **5 passed**,无跳过。 sh python -m pytest -q -p no:cacheprovider --confcutdir=tests/ge/ut/ge/graph/pyge_tests tests/ge/ut/ge/graph/pyge_tests/attr_datatype_readback_cpu_test.py 每个平台另对缓存封装前后的生产实现执行 24 组对照,返回值、getter 调用参数与次数、缓存状态均一致,覆盖空值、false/zero、空列表、类型变化、异常以及 setter 成败。 仓库原有 pre-commit、Ruff check/format、codespell、OAT 和 git diff --check 通过。OAT 复检前补齐本地 hook 环境声明的 XML 依赖;扫描规则、许可证头及仓库配置均保持原样。实际 OAT 文件类型、许可证和版权问题数均为 0。 测试执行实际 Python getter/setter、枚举及 ctypes 缓冲,只在 graph C API 边界使用已有替身;未验证真实 ABI、CANN/NPU 或全量 C++ UT/ST。远端完整 CI 需以本轮提交对应的实际结果为准,本地通过不代表远端通过。 本轮是既有 PR 的 CI 维护,不新增 Issue、PR 或活动计数。 ## 2026-10-10 后续 CodeCheck 两项修复 [12:25:16 的实际报告](https://www.openlibing.com/apps/entryCheckDashCode/MR_c649956d7bed4d88bc686fcf041d324e/5f127847a650fb938003917cdbe4d440?projectId=300033&codeHostingPlatformFlag=gitcode) 已没有原 3 项 G.CLS.11,剩余 2 项:第 186 行 G.CLS.06 要求 get_or_cache 排在 __repr__ 后;第 203 行 G.ERR.13 指出 except 直接 raise。 按报告移动该方法并移除无处理动作的重抛包装。其余方法 AST 完全一致;缓存方法在去除该空包装后,原有调用、命中判断和成功更新语句 AST 一致。getter 抛出的异常自然向上传播,失败时不会写入缓存。 再次运行原门禁/OAT 全通过;Windows 与 Linux 各 5 项原有回归通过、零跳过,另各 24 组原版/最终版缓存行为对照一致。原测试和断言未更改,CANN/NPU、真实 C API ABI 及全量 UT/ST 仍未在本地验证。已请求本轮新提交的远端 CI,完整结论待确认。 ## 2026-10-10 最新源提交远端 CI 核验 源提交 5e0f8a45d4b814d73c2380648bfbd72b9a3aeef4 对应的[本轮 Actions](https://gitcode.com/cann/ge/actions/runs/3251e9c604824b8585b1600e0163f21b)已结束:**98 项作业全部 COMPLETED,失败项为 0**,包含 Codecheck_dt、SCA 以及本轮实际执行的构建/测试作业。 已读取实际 checkout 日志,核实它与测试合并提交 8d623419beb6a256eade53a94dda9aa4e2f9937c 一致;该合并提交的直接父提交包含当前源提交,PR 全部修改文件的内容也与已测试源码逐个一致。此结论对应本轮新源码,替代上文该轮远端结果待确认的状态。 另在隔离检验目录组合 #5294 与 #5298 的当前修改,无合并冲突;两份原有回归合计 **10 项**在 Windows、Linux 分别全部通过、无跳过。组合检验未改动两个公开分支,也未替代各 PR 自身的远端 CI。本地真实 C API ABI、CANN/NPU 与全量 UT/ST 的验证边界仍以上文说明为准。 See merge request: cann/ge!5298 | 9 天前 | |
fix(python): preserve inherited patterns when extending a fusion pass (#635) Co-authored-by: gcw_Z57idahf<liaopinyi714@outlook.com> # message auto-generated for no-merge-commit merge: !5296 merge codex/fix-ge-pattern-inheritance-batch02 into develop fix(python): preserve inherited patterns when extending a fusion pass (#635) Created-by: gcw_Z57idahf Commit-by: gcw_Z57idahf Merged-by: cann-robot Description: ## AI 参与情况 - [x] 是:AI 辅助源码核查、修复与回归;未推断真实设备结果。 ## 描述 / 合入原因 ### 子类新增 @pattern 方法时静默丢失基类已声明的融合 pattern 触发与原始结果:Base(PatternFusionPass) 声明一个 @pattern,Child(Base) 再声明另一个;Base().patterns() 有一个,而 Child().patterns() 仍只有一个,继承的基类 pattern 消失。 根因:子类生成新的 patterns() 适配器时,仅遍历 cls.__dict__,没有读取继承的方法;旧基类适配器又被覆盖。 修复后:子类添加 decorated pattern 时保留未被覆盖的基类 pattern,按 Python MRO 处理同名覆盖与菱形继承;子类显式 legacy patterns() 的既有选择不改变。 影响与等级建议:通过继承复用并扩展 pattern 的融合 pass 静默减少可匹配的模式,导致应生效的优化遗漏。这里只验证 Python 方法发现和适配,不宣称已验证 NPU 优化性能。 L2,最终由维护者确认。 回归:6 项:保留基类、同名覆盖、属性遮蔽、菱形去重、显式 legacy 兼容、同类混用继续拒绝。调用实际 patterns()、Graph/GraphBuilder 及方法适配。 文件 tests/ge/ut/ge/graph/pyge_tests/pattern_inheritance_cpu_test.py。 同文件 1 项修复集中评审,每个独立 Issue 保留自己的触发条件与根因,不按链接出现次数累计数量。 ## 关联 Issue Fixes #635:https://gitcode.com/cann/ge/issues/635 ## 修改范围与目标 目标 cann/ge:develop,基线 ba12e592e8f84bc59709464bd3ad6ca010498d8b,提交 d3c80be75a68f462251e11834635ef5115436971。发布前刷新上游/Fork,从最新上游建立,只有一个任务提交。 生产实现 api/python/ge/ge/passes/pattern.py,另有回归和 GE 中英文成对设计说明。Python 文件通过项目配置下 Ruff 0.14.14 check/format;包含原文件等价条件合并、冗余 else 清理与长行折行,不将格式整理另计为问题。 ## 如何测试 本地 Windows / Python 3.12.14,加载实际生产 Python 源码。pyge 使用 pytest,与 scripts/build_fwk.sh 一致。Graph/GraphBuilder/Node 和方法适配使用实际实现,C API、原生 pass 类型及未使用的描述符边界被替换。 bash python -m pytest -q -p no:cacheprovider tests/ge/ut/ge/graph/pyge_tests/pattern_inheritance_cpu_test.py 分组结果:**6 passed in 0.10s**。独立用例先在未修复实现断言失败,再验证修复后通过;git diff --check 通过。 本地组合验证:32 passed, 49 subtests passed in 0.85s,与 ['llm-options-snapshot', 'llm-cache-transfer-metadata', 'llm-transfer-worker-results', 'llm-numpy-string-conversions'] 试合验证。未验证真实 CANN/NPU、原生 ABI、全量 C++ UT/ST。远端完整 CI 按当前 PR head 实际终态确认,本地通过不等于门禁通过。 ## 重复核查 核查全部作者、所有状态 Issue/PR 的标题正文,并读取 525 个开放 PR 的实际文件差异;接口失败已补查。 ## 类型与核对清单 - [x] Bug 修复,标题使用 fix - [x] 关联独立 Issue,写明实际/预期行为和等级依据 - [x] 执行上述本地回归与组合验证 - [x] GE 修改已配对中英文设计说明 - [ ] 当前提交的远端完整 CI 已通过(创建后触发并回查) ## 希望检视人员了解 未调整门禁阈值或新增产品运行依赖。请帮助核查范围和兼容性;如需设备验证或测试组织调整,会按实际意见继续完善。 See merge request: cann/ge!5296 | 9 天前 | |
refactor: Python 自定义算子上下文查询接口内部化,部分查询接口改为内部接口 Co-authored-by: du-hua1024<duhua2@huawei.com> # message auto-generated for no-merge-commit merge: !4948 merge op into develop refactor: Python 自定义算子上下文查询接口内部化,部分查询接口改为内部接口 Created-by: du-hua1024 Commit-by: du-hua1024 Merged-by: cann-robot Description: # Pull Request ## 描述 将 Python 自定义算子上下文的查询 input/attr 接口内部化: - EagerOpExecutionContext 的 input/attr 查询绑定改为 _ 前缀内部接口(_get_input_tensor、_get_input_num、_get_required_input_tensor、_get_optional_input_tensor、_get_dynamic_input_num、_get_dynamic_input_tensor、_get_attrs),仅由桥接层 schema-bound 组装逻辑使用;malloc_output_tensor、get_output_tensor、get_stream 等保持公开 - InferMetaContext 的查询绑定(含 _get_dynamic_output_num)同样改为内部接口;该上下文无公开获取途径,不再通过 ge.custom_op 导出 - RuntimeAttrs 为桥接层内部视图,不在公开类型桩中展示 - _ge_custom_op_native.pyi 移除全部内部查询方法,非公开接口不在公开 stub 中展示 - 同步更新桥接层调用点(_bridge.py、_infer_meta.py)、ge.custom_op 导出、UT 断言与 zh/en 设计文档 ## 变更类型 - [x] ♻️ 重构(既不修复错误也不增加功能的代码变动) ## 关联的Issue 无 ## 如何测试 1. pyge 全量 Python UT:772 passed, 1 skipped 2. ST 端到端(graph_engine_test,CustomOpFactoryStTest 全部 14 项):eager 执行、infer_meta(12 类属性)、compilable、annotated args 均通过 ## 核对清单 - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如:feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 无 See merge request: cann/ge!4948 | 1 个月前 | |
feat: Python自定义算子支持HostCpu后端register_kernel注册与执行上下文 Co-authored-by: du-hua1024<duhua2@huawei.com> # message auto-generated for no-merge-commit merge: !5074 merge new into develop feat: Python自定义算子支持HostCpu后端register_kernel注册与执行上下文 Created-by: du-hua1024 Commit-by: du-hua1024 Merged-by: cann-robot Description: # Pull Request ## 描述 本次PR为 ge.custom_op 自定义算子框架新增 HostCpu 后端内核注册能力与执行上下文支持: 1. 新增 register_kernel 装饰器与 OpBackend 枚举(DEVICE/HOST),同一 @register_op_impl 实现类可为多个后端分别声明 execute 回调。 2. 新增 HostCpuOpExecutionContext(malloc_output_tensor/get_output_tensor/make_output_ref_input),HostCpu 后端 execute 回调内可通过 get_execute_ctx 获取执行上下文。 3. runtime/custom_op:PythonCustomOpAdapter 新增 Execute(HostCpuOpExecutionContext*) 重载,bridge loader 支持 kHostCpuExecute 能力识别与 HostCpu 后端注册,pybind bridge 支持 host 端执行上下文的构建与分发。 4. 新增/更新 API 文档(register_kernel、OpBackend、HostCpuOpExecutionContext 系列、get_execute_ctx)及中英文设计文档。 5. 新增/完善 UT:多后端 register_kernel 注册、HostCpu 执行上下文、bridge loader 能力解析等(python_custom_op_test.py、python_custom_op_compile_test.py、python_custom_op_bridge_loader_unittest.cc 等)。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [x] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [x] 📝 文档内容更新 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在当前页面的右侧'关联Issue'部分添加相应Issue链接,并勾选'合并后关闭已关联的 Issue'选项。 --> ## 如何测试 描述测试此变更的步骤和前提条件: 1. 编译并运行相关 UT:python_custom_op_test.py、python_custom_op_compile_test.py、python_custom_op_bridge_loader_unittest.cc、python_custom_op_ir_meta_unittest.cc。 2. 定义自定义算子,分别使用 @register_kernel(backend=OpBackend.DEVICE) 与 OpBackend.HOST 声明 execute,在 HostCpu 执行回调内通过 get_execute_ctx 分配/获取输出张量,验证执行结果正确。 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如:feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 无。 See merge request: cann/ge!5074 | 1 个月前 | |
feat: 补充Python自定义算子多版本构建与fallback codegen能力 Co-authored-by: du-hua1024<duhua2@huawei.com> # message auto-generated for no-merge-commit merge: !4767 merge op into develop feat: 补充Python自定义算子多版本构建与fallback codegen能力 Created-by: du-hua1024 Commit-by: du-hua1024 Merged-by: cann-robot Description: # Pull Request ## 描述 本 PR 为 Python 自定义算子(custom op)补齐**多版本构建**与**运行时 fallback codegen** 能力,并统一 pass/runtime/custom_op 三组件的 native artifact 加载机制: **1. Python custom op 多版本构建能力** - build_python_native_matrix.py 泛化为组件化矩阵构建(--component custom_op),复用共享的 Python 探测(PATH/conda、cp39–cp314)、按版本重编译与 wheel 打包逻辑 - CMake 侧新增 custom_op native wheel target、矩阵构建 target 及组件配置(ge_python_write_native_build_config)生成 - 打包脚本(custom_postinst/prerm、ge-compiler_custom_install/uninstall)支持按当前解释器版本安装匹配的 ge_py_custom_op_bridge wheel,并安装到用户 site-packages **2. Python custom op fallback codegen 能力** - gen_fallback_resources.py 组件化:支持 --component pass/runtime/custom_op、--link-python/--no-link-python、bridge/native target 参数化及依赖头文件按原目录层级摆位(nested_subdir) - C++ 侧 bridge loader(python_custom_op_bridge_loader.cc、python_pass_bridge_loader.cc、python_fallback_codegen_helper.h)支持现场编译回退 - 统一共享层:ge/_internal/native_loader.py(新增,加载决策:sys.modules 缓存 → manifest 校验的预置 artifact → fallback codegen → 失败原因聚合诊断);ge/_internal/fallback_runtime.py 以 pass 原版实现为基座承载三组件的公共编译引擎(参数化 abi_key/artifacts/link_python) - 三组件(pass/runtime/custom_op)统一只接受通过 manifest 校验(Python tag、平台 tag、ABI)的 artifact,不再支持无校验的包内裸 import ## 变更类型 - [ ] 🐛 Bug 修复 - [x] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [x] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [x] 📦 构建过程或辅助工具的变动 - [x] 📝 文档内容更新 ## 关联的Issue ## 如何测试 1. 全量 UT、ST passed 2. example不受Python版本限制 ## 核对清单 - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如:feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 - 加载语义变更说明:runtime/custom_op 不再尝试包内无校验的 import_module 路径,统一走 manifest 校验,避免加载不匹配版本导致符号崩溃;开发态请使用 artifacts 目录或 fallback codegen - ge_py_install/.installed 测试安装目录的 make 规则无文件级依赖,增量构建时不会自动重装(已在本地验证时通过删除标记规避),后续可单独修复 See merge request: cann/ge!4767 | 1 个月前 | |
fix(python): reject TensorDesc dimensions outside the native range (#638) Co-authored-by: gcw_Z57idahf<liaopinyi714@outlook.com> # message auto-generated for no-merge-commit merge: !5299 merge codex/fix-ge-tensor-desc-dimension-range-batch03-final into develop fix(python): reject TensorDesc dimensions outside the native range (#638) Created-by: gcw_Z57idahf Commit-by: gcw_Z57idahf Merged-by: cann-robot Description: ## AI 参与情况 - [x] 是:Codex 辅助核查、修复与回归,验证边界如实列出。 ## 描述 / 合入原因 ### TensorDesc 超出 int64 范围的维度被 ctypes 静默截断 触发与原始结果:TensorDesc([2**64+7]) 传给实际 C API 边界的维度为 7,Shape 仍保留原值;构造、set_shape 与 set_origin_shape 都经过同一无范围校验。 根因:_normalize_dims 只检查 Python int 类型,ctypes.c_int64 接受大整数并按 64 位截断。 修改:共享维度归一化加入有符号 64 位范围校验,覆盖 Shape/TensorDesc 的构造和两个 shape setter。 修复后:原生 int64 无法表示的维度在构造 ctypes 数组前抛 ValueError,设备入口不调用;int64 边界、0 和现有动态维度 -1/-2 保留。 影响与等级建议:描述符携带与调用方不同的实际维度,形状计算和原生推导可能错误。仅确认边界数值截断,不声称已复现设备越界。 建议 L2,最终由维护者确认。 回归:11 项:构造、set_shape、set_origin_shape 三入口各覆盖过大/过小/回绕为合法正数的维度,Shape 入口拒绝及合法 signed-int64/动态标记控制。核对实际 ctypes 缓冲区。 tests/ge/ut/ge/graph/pyge_tests/tensor_desc_dimension_range_cpu_test.py,原版 10 failed, 1 passed in 0.13s;修复后 11 passed in 0.07s。 ## 关联 Issue Fixes #638:https://gitcode.com/cann/ge/issues/638 同一生产文件的 1 项修复集中在本 PR,各 Issue 保留独立触发与根因,不按 PR 链接出现次数累计问题。 ## 修改范围与目标 目标 cann/ge:develop,基线 ba12e592e8f84bc59709464bd3ad6ca010498d8b,提交 1ae402ba839d2a63b186bbe5cbf3795e311a743d。基于发布前刷新的上游建立,只有一个任务提交。 生产实现 api/python/ge/ge/graph/tensor_desc.py,新增对应回归;GE 配套中英文设计说明。Python 文件通过项目配置下 Ruff 0.14.14 check/format;必要的原文件等价整理和折行不另计问题。 ## 如何测试 本地 Windows / Python 3.12.14;测试执行实际生产 Python 实现。实际 enum 类、ctypes 缓冲区和 Python getter/setter/Shape/TensorDesc;只在 graph C API 边界使用局部替身。未验证真实 ABI 或设备,未分配巨大张量。 bash python -m pytest -q -p no:cacheprovider tests/ge/ut/ge/graph/pyge_tests/tensor_desc_dimension_range_cpu_test.py 最终分组:**11 passed in 0.07s**。git diff --check 通过。原实现与修复使用相同最终回归对照。 本地组合验证:26 passed in 0.18s;组合对象:!5294: DataType write dispatch。未验证真实 CANN/NPU、全量 C++ UT/ST。远端完整 CI 以当前 PR 提交对应 run 的实际终态为准,本地通过不代表远端门禁通过。 ## 重复核查 核查全部作者、全部状态 Issue/PR 的标题正文,并读取涉及四个仓库的 443 个开放 PR 实际文件差异。 ## 类型与核对清单 - [x] Bug 修复,标题使用 fix,关联独立 Issue - [x] 写明实际/预期行为、根因、影响及等级依据 - [x] 执行上述本地回归,列明替身与未验证范围 - [x] 核查当前目标分支、单任务提交与重复问题 - [ ] 当前提交远端完整 CI 已通过(创建后触发,结果以实际门禁为准) ## 希望检视人员了解 没有降低门禁或增加产品运行依赖。烦请帮助检查修复范围、兼容性及测试组织,后续按具体意见完善。感谢! See merge request: cann/ge!5299 | 9 天前 | |
fix(python): enforce unsigned constant and graph output contracts (#639,#640) Co-authored-by: gcw_Z57idahf<liaopinyi714@outlook.com> # message auto-generated for no-merge-commit merge: !5300 merge codex/fix-ge-builder-constant-and-output-contracts-batch04-final into develop fix(python): enforce unsigned constant and graph output contracts (#639,#640) Created-by: gcw_Z57idahf Commit-by: gcw_Z57idahf Merged-by: cann-robot Description: ## 描述 本 PR 修复 GraphBuilder 的两项独立契约问题,并处理本文件的扫描告警。目标为 cann/ge:develop,已合入当前上游 d970d595b71c054a7a8ca74753fdec906875700e;当前源提交 cb3a6304d1fa3bcb56f1839db6cb6e4fd7334d1d。更新保留原 PR 和源分支历史,未强制推送。 ### 无符号常量值域检查(Issue #639) 原行为:create_const_uint32([-1, 0]) 在 ctypes 数组转换时将 -1 静默回绕为 4294967295,而单元素/标量入口会报错。uint64 列表及超过 2^64-1 的标量同样缺少完整范围检查,导致实际图常量不同于输入值。 修复:uint32/uint64 列表在 ctypes 转换前验证相应值域,补齐 uint64 标量上界。非法值在原生调用前抛出 ValueError,合法两端逐位保留,既有负 uint64 错误文本不变。该问题建议 L2,由维护者确认。 ### 图输出归属检查(Issue #640) 原行为:receiver.set_graph_output(source.create_input(0), 0) 接受外来 builder 的 TensorHolder。EsSetGraphOutput 仅接收 tensor 指针,按该 tensor 所属图操作,无法验证 Python 接收方。 修复:要求 tensor.get_owner_builder() is self,外来输出在原生调用前抛出 ValueError;build_and_reset(outputs=...) 复用该检查。正常同图输出保持有效。该问题建议 L2;本地证明的是实际 Python/ABI 路由,未推定真实原生图结果。 ### 扫描整改与兼容性 前一轮整理保留了整数值域与输出归属修复,并抽取四种整数常量的共同准备逻辑;六种 tensor/node 属性设置使用 TensorHolder 的只读 ctypes _as_parameter_ 协议,保留指针类型、借用关系、UTF-8 参数和值。 2026-10-09 22:44 的新版未解决导出包含 36 条,所有代码片段与被扫描源提交 6f577a47e79ef94d551b605ad62213cefb8fa6c6 逐行匹配。上次只按公有/私有排列的处理不符合该扫描器的方法类别规则,现已纠正: | 规则 | 数量 | 本次处理 | | --- | --- | --- | | G.CLS.06 / function-order | 32 | 两个类依次排列魔法方法、属性、静态方法、类方法、普通方法、受保护实例辅助方法;类别内部保持原相对顺序,方法体保持等价。 | | G.CLS.11 / protected-access | 4 | 将原作用域协作方法明确为 apply_scope_infos_to_node,GraphBuilder 与 TensorHolder 的调用统一使用该名称;保留先属性、后控制依赖、返回原 holder 的流程,TensorHolder 的这四处调用不再跨类调用受保护方法。原 _apply_scope_infos_to_node 名称保留为内部转发入口,供仓库现有算子生成器及已有 Python 包装代码使用;不修改生成器、不重复施加作用域。 | 这 36 条是扫描诊断,不能当作 36 个活动缺陷。保持原 PR、源分支和两个原独立 Issue;未新增活动计数。仓库扫描规则、忽略项和产品依赖均未改动。 ## 关联的Issue - [Issue #639](https://gitcode.com/cann/ge/issues/639):无符号常量范围检查。 - [Issue #640](https://gitcode.com/cann/ge/issues/640):图输出 builder 归属。 两项独立缺陷修改同一生产文件,集中在本 PR。目标仍为 cann/ge:develop,已包含当前上游 d970d595b71c054a7a8ca74753fdec906875700e;当前源提交 cb3a6304d1fa3bcb56f1839db6cb6e4fd7334d1d,保留已有历史并正常推送。 ## 如何测试 shell python -m pytest -q -p no:cacheprovider --confcutdir=tests/ge/ut/ge/graph/pyge_tests tests/ge/ut/ge/graph/pyge_tests/graph_output_owner_cpu_test.py tests/ge/ut/ge/graph/pyge_tests/unsigned_constant_range_cpu_test.py - 当前最终代码 **85 passed**:原有 16 项缺陷回归、32 项整数常量兼容性用例、12 项真实 CFUNCTYPE/类型指针属性调用、1 项只读借用参数协议、24 项四种算术结果和已有生成包装代码的属性/控制依赖/同时作用域用例。 - 同一份最终测试对照本轮整改前的实际源码 6f577a47e79ef94d551b605ad62213cefb8fa6c6 亦为 **85 passed**,证明本轮顺序整理和协作方法改名保留已有行为;这不是未修复上游缺陷的基线,原缺陷复现见关联 Issue。 - 新作用域用例核对结果 holder、owner、节点属性名称和值、控制边的实际指针与数量,并执行离开作用域后的第二次算术,验证上下文无残留。对相同四种算术与三种作用域,额外覆盖现有生成器的 _create_from → 旧作用域入口调用方式,确认两种路径都有属性/控制边且仅应用一次。 - AST 对照确认两个生产类所有方法仅调整排列及作用域方法名/调用名,既有方法体其余内容不变;另保留一个委托统一实现的内部兼容入口。 - 原 .pre-commit-config.yaml 适用检查通过:Ruff 0.14.14 check/format、codespell、文本/冲突/私钥检查、原 OAT v1.0.5。完整最终 PR 文件按原 OAT.xml 扫描,文件类型、许可证、版权违规均为 0;git diff --check 通过。 - CPU 测试执行实际 Python 类和 ctypes 转换,原生库边界使用替身;未运行真实 GE 原生库、CANN/NPU 或全量 C++ UT/ST。远端完整 CI 尚待当前源提交结果,不以本地通过代替。 ## 文档与核对清单 - [x] 同步中英文特性与模块文档,纠正之前的方法排序说明,说明作用域协作。 - [x] 原 Issue、PR 与目标 develop 对应,确认当前上游时效性。 - [x] 原提交门禁和 CPU 回归通过。 - [x] 当前源提交完整 CI 已通过(以实际 checkout 和全部任务结果为准)。 - [x] 使用 Codex 辅助核查、实现和验证;验证范围如上。 ## 当前 CI 状态 前一轮源提交 6f577a47e79ef94d551b605ad62213cefb8fa6c6 在 Codecheck_dt 失败,作者提供的 36 条新版诊断已逐项定位并修改。此前一次整理提交的 Codecheck_dt 已通过,但 Python UT/ST 与 parser 失败日志明确指出生成包装代码调用的旧作用域方法缺失。复查全仓调用后确认同一兼容遗漏,当前提交 cb3a6304d1fa3bcb56f1839db6cb6e4fd7334d1d 已保留兼容入口并补齐回归。当前源码仅触发一轮复检;完整 CI 结果待按实际 checkout 和源提交确认,未将此前失败或未完成任务视为通过。 感谢各位维护者检视,后续会根据具体扫描或评审结果继续完善。 ## 当前源提交最终 CI 结果 当前源提交 cb3a6304d1fa3bcb56f1839db6cb6e4fd7334d1d 对应流水线 323552cba83646c5b97c2e75ba06f27d 已 **COMPLETED**;任务为 COMPLETED 98,没有失败任务,Codecheck_dt 与此前失败的 Python UT/ST、GE common、parser ST 均通过。 实际 checkout 的测试合并提交、源提交为直接父节点、以及全部修改文件内容均已核对一致。这是兼容修复后仅触发一次的同一轮运行;前一轮缺少旧方法入口的失败记录不作为当前结果。 当前源提交完整 CI 待核实的条目现已由上述实际结果完成。本地 85 项 CPU 回归和原提交门禁的验证范围不变,未声称本机执行过真实 CANN/NPU 全量构建。 See merge request: cann/ge!5300 | 9 天前 | |
fix: ONNX插件桥接按入口扫描触发并透出加载失败详情 Co-authored-by: huangfuqixun<3045324663@qq.com> # message auto-generated for no-merge-commit merge: !5177 merge fix/onnx-plugin-bridge-load-fail into develop fix: ONNX插件桥接按入口扫描触发并透出加载失败详情 Created-by: gentle-knight Commit-by: huangfuqixun Merged-by: cann-robot Description: # Pull Request ## 描述 修复 DT 问题单 1952: ASCEND_CUSTOM_OPP_PATH 非空即触发 ONNX Python 插件桥接加载,而该变量同时是 C++ 自定义算子的标准交付变量——纯 C++ 算子环境(目录无 python 插件入口、环境无桥接产物)下桥接加载必失败,且失败直接阻断该环境下所有 ONNX 模型解析,控制台仅报 E19999: LoadOnnxPythonPluginBridge failed. 泛化信息,具体原因仅进 plog。 **根因**:onnx_plugin 复用该环境变量作为触发判据,却缺失姊妹特性 custom_op 已有的入口存在性扫描(CheckNeedLoadPythonCustomOps),仅凭变量非空即触发桥接加载。 **修改内容**: 1. NeedLoad() 对齐 custom_op 模式:仅当环境变量各路径段存在可加载的 python 插件入口(.py 文件,或目录下单层非下划线开头的 .py 文件 / 含 __init__.py 的子目录)时才加载桥接;纯 C++ 自定义算子目录不再误触发,解析不再被环境阻断。新增可测试接口 HasPythonOnnxPluginEntryInEnv。 2. Python 运行时准备失败与桥接产物不匹配两类失败的根因详情(runtime key、可用产物清单、loader 路径、PYTHONPATH、修复指引)经 REPORT_INNER_ERR_MSG 透出到 ATC 控制台,替换原先仅进 plog 的泛化信息。 3. UT:入口扫描 11 种路径形态单测、纯 C++ 目录下 ModelParseToGraph 解析不阻断、产物缺失时失败详情上报断言;LoadThroughCommonLoader 改用真实临时目录适配新触发条件。 4. ST:test_onnx_parser 两处虚构路径改为真实插件入口目录(共享 helper 新增 ScopedPluginEntryDir)。 5. 文档:onnx_plugin_design.md 中英同步 3.2 节触发条件与第 2 节失败提示说明。 ## 变更类型 - [x] 🐛 Bug 修复 - [ ] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue DT 问题单 1952(pyPTO 模块功能测试:【自定义算子编译 OM 时报 LoadOnnxPythonPluginBridge failed】,Pegasus Auto V200R001C20B001,必现)。 ## 如何测试 1. 设置 ASCEND_CUSTOM_OPP_PATH 指向纯 C++ 自定义算子目录(无任何 .py 文件),ATC 编译任意 ONNX 模型 → 修复前报 E19999: LoadOnnxPythonPluginBridge failed.,修复后正常产出 OM 模型; 2. 设置变量指向含 .py 插件入口的目录但环境无匹配桥接产物(如 python 版本与产物 tag 不一致)→ 仍失败,但控制台报错包含 runtime key、可用产物清单与修复指引; 3. 单元/系统测试:ut_onnx_plugin_bridge_utest、ut_parser、st_parser。 测试结果:ut_onnx_plugin_bridge_utest 10/10、ut_parser 656/656、st_parser 65/65 全部通过;pre-commit 全部通过。 ## 核对清单 - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如:feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 - 行为变化说明:环境变量路径段无 python 插件入口时,桥接加载从"失败阻断编译"变为"跳过并打 INFO 日志",这是本次修复的目的(对齐 custom_op 特性既有行为);真插件用户环境不满足时仍失败,但报错可定位。 - 本分支基于 upstream/develop 最新(460147bb6)创建。 See merge request: cann/ge!5177 | 22 天前 | |
refactor: 清理文档目录,更新配置文件 | 4 个月前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 9 天前 | ||
| 9 天前 | ||
| 9 天前 | ||
| 9 天前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 1 个月前 | ||
| 9 天前 | ||
| 9 天前 | ||
| 22 天前 | ||
| 4 个月前 |