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

【合入来源】

如有社区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中体现,并简要说明修改内容。如不涉及,需填写“不涉及”

不涉及

【接口变更】

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

不涉及

【功能验证】

image.png

自验证ok

【CheckList】

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

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

变更摘要

此 PR 为 NPU 图模式(graph mode)下的确定性计算功能新增了两个核心能力:一是通过 install_npu_deterministic_level_guard 实现图模式编译守卫,当 deterministic_level 发生变更时触发 Dynamo 重新编译;二是在 npugraph_ex.scope 中暴露 deterministic API,允许在 EX scope 内设置确定性计算级别。同时新增了对应的单元测试和接口模式声明。

主要改动

  • 新增 torch_npu/dynamo/_deterministic_guard.py:实现 install_npu_deterministic_level_guard() 函数,该函数在 Dynamo TracingContext 中注册一个基于 GlobalStateSource 的守卫,通过 lambda guard 捕获当前 _get_deterministic_level() 的值,当等级变化时触发图重新编译。
  • 新增 test/dynamo/test_deterministic_level_graph_mode.py:添加 TestDeterministicLevelGraphMode 测试类,验证在 torch.compile 图模式下切换 deterministic_level(1↔2)时仅触发两次编译(每个等级一次),确保守卫生效。
  • 修改 torch_npu/npu/npugraph_ex/scope/__init__.py:在 __all__ 中新增 "deterministic" 导出,并添加 deterministic(level: int) 函数,内部委托至 torch_npu.dynamo.npugraph_ex.scope.deterministic,为用户提供 EX scope 下的确定性级别设置入口。
  • 更新 test/torch_npu_schema.json:补充 torch_npu.npu.npugraph_ex.scope.deterministic 的函数签名声明 (level: int),保持接口 schema 与实现同步。
likedislike
不准确?
atomgit-bot
atomgit-bot
7月15日 评论:

代码审查

我已完成对所有四个变更文件的全面审查。以下是我的审查结论:


审查总结

逐文件审查结果

  1. test/dynamo/test_deterministic_level_graph_mode.py(新增测试文件)

    • 测试 install_npu_deterministic_level_guard 的守卫安装和基于 deterministic_level 变化的重新编译行为
    • 逻辑正确:通过交替设置 level=1/2,验证守卫导致恰好 2 次编译(每个 unique level 缓存一次编译结果)
    • tearDown 正确调用了 torch._dynamo.reset()super().tearDown() 进行清理
    • 未发现问题
  2. test/torch_npu_schema.json

    • 新增 torch_npu.npu.npugraph_ex.scope.deterministic 的 schema 条目
    • signature "(level: int)" 与函数签名一致
    • JSON 格式正确
    • 未发现问题
  3. torch_npu/dynamo/_deterministic_guard.py(新增模块)

    • 实现 install_npu_deterministic_level_guard() 函数,在 dynamo 追踪上下文中安装全局状态守卫
    • TracingContext.try_get() 空值检查正确,非追踪上下文时安全返回 False
    • 闭包正确捕获 captured_level_create_guard_fn 和内部 check_fn 都引用同一值
    • 使用 GlobalStateSource().make_guard() + add_lambda_guard() 的模式符合 PyTorch dynamo 内部 API 惯例
    • 未发现问题
  4. torch_npu/npu/npugraph_ex/scope/__init__.py

    • 新增 deterministic(level: int) 公共 API 函数
    • __all__ 中正确导出
    • 遵循与既有 limit_core_num 相同的委托模式(延迟导入 torch_npu.dynamo.npugraph_ex.scope
    • 未发现问题

问题统计

优先级 数量
P0 0
P1 0
P2 0
P3 0

整体风险评估

低风险。 此变更新增了一个确定性等级守卫(deterministic level guard)机制以及对应的公共 API 和测试。代码逻辑正确,遵循了现有代码的模式(limit_core_num 的委托模式、TracingContext 的使用方式),测试覆盖了守卫安装和重新编译的核心路径。未发现正确性、安全、可靠性或破坏性变更问题。

⚠️ 已识别出整体风险,但无法提取行内评论,请参考整体评估。

likedislike
不准确?
ascend-robotascend-robot成员
7月15日 添加了label:ascend-cla/yes
此处折叠了55条消息 查看更多
ascend-robotascend-robot成员
7月23日 删除了label:ci-pipeline-passed
ascend-robotascend-robot成员
7月23日 关闭了关联的issue
ascend-robotascend-robot成员
7月23日 合入了pull request
ascend-robot
ascend-robot成员
7月23日 评论:
流水线 pytorch_gitcode_PR_multiVersion#12974 [ commitID:a4c5f649 ] 已完成
likedislike
culechanculechan成员
7月24日 修改了pull request 的描述