Spec-Zone.ru › PyTorch 2.14

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.ReplicationPad1d при попытке вычислить градиент тензора CUDA
  • torch.nn.ReplicationPad2d при попытке вычислить градиент тензора CUDA
  • torch.nn.ReplicationPad3d при попытке вычислить градиент тензора CUDA
  • torch.bmm() при вызове с разреженными и плотными тензорами CUDA
  • torch.cumsum() при вызове с тензором 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
  • torch.Tensor.scatter(), если тип src — Tensor и операция вызвана с тензором CUDA
  • torch.Tensor.scatter_reduce(), если reduce='sum' или reduce='mean', и операция вызвана с тензором CUDA
  • torch.nn.MaxPool3d при попытке вычислить градиент тензора CUDA
  • torch.nn.Embedding при попытке вычислить градиент тензора CUDA

Следующие обычно недетерминированные операции будут вызывать исключение RuntimeError, если mode=True:

  • torch.nn.AvgPool3d при попытке вычислить градиент тензора CUDA
  • torch.nn.AdaptiveAvgPool2d при попытке вычислить градиент тензора CUDA
  • torch.nn.AdaptiveAvgPool3d при попытке вычислить градиент тензора 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.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.median() с выводом индексов при вызове с тензором CUDA
  • torch.nn.functional.grid_sample() при попытке вычислить градиент тензора CUDA
  • torch.Tensor.scatter_reduce(), если reduce='prod' и операция вызвана с тензором CUDA
  • torch.Tensor.resize_() при вызове с квантованным тензором

Кроме того, при включении этой настройки и torch.utils.deterministic.fill_uninitialized_memory несколько операций заполняют неинициализированную память. Дополнительную информацию см. в документации по этому атрибуту.

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

При включении этой настройки также автоматически включается детерминированный режим Inductor. В детерминированном режиме Inductor не выполняет бенчмаркинг на устройстве, который влияет на численные результаты. Это включает следующее:

  • Не дополнять формы входных данных matmul. Если детерминированный режим не включён, Inductor выполняет бенчмаркинг, чтобы проверить, полезно ли дополнение формы matmul.
  • Не выполнять автоподбор шаблонов. В Inductor есть шаблоны для таких ядер, как matmul/conv/attention. Если детерминированный режим не включён, Inductor выполняет автоподбор, чтобы выбрать лучшие конфигурации для этих шаблонов, и использует их, если они быстрее ядра в eager-режиме. В детерминированном режиме выбирается ядро eager-режима.
  • Не выполнять автоподбор конфигураций triton для редукции. Численные результаты редукции очень чувствительны к конфигурациям triton. В детерминированном режиме Inductor использует эвристики для выбора наиболее перспективных конфигураций вместо автоподбора.
  • Пропускать автоподбор редукций при настройке методом координатного спуска.
  • Не выполнять бенчмаркинг для прохода перестановки вычислений и коммуникаций.
  • Отключить функцию динамического уменьшения конфигурации RBLOCK triton для повышения загрузки.

Примечание

Этот флаг не обнаруживает и не предотвращает недетерминированное поведение, вызванное вызовом операции in-place для тензора с внутренним перекрытием памяти или передачей такого тензора в качестве аргумента out операции. В этих случаях несколько записей с разными данными могут обращаться к одной ячейке памяти, а порядок записей не гарантирован.

Параметры:

mode (bool) – Если True, потенциально недетерминированные операции переключаются на детерминированный алгоритм или вызывают ошибку времени выполнения. Если False, недетерминированные операции разрешены.

Именованные аргументы:

warn_only (bool, необязательный) – Если True, операции без детерминированной реализации выдают предупреждение вместо ошибки. Значение по умолчанию: False

Пример:

>>> torch.use_deterministic_algorithms(True)

# 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...

© 2026, PyTorch Contributors
PyTorch has a BSD-style license, as found in the LICENSE file.
https://docs.pytorch.org/docs/2.14/generated/torch.use_deterministic_algorithms.html

Spec-Zone.ru

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