torch.use_deterministic_algorithms#
- torch.use_deterministic_algorithms(mode, *, warn_only=False)[source]#
设置 PyTorch 操作是否必须使用“确定性”算法。即,给定相同的输入,在相同的软件和硬件上运行时,总是产生相同输出的算法。启用后,操作将在可用时使用确定性算法,如果只有非确定性算法可用,调用它们时将抛出
RuntimeError
。注意
此设置本身并不足以使应用程序可复现。有关更多信息,请参阅 可复现性。
注意
torch.set_deterministic_debug_mode()
提供了此功能的一个替代接口。当
mode=True
时,以下通常非确定性的操作将表现为确定性的:torch.nn.Conv1d
在 CUDA 张量上调用时torch.nn.Conv2d
在 CUDA 张量上调用时torch.nn.Conv3d
在 CUDA 张量上调用时torch.nn.ConvTranspose1d
在 CUDA 张量上调用时torch.nn.ConvTranspose2d
在 CUDA 张量上调用时torch.nn.ConvTranspose3d
在 CUDA 张量上调用时torch.nn.ReplicationPad1d
在尝试区分 CUDA 张量时torch.nn.ReplicationPad2d
在尝试区分 CUDA 张量时torch.nn.ReplicationPad3d
在尝试区分 CUDA 张量时torch.bmm()
在稀疏-密集 CUDA 张量上调用时torch.Tensor.__getitem__()
在尝试区分 CPU 张量且索引为张量列表时torch.Tensor.index_put()
使用accumulate=False
torch.Tensor.index_put()
使用accumulate=True
在 CPU 张量上调用时torch.Tensor.put_()
使用accumulate=True
在 CPU 张量上调用时torch.Tensor.scatter_add_()
在 CUDA 张量上调用时torch.gather()
在需要 grad 的 CUDA 张量上调用时torch.index_add()
在 CUDA 张量上调用时torch.index_select()
在尝试区分 CUDA 张量时torch.repeat_interleave()
在尝试区分 CUDA 张量时torch.Tensor.index_copy()
在 CPU 或 CUDA 张量上调用时torch.Tensor.scatter()
当 src 类型为 Tensor 并在 CUDA 张量上调用时torch.Tensor.scatter_reduce()
当reduce='sum'
或reduce='mean'
且在 CUDA 张量上调用时
当
mode=True
时,以下通常非确定性的操作将抛出RuntimeError
:torch.nn.AvgPool3d
在尝试区分 CUDA 张量时torch.nn.AdaptiveAvgPool2d
在尝试区分 CUDA 张量时torch.nn.AdaptiveAvgPool3d
在尝试区分 CUDA 张量时torch.nn.MaxPool3d
在尝试区分 CUDA 张量时torch.nn.AdaptiveMaxPool2d
在尝试区分 CUDA 张量时torch.nn.FractionalMaxPool2d
在尝试区分 CUDA 张量时torch.nn.FractionalMaxPool3d
在尝试区分 CUDA 张量时torch.nn.functional.interpolate()
在尝试区分 CUDA 张量并使用以下任一模式时linear
bilinear
bicubic
trilinear
torch.nn.ReflectionPad1d
在尝试区分 CUDA 张量时torch.nn.ReflectionPad2d
在尝试区分 CUDA 张量时torch.nn.ReflectionPad3d
在尝试区分 CUDA 张量时torch.nn.NLLLoss
在 CUDA 张量上调用时torch.nn.CTCLoss
在尝试区分 CUDA 张量时torch.nn.EmbeddingBag
在尝试区分 CUDA 张量时,当mode='max'
torch.Tensor.put_()
当accumulate=False
时torch.Tensor.put_()
当accumulate=True
并在 CUDA 张量上调用时torch.histc()
在 CUDA 张量上调用时torch.bincount()
在 CUDA 张量上调用且提供了weights
张量时torch.kthvalue()
在 CUDA 张量上调用时torch.median()
在 CUDA 张量上调用时,并输出索引torch.nn.functional.grid_sample()
在尝试区分 CUDA 张量时torch.cumsum()
在 CUDA 张量上调用且 dtype 为浮点数或复数时torch.Tensor.scatter_reduce()
当reduce='prod'
且在 CUDA 张量上调用时torch.Tensor.resize_()
使用量化张量调用时
此外,当启用此设置并且
torch.utils.deterministic.fill_uninitialized_memory
启用时,一些操作会填充未初始化的内存。有关更多信息,请参阅该属性的文档。少数 CUDA 操作在 CUDA 版本为 10.2 或更高版本时是不可确定的,除非设置了环境变量
CUBLAS_WORKSPACE_CONFIG=:4096:8
或CUBLAS_WORKSPACE_CONFIG=:16:8
。有关更多详细信息,请参阅 CUDA 文档:https://docs.nvda.net.cn/cuda/cublas/index.html#results-reproducibility 如果未设置其中一个环境变量配置,在调用 CUDA 张量时,这些操作会引发RuntimeError
。请注意,确定性操作的性能通常比非确定性操作差。
注意
此标志不会检测或阻止由于对具有内部内存重叠的张量调用原地操作,或将此类张量作为操作的
out
参数而导致的非确定性行为。在这些情况下,对单个内存位置可能有多个不同数据的写入,并且写入顺序未得到保证。- 参数
mode (
bool
) – 如果为 True,则使潜在的非确定性操作切换到确定性算法或抛出运行时错误。如果为 False,则允许非确定性操作。- 关键字参数
warn_only (
bool
, optional) – 如果为 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...