已合并
test: adapt debug_set_autodiff_subgraph_inlining for NPU #41603
test: adapt debug_set_autodiff_subgraph_inlining for NPU #41603
已合并
yulin520创建于 7月14日
yulin520
yulin520
7月14日

〖合入来源〗

Issue:

https://gitcode.com/Ascend/pytorch/issues/2850

〖修改方案〗

本 PR 针对 v2.7.1 分支,补充以下 PyTorch 官方社区测试用例的 NPU 适配 patch:

test/jit/test_autodiff_subgraph_slicing.py

提交文件:

test_upstream/test/jit/test_autodiff_subgraph_slicing.py.patch

涉及 API:

torch._C._debug_set_autodiff_subgraph_inlining

该接口用于控制 PyTorch JIT 自动微分子图的内联行为,属于 PyTorch 内部调试接口。

PyTorch 官方社区已经提供相关测试,因此本 PR 不新增独立测试文件,仅对现有官方测试进行必要的 NPU 设备适配,不修改 API 实现代码。

相关测试及适配位置主要位于 PyTorch v2.7.1 官方测试文件约:

45、69、323、383、396、411 行附近

本次主要修改内容如下:

  1. 保留 PyTorch 官方社区测试用例原有验证逻辑和断言;
  2. 对两个默认创建在 CPU、需要参与 NPU 计算的外部输入 Tensor 使用 .npu() 迁移至 NPU;
  3. 对 JIT 函数内部新建的 zeros/ones Tensor,使用已有输入 Tensor 的 device 创建,避免 CPU/NPU Tensor 混用;
  4. import torch_npu # noqa: F401 按项目导入顺序放置在全部 torch.testing 相关导入之后;
  5. 保留自动微分子图切分和内联行为相关检查;
  6. 未新增 device_type
  7. 未增加额外 NPU 设备检测逻辑;
  8. 未增加 torch-npu API 实现代码;
  9. 未引入 transfer_to_npu 自动迁移;
  10. 未修改 torch.jit.scripttorch.jit.script_method
  11. patch 基于 PyTorch v2.7.1 官方源码修改后通过 git diff 生成。

本次实际设备适配方式包括:

inputs = [torch.randn(size).npu().requires_grad_() for size in input_sizes]
input = torch.rand(6, 10).npu().requires_grad_()

以及根据已有 Tensor 派生 device,例如:

torch.zeros(..., device=y.device)
torch.zeros(..., device=a.device)
torch.ones(..., device=y.device)

v2.7.1 分支原已存在该测试文件的相关 patch。本 PR 基于对应版本 PyTorch 官方源码重新整理该 patch,在保留原有测试语义的基础上完成显式 NPU 设备适配。

具体提交内容以当前 PR 最新 commit 为准。

〖资料变更〗

不涉及。

该 API 完整名称为:

torch._C._debug_set_autodiff_subgraph_inlining

该接口位于 PyTorch 内部 torch._C 模块,属于 PyTorch 私有调试接口。

本 PR 未新增公开 API,也未修改用户可见接口,因此无需补充 torch-npu 公共 API 资料。

〖接口变更〗

不涉及。

本 PR 仅补充 PyTorch 官方社区测试用例的 NPU 适配 patch,不修改:

API 定义
API 参数
返回值
调用方式
API 实现

〖功能验证〗

验证环境

已在以下匹配环境完成当前 PR 最新提交对应的 NPU Runtime 验证:

操作系统:Linux(Ubuntu)
昇腾硬件:910B4
CANN 软件版本:8.5.0
目标分支:v2.7.1
PyTorch:2.7.1+cpu
torch_npu:2.7.1.post2
npu available:True
npu device count:1
Tensor device:npu:0

本次 Runtime 验证对应提交:

PR:#41603
HEAD SHA:afab36ae0d3367eb2e99e800371ac30180544a0c

NPU Runtime 验证

已在真实 Ascend NPU 环境中执行与以下 API 相关的 PyTorch 官方测试:

torch._C._debug_set_autodiff_subgraph_inlining

运行前检查结果:

RUNTIME_TORCH=2.7.1+cpu
RUNTIME_TORCH_NPU=2.7.1.post2
RUNTIME_NPU_AVAILABLE=True
RUNTIME_PROBE_DEVICE=npu:0

TARGET_API_DIRECT_CALL=PASS
PREFLIGHT=PASS
GRAPH_EXECUTOR=ProfilingMode.PROFILING
GRAPH_EXECUTOR_INIT=PASS
TEST_MODULE_LOAD=PASS

本次连续执行与目标 API 相关的 11 个 PyTorch 官方测试场景:

RELATED_TEST_COUNT=11
RAN_TESTS=11

FAILURES=0
ERRORS=0
SKIPPED=0
EXPECTED_FAILURES=0
UNEXPECTED_SUCCESSES=0

测试完成后检查结果:

