本文简要介绍python语言中 torch.use_deterministic_algorithms
的用法。
用法:
torch.use_deterministic_algorithms(mode)
mode(
bool
) -如果为 True,则使潜在的非确定性操作切换到确定性算法或引发运行时错误。如果为 False,则允许非确定性操作。设置PyTorch操作是否必须使用“deterministic”算法。也就是说,给定相同的输入并且在相同的软件和硬件上运行时,算法总是产生相同的输出。启用后,操作将在可用时使用确定性算法,如果只有非确定性算法可用,则在调用时将抛出
RuntimeError
。以下 normally-nondeterministic 操作将在
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.bmm()
在 sparse-dense CUDA 张量上调用时torch.Tensor.__getitem__()
尝试区分 CPU 张量并且索引是张量列表时torch.Tensor.index_put()
与accumulate=False
torch.Tensor.index_put()
和accumulate=True
在 CPU 张量上调用时torch.Tensor.put_()
和accumulate=True
在 CPU 张量上调用时torch.Tensor.scatter_add_()
当input
维度为一并且在 CUDA 张量上调用torch.gather()
当input
维度为一并且在需要 grad 的 CUDA 张量上调用torch.index_add()
在 CUDA 张量上调用时torch.index_select()
尝试区分 CUDA 张量时torch.repeat_interleave()
尝试区分 CUDA 张量时torch.Tensor.index_copy()
在 CPU 或 CUDA 张量上调用时
以下 normally-nondeterministic 操作将在
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 张量并使用以下模式之一时:linear
bilinear
bicubic
trilinear
torch.nn.ReflectionPad1d
尝试区分 CUDA 张量时torch.nn.ReflectionPad2d
尝试区分 CUDA 张量时torch.nn.ReflectionPad3d
尝试区分 CUDA 张量时torch.nn.ReplicationPad1d
尝试区分 CUDA 张量时torch.nn.ReplicationPad2d
尝试区分 CUDA 张量时torch.nn.ReplicationPad3d
尝试区分 CUDA 张量时torch.nn.NLLLoss
在 CUDA 张量上调用时torch.nn.CTCLoss
尝试区分 CUDA 张量时torch.nn.EmbeddingBag
当mode='max'
尝试微分 CUDA 张量时torch.Tensor.scatter_add_()
当input
维度大于 1 并在 CUDA 张量上调用torch.gather()
当input
维度大于 1 并调用需要 grad 的 CUDA 张量torch.Tensor.put_()
当accumulate=False
torch.Tensor.put_()
当accumulate=True
并调用 CUDA 张量torch.histc()
在 CUDA 张量上调用时torch.bincount()
在 CUDA 张量上调用时torch.kthvalue()
调用 CUDA 张量torch.median()
在 CUDA 张量上调用时带有索引输出torch.nn.functional.grid_sample()
尝试区分 CUDA 张量时
如果 CUDA 版本为 10.2 或更高版本,则少数 CUDA 操作是不确定的,除非设置了环境变量
CUBLAS_WORKSPACE_CONFIG=:4096:8
或CUBLAS_WORKSPACE_CONFIG=:16:8
。有关更多详细信息,请参阅 CUDA 文档: https://docs.nvidia.com/cuda/cublas/index.html#cublasApi_reproducibility 如果未设置这些环境变量配置之一,则在使用 CUDA 张量调用时,将从这些操作中引发RuntimeError
:请注意,确定性操作的性能往往比非确定性操作差。
注意
此标志不会检测或防止由于在具有内部内存重叠的张量上调用就地操作或通过将此类张量作为操作的
out
参数而引起的非确定性行为。在这些情况下,不同数据的多次写入可能针对单个内存位置,并且无法保证写入的顺序。例子:
>>> torch.use_deterministic_algorithms(True) # Forward mode nondeterministic error >>> torch.randn(10).index_copy(0, torch.tensor([0]), torch.randn(1)) ... RuntimeError: index_copy does not have a deterministic implementation... # Backward mode nondeterministic error >>> torch.randn(10, requires_grad=True, device='cuda').index_select(0, torch.tensor([0], device='cuda')).backward() ... RuntimeError: index_add_cuda_ does not have a deterministic implementation...
参数:
相关用法
- Python PyTorch unicode_csv_reader用法及代码示例
- Python PyTorch unused用法及代码示例
- Python PyTorch unique_consecutive用法及代码示例
- Python PyTorch unbind用法及代码示例
- Python PyTorch unique用法及代码示例
- Python PyTorch uniform_partition用法及代码示例
- Python PyTorch uniform_用法及代码示例
- Python PyTorch unsqueeze用法及代码示例
- Python PyTorch frexp用法及代码示例
- Python PyTorch jvp用法及代码示例
- Python PyTorch cholesky用法及代码示例
- Python PyTorch vdot用法及代码示例
- Python PyTorch ELU用法及代码示例
- Python PyTorch ScaledDotProduct.__init__用法及代码示例
- Python PyTorch gumbel_softmax用法及代码示例
- Python PyTorch get_tokenizer用法及代码示例
- Python PyTorch saved_tensors_hooks用法及代码示例
- Python PyTorch positive用法及代码示例
- Python PyTorch renorm用法及代码示例
- Python PyTorch AvgPool2d用法及代码示例
- Python PyTorch MaxUnpool3d用法及代码示例
- Python PyTorch Bernoulli用法及代码示例
- Python PyTorch Tensor.unflatten用法及代码示例
- Python PyTorch Sigmoid用法及代码示例
- Python PyTorch Tensor.register_hook用法及代码示例
注:本文由纯净天空筛选整理自pytorch.org大神的英文原创作品 torch.use_deterministic_algorithms。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。