【问题标题】:Training PyTorch models on different machines leads to different results在不同机器上训练 PyTorch 模型会导致不同的结果
【发布时间】:2021-08-03 06:57:44
【问题描述】:

我在两台不同的机器上训练相同的模型,但训练的模型并不相同。我已采取以下措施来确保重现性:

# 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)

当我在同一台机器上多次训练同一个模型时,训练的模型总是相同的。但是,在两台不同机器上训练的模型并不相同。这是正常的吗?我还有什么其他的技巧可以使用吗?

【问题讨论】:

  • 您在模型中使用了哪些层?除了@iacob 的相关答案外,特定层可能以非确定性方式运行。

标签: python pytorch random-seed reproducible-research


【解决方案1】:

有许多领域可能会额外引入随机性,例如:

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_init_fn() 保持可重复性:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-28
    • 1970-01-01
    • 2018-06-29
    • 1970-01-01
    • 2021-08-25
    • 1970-01-01
    • 2020-02-19
    相关资源
    最近更新 更多