PyTorch兰德(device)vs rand.to(device)

hgc7kmma  于 2023-11-19  发布在  其他
关注(0)|答案(1)|浏览(101)

Pytorch新手:我想知道为什么这两个产生不同的结果?我的猜测是一个在CPU中计算兰德并将Tensor发送到GPU,而一个将Tensor发送到GPU并在GPU中计算rand。

torch.manual_seed(1234)
print(torch.rand(size=(2,3),device=device))
print(torch.rand(size=(2,3),device=device))
"""
tensor([[0.1272, 0.8167, 0.5440],
        [0.6601, 0.2721, 0.9737]], device='cuda:0')
tensor([[0.6208, 0.0276, 0.3255],
        [0.1114, 0.6812, 0.3608]], device='cuda:0')
"""

个字符

gcxthw6b

gcxthw6b1#

简短回答

PyTorch目前无法实现随机数的跨设备可重复性。

长回答

正如Djinn的评论中已经提到的那样,在第一个代码示例(rand(..., device=device))中,你直接在GPU上产生随机数,而在第二个代码示例(rand(...).to(device))中,你在CPU上产生随机数,然后将它们移动到GPU上-当然,假设你的device是一个GPU设备。
为什么数字不同的根本问题是,在PyTorch中,在不同的设备上使用相同的随机种子通常不会产生相同的随机数序列。这是documented here(报价:* 结果可能无法在CPU和GPU执行之间重现,即使使用相同的种子 *)。一个旨在改变这一点的问题,以便行为可能与您预期的一样,2022年为opened in PyTorch's GitHub repo(此后一直保持开放)。
目前,如果你想确保相同的随机数序列,我看到的唯一选择似乎是:总是在同一个设备上创建随机数(可能最好总是在CPU上创建它们,因为它应该总是可用的,而GPU不一定可用),然后将它们移动到所需的设备进行处理(例如,如果GPU可用,则移动到GPU)。

相关问题