'torch.backends.cudnn.deterministic=True' 和 'torch.set_deterministic(True)' 有什么区别?

What does the difference between 'torch.backends.cudnn.deterministic=True' and 'torch.set_deterministic(True)'?

我的网络包括 'torch.nn.MaxPool3d',根据 PyTorch 文档(版本 1.7 - https://pytorch.org/docs/stable/generated/torch.set_deterministic.html#torch.set_deterministic),当 cudnn 确定性标志打开时会抛出 RuntimeError,但是,当我插入代码时 'torch.backends.cudnn.deterministic=True' 在我的代码开头,没有RuntimeError。为什么该代码不抛出 RuntimeError? 我想知道该代码是否保证了我训练过程的确定性计算。

torch.backends.cudnn.deterministic=True 只有适用于CUDA卷积运算,其他的都不适用。因此,不,它不能保证您的训练过程是确定性的,因为您还使用了 torch.nn.MaxPool3d,其后向函数对于 CUDA 是不确定的。

另一方面,

torch.set_deterministic() 会影响此处列出的所有正常非确定性操作(请注意,set_deterministic 在 1.8 中已重命名为 use_deterministic_algorithms):https://pytorch.org/docs/stable/generated/torch.use_deterministic_algorithms.html?highlight=use_deterministic#torch.use_deterministic_algorithms

如文档所述,列出的某些操作没有确定性实现。因此,如果设置了 torch.use_deterministic_algorithms(True),它们将抛出错误。

如果您需要使用像 torch.nn.MaxPool3d 这样的非确定性操作,那么目前您的训练过程没有办法是确定性的——除非您自己编写一个自定义的确定性实现。或者您可以打开一个 GitHub 问题请求确定性实现:https://github.com/pytorch/pytorch/issues

此外,您可能想查看此页面:https://pytorch.org/docs/stable/notes/randomness.html