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 或更高,除非设置了环境变量 CUBLAS_WORKSPACE_CONFIG=:4096:8CUBLAS_WORKSPACE_CONFIG=:16:8,否则一些 CUDA 操作会是非确定性的。更多详情请参阅:CUDA 文档中的结果可重复性部分。如果没有设置这些环境变量配置之一,在调用带有 CUDA 张量的操作时将引发 RuntimeError

请注意,确定性操作的性能通常低于非确定性操作。

注意

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

参数

mode (bool) – 如果为 True,将使潜在的非确定性操作切换到确定性算法或抛出运行时错误。如果为 False,则允许执行非确定性操作。

关键字参数

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

示例:

>>> torch.use_deterministic_algorithms(True)

# Forward mode nondeterministic error
>>> torch.randn(10, device='cuda').kthvalue(1)
...
RuntimeError: kthvalue CUDA does not have a deterministic implementation...

# Backward mode nondeterministic error
>>> torch.nn.AvgPool3d(1)(torch.randn(3, 4, 5, 6, requires_grad=True).cuda()).sum().backward()
...
RuntimeError: avg_pool3d_backward_cuda does not have a deterministic implementation...
本页目录