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