torch.use_deterministic_algorithms
-
torch.use_deterministic_algorithms(mode, *, warn_only=False)[source]
-
Устанавливает, должны ли операции 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.bmm(), если вызывается с разреженными/плоскими тензорами 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_(), если вызывается с тензором CUDA -
torch.gather(), если вызывается с тензором CUDA, требующим градиент -
torch.index_add(), если вызывается с тензором CUDA -
torch.index_select(), при попытке дифференцирования тензора CUDA -
torch.repeat_interleave(), при попытке дифференцирования тензора CUDA -
torch.Tensor.index_copy()при вызове с тензором CPU или CUDA
Следующие обычно недетерминированные операции возбудят исключение
RuntimeErrorприmode=True:-
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.MaxUnpool1dtorch.nn.MaxUnpool2dtorch.nn.MaxUnpool3d-
torch.nn.functional.interpolate()при попытке дифференцирования тензора CUDA и использовании одного из следующих режимов:linearbilinearbicubictrilinear
-
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при попытке дифференцирования тензора CUDA, когдаmode='max' -
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 -
torch.cumsum()при вызове с тензором CUDA, если тип данных — с плавающей точкой или комплексный
Некоторые операции CUDA недетерминированы, если версия CUDA 10.2 или выше, если не установлены переменные окружения
CUBLAS_WORKSPACE_CONFIG=:4096:8илиCUBLAS_WORKSPACE_CONFIG=:16:8. См. документацию CUDA для получения более подробной информации: https://docs.nvidia.com/cuda/cublas/index.html#cublasApi_reproducibility Если ни одна из этих переменных окружения не установлена, при вызове с тензорами CUDA будет возбуждаться исключениеRuntimeErrorиз этих операций:Обратите внимание, что детерминированные операции обычно имеют худшую производительность, чем недетерминированные.
Примечание
Этот флаг не обнаруживает и не предотвращает недетерминированное поведение, вызванное вызовом операции in-place над тензором с внутренней перекрывающейся памятью или передачей такого тензора в качестве аргумента
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(0) ... 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...
© 2024, PyTorch Contributors
PyTorch has a BSD-style license, as found in the LICENSE file.
https://pytorch.org/docs/1.13/generated/torch.use_deterministic_algorithms.html