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=Falsetorch.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()linearbilinearbicubictrilinear
当尝试对 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.nvda.net.cn/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...