已开启
【API一致性任务】Ascend for PyTorch API 一致性验证:torch.testing._internal.common_utils.skipIfRocm(NPU 验证) #4116
村雨雨雨创建于  8月18日
村雨雨雨
村雨雨雨
8月18日 创建

关联原任务 issue:https://gitcode.com/Ascend/pytorch/issues/3704

任务背景

torch.testing._internal.common_utils.skipIfRocm 是 PyTorch 官方测试装饰器:在 ROCm 环境下跳过被装饰的测试/函数,支持 @skipIfRocm 与 @skipIfRocm(msg="...") 两种用法,默认跳过消息为 "skipIfRocm: test doesn't currently work on the ROCm stack"。

官方用例检索结果

官方 test/test_testing.py 等使用该装饰器(如 TestImports.test_circular_dependencies),但未发现对其行为(运行路径、跳过路径、reason 消息、两种用法)的直接验证用例,也没有 NPU 专项覆盖。源码片段(官方装饰器定义):

def skipIfRocm(fn=None, *, msg=None):
    ...
    return skipIf(TEST_WITH_ROCM, msg or "test doesn't currently work on the ROCm stack")(fn)

NPU 适配验证情况(四版本环境)

在 NPU 上补充直接验证(本地验证文件 test/test_skip_if_rocm.py):NPU 上装饰器不跳过、正常执行;TEST_WITH_ROCM=True(mock)时按默认/自定义消息抛 unittest.SkipTest。运行命令与结果(v2.7.1 / v2.11.0 / v2.12.0 / master 四环境,Ascend 910B3 单卡):

# v2.7.1(torch 2.7.1+cpu + torch_npu 2.7.1.post8)
python test/test_skip_if_rocm.py -v
Ran 5 tests in 1.092s
OK
(class decoration preserves TestCase subclass: False)

# v2.11.0(torch 2.11.0+cu130 + torch_npu 2.11.0)
python test/test_skip_if_rocm.py -v
Ran 5 tests in 1.077s
OK
(class decoration preserves TestCase subclass: False)

# v2.12.0(torch 2.12.0+cu130 + torch_npu 2.12.0)
python test/test_skip_if_rocm.py -v
Ran 5 tests in 1.091s
OK
(class decoration preserves TestCase subclass: False)

# master(torch 2.13.0+cpu + torch_npu 2.13.0.rc1)
python test/test_skip_if_rocm.py -v
Ran 5 tests in 1.090s
OK
(class decoration preserves TestCase subclass: True)

补充说明(类装饰器版本差异,纯 Python 行为、与设备无关):master 的 skipIfRocm 基于 lazy_skip_if,对类目标原样返回类(类装饰用法有效,NPU 上正常执行);v2.7.1 / v2.11.0 / v2.12.0 实现为 @wraps + wrapper,类装饰后返回函数包装器、类不再被 unittest 识别为 TestCase。

资料补齐

torch.testing._internal.common_utils.skipIfRocm 属 PyTorch 私有测试内部接口,master 文档树 docs/zh/api/native_api 下无对应 Native API 文档条目,按验收标准「PyTorch 私有接口不需要补充资料」,无需资料补齐。

结论

该 API 在 NPU 上行为与官方一致(装饰器仅在 ROCm 环境生效,NPU无关);官方用例缺乏对该装饰器行为的直接覆盖,本 issue 已附运行日志与源码片段,按社区用例硬件解耦任务跟踪处理。


A2 补充实测(2026-09-10,Atlas A2 / 910B3 单卡,torch 2.9.0)

在 A2 环境(主机 6b99a1c1d57a,aarch64 / Ubuntu 22.04 / Python 3.11.15 / CANN 9.0.0)以 torch 2.9.0+cpu + torch_npu 2.9.0.post6 复跑同一验证脚本,结果与上述一致:

npu-smi 25.2.0:NPU 2 910B3  Health OK
torch: 2.9.0+cpu
torch_npu: 2.9.0.post6
device: 0
TEST_WITH_ROCM: False
(class decoration preserves TestCase subclass: False)