FINAL_STATE_RESET=PASS
NPU_SYNCHRONIZE=PASS
API24_RUNTIME_RESULT=PASS
FINAL_RESULT=PASS

本次 Runtime 验证确认:

  1. 目标 API 在 PyTorch v2.7.1 与 torch_npu 2.7.1.post2 匹配环境中可正常调用;
  2. 实际测试 Tensor 位于 npu:0
  3. 与该 API 相关的 11 个 PyTorch 官方测试均已执行;
  4. 11 个测试全部通过,无 failure、error 或 skip;
  5. 测试结束后已恢复 _debug_set_autodiff_subgraph_inlining(True)
  6. torch.npu.synchronize() 检查通过,未发现异步 NPU 错误;
  7. Runtime 验证对应当前 PR 提交 afab36ae0d3367eb2e99e800371ac30180544a0c

最新 commit 静态检查

对当前最新 patch 已重新完成以下检查:

PATCH_SEMANTIC_CHECK=PASS
PATCH_APPLY_CHECK=PASS
PATCH_APPLY=PASS
PY_COMPILE=PASS
SOURCE_DIFF_CHECK=PASS
IMPORT_ORDER=PASS
PATCH_GIT_DIFF_ROUNDTRIP=PASS
POST_COMMIT_WORKTREE=PASS
COMMITTED_PATCH_MATCH=PASS

当前 patch 设备适配检查结果:

PATCH_TORCH_NPU_IMPORT=1
PATCH_NPU_CALLS=2
PATCH_DERIVED_DEVICE=4
PATCH_DEVICE_TYPE=0

其中:

torch_npu import:1 处
.npu():2 处
从已有 Tensor 派生 device:4 处
device_type:0 处

torch_npu 导入顺序检查结果:

torch
→ torch.testing...
→ torch_npu

已确认:

torch_npu 位于全部 torch.testing 相关导入之后

patch 应用检查

已在对应版本 PyTorch 官方源码上执行:

git apply --check test_upstream/test/jit/test_autodiff_subgraph_slicing.py.patch

结果:

PASS

同时已将 patch 应用到对应 PyTorch 官方源码,并完成:

Python 语法检查:PASS
源码 git diff --check:PASS
import 顺序 AST 检查:PASS
patch git diff round-trip:PASS

〖修改范围审计〗

本 PR 当前仅包含以下一个文件:

test_upstream/test/jit/test_autodiff_subgraph_slicing.py.patch

最新检查结果:

FINAL_COMMIT_COUNT=1
FINAL_CHANGED_FILES=test_upstream/test/jit/test_autodiff_subgraph_slicing.py.patch

审计结论:

Changed files:1
Commits:1
patch 仅修改 test/jit/test_autodiff_subgraph_slicing.py
patch 不包含整文件删除
patch 不包含无关测试文件
patch 不包含日志、压缩包、环境文件或构建产物

同时确认:

未引入 transfer_to_npu
未新增 device_type
未增加额外 NPU 检测逻辑
未修改 torch.jit.script
未修改 torch.jit.script_method
未修改 API 实现

〖验证结论〗

torch._C._debug_set_autodiff_subgraph_inlining 已在 PyTorch v2.7.1 与 torch_npu 2.7.1.post2 匹配环境中完成一致性验证。

当前结论如下:

  1. PyTorch v2.7.1 中已存在该 API;
  2. torch-npu 无需增加对应 API 实现;
  3. PyTorch 官方社区已有相关测试用例,无需新增 Torch-NPU 原生测试文件;
  4. 两个外部输入 Tensor 已按照最小修改原则使用 .npu() 迁移至 NPU;
  5. JIT 函数内部新建 Tensor 使用已有输入 Tensor 的 device
  6. import torch_npu # noqa: F401 已位于全部 torch.testing 导入之后;
  7. 未新增 device_type
  8. 未增加额外 NPU 检测逻辑;
  9. 未引入 transfer_to_npu
  10. 未修改 PyTorch 官方测试原有核心逻辑和断言;
  11. patch 基于对应版本 PyTorch 官方源码通过 git diff 生成;
  12. patch 已通过对应 PyTorch 官方源码的 git apply --check
  13. patch 应用后的 Python 源码已通过语法和 whitespace 检查;
  14. 当前 PR 保持单 commit;
  15. 当前 PR 仅修改目标 patch 文件;
  16. 已在当前 PR 提交对应的 Ascend 910B4 NPU 环境中完成 Runtime 验证;
  17. 与目标 API 相关的 11 个 PyTorch 官方测试全部通过;
  18. Runtime 结果为 11 个测试、0 failure、0 error、0 skip;
  19. 实际测试 Tensor 位于 npu:0
  20. NPU_SYNCHRONIZE=PASS
  21. API24_RUNTIME_RESULT=PASS
  22. 该 API 为 PyTorch 私有调试接口,无需补充公开 API 资料。

