已合并
[feat] deterministic_level: add graph-mode guard and EX scope API #42191
Lyric创建于 7月20日
[feat] deterministic_level: add graph-mode guard and EX scope API #42191
已合并
Pull Request已成功合入, 合并人@ascend-robot
(感谢 Lyric 的贡献)atomgit-bot
7月20日 评论:
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_wrapper的new_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之间切换时,编译次数符合预期(仅因等级变化而重新编译),而非每次调用都重新编译。


ascend-robot
7月20日 评论:
7月20日 评论:
atomgit-bot
7月20日 评论:
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_wrapper的new_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_wrapper的new_call中 guard 安装时机错误(P1),且返回值被忽略(P3)。
整体风险判断
中高风险。P1 问题导致 deterministic level guard 在生产环境中完全失效——Dynamo 不会因 level 切换而重新 tracing(虽然 inductor 级别的 cache key patching 仍可能按不同 key 触发重新编译,但这不是 Dynamo guard 的预期行为)。建议在合入前修复 patch_inductor_wrapper 中 guard 的安装时机。
| 类型 | 数量 |
|---|---|
| 🔴 阻塞 | 1 |
| 🟡 建议 | 0 |
⛔ 需要修改


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


【合入来源】
【修改方案】
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。
【资料变更】
不涉及
【接口变更】
不涉及
【功能验证】
自验证ok
【CheckList】