Ran 5 tests in 0.374s
OK
ALL_PASS
  • 5 项断言全部通过:NPU 上 @skipIfRocm 装饰的函数正常执行(含真实 NPU 算子运算);mock TEST_WITH_ROCM=True 时默认/自定义消息精确抛出 unittest.SkipTest;@skipIfRocm 与 @skipIfRocm(msg=...) 两种写法等价。
  • torch 2.9.0 的 skipIfRocm 仍为 @wraps + wrapper 实现(类装饰返回函数包装器、不被识别为 TestCase),与 2.7.1 / 2.11.0 / 2.12.0 一致;master 改用 lazy_skip_if 属后续上游变更。
  • 验证脚本:verify_skip_if_rocm.py(含 NPU 算子断言),运行环境 venv=/workspace/torchnpu26/venv。
likedislike
村雨雨雨村雨雨雨
8月18日 关联了看板:FrameworkPTAdapter 版本issue看板
TorchNPU-BotTorchNPU-Bot成员
8月18日 添加了label:help-wantedbot-triagedevent: accelerator-agnostic
TorchNPU-Bot
TorchNPU-Bot成员
8月18日 评论:

检测到社区任务相关 issue,自动添加标签:event: accelerator-agnostic、help-wanted

likedislike
村雨雨雨村雨雨雨
8月18日 修改了issue 的描述
此处折叠了5条事件消息 查看更多
TorchNPU-BotTorchNPU-Bot成员
8月20日 添加了label:event: api-consistency
TorchNPU-Bot
TorchNPU-Bot成员
8月20日 评论:

检测到社区任务相关 issue,自动添加标签:event: api-consistency、help-wanted

likedislike
群群青世界成员
8月20日 删除了label:event: accelerator-agnostic
群群青世界成员
8月20日 修改了issue 的描述
村雨雨雨村雨雨雨
8月24日 修改了issue 的描述
村雨雨雨村雨雨雨
8月25日 修改了issue 的描述
群青世界成员
9月1日 评论:

社区任务交付件初审结论:✔

1. 现状分析

  • 涉及 API:torch.testing._internal.common_utils.skipIfRocm。
  • 核心功能:PyTorch 官方测试装饰器,用于在 ROCm 环境下跳过特定测试或函数。支持无参 @skipIfRocm 和带消息参数 @skipIfRocm(msg="...") 两种用法。
  • 任务规范:依据《Torch-NPU API 一致性说明文档》,需验证该装饰器在 NPU 环境下的行为。由于 NPU 非 ROCm 环境,预期行为应为不跳过、正常执行测试,且装饰器逻辑本身不应影响 NPU 上的测试运行。

2. 适配方案

  • 代码适配:无需修改。
    • 该装饰器核心逻辑为判断 TEST_WITH_ROCM 标志位。在 NPU 环境下,该标志位为 False,装饰器直接返回原函数/类,无副作用。无需 TorchNPU 进行代码适配。
  • 用例适配:补充验证用例。
    • 官方用例缺乏对该装饰器行为(特别是跳过逻辑和装饰器保留属性)的直接验证。
    • 已在 TorchNPU 仓库本地补充验证脚本 test/test_skip_if_rocm.py,覆盖函数装饰、类装饰、自定义消息等场景。
  • 文档补齐:无需提交资料 PR。
    • 该 API 为 PyTorch 私有测试接口,无独立公开文档条目,且行为与上游一致,无单独限制条目。

3. NPU 功能验证

  • 验证策略:

    • 在 NPU 环境(Ascend 910B3)下,运行本地补充的 test_skip_if_rocm.py。
    • 验证点:
      1. @skipIfRocm 在 NPU 上不触发跳过,测试正常执行。
      2. @skipIfRocm(msg="custom") 自定义消息逻辑在 mock TEST_WITH_ROCM=True 时能正确抛出 unittest.SkipTest。
      3. 装饰器对类/函数的保留行为(Class/Function preservation)。
  • 验证环境:

    • OS: openEuler (具体版本未详述,通常配合 CANN 9.1.0)
    • NPU: Ascend 910B3 (CANN 9.1.0)
    • 版本: PyTorch/TorchNPU v2.7.1, v2.11.0, v2.12.0, master
  • 验证结果:

    • PASS。
    • 在所有四个目标版本中,测试用例均成功运行并通过。
    • 注意版本差异:
      • master 版本:类装饰器保留 TestCase 子类属性(True),行为更完善。
      • v2.7.1 / v2.11.0 / v2.12.0:类装饰器因实现细节(@wraps + wrapper)导致返回函数包装器,TestCase 识别为 False。此为 Python 装饰器实现差异,非 NPU 适配问题,且不影响 NPU 上函数/方法装饰器的正常使用。
  • 版本结果汇总表:

