在不同的机器上训练 PyTorch 模型会导致不同的结果 PyTorch 随机数生成器CUDA 卷积确定性CUDA RNN 和 LSTMDataLoader

问题描述

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

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

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

解决方法

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

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