已合并
[feat] deterministic_level: add graph-mode guard and EX scope API #42191
[feat] deterministic_level: add graph-mode guard and EX scope API #42191
已合并
Lyric创建于 7月20日
Lyric
Lyric成员
7月20日

【合入来源】

如有社区issue,请关联issue链接
请勿携带内部流程信息(需求链接、问题单、内部issue等)

【修改方案】

1、新增 torch_npu.dynamo._deterministic_guard.install_npu_deterministic_level_guard()。在 Dynamo 的 TracingContext.guards_context.dynamo_guards 中注册 Lambda Guard。
2、新增 torch_npu._inductor.deterministic_cache,在 AscendC 编译 scope 内 patch。

【资料变更】

请确认是否涉及资料变更。如涉及,需要在PR中体现,并简要说明修改内容。如不涉及,需填写“不涉及”

不涉及

【接口变更】

请确认是否涉及跨代码仓或者客户面可见的接口变更。如涉及,需要详细说明接口以及对应的变更内容,同时需要在资料中体现。如不涉及,需填写“不涉及”

不涉及

【功能验证】

说明测试场景,测试方法。如果本次测试方式与常规单元测试不同,请详细说明您的测试步骤
新增/变更内容是否已新增/适配UT测试用例看护,并补充测试自验证截图

自验证ok

【CheckList】

PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x]

likedislike
Pull Request已成功合入, 合并人@ascend-robot
(感谢 Lyric 的贡献)
LyricLyric成员
7月20日 创建了 pull request,commit 59ba5d2d
atomgit-bot
atomgit-bot
7月20日 评论:

变更摘要

此 PR 为 AscendC 后端引入了 NPU 确定性等级(deterministic_level)的守卫与缓存隔离机制。当用户通过 torch_npu.npu.set_deterministic_level() 切换确定性等级时,该机制可触发 torch.compile 的重新编译,并在 AscendC 后端的缓存键中区分不同等级的编译结果,从而避免缓存的错误复用。

主要改动

  • 新增 torch_npu/dynamo/_deterministic_guard.py:实现 install_npu_deterministic_level_guard(),向 Dynamo 守卫上下文注册一个 GlobalStateSource 守卫,比较当前 deterministic_level 与编译时捕获的等级,不一致时触发重新编译。
  • 新增 torch_npu/_inductor/deterministic_cache.py:实现 patch_npu_deterministic_level_cache_keys(),通过猴子补丁修改 FxGraphHashDetails.__init__AOTAutogradCacheDetails.__init__,在 AscendC 后端下将 npu_deterministic_level 注入缓存哈希键,确保不同等级的编译结果相互隔离。
  • 修改 torch_npu/utils/_dynamo.py:在 _NpuBackendScope.__enter__ 中调用 patch_npu_deterministic_level_cache_keys(),在 patch_inductor_wrappernew_call 中调用 install_npu_deterministic_level_guard(),使守卫和缓存补丁在 AscendC 后端激活时自动生效。
  • 新增 torch_npu/npu/npugraph_ex/scope/__init__.py 中的 deterministic 函数:暴露 deterministic(level: int) 公共接口,委托至内部实现,并在 __all__ 中导出。
  • 新增测试文件 test/dynamo/test_deterministic_level_graph_mode.py:验证在不同 deterministic_level 之间切换时,编译次数符合预期(仅因等级变化而重新编译),而非每次调用都重新编译。
likedislike
atomgit-bot
atomgit-bot
7月20日 评论:

代码审查

审查总结

对 6 个变更文件逐一审查完毕,共发现 3 个问题:

优先级 数量 说明
P1 1 install_npu_deterministic_level_guard()TracingContext 创建前被调用,导致生产路径下 guard 永不被安装
P3 2 返回值被忽略导致静默失败;测试覆盖路径与生产路径不一致

各文件审查结果

  • test/dynamo/test_deterministic_level_graph_mode.py:测试逻辑本身正确(在 Dynamo tracing 期间通过自定义 backend 安装 guard),但未覆盖生产路径(patch_inductor_wrappernew_call),见 P3 发现。
  • test/torch_npu_schema.json:新增的 deterministic 条目 key 和 signature 与 scope/__init__.py 一致,无问题。
  • torch_npu/_inductor/deterministic_cache.py:monkey-patching 模式实现正确,idempotency guard 有效,无问题。
  • torch_npu/dynamo/_deterministic_guard.py:guard 创建和安装逻辑正确,闭包捕获语义正确,无问题。
  • torch_npu/npu/npugraph_ex/scope/__init__.py:新增 deterministic 函数遵循既有 limit_core_num 的委托模式,__all__ 更新正确,无问题。
  • torch_npu/utils/_dynamo.py_NpuBackendScope.__enter__ 中的 cache key patching 集成正确;patch_inductor_wrappernew_call 中 guard 安装时机错误(P1),且返回值被忽略(P3)。

整体风险判断

中高风险。P1 问题导致 deterministic level guard 在生产环境中完全失效——Dynamo 不会因 level 切换而重新 tracing(虽然 inductor 级别的 cache key patching 仍可能按不同 key 触发重新编译,但这不是 Dynamo guard 的预期行为)。建议在合入前修复 patch_inductor_wrapper 中 guard 的安装时机。

类型 数量
🔴 阻塞 1
🟡 建议 0

⛔ 需要修改

likedislike
ascend-robotascend-robot成员
7月20日 添加了label:stat/needs-squash
此处折叠了43条消息 查看更多
ascend-robotascend-robot成员
7月23日 添加了label:lgtm
ascend-robotascend-robot成员
7月23日 删除了label:ci-pipeline-passed
ascend-robotascend-robot成员
7月23日 解决了最后一个问题
ascend-robotascend-robot成员
7月23日 合入了pull request
ascend-robot
ascend-robot成员
7月23日 评论:
流水线 pytorch_gitcode_PR_multiVersion#12973 [ commitID:22c32a64 ] 已完成
likedislike