〖CheckList〗

〖验证截图〗

NPU Runtime 验证

以下截图为当前 PR 提交对应的 Ascend 910B4 NPU Runtime 验证结果。

截图关键信息:

PR:#41603
目标版本:v2.7.1
HEAD:afab36ae0d3367eb2e99e800371ac30180544a0c

PyTorch:2.7.1+cpu
torch_npu:2.7.1.post2
Device:npu:0

Related tests:11
Ran tests:11
Failures:0
Errors:0
Skipped:0

NPU synchronize:PASS
Runtime result:PASS
Final result:PASS

242.7.1.png

以下截图为此前在匹配 Ascend 910B4 NPU 环境中的实际运行验证记录。
API24_v2.7.1.png

likedislike
Pull Request已成功合入, 合并人@ascend-robot
(感谢 yulin520 的贡献)
yulin520yulin520
7月14日 创建了 pull request,commit 9ec0ad2c
yulin520yulin520
7月14日 关联了issue:[Usage]: API一致性说明:torch._C._debug_set_autodiff_subgraph_inlining
atomgit-bot
atomgit-bot
7月14日 评论:

变更摘要

本 PR 为 test/jit/test_autodiff_subgraph_slicing.py 测试用例补充 NPU 适配 patch,主要将原有在 CPU 上运行的 torch._C._debug_set_autodiff_subgraph_inlining 相关测试逻辑迁移至 NPU 设备,通过添加 import torch_npu 导入并将所有 Tensor 创建或迁移到 NPU(使用 .npu() 方法或 device="npu" 参数),确保自动微分子图内联行为在 NPU 环境下同样可验证。

主要改动

  • 添加 torch_npu 导入:在测试文件中新增 import torch_npu,为后续 NPU 设备操作提供必要的模块支持。
  • 输入张量迁移至 NPU:将 _perform_ad_subgraph_slicing 辅助方法中的 torch.randn 创建的输入列表,以及 test_autodiff_subgraph_slicing_serialtorch.rand 创建的输入,均通过 .npu() 方法迁移到 NPU 设备。
  • 工厂函数指定 NPU 设备:将多处测试函数(如 fn)中的 torch.zerostorch.ones 创建改为显式指定 device="npu",确保这些零/一张量直接在 NPU 上分配。
likedislike
不准确?
atomgit-bot
atomgit-bot
7月14日 评论:

代码审查

经过对 patch 文件的逐行审查,我来确认以下几点:

  1. 导入 torch_npu(第9行):放置在 import torch 之后,在后续 .npu() 调用和 device="npu" 参数使用之前,位置正确。
  2. _perform_ad_subgraph_slicing 方法的输入张量适配(第18行):.npu() 将输入张量移动到 NPU,requires_grad=True 被保留。
  3. 独立测试用例的输入适配(第27行):.npu() 同样正确。
  4. 内部工厂函数适配(第36/45/54/63行):torch.zerostorch.ones 添加 device="npu",与输入 NPU 张量保持一致设备,避免了设备不匹配。
  5. 已移除 transfer_to_npu 导入:符合 PR 描述中的"未引入 transfer_to_npu 自动迁移"。

关于正确性的关键验证点:

  • 设备一致性:所有输入张量通过 .npu() 放置在 NPU 上;所有内部创建的张量通过 device="npu" 显式放置在 NPU 上。计算图中的所有操作数在同一设备上,不存在设备混用问题。
  • int(y) 在 TorchScript 中的行为aten::Int.Tensor 操作从张量提取标量值,与设备无关,不需要额外的 NPU kernel 支持。
  • JIT profiling 兼容性profile_and_replay=True 与 NPU 张量的交互已在验证环境中通过。

审查结论:该 patch 更改均为 NPU 适配所需的机械性修改,逻辑一致、设备放置正确、没有引入正确性或安全性问题。


关闭摘要

  • 审查了 1 个文件:test_upstream/test/jit/test_autodiff_subgraph_slicing.py.patch
  • 发现问题数:0(P0: 0, P1: 0, P2: 0, P3: 0)
  • 整体风险判断:低风险。所有变更均为 NPU 适配的标准模板操作(添加导入、指定设备),各张量设备放置一致,无逻辑错误或安全隐患。

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

likedislike
不准确?
此处折叠了256条消息 查看更多
梁松伟
梁松伟成员
8月15日 评论:

/approve

likedislike
ascend-robotascend-robot成员
8月15日 添加了label:approvedlgtm
ascend-robotascend-robot成员
8月15日 合入了pull request
ascend-robot
ascend-robot成员
8月15日 评论:

Pull Request 已合并或已关闭。

If you want to solve this problem, you can click here to do it in the FAQs.

likedislike
ascend-robot
ascend-robot成员
8月15日 评论:
流水线 pytorch_gitcode_PR_multiVersion#14065 [ commitID:afab36ae ] 已完成
likedislike