torch.use_deterministic_algorithms¶
- torch.use_deterministic_algorithms(mode, *, warn_only=False)[source][source]¶
设置 PyTorch 操作是否必须使用“确定性”算法。也就是说,对于相同的输入,在相同的软件和硬件上运行时,总是产生相同输出的算法。启用后,当可用时,操作将使用确定性算法,如果只有非确定性算法可用,则调用时会抛出
RuntimeError
。注意
单独设置此选项并不总是足以使应用程序可重复。请参阅可重复性获取更多信息。
注意
为此功能提供了一种替代接口。
以下通常非确定性的操作在
mode=True
时将表现出确定性:当在 CUDA 张量上调用
torch.nn.Conv1d
时:当在 CUDA 张量上调用时
当在 CUDA 张量上调用时
当在 CUDA 张量上调用时
当在 CUDA 张量上调用时
当在 CUDA 张量上调用时
当尝试对 CUDA 张量进行微分时
当在稀疏-稠密 CUDA 张量上调用时
当尝试对 CPU 张量进行微分且索引为张量列表时
使用
accumulate=False
在 CPU 张量上调用时使用
accumulate=True
在 CPU 张量上调用时使用
accumulate=True
在 CUDA 张量上调用时使用 @1#
当对一个需要梯度的 CUDA 张量调用时
当对一个 CUDA 张量调用时
当尝试对 CUDA 张量求导时
当尝试对 CUDA 张量求导时
当在 CPU 或 CUDA 张量上调用时
当 src 类型为 Tensor 且在 CUDA 张量上调用时
当
reduce='sum'
或reduce='mean'
且在 CUDA 张量上调用时
以下通常非确定性的操作将在
mode=True
时抛出RuntimeError
:当尝试区分 CUDA 张量时
当尝试区分 CUDA 张量时
当尝试区分 CUDA 张量时
当尝试区分 CUDA 张量时
当尝试区分 CUDA 张量时
当尝试区分 CUDA 张量时
当尝试区分 CUDA 张量时
当尝试区分 CUDA 张量并使用以下任一模式时:
linear
bilinear
bicubic
trilinear
当尝试区分 CUDA 张量时
当尝试区分 CUDA 张量时
当尝试区分 CUDA 张量时
当尝试区分 CUDA 张量时
当尝试区分 CUDA 张量时
当对 CUDA 张量调用时
当尝试区分 CUDA 张量时
当尝试区分 CUDA 张量时,且
mode='max'
当
torch.Tensor.put_()
时accumulate=False
当
torch.Tensor.put_()
时accumulate=True
并且在一个 CUDA 张量上调用当在一个 CUDA 张量上调用时
torch.histc()
当在一个 CUDA 张量上调用时
torch.bincount()
并且提供了weights
张量在调用 CUDA 张量时
在调用 CUDA 张量时输出索引
在尝试对 CUDA 张量进行微分时
在调用 CUDA 张量且数据类型为浮点或复数时
当在 CUDA 张量上调用时
当使用量化张量调用时
此外,当启用此设置且启用
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
:注意,确定性操作的性能往往比非确定性操作差。
注意
此标志无法检测或防止由于在具有内部内存重叠的张量上调用原地操作或将此类张量作为操作的第 0#参数传递而引起的非确定性行为。在这些情况下,可能对单个内存位置进行多次不同数据写入,且写入顺序无法保证。
- 参数:
模式(
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...