Shortcuts

torch.use_deterministic_algorithms

torch.use_deterministic_algorithms(mode, *, warn_only=False)[源代码]

设置PyTorch操作是否必须使用“确定性”算法。也就是说,在相同的输入、相同的软件和硬件条件下,总是产生相同输出的算法。当启用时,操作将在可用时使用确定性算法,如果只有非确定性算法可用,则在调用时会抛出RuntimeError

注意

仅此设置通常不足以使应用程序可重现。更多信息请参考可重现性

注意

torch.set_deterministic_debug_mode() 提供了此功能的替代接口。

以下通常为非确定性的操作在 mode=True 时将表现为确定性:

以下通常为非确定性的操作在 mode=True 时将抛出 RuntimeError

此外,当此设置开启并且 torch.utils.deterministic.fill_uninitialized_memory 也开启时,几个操作会填充未初始化的内存。 有关更多信息,请参阅该属性的文档。

如果CUDA版本为10.2或更高,一些CUDA操作是非确定性的,除非设置了环境变量CUBLAS_WORKSPACE_CONFIG=:4096:8CUBLAS_WORKSPACE_CONFIG=:16:8。更多详情请参阅CUDA文档:https://docs.nvidia.com/cuda/cublas/index.html#results-reproducibility 如果没有设置这些环境变量配置之一,当使用CUDA张量调用这些操作时,将会引发RuntimeError

请注意,确定性操作的性能往往比非确定性操作差。

注意

此标志不会检测或防止由对具有内部内存重叠的张量调用就地操作或将其作为 out 参数传递给操作引起的非确定性行为。在这些情况下,可能会对单个内存位置进行多次不同的写入,并且写入顺序无法保证。

Parameters

模式 (bool) – 如果为 True,则使可能的非确定性操作切换到确定性算法或抛出运行时错误。如果为 False,则允许非确定性操作。

Keyword Arguments

warn_only (bool, 可选) – 如果为True,没有确定性实现的操作将抛出警告而不是错误。默认值:False

示例:

>>> torch.use_deterministic_algorithms(True)

# 前向模式非确定性错误
>>> torch.randn(10, device='cuda').kthvalue(1)
...
RuntimeError: kthvalue CUDA 没有确定性实现...

# 反向模式非确定性错误
>>> torch.nn.AvgPool3d(1)(torch.randn(3, 4, 5, 6, requires_grad=True).cuda()).sum().backward()
...
RuntimeError: avg_pool3d_backward_cuda 没有确定性实现...