已合并
test: adapt Generator.clone_state test for NPU #43344
Flipped创建于 7月30日
test: adapt Generator.clone_state test for NPU #43344
已合并
Pull Request已成功合入, 合并人@ascend-robot
(感谢 Flipped 的贡献)atomgit-bot
7月30日 评论:
7月30日 评论:
变更摘要
此 PR 将 test_cuda.py 补丁文件中的 test_graphsafe_set_get_rng_state 测试用例适配至 NPU 后端,并同步完善了 CUDA/NPU 双后端兼容的基础设施。核心改动包括:将测试中所有 CUDA 特定 API(如 CUDAGraph、Stream、default_generators、current_stream 等)替换为 NPU 对应接口,同时在模块导入处新增 torch_npu.contrib.transfer_to_npu 导入、HAS_NPU 标志及 get_device_capability 回退逻辑,并在多处 memory_stats 相关调用中增加了 NPU 分支判断。
主要改动
- NPU 基础兼容设施:在模块导入部分新增
import torch_npu.contrib.transfer_to_npu、HAS_NPU变量定义,以及torch.cuda.get_device_capability在 NPU 环境下的兜底 lambda,确保后续 NPU 检测与降级逻辑可用 memory_stats系列调用双后端适配:将test_cuda.py中所有torch.cuda.memory_stats()、memory_stats_as_nested_dict()、reset_peak_memory_stats()、reset_accumulated_memory_stats()及empty_cache()调用替换为条件表达式,当HAS_NPU为真时使用torch.npu.*对应接口test_graphsafe_set_get_rng_state完整 NPU 适配:将该测试用例中的所有设备标识从"cuda"改为"npu",torch.cuda.CUDAGraph替换为torch.npu.NPUGraph,torch.cuda.Stream替换为torch.npu.Stream,torch.cuda.default_generators替换为torch.npu.default_generators,CUDA 流操作(stream、current_stream)均切换为 NPU 流 API,并新增@skipCUDAMemoryLeakCheckIf(True)和@skipCUDANonDefaultStreamIf(True)装饰器test_multinomial_invalid_probs_cuda设备选择适配:在大张量分配处增加device="cuda" if not HAS_NPU else device="npu"条件判断,使测试在 NPU 环境下正确定向到 NPU 设备test_cublas_workspace_explicit_allocationNPU 跳过:在该测试函数上新增@unittest.skipIf(HAS_NPU, "skip test on npu")装饰器,避免 NPU 环境下执行不兼容的 cuBLAS 相关测试


不准确?
ascend-robot
7月30日 评论:
7月30日 评论:
atomgit-bot
7月30日 评论:
7月30日 评论:
代码审查
经过全面审查,我确认除了已报告的 P2 问题外,diff 中没有其他需要报告的问题。多轮扫描的要点如下:
- multinomial 批处理逻辑(第 92-103 行):
batch_size=1000、while remaining > 0循环、min(remaining, batch_size)边界处理均正确,torch.cat拼接结果与原单次调用语义等价(replacement=True下每次抽取独立)。 get_device_capabilitymonkey-patch(第 14-15 行):仅在 CUDA 不可用时生效,属于 NPU 环境的防御性规避措施,不影响 CUDA 系统。TEST_NPU = True(第 24 行):硬编码值,仅用于跳过 NPU 不支持的 cublas 测试,与整个 patch 文件依赖torch_npu可导入的设计一致。@skipCUDAMemoryLeakCheckIf(True)/@skipCUDANonDefaultStreamIf(True):正确禁用了与 NPU 测试无关的 CUDA 特定检查。torch.rand(1, device="npu")初始化(第 156 行):在访问default_generators[0]前初始化 NPU 上下文,防御性但无害(随后manual_seed(0)会重置状态)。
审查总结
| 优先级 | 数量 |
|---|---|
| P0 | 0 |
| P1 | 0 |
| P2 | 1 |
| P3 | 0 |
已审查文件:
test_upstream/test/test_cuda.py.patch— 发现 1 个问题(P2:test_graphsafe_set_get_rng_state缺少 NPU graph 能力检查)
整体风险评估:低风险。 此变更是一个标准的 NPU 适配 patch,将 CUDA 测试用例转换为 NPU 等价版本。唯一值得关注的问题是新增的 test_graphsafe_set_get_rng_state 测试的 skip 条件未检查 NPU graph 能力,可能在无 graph 支持的 NPU 环境中导致测试崩溃而非优雅跳过。其余变更均为正常的 API 替换(torch.cuda.* → torch_npu.npu.* / torch.npu.*)和 NPU 限制的规避处理(multinomial 批处理),逻辑正确且与仓库中其他 patch 文件风格一致。
⚠️ 已识别出整体风险,但无法提取行内评论,请参考整体评估。


不准确?
7月30日 添加了label:ascend-cla/yes
此处折叠了83条消息 查看更多
li_jing_hw
28 天前 评论:
28 天前 评论:
/approve


28 天前 添加了label:approvedlgtm
28 天前 删除了label:ci-pipeline-passed
28 天前 合入了pull request
ascend-robot
28 天前 评论:
28 天前 评论:
流水线 pytorch_gitcode_PR_multiVersion#13939 [ commitID:3b8a5de5 ] 运行失败


