Spec-Zone.ru › PyTorch 2

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, который требует grad
  • torch.index_add() при вызове на тензоре CUDA
  • torch.index_select() при попытке дифференцирования тензора CUDA
  • torch.repeat_interleave() при попытке дифференцирования тензора CUDA
  • torch.Tensor.index_copy() при вызове на тензоре CPU или CUDA
  • torch.Tensor.scatter() когда src тип является тензором и вызывается на тензоре CUDA
  • torch.Tensor.scatter_reduce() когда reduce='sum' или reduce='mean' и вызывается на тензоре CUDA
  • torch.Tensor.resize_(), когда вызывается с тензором, который не квантизован, устанавливает новые элементы в известное значение. Значения с плавающей точкой или комплексными значениями устанавливаются в NaN. Целочисленные значения устанавливаются в максимальное значение.
  • torch.empty(), torch.empty_like(), torch.empty_strided(), и torch.empty_permuted() будут заполнять выходной тензор известным значением. Тензоры с типом с плавающей точкой или комплексными значениями заполняются NaN. Тензоры целочисленного типа заполняются максимальным значением.

Следующие обычно недетерминированные операции будут выбрасывать 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.MaxUnpool1d
  • torch.nn.MaxUnpool2d
  • torch.nn.MaxUnpool3d
  • 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 при попытке дифференцировать тензор CUDA, когда mode='max'
  • torch.Tensor.put_() когда accumulate=False
  • torch.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, когда тип данных — с плавающей точкой или комплексный
  • torch.Tensor.scatter_reduce() когда reduce='prod' и вызывается на тензоре CUDA
  • torch.Tensor.resize_() при вызове с квантованным тензором

Несколько операций 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 Если ни одна из этих конфигураций переменных среды не установлена, RuntimeError будет поднята при вызове с тензорами CUDA:

  • torch.mm()
  • torch.mv()
  • torch.bmm()

Обратите внимание, что детерминированные операции, как правило, имеют худшую производительность, чем недетерминированные операции.

Примечание

Этот флаг не обнаруживает или не предотвращает недетерминированное поведение, вызванное вызовом операции на месте для тензора с внутренней перекрывающейся памятью или передачей такого тензора в качестве аргумента 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/2.1/generated/torch.use_deterministic_algorithms.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API