目标版本 torch / torch-npu 验证结果 备注
v2.7.1 2.7.1+cpu / 2.7.1.post8 PASS Ran 5 tests, OK (Class preservation: False)
v2.11.0 2.11.0+cu130 / 2.11.0 PASS Ran 5 tests, OK (Class preservation: False)
v2.12.0 2.12.0+cu130 / 2.12.0 PASS Ran 5 tests, OK (Class preservation: False)
master 2.13.0+cpu / 2.13.0.rc1 PASS Ran 5 tests, OK (Class preservation: True)

4. 资料检查

  • 检查范围:PyTorch 2.7、2.11、2.12、2.13 原生文档及 Ascend 原生 API 支持表。
  • 处理结论:
    • 该 API 为私有测试接口,无独立公开文档条目,且行为与上游完全一致。
    • 无需补充公开资料。

5. 最终结论

  • API 适配:无需修改(纯逻辑装饰器,NPU 环境下无影响)。
  • 用例适配:已补充本地验证用例,证明 NPU 环境下装饰器行为符合预期。
  • 文档补齐:无需补齐。
  • 验证结果:
    • 在 Ascend 910B3 环境及多个 PyTorch 版本下,skipIfRocm 功能验证均通过。
    • 确认该装饰器在 NPU 环境下行为与官方一致(即不跳过,正常执行)。
  • 动作:不提交 PR(因属测试工具内部验证,且官方用例需跟踪处理),以 Issue 记录结论,请维护者复检并完成任务验收。
likedislike
linhan37
9月9日 评论:

审核结论:该API用于在 ROCm 环境下跳过特定测试或函数,对硬件后端有依赖,非纯python逻辑。上游测试用例不完整的情况下需要在TorchNPU目录下新增测试用例文件补齐测试场景。因此该API为非issue-only场景,请开发者重新提交PR后由社区maintainer进一步检视。

likedislike
村雨雨雨村雨雨雨
9月10日 修改了issue 的描述
TorchNPU-BotTorchNPU-Bot成员
9月10日 添加了label:event: accelerator-agnostic
TorchNPU-Bot
TorchNPU-Bot成员
9月10日 评论:

检测到社区任务相关 issue,自动添加标签:event: accelerator-agnostic、help-wanted

likedislike
Jinfan LiuJinfan Liu
27 天前 关联了pull request:test: add NPU coverage for torch.testing._internal.common_utils.skipIfRocm
Jinfan LiuJinfan Liu
27 天前 关联了pull request:test: add NPU coverage for torch.testing._internal.common_utils.skipIfRocm
Jinfan LiuJinfan Liu
27 天前 关联了pull request:test: add NPU coverage for torch.testing._internal.common_utils.skipIfRocm
Jinfan LiuJinfan Liu
27 天前 关联了pull request:test: add NPU coverage for torch.testing._internal.common_utils.skipIfRocm
Jinfan Liu
Jinfan Liu
27 天前 评论:

本任务按 2026-09-09 审核结论(非 issue-only,需在 TorchNPU 目录下新增测试用例文件补齐测试场景)重新提交测试 PR:test/test_skip_if_rocm.py(仅新增测试,不改动实现代码)。

用例覆盖:skipIfRocm 裸装饰器 / 带 msg 两种用法的运行路径(NPU 不跳过),以及 TEST_WITH_ROCM 打开时的跳过路径与 reason(默认 msg / 自定义 msg),并通过 unittest runner 断言用例被上报为 skipped。

likedislike