Pull Request has been successfully merged by CANN-robot.
(Thank you for lfz2812's contribution.)变更摘要
该 PR 的标题与描述均为模板占位内容(未填写具体说明),从实际补丁看,本次改动集中在示例文件 examples/custom_op/annotated_args_refresh_add_custom/online/python/src/ge/annotated_add_custom.py,属于一次实验性的实现替换:将 _compile_kernel(platform) 中基于 bisheng/llvm-objcopy 子进程编译 Ascend C kernel 的完整流程,改写为基于 pypto.jit 的 kernel 编译尝试。由于 PR 描述未提供业务背景,可推断此改动主要为验证 PyPTO 编译路径(源分支名 pypto_try 与之吻合),尚未接通最终产物导出。
主要改动
_compile_kernel实现方式替换:删除了通过subprocess调用bisheng与llvm-objcopy完成 host 与.aicore二进制编译的整套逻辑,改为调用@pypto.jit(new_ir=False)装饰的add_kernel完成 kernel 编译。- 删除编译缓存与依赖导入:移除了基于
_KERNEL_SOURCE内容sha256摘要生成.o/.aicore.o并判断产物是否已存在的缓存机制,同时清理了hashlib、subprocess、tempfile等不再使用的 import。 - kernel 逻辑改用 PyPTO 描述:通过
pypto.Tensor([8192], pypto.DT_FP32)声明x/y/out张量,以pypto.set_vec_tile_shapes(1, 1024)设置分块并执行out.move(pypto.add(x, y))表达加法计算。 - 移除环境变量相关逻辑:删除了对
ASCEND_HOME_PATH、GE_PYTHON_CUSTOM_OP_BUILD_DIR的读取及 include/输出目录构建逻辑,新实现改为直接构造torch的 npu 张量驱动执行,并以torch.npu.synchronize()等待完成。 - 结尾改为占位异常:新实现末尾抛出
RuntimeError("PyPTO kernel compiled, but GE kernel binary export is not implemented"),明确表示 PyPTO 编译已跑通、但 GE kernel 二进制导出尚未实现,属于阶段性的占位变更。


代码审查
审查结论
审查文件(共 1 个):
examples/custom_op/annotated_args_refresh_add_custom/online/python/src/ge/annotated_add_custom.py— 发现 2 个问题:
| # | 严重度 | 置信度 | 行号 | 摘要 |
|---|---|---|---|---|
| 1 | P1 | 0.8 | 123–125 | _compile_kernel 无条件抛 RuntimeError,AnnotatedAddCustom.compile() 必然失败,样例的声明式地址刷新算子整体不可用(确定性功能回归) |
| 2 | P3 | 0.9 | 69–79 | _KERNEL_SOURCE 模块常量随旧编译实现删除而成为死代码(可选项) |
总体风险评估:
本次 diff 把 _compile_kernel 从"可产出真实 device binary 的 bisheng 编译实现"替换为"pypto JIT 编译并在真实 NPU 上启动 kernel 后无条件抛错"的桩实现。除渲染样例必然无法运行外,该实现还在抛错前执行了完整的设备 kernel 启动与同步副作用,把编译回调从纯离线编译变成对 NPU/torch_npu 的硬性运行期依赖,并引入硬编码 [8192]/FP32 形状、dtype 与 _KERNEL_NAME 符号名与剩余未改代码契约的不一致(这些不一致当前因必然抛错而不可达,一旦补上导出即会暴露)。就当前代码形态而言,该 PR 若目标为使样例跑通 pypto 链路则不可合入;建议补全导出实现或明确标记为 WIP。整体风险等级:中(样例级功能完全回归,不涉生产数据安全)。
| 类型 | 数量 |
|---|---|
| 🔴 阻塞 | 1 |
| 🟡 建议 | 0 |
⛔ 需要修改


/lgtm


/approve


Pull Request
描述
新增
pypto_add_custom样例,把 PyPTO JIT kernel 通过 Python 自定义算子接入 GE 图执行。主要变更:
@register_op注册PyptoAddCustom原型与infer_meta,@register_op_impl注册 schema-boundexecute(x, y)实现。EagerOpExecutionContext申请输出 Tensor,把输入/输出 device 地址经 torchaircreate_npu_tensors零拷贝包装为 torch Tensor,再执行@pypto.jitAdd kernel。src/run.py在 GE 初始化前于主线程预热编译,execute 回调只消费进程内编译缓存(GE 回调内触发 JIT 编译会因编译器子进程与 GE 运行时冲突而挂起)。ge.exec.static_model_ops_lower_limit=-1强制 RT2 动态执行路径,使 execute 回调在每次图执行时被调用(默认静态路径下回调仅在任务生成阶段执行一次,与 PyPTO 即时启动模型不兼容)。AnnotatedArgs的kernel_bin;Python execute 回调 + torchair 桥接是当前 PyPTO 接入 GE 的可行路径。examples/custom_op/README.md与README_en.md总览表同步登记新样例。变更类型
关联的Issue
无。
如何测试
静态检查:
已对全部变更文件执行 pre-commit(ruff/codespell/clang-format/OAT 等),全部通过。
NPU 环境验收(CANN 9.2.0 + Atlas A2):
source ${ASCEND_HOME_PATH}/set_env.sh cd examples/custom_op/pypto_add_custom bash run.sh实测输出:
核对清单
其他信息
output/下program.json、dy_kernel_*.o等)为进程内部缓存,未纳入版本管理。import torch/import torch_npu在import pypto之前,否则可能触发libc10.so静态 TLS 报错,README 已注明。torchair.llm_datadist.create_npu_tensors;torchair 包初始化失败的环境自动降级为直接加载其 C++ 扩展。annotated_args_refresh_add_custom):开销来自设备同步与 Python 回调,本样例聚焦链路打通而非性能。annotated_args_refresh_add_custom等基于 Ascend C 的样例。