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.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()
在需要梯度的 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 张量上调用时当
reduce='sum'
或reduce='mean'
且在 CUDA 张量上调用torch.Tensor.scatter_reduce()
时
当
mode=True
时,以下通常非确定性的操作将抛出RuntimeError
当尝试对 CUDA 张量进行微分时,
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()
linear
bilinear
bicubic
trilinear
当尝试对 CUDA 张量进行微分时,
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 张量进行微分且
mode='max'
时,torch.nn.EmbeddingBag
当
accumulate=False
时,torch.Tensor.put_()
当
accumulate=True
且在 CUDA 张量上调用torch.Tensor.put_()
时当在 CUDA 张量上调用
torch.histc()
时当在 CUDA 张量上调用
torch.bincount()
且提供了weights
张量时使用 CUDA 张量调用
torch.kthvalue()
在 CUDA 张量上调用
torch.median()
并输出索引时当尝试对 CUDA 张量进行微分时,
torch.nn.functional.grid_sample()
当在 CUDA 张量上调用
torch.cumsum()
且数据类型为浮点数或复数时当
reduce='prod'
且在 CUDA 张量上调用torch.Tensor.scatter_reduce()
时当使用量化张量调用
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.nvidia.com/cuda/cublas/index.html#results-reproducibility 如果未设置这些环境变量配置之一,则当使用 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...