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
相关产品推荐
相关产品推荐

