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.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 и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:Обратите внимание, что детерминированные операции, как правило, имеют худшую производительность, чем недетерминированные операции.
Примечание
Этот флаг не обнаруживает или не предотвращает недетерминированное поведение, вызванное вызовом операции на месте для тензора с внутренней перекрывающейся памятью или передачей такого тензора в качестве аргумента
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