2
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()。我无法弄清楚其中的原因。

4

1 回答 1

2

我认为torch.backends.cudnn.benchmark = True导致问题的线路。它使cudnn 自动调谐器能够找到要使用的最佳算法。例如,可以使用以下算法之一来实现卷积:

     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 函数,请参阅文档。

于 2020-08-21T04:56:52.030 回答