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

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

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

我认为是线路
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,