You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyTorch中torch.rand(device)与torch.rand().to(device)结果差异原因探究

为什么两种PyTorch随机张量生成方式结果不同?

你的推测方向完全正确,核心原因是PyTorch的CPU和CUDA设备各自维护独立的随机数生成器(RNG),两者的状态完全分开:

  • 示例代码1中,torch.rand(..., device=device)直接调用CUDA设备的随机数生成器生成张量;
  • 示例代码2中,torch.rand(size=(2,3))先调用CPU的随机数生成器生成张量,再转移到GPU。

你只调用了torch.manual_seed(1234),这个函数默认只会初始化CPU的随机种子,CUDA设备的随机种子并没有被设置为相同值,两个生成器的初始状态不关联,所以输出的随机数序列自然不一样。

验证:让CPU和CUDA生成相同序列

如果同时初始化CPU和CUDA的随机种子,就能让两者生成一致的随机数:

import torch
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

# 同步CPU和CUDA的随机种子
torch.manual_seed(1234)
torch.cuda.manual_seed(1234)

# GPU直接生成
print("GPU直接生成:")
print(torch.rand(size=(2,3), device=device))
# CPU生成转GPU
print("\nCPU生成转GPU:")
print(torch.rand(size=(2,3)).to(device))

此时两者输出的随机数会完全一致,因为两个RNG的初始状态被同步了。

如果你的机器有多块GPU,需要用torch.cuda.manual_seed_all()来初始化所有CUDA设备的种子。

内容的提问来源于stack exchange,提问作者mkmkmkmk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 08:09:53