已关闭
【API一致性任务】: torch.Generator.clone_state NPU一致性验证 #3476
Flipped创建于 7月30日关闭于 23 天前
7月30日 添加了label:usage
7月30日 修改了issue 的描述
7月30日 修改了issue 的描述
7月30日 关联了看板:@yao-xiaobai的看板 20260730
29 天前 添加了label:bot-triaged
TorchNPU-Bot
29 天前 评论:
29 天前 评论:
检测到当前 issue 已关联 PR,自动添加标签:bot-triaged


29 天前 修改了issue 的描述
29 天前 关联了看板:FrameworkPTAdapter 版本issue看板
23 天前 关闭了 issue
23 天前 添加了label:resolved
23 天前 修改标题为 “【API一致性任务】: torch.Generator.clone_state NPU一致性验证”,原标题为“[Usage]: torch.Generator.clone_state NPU一致性验证”
23 天前 修改标题为 “【API一致性任务】: torch.Generator.clone_state NPU一致性验证”,原标题为“[Usage]: torch.Generator.clone_state NPU一致性验证”
23 天前 添加了label:event: api-consistency
TorchNPU-Bot
23 天前 评论:
23 天前 评论:
检测到社区任务相关 issue,自动添加标签:event: api-consistency


ISSUE来源:【社区任务】7月社区任务第三期-Ascend for PyTorch API 一致性开发(124) #3235
环境信息
使用场景及问题
当前需确认以下 API 在 NPU 环境下的测试覆盖、适配情况和资料支持情况:
经检查,PyTorch 官方已有直接测试用例:
该用例在 NPU 上需要将 CUDA Generator、CUDA Graph、CUDA Stream 等相关逻辑适配为 NPU 对应接口,因此本任务走 1.1 路线:PyTorch 官方有用例,并且需要进行 NPU 适配。
按照当前版本要求,本次测试 patch 处理:
v2.9.0 和 v2.10.0 已进入维护阶段,暂不提交测试 patch;master 不需要提交 test_upstream patch。
资料补齐已转移到 master 分支下,因此资料部分需要检查:
PyTorch 2.6 和 2.8 按当前规则无需刷新。
一、API功能说明
torch.Generator.clone_state用于克隆当前Generator的随机数状态,返回一个新的Generator对象。克隆后的 Generator 应保持与原 Generator 克隆时一致的 RNG 状态,从而保证后续随机数生成结果可复现。
基础行为包括:
clone_state()得到新的 Generator;NPU 基础功能验证结果如下:
因此,该 API 在 NPU 上实际已支持,本次无需修改
torch.Generator.clone_state接口实现,只需补齐官方测试用例的 NPU 适配。二、官方用例覆盖情况
PyTorch 官方中检索到
torch.Generator.clone_state相关用例。PyTorch v2.7.1
其中本次适配的官方目标用例为:
PyTorch v2.11.0
其中本次适配的官方目标用例为:
PyTorch v2.12.0
其中本次适配的官方目标用例为:
该用例直接覆盖以下 Generator RNG 状态相关功能:
因此,无需在 torch-npu 的
test/目录新增自定义测试用例,只需适配现有 PyTorch 官方用例。三、NPU适配分析
官方目标用例原始逻辑使用 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 上的行为。原始运行结果表现为:
因此,本次需要将该官方 CUDA 用例适配为 NPU 用例,使其在 NPU 环境中真实执行,而不是跳过。
主要适配点如下:
import torch_npu from torch_npu.contrib import transfer_to_nputorch.cuda.get_device_capability()返回None时的兼容处理,避免测试导入阶段受到 CUDA capability 判断逻辑影响:if torch.cuda.get_device_capability() is None: torch.cuda.get_device_capability = lambda device=None: (0, 0) # noqa: E731torch.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" )@skipCUDAMemoryLeakCheckIf(True) @skipCUDANonDefaultStreamIf(True)修改后,该用例能够在 NPU 上真实执行并覆盖
torch.Generator.clone_state的核心行为。四、各版本patch处理
v2.7.1
v2.7.1 已存在:
原 patch 已对
test/test_cuda.py中部分 CUDA 相关测试进行了 NPU 适配,但未覆盖torch.Generator.clone_state对应的官方目标用例:本次在已有
test_upstream/test/test_cuda.py.patch基础上补充该目标用例的 NPU 适配。对应处理路线为 1.1.2:修改已有 patch。
v2.11.0
v2.11.0 原本不存在:
本次新增:
并完成
test/test_cuda.py::TestCuda.test_graphsafe_set_get_rng_state的 NPU 适配。对应处理路线为 1.1.1:新增 patch。
v2.12.0
v2.12.0 原本不存在:
本次新增:
并完成
test/test_cuda.py::TestCuda.test_graphsafe_set_get_rng_state的 NPU 适配。v2.12.0 中
test_graphsafe_set_get_rng_state后存在其他 CUDA graph 测试函数,例如:因此本次生成 patch 时已检查修改范围,确保只修改
test_graphsafe_set_get_rng_state目标函数,不误改后续其他 CUDA graph 测试函数。最终 v2.12.0 patch 修改范围已收敛为:
对应处理路线为 1.1.1:新增 patch。
五、功能验证
最终 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验证结果:
v2.11.0
运行命令:
cd /workspace source /workspace/envs/torch-npu-2.11.0/bin/activate source /usr/local/Ascend/ascend-toolkit/set_env.sh unset PYTHONPATH export PYTHONPATH=/workspace/pytorch-v2.11.0/test export PYTHONNOUSERSITE=1 export PYTORCH_PRINT_REPRO_ON_FAILURE=0 python /workspace/pytorch-v2.11.0/test/test_cuda.py -v -k test_graphsafe_set_get_rng_state验证结果:
v2.12.0
运行命令:
cd /workspace source /workspace/envs/torch-npu-2.12.0/bin/activate source /usr/local/Ascend/ascend-toolkit/set_env.sh unset PYTHONPATH export PYTHONPATH=/workspace/pytorch-v2.12.0/test export PYTHONNOUSERSITE=1 export PYTORCH_PRINT_REPRO_ON_FAILURE=0 python /workspace/pytorch-v2.12.0/test/test_cuda.py -v -k test_graphsafe_set_get_rng_state验证结果:
三个目标版本修改后的官方用例均在 NPU 环境下执行通过,不再是 skipped,能够正常覆盖:
graphsafe_get_stateclone_stategraphsafe_set_state六、资料检查
已检查 master 分支资料目录:
torch.Generator.clone_state 为 PyTorch Generator 公开接口,不属于 PyTorch 私有接口。该 API 用于克隆当前 Generator 的随机数状态,返回一个新的 Generator 对象;克隆后的 Generator 应保持与原 Generator 克隆时一致的 RNG 状态,用于保证后续随机数生成结果可复现。
根据 master 分支最新资料目录规则,pytorch_2-9-0 与 pytorch_2-10-0 目录已删除,本次不再补充;新增 pytorch_2-13-0 目录需要同步检查并刷新。资料补齐以 master 分支 docs/zh/api/native_api 当前实际存在的版本目录为准。
最新资料 PR 已完成以下补充:
本次资料 PR 修改范围为 master 最新资料目录中实际存在版本对应的 torch.md 文件:
补充后的资料条目格式如下:
原生文档:torch.Generator.clone_state
是否支持:是
限制与说明:-
综上,torch.Generator.clone_state 需要进行资料补齐,已通过 master 分支资料 PR 在现有版本的 torch.md 中完成支持情况刷新。
七、PR信息
v2.7.1:https://gitcode.com/Ascend/pytorch/pull/43344
v2.11.0:https://gitcode.com/Ascend/pytorch/pull/43346
v2.12.0:https://gitcode.com/Ascend/pytorch/pull/43348
master 资料 PR:https://gitcode.com/Ascend/pytorch/pull/43350
八、结论
torch.Generator.clone_state已有 PyTorch 官方直接测试用例覆盖。test_upstream/test/test_cuda.py.patch。test_upstream/test/test_cuda.py.patch。git diff生成。test_graphsafe_set_get_rng_state均重新验证通过,且结果为ok,不是 skipped。torch.Generator.clone_state接口实现。torch.Generator.clone_state在 master 分支docs/zh/api/native_api下五个目标版本均缺失资料条目。torch-Generator.md,不应写入torch-random.md。torch.Generator.clone_state为非计算类 API,与数据类型无关,资料中限制与说明填写为-。欢迎加入社区,感谢您对社区的贡献 🎉!