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

〖合入来源〗

Issue:

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

〖修改方案〗

本 PR 针对 v2.12.0 分支,补充以下 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.12.0 官方测试文件约:

42、66、332、392、405、420 行附近

本次主要修改内容如下:

  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.12.0 官方源码修改后通过 git diff 生成。

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

inputs = [torch.randn(size).npu().requires_grad_() for size in input_sizes]

以及:

input = torch.rand(6, 10).npu().requires_grad_()

对于 JIT 函数内部根据已有 Tensor 创建的新 Tensor,则使用已有 Tensor 的 device,例如:

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

本 PR 保留 PyTorch 官方测试原有测试语义,仅进行与 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.12.0
PyTorch:2.12.0+cpu
torch_npu:2.12.0rc1
npu available:True
npu device count:1
Tensor device:npu:0

本次 Runtime 验证对应提交:

PR:#41607
HEAD SHA:812351c8934f2d5387ee9fed8d91f57cb2fe5e8c

NPU Runtime 验证

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

torch._C._debug_set_autodiff_subgraph_inlining

运行前检查结果:

RUNTIME_TORCH=2.12.0+cpu
RUNTIME_TORCH_NPU=2.12.0.rc1
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.12.0 与 torch_npu 2.12.0rc1 匹配环境中可正常调用;
  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 提交 812351c8934f2d5387ee9fed8d91f57cb2fe5e8c

最新 commit 静态检查

本次调整 torch_npu import 顺序后,对最新 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

本 PR 当前远程分支信息:

源仓库:weixin_65332823/pytorch
源分支:test-debug-set-autodiff-subgraph-inlining-npu-v212
目标仓库:Ascend/pytorch
目标分支:v2.12.0

当前最新远端 commit:

812351c8934f2d5387ee9fed8d91f57cb2fe5e8c

本地与远端 SHA 已完成一致性检查:

REMOTE_VERIFY=PASS

修改范围审计结论:

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.12.0 与 torch_npu 2.12.0rc1 匹配环境中完成一致性验证。

当前结论如下:

  1. PyTorch v2.12.0 中已存在该 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. 当前最新本地 commit 与远端 source branch SHA 一致;
  17. 已在当前 PR 提交对应的 Ascend 910B4 NPU 环境中完成 Runtime 验证;
  18. 与目标 API 相关的 11 个 PyTorch 官方测试全部通过;
  19. Runtime 结果为 11 个测试、0 failure、0 error、0 skip;
  20. 实际测试 Tensor 位于 npu:0
  21. NPU_SYNCHRONIZE=PASS
  22. API24_RUNTIME_RESULT=PASS
  23. 该 API 为 PyTorch 私有调试接口,无需补充公开 API 资料。

〖CheckList〗

〖验证截图〗

NPU Runtime 验证

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

截图关键信息:

PR:#41607
目标版本:v2.12.0
HEAD:812351c8934f2d5387ee9fed8d91f57cb2fe5e8c

PyTorch:2.12.0+cpu
torch_npu:2.12.0rc1
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.12.0.png

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

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

变更摘要

本 PR 为 v2.12.0 分支新增一个 NPU 适配 patch 文件,针对 PyTorch 官方社区测试用例 test/jit/test_autodiff_subgraph_slicing.py 进行 NPU 设备适配。该 patch 在保留原始 torch._C._debug_set_autodiff_subgraph_inlining 自动微分子图切分和内联行为验证语义的前提下,将测试中的 Tensor 创建或迁移至 NPU 设备,使相关测试能够在昇腾 NPU 上执行。

主要改动

  • 导入 torch_npu 模块: 在 patch 目标文件中新增 import torch_npu,为后续 NPU 设备操作提供支持。
  • 通过 .npu() 将输入 Tensor 迁移至 NPU: 将 _perform_ad_subgraph_slicing 方法中的 inputs 列表生成表达式从 torch.randn(size, requires_grad=True) 改为 torch.randn(size, requires_grad=True).npu(),以及将 input 变量从 torch.rand(6, 10).requires_grad_() 改为 torch.rand(6, 10).requires_grad_().npu(),确保输入数据位于 NPU 设备。
  • 通过 device="npu" 指定 Tensor 创建设备: 在多处测试函数(如 fn)中,将 torch.zeros(...)torch.ones(...) 调用增加 device="npu" 参数,使这些直接创建的 Tensor 也在 NPU 上生成,避免跨设备操作不匹配。
likedislike
atomgit-bot
atomgit-bot
7月14日 评论:

代码审查

✅ 未发现问题

likedislike
此处折叠了247条消息 查看更多
梁松伟梁松伟成员
4 天前 解决了最后一个问题
ascend-robotascend-robot成员
4 天前 关闭了关联的issue
ascend-robotascend-robot成员
4 天前 合入了pull request
ascend-robot
ascend-robot成员
4 天前 评论:

Pull Request 已合并或已关闭。

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

likedislike
ascend-robot
ascend-robot成员
4 天前 评论:
流水线 pytorch_gitcode_PR_multiVersion#14067 [ commitID:812351c8 ] 已完成
likedislike