torch.use_deterministic_algorithms¶
- torch.use_deterministic_algorithms(mode, *, warn_only=False)[source][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.ReplicationPad2d
尝试对 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.ReplicationPad1d
尝试对 CUDA 张量进行微分时torch.nn.ReplicationPad3d
尝试对 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 版本是 10.2 或更高,则少数 CUDA 操作是非确定性的,除非设置了环境变量
CUBLAS_WORKSPACE_CONFIG=:4096:8
或CUBLAS_WORKSPACE_CONFIG=:16:8
。有关更多详细信息,请参阅 CUDA 文档:https://docs.nvda.net.cn/cuda/cublas/index.html#results-reproducibility 如果未设置这些环境变量配置之一,则在使用 CUDA 张量调用这些操作时,将抛出RuntimeError
。请注意,确定性操作的性能通常不如非确定性操作。
注意
此标志不会检测或阻止由于在具有内部内存重叠的张量上调用原地(inplace)操作,或将此类张量作为操作的
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...