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 张量上调用时torch.nn.ReplicationPad2d当尝试对CUDA张量进行微分时torch.bmm()当在稀疏-稠密 CUDA 张量上调用时torch.Tensor.__getitem__()当尝试对一个CPU张量进行微分,并且索引是一个张量列表时torch.Tensor.index_put()使用accumulate=Falsetorch.Tensor.index_put()在 CPU 张量上调用时使用accumulate=Truetorch.Tensor.put_()在 CPU 张量上调用时,使用accumulate=Truetorch.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: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张量进行微分并且使用了以下模式之一时:线性双线性双三次三线性
尝试对CUDA张量进行微分时使用
torch.nn.ReflectionPad1d尝试对CUDA张量进行微分时使用
torch.nn.ReflectionPad2d尝试对CUDA张量进行微分时使用
torch.nn.ReflectionPad3dtorch.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=Falsetorch.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.nvidia.com/cuda/cublas/index.html#results-reproducibility 如果没有设置这些环境变量配置之一,当使用CUDA张量调用这些操作时,将会引发RuntimeError:请注意,确定性操作的性能往往比非确定性操作差。
注意
此标志不会检测或防止由对具有内部内存重叠的张量调用就地操作或将其作为
out参数传递给操作引起的非确定性行为。在这些情况下,可能会对单个内存位置进行多次不同的写入,并且写入顺序无法保证。- Parameters
模式 (
bool) – 如果为 True,则使可能的非确定性操作切换到确定性算法或抛出运行时错误。如果为 False,则允许非确定性操作。- Keyword Arguments
warn_only (
bool, 可选) – 如果为True,没有确定性实现的操作将抛出警告而不是错误。默认值:False
示例:
>>> torch.use_deterministic_algorithms(True) # 前向模式非确定性错误 >>> torch.randn(10, device='cuda').kthvalue(1) ... RuntimeError: kthvalue CUDA 没有确定性实现... # 反向模式非确定性错误 >>> torch.nn.AvgPool3d(1)(torch.randn(3, 4, 5, 6, requires_grad=True).cuda()).sum().backward() ... RuntimeError: avg_pool3d_backward_cuda 没有确定性实现...