在pytorch中设置随机种子后结果不固定

问题描述

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  

我在运行代码时设置了随机种子,但是用pytorch无法得到固定的结果。此外,我在代码中使用了 batchnorm 。在评估和测试时,我设置了 model.eval()。我不知道原因。

解决方法

我认为引起问题的行torch.backends.cudnn.benchmark = True。它使 cudnn自动调谐器能够找到要使用的最佳算法。例如,可以使用these算法之一来实现 convolution

     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,

有几种没有可重复性保证的算法

因此,对于确定性输出,请使用torch.backends.cudnn.benchmark = False(这可能会降低执行时间)。

还有一些无法确定的pytorch函数,请参考this文档。