在不同的机器上训练PyTorch模型会导致不同的结果。

3

我正在两台不同的机器上训练相同的模型,但是训练出的模型并不完全相同。为了确保可重复性,我采取了以下措施:

# set random number 
random.seed(0)
torch.cuda.manual_seed(0)
np.random.seed(0)

# set the cudnn
torch.backends.cudnn.benchmark=False
torch.backends.cudnn.deterministic=True

# set data loader work threads to be 0
DataLoader(dataset, num_works=0)

当我在同一台机器上多次训练相同的模型时,训练出的模型总是相同的。然而,在两台不同的机器上训练出的模型并不相同。这种情况正常吗?还有其他的诀窍可以使用吗?


1
你的模型使用哪些层?除了@iacob的相关答案外,特定的层可能以非确定的方式运作。 - Shir
1个回答

3

有一些领域可能会引入额外的随机性,例如:

PyTorch 随机数生成器

您可以使用 torch.manual_seed()所有设备(包括 CPU 和 CUDA)设置 RNG 的种子:

CUDA 卷积确定性

虽然禁用 CUDA 卷积基准测试(上面讨论过)可以确保 CUDA 每次运行应用程序时选择相同的算法,但该算法本身可能是不确定的,除非设置 torch.use_deterministic_algorithms(True)torch.backends.cudnn.deterministic = True。后者仅控制此行为,不像 torch.use_deterministic_algorithms(),它将使其他 PyTorch 操作行为变得确定。

CUDA RNN 和 LSTM

在某些版本的 CUDA 中,RNN 和 LSTM 网络可能具有不确定性行为。请参见torch.nn.RNN()torch.nn.LSTM()了解详细信息和解决方法。

DataLoader

DataLoader 将遵循多进程数据加载算法中的随机性重新生成 worker。使用 worker_init_fn() 以保持可重复性:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接