torch.use_deterministic_algorithms¶
- torch.use_deterministic_algorithms(mode, *, warn_only=False)[源代码][源代码]¶
设置 PyTorch 操作是否必须使用“确定性”算法。 也就是说,在给定相同输入,并在相同的软硬件上运行时,始终产生相同输出的算法。 启用后,操作将在可用时使用确定性算法,如果只有非确定性算法可用,则在调用时会抛出
RuntimeError
。注意
仅此设置并不总是足以使应用程序具有可重复性。 有关更多信息,请参阅 可重复性。
注意
torch.set_deterministic_debug_mode()
为此功能提供了另一种接口。以下通常为非确定性的操作在
mode=True
时将以确定性的方式运行在 CUDA 张量上调用
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()
时当尝试区分 CPU 张量且索引是张量列表时
torch.Tensor.__getitem__()
使用
accumulate=False
的torch.Tensor.index_put()
在 CPU 张量上调用时,使用
accumulate=True
的torch.Tensor.index_put()
在 CPU 张量上调用时,使用
accumulate=True
的torch.Tensor.put_()
在 CUDA 张量上调用
torch.Tensor.scatter_add_()
时在需要梯度的 CUDA 张量上调用
torch.gather()
时在 CUDA 张量上调用
torch.index_add()
时当尝试区分 CUDA 张量时
torch.index_select()
当尝试区分 CUDA 张量时
torch.repeat_interleave()
在 CPU 或 CUDA 张量上调用
torch.Tensor.index_copy()
时当 src 类型为 Tensor 且在 CUDA 张量上调用时
torch.Tensor.scatter()
当
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
当
mode='max'
时,尝试区分 CUDA 张量时torch.nn.EmbeddingBag
当
accumulate=False
时torch.Tensor.put_()
当
accumulate=True
且在 CUDA 张量上调用时torch.Tensor.put_()
在 CUDA 张量上调用
torch.histc()
时当在 CUDA 张量上调用且给定
weights
张量时torch.bincount()
在 CUDA 张量上调用
torch.kthvalue()
时当在 CUDA 张量上调用时,使用索引输出的
torch.median()
当尝试区分 CUDA 张量时
torch.nn.functional.grid_sample()
当 dtype 为浮点型或复数类型时,在 CUDA 张量上调用
torch.cumsum()
时当
reduce='prod'
且在 CUDA 张量上调用时torch.Tensor.scatter_reduce()
当使用量化张量调用
torch.Tensor.resize_()
时
此外,当启用此设置且启用
torch.utils.deterministic.fill_uninitialized_memory
时,多个操作会填充未初始化的内存。 有关更多信息,请参阅该属性的文档。如果 CUDA 版本为 10.2 或更高版本,除非设置了环境变量
CUBLAS_WORKSPACE_CONFIG=:4096:8
或CUBLAS_WORKSPACE_CONFIG=:16:8
,否则少数 CUDA 操作是非确定性的。 有关更多详细信息,请参阅 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...