Пакет автоматической смешанной точности — torch.amp
Создано: Jun 12, 2025 | Последнее обновление: Jul 11, 2026
torch.amp предоставляет удобные методы для смешанной точности, при которой одни операции используют тип данных torch.float32 (float), а другие — тип данных с плавающей точкой меньшей точности (lower_precision_fp): torch.float16 (half) или torch.bfloat16. Некоторые операции, например линейные слои и свёртки, выполняются намного быстрее в lower_precision_fp. Для других операций, например редукций, часто требуется динамический диапазон float32. Смешанная точность пытается подобрать для каждой операции подходящий тип данных.
Обычно для «обучения с автоматической смешанной точностью» с типом данных torch.float16 используются вместе torch.autocast и torch.amp.GradScaler, как показано в примерах автоматической смешанной точности и руководстве по автоматической смешанной точности. Однако torch.autocast и torch.GradScaler являются модульными и при необходимости могут использоваться отдельно. Как показано в разделе примера для CPU в torch.autocast, для «обучения/вывода с автоматической смешанной точностью» на CPU с типом данных torch.bfloat16 используется только torch.autocast.
Предупреждение
torch.cuda.amp.autocast(args...) и torch.cpu.amp.autocast(args...) устарели. Вместо них используйте torch.amp.autocast("cuda", args...) или torch.amp.autocast("cpu", args...). torch.cuda.amp.GradScaler(args...) и torch.cpu.amp.GradScaler(args...) устарели. Вместо них используйте torch.amp.GradScaler("cuda", args...) или torch.amp.GradScaler("cpu", args...).
Предупреждение
При сочетании AMP с torch.compile учтите, что по умолчанию параметр torch._functorch.config.backward_pass_autocast имеет значение "same_as_forward". Предполагается, что скомпилированный обратный проход выполняется в том же контексте autocast, что и скомпилированный прямой проход. Если вы следуете рекомендуемому для AMP шаблону обучения и выполняете обратный проход вне autocast, задайте для torch._functorch.config.backward_pass_autocast значение "off" в скомпилированной области. Подробности см. в разделе torch.compile имеет иную семантику autograd.
torch.autocast и torch.cpu.amp.autocast появились в версии 1.10.
Автоматическое приведение типов
-
torch.amp.autocast_mode.is_autocast_available(device_type)[источник] -
Возвращает логическое значение, указывающее, доступно ли автоматическое приведение типов на
device_type.- Параметры:
-
device_type (str) – Тип устройства. Возможные значения: ‘cuda’, ‘cpu’, ‘mtia’, ‘maia’, ‘xpu’ и т. д. Тип совпадает с атрибутом
typeобъектаtorch.device. Таким образом, тип устройства тензора можно получить с помощьюTensor.device.type. - Возвращаемый тип:
-
class torch.autocast(device_type, dtype=None, enabled=True, cache_enabled=None)[источник] -
Экземпляры
autocastвыступают в роли менеджеров контекста или декораторов, позволяющих выполнять отдельные участки скрипта в режиме смешанной точности.В этих участках операции выполняются с типом данных, выбранным для каждой операции механизмом автоматического приведения типов, что повышает производительность при сохранении точности. Подробности см. в справочнике операций с автоматическим приведением типов.
При входе в область с включённым автоматическим приведением типов тензоры могут иметь любой тип. При использовании автоматического приведения типов не следует вызывать
half()илиbfloat16()для модели (моделей) или входных данных.autocastследует использовать только для прямого прохода (проходов) сети, включая вычисление функции (функций) потерь. Обратные проходы с включённым автоматическим приведением типов не рекомендуются. Операции обратного прохода выполняются с теми же типами, которые автоматическое приведение типов использовало для соответствующих операций прямого прохода.Пример для устройств CUDA:
# Creates model and optimizer in default precision model = Net().cuda() optimizer = optim.SGD(model.parameters(), ...) for input, target in data: optimizer.zero_grad() # Enables autocasting for the forward pass (model + loss) with torch.autocast(device_type="cuda"): output = model(input) loss = loss_fn(output, target) # Exits the context manager before backward() loss.backward() optimizer.step()Примеры использования (в том числе с масштабированием градиентов) в более сложных сценариях (например, штраф за градиент, несколько моделей или функций потерь, пользовательские функции autograd) см. на странице с примерами автоматической смешанной точности.
autocastтакже можно использовать как декоратор, например, для методаforwardмодели:class AutocastModel(nn.Module): ... @torch.autocast(device_type="cuda") def forward(self, input): ...Тензоры с плавающей точкой, созданные в области с включённым автоматическим приведением типов, могут иметь тип
float16. При возвращении в область с отключённым автоматическим приведением типов их использование с тензорами с плавающей точкой других типов данных может привести к ошибкам несовпадения типов. В этом случае преобразуйте созданные в области автоматического приведения типов тензор (тензоры) обратно вfloat32(или в другой тип данных, если необходимо). Если тензор из области автоматического приведения типов уже имеет типfloat32, преобразование не выполняется и не требует дополнительных затрат. Пример для CUDA:# Creates some tensors in default dtype (here assumed to be float32) a_float32 = torch.rand((8, 8), device="cuda") b_float32 = torch.rand((8, 8), device="cuda") c_float32 = torch.rand((8, 8), device="cuda") d_float32 = torch.rand((8, 8), device="cuda") with torch.autocast(device_type="cuda"): # torch.mm is on autocast's list of ops that should run in float16. # Inputs are float32, but the op runs in float16 and produces float16 output. # No manual casts are required. e_float16 = torch.mm(a_float32, b_float32) # Also handles mixed input types f_float16 = torch.mm(d_float32, e_float16) # After exiting autocast, calls f_float16.float() to use with d_float32 g_float32 = torch.mm(d_float32, f_float16.float())Пример обучения на CPU:
# Creates model and optimizer in default precision model = Net() optimizer = optim.SGD(model.parameters(), ...) for epoch in epochs: for input, target in data: optimizer.zero_grad() # Runs the forward pass with autocasting. with torch.autocast(device_type="cpu", dtype=torch.bfloat16): output = model(input) loss = loss_fn(output, target) loss.backward() optimizer.step()Пример инференса на CPU:
# Creates model in default precision model = Net().eval() with torch.autocast(device_type="cpu", dtype=torch.bfloat16): for input in data: # Runs the forward pass with autocasting. output = model(input)Пример инференса на CPU с трассировкой Jit:
class TestModel(nn.Module): def __init__(self, input_size, num_classes): super().__init__() self.fc1 = nn.Linear(input_size, num_classes) def forward(self, x): return self.fc1(x) input_size = 2 num_classes = 2 model = TestModel(input_size, num_classes).eval() # For now, we suggest to disable the Jit Autocast Pass, # As the issue: https://github.com/pytorch/pytorch/issues/75956 torch._C._jit_set_autocast_mode(False) with torch.cpu.amp.autocast(cache_enabled=False): model = torch.jit.trace(model, torch.randn(1, input_size)) model = torch.jit.freeze(model) # Models Run for _ in range(3): model(torch.randn(1, input_size))Ошибки несовпадения типов внутри области с включённым автоматическим приведением типов являются ошибкой; если вы столкнулись с такой проблемой, сообщите о ней.
Подобласти
autocast(enabled=False)можно вкладывать в области с включённым автоматическим приведением типов. Локальное отключение автоматического приведения типов может быть полезно, например, если нужно принудительно выполнять подобласть с определённымdtype. Отключение автоматического приведения типов позволяет явно управлять типом выполнения. Перед использованием во вложенной области входные данные из окружающей области следует преобразовать вdtype:# Creates some tensors in default dtype (here assumed to be float32) a_float32 = torch.rand((8, 8), device="cuda") b_float32 = torch.rand((8, 8), device="cuda") c_float32 = torch.rand((8, 8), device="cuda") d_float32 = torch.rand((8, 8), device="cuda") with torch.autocast(device_type="cuda"): e_float16 = torch.mm(a_float32, b_float32) with torch.autocast(device_type="cuda", enabled=False): # Calls e_float16.float() to ensure float32 execution # (necessary because e_float16 was created in an autocasted region) f_float32 = torch.mm(c_float32, e_float16.float()) # No manual casts are required when re-entering the autocast-enabled region. # torch.mm again runs in float16 and produces float16 output, regardless of input types. g_float16 = torch.mm(d_float32, f_float32)Состояние автоматического приведения типов хранится в локальном для потока режиме. Чтобы включить его в новом потоке, необходимо вызвать менеджер контекста или декоратор в этом потоке. Это влияет на
torch.nn.DataParallelиtorch.nn.parallel.DistributedDataParallelпри использовании более одного GPU на процесс (см. Работа с несколькими GPU).- Параметры:
-
-
device_type (str, обязательный) – Тип устройства. Возможные значения: ‘cuda’, ‘cpu’, ‘mtia’, ‘maia’, ‘xpu’ и ‘hpu’. Тип совпадает с атрибутом
typeобъектаtorch.device. Таким образом, тип устройства тензора можно получить с помощьюTensor.device.type. -
enabled (bool, необязательный) – Следует ли включить автоматическое приведение типов в этой области. Значение по умолчанию:
True -
dtype (torch_dtype, необязательный) – Тип данных для операций, выполняемых с автоматическим приведением типов. Если
dtypeравенNone, используется значение по умолчанию (torch.float16для CUDA иtorch.bfloat16для CPU), задаваемое функциейget_autocast_dtype(). Значение по умолчанию:None -
cache_enabled (bool, необязательный) – Следует ли включить кэш весов для автоматического приведения типов. Значение по умолчанию:
True
-
device_type (str, обязательный) – Тип устройства. Возможные значения: ‘cuda’, ‘cpu’, ‘mtia’, ‘maia’, ‘xpu’ и ‘hpu’. Тип совпадает с атрибутом
-
torch.amp.custom_fwd(fwd=None, *, device_type, cast_inputs=None)[источник] -
Создаёт вспомогательный декоратор для методов
forwardпользовательских функций autograd.Функции autograd являются подклассами
torch.autograd.Function. Подробнее см. на странице с примерами.- Параметры:
-
-
device_type (str) – Тип устройства: ‘cuda’, ‘cpu’, ‘mtia’, ‘maia’, ‘xpu’ и т. д. Тип совпадает с атрибутом
typeобъектаtorch.device. Таким образом, тип устройства тензора можно получить с помощьюTensor.device.type. -
cast_inputs (
torch.dtypeили None, необязательный, по умолчанию None) – Если значение не равноNoneиforwardвыполняется в области с включённым автоматическим приведением типов, входные тензоры с плавающей точкой преобразуются к целевому типу данных (тензоры без плавающей точки не затрагиваются), после чегоforwardвыполняется с отключённым автоматическим приведением типов. Если значение равноNone, внутренние операцииforwardвыполняются в текущем состоянии автоматического приведения типов.
-
device_type (str) – Тип устройства: ‘cuda’, ‘cpu’, ‘mtia’, ‘maia’, ‘xpu’ и т. д. Тип совпадает с атрибутом
Примечание
Если декорированный
forwardвызывается вне области с включённым автоматическим приведением типов,custom_fwdничего не делает, аcast_inputsне оказывает эффекта.
-
torch.amp.custom_bwd(bwd=None, *, device_type)[источник] -
Создаёт вспомогательный декоратор для методов обратного прохода пользовательских функций autograd.
Функции autograd являются подклассами
torch.autograd.Function. Гарантирует, чтоbackwardвыполняется в том же состоянии автоматического приведения типов, что иforward. Подробнее см. на странице с примерами.- Параметры:
-
device_type (str) – Тип устройства: ‘cuda’, ‘cpu’, ‘mtia’, ‘maia’, ‘xpu’ и т. д. Тип совпадает с атрибутом
typeобъектаtorch.device. Таким образом, тип устройства тензора можно получить с помощьюTensor.device.type.
-
class torch.cuda.amp.autocast(enabled=True, dtype=torch.float16, cache_enabled=True)[источник] -
См.
torch.autocast.torch.cuda.amp.autocast(args...)устарел. Используйте вместо негоtorch.amp.autocast("cuda", args...).
-
torch.cuda.amp.custom_fwd(fwd=None, *, cast_inputs=None)[источник] -
torch.cuda.amp.custom_fwd(args...)устарел. Используйте вместо негоtorch.amp.custom_fwd(args..., device_type='cuda').
-
torch.cuda.amp.custom_bwd(bwd)[источник] -
torch.cuda.amp.custom_bwd(args...)устарел. Используйте вместо негоtorch.amp.custom_bwd(args..., device_type='cuda').
-
class torch.cpu.amp.autocast(enabled=True, dtype=torch.bfloat16, cache_enabled=True)[источник] -
См.
torch.autocast.torch.cpu.amp.autocast(args...)устарел. Используйте вместо негоtorch.amp.autocast("cpu", args...).
Масштабирование градиентов
Если для прямого прохода некоторой операции используются входные данные типа float16, то обратный проход этой операции создаст градиенты типа float16. Значения градиентов с малым модулем могут быть непредставимы в float16. Эти значения будут округлены до нуля («потеря точности при антипереполнении»), и обновление соответствующих параметров не произойдёт.
Чтобы предотвратить потерю точности при антипереполнении, «масштабирование градиентов» умножает функцию (функции) потерь сети на масштабный коэффициент и запускает обратный проход для масштабированной функции (функций) потерь. Градиенты, распространяющиеся в обратном направлении по сети, масштабируются тем же коэффициентом. Иными словами, модуль значений градиентов увеличивается, поэтому они не округляются до нуля.
Градиент каждого параметра (атрибут .grad) следует привести к исходному масштабу до обновления параметров оптимизатором, чтобы масштабный коэффициент не влиял на скорость обучения.
Примечание
AMP/fp16 подходит не для каждой модели! Например, большинство моделей, предварительно обученных в bf16, не могут работать в числовом диапазоне fp16 с максимальным значением 65504, поэтому градиенты будут переполняться, а не терять точность при антипереполнении. В этом случае масштабный коэффициент может стать меньше 1, чтобы привести градиенты к значениям, представимым в динамическом диапазоне fp16. Хотя можно ожидать, что масштаб всегда будет больше 1, наш GradScaler НЕ гарантирует этого, чтобы сохранить производительность. Если при работе с AMP/fp16 в функции потерь или градиентах появляются NaN, проверьте совместимость модели.
-
class torch.cuda.amp.GradScaler(init_scale=65536.0, growth_factor=2.0, backoff_factor=0.5, growth_interval=2000, enabled=True)[источник] -
См.
torch.amp.GradScaler.torch.cuda.amp.GradScaler(args...)устарел. Используйте вместо негоtorch.amp.GradScaler("cuda", args...).
-
class torch.cpu.amp.GradScaler(init_scale=65536.0, growth_factor=2.0, backoff_factor=0.5, growth_interval=2000, enabled=True)[источник] -
См.
torch.amp.GradScaler.torch.cpu.amp.GradScaler(args...)устарел. Используйте вместо негоtorch.amp.GradScaler("cpu", args...).
Справочник операций Autocast
Допустимость операций
Операции, выполняемые в float64 или с типами данных, отличными от чисел с плавающей точкой, не поддерживают autocast и будут выполняться с этими типами независимо от того, включен ли autocast.
Поддерживаются только операции, не изменяющие исходный объект, и методы Tensor. Варианты операций на месте и вызовы, явно передающие Tensor типа out=..., разрешены в областях, где включен autocast, но autocast к ним применяться не будет. Например, в области, где включен autocast, a.addmm(b, c) может использовать autocast, а a.addmm_(b, c) и a.addmm(b, c, out=d) — нет. Для лучшей производительности и стабильности в областях, где включен autocast, предпочтительны операции, не изменяющие исходный объект.
Операции, вызванные с явным аргументом dtype=..., не поддерживают autocast и будут создавать выходные данные с учетом аргумента dtype.
Особенности операций CUDA
В следующих списках описано поведение допустимых операций в областях, где включен autocast. К этим операциям всегда применяется autocast, независимо от того, вызываются ли они в составе torch.nn.Module, как функция или как метод torch.Tensor. Если функции доступны в нескольких пространствах имен, autocast применяется к ним независимо от пространства имен.
К операциям, не указанным ниже, autocast не применяется. Они выполняются с типом, определяемым их входными данными. Однако autocast может изменить тип, с которым выполняются неуказанные операции, если они следуют за операциями, к которым применялся autocast.
Если операция не указана, предполагается, что она численно устойчива в float16. Если вы считаете, что неуказанная операция численно неустойчива в float16, сообщите об этом, создав issue.
Операции CUDA, для которых autocast может преобразовать тип в float16
__matmul__, addbmm, addmm, addmv, addr, baddbmm, bmm, chain_matmul, multi_dot, conv1d, conv2d, conv3d, conv_transpose1d, conv_transpose2d, conv_transpose3d, GRUCell, linear, LSTMCell, matmul, mm, mv, prelu, RNNCell
Операции CUDA, для которых autocast может преобразовать тип в float32
__pow__, __rdiv__, __rpow__, __rtruediv__, acos, asin, binary_cross_entropy_with_logits, cosh, cosine_embedding_loss, cdist, cosine_similarity, cross_entropy, cumprod, cumsum, dist, erfinv, exp, expm1, group_norm, hinge_embedding_loss, kl_div, l1_loss, layer_norm, log, log_softmax, log10, log1p, log2, margin_ranking_loss, mse_loss, multilabel_margin_loss, multi_margin_loss, nll_loss, norm, normalize, pdist, poisson_nll_loss, pow, prod, reciprocal, rsqrt, sinh, smooth_l1_loss, soft_margin_loss, softmax, softmin, softplus, sum, renorm, tan, triplet_margin_loss
Операции CUDA, повышающие тип до наиболее широкого типа входных данных
Для стабильной работы этим операциям не требуется определенный тип данных, однако они принимают несколько входных значений и требуют, чтобы типы данных этих значений совпадали. Если все входные значения имеют тип float16, операция выполняется в float16. Если хотя бы одно входное значение имеет тип float32, autocast преобразует все входные значения в float32 и выполняет операцию в float32.
addcdiv, addcmul, atan2, bilinear, cross, dot, grid_sample, index_put, scatter_add, tensordot
Некоторые не указанные здесь операции (например, бинарные операции вроде add) самостоятельно повышают типы входных данных без участия autocast. Если входные значения имеют смешанные типы float16 и float32, эти операции выполняются в float32 и создают выходные данные типа float32 независимо от того, включен ли autocast.
Предпочитайте binary_cross_entropy_with_logits вместо binary_cross_entropy
При обратном распространении через torch.nn.functional.binary_cross_entropy() (и torch.nn.BCELoss, который его оборачивает) могут возникать градиенты, которые невозможно представить в float16. В областях, где включен autocast, входные данные прямого прохода могут иметь тип float16, а значит, градиент обратного прохода должен представляться в float16 (преобразование входных данных прямого прохода типа float16 в float32 не помогает, поскольку при обратном проходе это преобразование придется отменить). Поэтому binary_cross_entropy и BCELoss вызывают ошибку в областях, где включен autocast.
Во многих моделях непосредственно перед слоем бинарной кросс-энтропии используется слой sigmoid. В этом случае объедините два слоя с помощью torch.nn.functional.binary_cross_entropy_with_logits() или torch.nn.BCEWithLogitsLoss. К binary_cross_entropy_with_logits и BCEWithLogits можно безопасно применять autocast.
Особенности операций XPU (экспериментально)
В следующих списках описано поведение допустимых операций в областях, где включен autocast. К этим операциям всегда применяется autocast, независимо от того, вызываются ли они в составе torch.nn.Module, как функция или как метод torch.Tensor. Если функции доступны в нескольких пространствах имен, autocast применяется к ним независимо от пространства имен.
К операциям, не указанным ниже, autocast не применяется. Они выполняются с типом, определяемым их входными данными. Однако autocast может изменить тип, с которым выполняются неуказанные операции, если они следуют за операциями, к которым применялся autocast.
Если операция не указана, предполагается, что она численно устойчива в float16. Если вы считаете, что неуказанная операция численно неустойчива в float16, сообщите об этом, создав issue.
Операции XPU, для которых autocast может преобразовать тип в float16
addbmm, addmm, addmv, addr, baddbmm, bmm, chain_matmul, multi_dot, conv1d, conv2d, conv3d, conv_transpose1d, conv_transpose2d, conv_transpose3d, GRUCell, linear, LSTMCell, matmul, mm, mv, RNNCell
Операции XPU, для которых autocast может преобразовать тип в float32
__pow__, __rdiv__, __rpow__, __rtruediv__, binary_cross_entropy_with_logits, cosine_embedding_loss, cosine_similarity, cumsum, dist, exp, group_norm, hinge_embedding_loss, kl_div, l1_loss, layer_norm, log, log_softmax, margin_ranking_loss, nll_loss, normalize, poisson_nll_loss, pow, reciprocal, rsqrt, soft_margin_loss, softmax, softmin, sum, triplet_margin_loss
Операции XPU, повышающие тип до наиболее широкого типа входных данных
Для стабильной работы этим операциям не требуется определенный тип данных, однако они принимают несколько входных значений и требуют, чтобы типы данных этих значений совпадали. Если все входные значения имеют тип float16, операция выполняется в float16. Если хотя бы одно входное значение имеет тип float32, autocast преобразует все входные значения в float32 и выполняет операцию в float32.
bilinear, cross, grid_sample, index_put, scatter_add, tensordot
Некоторые не указанные здесь операции (например, бинарные операции вроде add) самостоятельно повышают типы входных данных без участия autocast. Если входные значения имеют смешанные типы float16 и float32, эти операции выполняются в float32 и создают выходные данные типа float32 независимо от того, включен ли autocast.
Особенности поведения отдельных операций на CPU
В следующих списках описано поведение операций, поддерживающих autocast, в областях с включённым autocast. Эти операции всегда подвергаются автоматическому приведению типов, независимо от того, вызываются ли они как часть torch.nn.Module, как функция или как метод torch.Tensor. Если функции доступны в нескольких пространствах имён, они подвергаются автоматическому приведению типов независимо от пространства имён.
Операции, не перечисленные ниже, не подвергаются автоматическому приведению типов. Они выполняются с типом, определяемым типами их входных данных. Однако autocast всё же может изменить тип, с которым выполняются неуказанные операции, если им предшествуют операции с автоматическим приведением типов.
Если операция не указана в списке, мы считаем её численно устойчивой в bfloat16. Если вы считаете, что неуказанная операция численно неустойчива в bfloat16, сообщите об этом, создав issue. float16 использует те же списки, что и bfloat16.
Операции CPU, для которых возможно автоматическое приведение к bfloat16
conv1d, conv2d, conv3d, bmm, mm, linalg_vecdot, baddbmm, addmm, addbmm, linear, matmul, _convolution, conv_tbc, mkldnn_rnn_layer, conv_transpose1d, conv_transpose2d, conv_transpose3d, prelu, scaled_dot_product_attention, _native_multi_head_attention
Операции CPU, для которых возможно автоматическое приведение к float32
avg_pool3d, binary_cross_entropy, grid_sampler, grid_sampler_2d, _grid_sampler_2d_cpu_fallback, grid_sampler_3d, polar, prod, quantile, nanquantile, stft, cdist, trace, view_as_complex, cholesky_inverse, cholesky_solve, inverse, lu_solve, orgqr, inverse, ormqr, pinverse, max_pool3d, max_unpool2d, max_unpool3d, adaptive_avg_pool3d, reflection_pad1d, reflection_pad2d, replication_pad1d, replication_pad2d, replication_pad3d, mse_loss, cosine_embedding_loss, nll_loss, nll_loss2d, hinge_embedding_loss, poisson_nll_loss, cross_entropy_loss, l1_loss, huber_loss, margin_ranking_loss, soft_margin_loss, triplet_margin_loss, multi_margin_loss, ctc_loss, kl_div, multilabel_margin_loss, binary_cross_entropy_with_logits, fft_fft, fft_ifft, fft_fft2, fft_ifft2, fft_fftn, fft_ifftn, fft_rfft, fft_irfft, fft_rfft2, fft_irfft2, fft_rfftn, fft_irfftn, fft_hfft, fft_ihfft, linalg_cond, linalg_matrix_rank, linalg_solve, linalg_cholesky, linalg_svdvals, linalg_eigvals, linalg_eigvalsh, linalg_inv, linalg_householder_product, linalg_tensorinv, linalg_tensorsolve, fake_quantize_per_tensor_affine, geqrf, _lu_with_info, svd, triangular_solve, fractional_max_pool2d, fractional_max_pool3d, adaptive_max_pool3d, multilabel_margin_loss_forward, linalg_qr, linalg_cholesky_ex, linalg_svd, linalg_eig, linalg_eigh, linalg_lstsq, linalg_inv_ex
Операции CPU, повышающие тип до наиболее широкого типа входных данных
Для обеспечения устойчивости этим операциям не требуется определённый тип данных, но они принимают несколько входных данных и требуют, чтобы их типы данных совпадали. Если все входные данные имеют тип bfloat16, операция выполняется с типом bfloat16. Если хотя бы один входной элемент имеет тип float32, autocast приводит все входные данные к типу float32 и выполняет операцию с типом float32.
cat, stack, index_copy
Некоторые не указанные здесь операции (например, бинарные операции, такие как add) самостоятельно выполняют продвижение типов входных данных без вмешательства autocast. Если среди входных данных есть элементы типов bfloat16 и float32, эти операции выполняются с типом float32 и возвращают результат типа float32 независимо от того, включён ли autocast.
© 2026, PyTorch Contributors
PyTorch has a BSD-style license, as found in the LICENSE file.
https://docs.pytorch.org/docs/2.14/amp.html