重现性
在 PyTorch 发行版,单独的提交或不同的平台上,不能保证完全可重复的结果。 此外,即使在使用相同种子的情况下,结果也不必在 CPU 和 GPU 执行之间再现。
但是,为了使计算能够在一个特定平台和 PyTorch 版本上确定特定问题,需要采取几个步骤。
PyTorch 中涉及两个伪随机数生成器,您将需要手动对其进行播种以使运行可重复。 此外,您应确保代码所依赖的所有其他库以及使用随机数的库也使用固定种子。
torch
您可以使用 torch.manual_seed()
为所有设备(CPU 和 CUDA)播种 RNG:
import torch
torch.manual_seed(0)
有一些使用 CUDA 函数的 PyTorch 函数可能会导致不确定性。 此类 CUDA 函数的一类是原子运算,尤其是atomicAdd
,其中不确定与相同值的并行加法顺序,对于浮点变量,其结果是方差的来源。 向前使用atomicAdd
的 PyTorch 函数包括 torch.Tensor.index_add_()
, torch.Tensor.scatter_add_()
, torch.bincount()
。
许多操作都向后使用atomicAdd
,特别是 torch.nn.functional.embedding_bag()
, torch.nn.functional.ctc_loss()
和许多形式的合并,填充和采样。 当前,没有简单的方法可以避免这些函数中的不确定性。
铜网
在 CuDNN 后端上运行时,必须设置另外两个选项:
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False
警告
确定性模式可能会对性能产生影响,具体取决于您的模型。 这意味着,由于模型具有确定性,因此与模型不确定时相比,处理速度(即每秒处理的批次项目)可能会更低。
脾气暴躁的
如果您或您正在使用的任何库都依赖于 Numpy,则也应为 Numpy RNG 设置种子。 这可以通过以下方式完成:
import numpy as np
np.random.seed(0)