【合入来源】
issue:【社区任务】7月社区任务第三期-Ascend for PyTorch API 一致性开发(124) #3235
issue:[Usage]: torch.Generator.clone_state NPU一致性验证 #3476
【修改方案】
1. API基础功能及用例覆盖
torch.Generator.clone_state用于克隆当前Generator的随机数状态,返回一个新的Generator对象。克隆后的 Generator 应保持与原 Generator 克隆时一致的 RNG 状态,从而保证后续随机数生成结果可复现。PyTorch v2.7.1 官方社区中已存在
torch.Generator.clone_state相关用例,检索结果包括:其中本次适配的官方目标用例为:
该用例直接覆盖以下 Generator RNG 状态相关功能:
graphsafe_get_stateclone_stategraphsafe_set_state因此,本次无需新增自定义测试用例,只需适配现有 PyTorch 官方用例。
2. v2.7.1原有patch情况
v2.7.1 已存在:
原 patch 已对
test/test_cuda.py中部分 CUDA 相关测试进行了 NPU 适配,但未覆盖torch.Generator.clone_state对应的官方目标用例:原始官方用例中使用了 CUDA 专属接口和 CUDA 设备:
torch.Generator(device="cuda") torch.cuda.CUDAGraph() torch.cuda.Stream() torch.cuda.default_generators[0] torch.cuda.stream(s) torch.cuda.current_stream().wait_stream(s) torch.rand(..., device="cuda")在 NPU 环境下直接运行时,该用例会因 CUDA graph 条件不满足而跳过,无法覆盖
torch.Generator.clone_state在 NPU 上的行为。此外,在导入测试依赖时,
torch.cuda.get_device_capability()在 NPU 环境下可能返回None,而 PyTorch 内部common_cuda.py中存在与 tuple 比较的逻辑,可能导致导入阶段触发异常:3. 本次修改内容
本次在已有
test_upstream/test/test_cuda.py.patch基础上补充test_graphsafe_set_get_rng_state的 NPU 适配。主要修改如下:
torch.rand(..., device="npu")generator = torch.Generator(device="npu")g = torch.npu.NPUGraph() s = torch.npu.Stream() default_generator = torch.npu.default_generators[0]with torch.npu.stream(s):@unittest.skipIf( not torch.npu.is_available(), "NPU not available, skipping tests" )torch.cuda.get_device_capability()返回None时的兼容处理,避免测试导入阶段触发NoneType与tuple比较异常:if torch.cuda.get_device_capability() is None: torch.cuda.get_device_capability = lambda device=None: (0, 0) # noqa: E731@skipCUDAMemoryLeakCheckIf(True) @skipCUDANonDefaultStreamIf(True)导入顺序说明
test/test_cuda.py中torch_npu/transfer_to_npu的导入位置属于初始化依赖例外。原因是
TestCuda类存在类级跳过条件:@unittest.skipIf(not TEST_CUDA, "CUDA not available, skipping tests") class TestCuda(TestCase):TEST_CUDA 会在 torch.testing._internal.common_cuda 导入阶段计算。若严格将 torch_npu / transfer_to_npu 放到所有 torch.testing 导入之后,NPU 环境下 TEST_CUDA 会提前计算为 False,导致目标用例 test_graphsafe_set_get_rng_state 被类级 skip,无法覆盖 torch.Generator.clone_state。
因此本 patch 保留 transfer_to_npu 在 common_cuda 导入前初始化。该处理不使用 try-except,不修改 TestCuda 类级 skip 条件,也不新增 NPU 专用测试类,仅用于保证官方目标用例能在 NPU 上真实执行。
本次只适配官方已有用例,不修改
torch.Generator.clone_state接口实现。本次适配的
test_graphsafe_set_get_rng_state已能覆盖torch.Generator.clone_state在 NPU Generator RNG 状态克隆场景下的核心行为。【资料变更】
已检查 master 分支
docs/zh/api/native_api资料目录,torch.Generator.clone_state为 PyTorch Generator 公开接口,非私有接口。该 API 属于 Generator 状态类 API,非计算类 API,与具体数据类型无关,限制与说明填写为-。根据 master 分支最新资料目录规则,
pytorch_2-9-0与pytorch_2-10-0目录已删除,本次不再补充;新增pytorch_2-13-0目录需要同步检查并刷新。资料补齐以 master 分支docs/zh/api/native_api当前实际存在的版本目录为准。资料补齐已在 master 分支单独提交 PR。本次未新增独立的
torch-Generator.md文件,而是在各版本已有torch.md的## Generators章节中补充clone_state()条目,位置放在set_state()之后,保持torch.Generator相关 API 统一维护在torch.md中。【接口变更】
不涉及。
本次仅适配 PyTorch 官方测试用例,不修改客户可见接口,不修改
torch.Generator.clone_state功能实现。【功能验证】
运行环境
将最终 patch 应用到干净的 PyTorch v2.7.1 工作树后,运行官方目标用例。
cd /workspace source /workspace/envs/torch-npu-2.7.1/bin/activate source /usr/local/Ascend/ascend-toolkit/set_env.sh unset PYTHONPATH export PYTHONPATH=/workspace/pytorch-v2.7.1/test export PYTHONNOUSERSITE=1 export PYTORCH_PRINT_REPRO_ON_FAILURE=0 python /workspace/pytorch-v2.7.1/test/test_cuda.py -v -k test_graphsafe_set_get_rng_state验证结果:
最终 patch 可以在干净工作树中正常应用,修改后的官方用例已在 NPU 上通过,可以覆盖
torch.Generator.clone_state的核心功能。【CheckList】