在pytorch中设置随机种子后,结果不是固定的
我在运行代码时设置了随机种子,但我无法使用pytorch获得固定的结果。此外,我在代码中使用了batchnorm。评估和测试时,我设置了model.eval()。我想不出原因。我认为是线路在pytorch中设置随机种子后,结果不是固定的,pytorch,random-seed,Pytorch,Random Seed,我在运行代码时设置了随机种子,但我无法使用pytorch获得固定的结果。此外,我在代码中使用了batchnorm。评估和测试时,我设置了model.eval()。我想不出原因。我认为是线路torch.backends.cudnn.benchmark=True造成了问题。它使cudnn自动调谐器能够找到要使用的最佳算法。例如,卷积可以使用以下算法之一实现: def setup_seed(seed): np.random.seed(seed) random.seed(seed)
torch.backends.cudnn.benchmark=True造成了问题。它使cudnn自动调谐器能够找到要使用的最佳算法。例如,卷积可以使用以下算法之一实现:
def setup_seed(seed):
np.random.seed(seed)
random.seed(seed)
torch.manual_seed(seed) # cpu
torch.cuda.manual_seed_all(seed)
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = True
有几种算法没有再现性保证
因此,对确定性输出使用torch.backends.cudnn.benchmark=False
(这可能会减慢执行时间)
还有一些pytorch函数无法确定,如torch.backends.cudnn.benchmark
中所示,应将其设置为False
。哦,谢谢!但是在设置torch.backends.cudnn.benchmark=Flase
之后,我仍然无法得到固定的结果,我在CPU
和GPU
上进行测试。batchnorm有什么问题吗?@Yan Tijin有一些pytorch后端函数,如果您的代码(在后台)使用了其中一些函数(一些池、填充、采样技术使用它们),它们就不能确定。那么这可能就是原因。参考
CUDNN_CONVOLUTION_FWD_ALGO_GEMM,
CUDNN_CONVOLUTION_FWD_ALGO_FFT,
CUDNN_CONVOLUTION_FWD_ALGO_FFT_TILING,
CUDNN_CONVOLUTION_FWD_ALGO_IMPLICIT_GEMM,
CUDNN_CONVOLUTION_FWD_ALGO_IMPLICIT_PRECOMP_GEMM,
CUDNN_CONVOLUTION_FWD_ALGO_DIRECT,
CUDNN_CONVOLUTION_FWD_ALGO_WINOGRAD,
CUDNN_CONVOLUTION_FWD_ALGO_WINOGRAD_NONFUSED,