torch.use_deterministic_algorithms
- torch.use_deterministic_algorithms(mode, *, warn_only=False)[源代码]
-
设置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 张量时 -
在尝试对 CUDA 张量进行求导时,参考
torch.nn.ReplicationPad2d
-
在调用稀疏-稠密 CUDA 张量时,
torch.bmm()
-
在尝试对 CPU 上的张量进行求导,且索引是张量列表时发生的
torch.Tensor.__getitem__()
情况 -
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 张量上被调用时 -
torch.Tensor.scatter_reduce()
当reduce='sum'
或reduce='mean'
并且作用于 CUDA 张量时
以下通常是非确定性的操作,在
mode=True
时会抛出一个RuntimeError
:-
在尝试对 CUDA 张量进行求导时,参考
torch.nn.AvgPool3d
-
在尝试对 CUDA 张量进行求导时,参考
torch.nn.AdaptiveAvgPool2d
-
在尝试对 CUDA 张量进行求导时,参考
torch.nn.AdaptiveAvgPool3d
-
torch.nn.MaxPool3d
在尝试对 CUDA 张量求导时 -
在尝试对 CUDA 张量进行求导时,参考
torch.nn.AdaptiveMaxPool2d
-
在尝试对 CUDA 张量进行求导时,参考
torch.nn.FractionalMaxPool2d
-
在尝试对 CUDA 张量进行求导时,参考
torch.nn.FractionalMaxPool3d
-
torch.nn.functional.interpolate()
在尝试对 CUDA 张量求导并使用以下模式之一时:-
线性
-
bilinear
-
双立方
-
三线性
-
-
在尝试对 CUDA 张量进行求导时,参考
torch.nn.ReflectionPad1d
-
在尝试对 CUDA 张量进行求导时,参考
torch.nn.ReflectionPad2d
-
在尝试对 CUDA 张量进行求导时,参考
torch.nn.ReflectionPad3d
-
在尝试对 CUDA 张量进行求导时,参考
torch.nn.ReplicationPad1d
-
在尝试对 CUDA 张量进行求导时,参考
torch.nn.ReplicationPad3d
-
torch.nn.NLLLoss
在接收 CUDA 张量作为输入时的调用 -
torch.nn.CTCLoss
在尝试对 CUDA 张量求导时 -
torch.nn.EmbeddingBag
在尝试对模式为mode='max'
的 CUDA 张量进行求导时 -
torch.Tensor.put_()
当accumulate=False
时 -
torch.Tensor.put_()
当accumulate=True
并作用于一个 CUDA 张量时 -
torch.histc()
调用 CUDA 张量时 -
当调用
torch.bincount()
并传入一个 CUDA 张量和weights
张量时 -
torch.kthvalue()
用于操作 CUDA 张量 -
torch.median()
在处理 CUDA 张量时返回索引输出 -
在尝试对 CUDA 张量进行求导时,参考
torch.nn.functional.grid_sample()
-
torch.cumsum()
在处理浮点或复数类型的 CUDA 张量时被调用 -
torch.Tensor.scatter_reduce()
当reduce='prod'
且应用于 CUDA 张量时 -
torch.Tensor.resize_()
在传入量化张量时被调用
此外,当此设置和
torch.utils.deterministic.fill_uninitialized_memory
同时开启时,几个操作会填充未初始化的内存。有关该属性的更多信息,请参阅相关文档。如果 CUDA 版本为 10.2 或更高,除非设置了环境变量
CUBLAS_WORKSPACE_CONFIG=:4096:8
或CUBLAS_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...
-