Spec-Zone.ru › PyTorch 2.14

SyncBatchNorm

class torch.nn.modules.batchnorm.SyncBatchNorm(num_features, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True, process_group=None, device=None, dtype=None, *, bias=True) [исходный код]

Применяет пакетную нормализацию к N-мерному входному тензору.

N-мерный вход представляет собой мини-пакет [N-2]-мерных входных данных с дополнительным измерением каналов, как описано в статье Пакетная нормализация: ускорение обучения глубоких сетей за счёт уменьшения внутреннего ковариативного сдвига .

y=x−E[x]Var[x]+ϵ∗γ+βy = \frac{x - \mathrm{E}[x]}{ \sqrt{\mathrm{Var}[x] + \epsilon}} * \gamma + \beta

Среднее значение и стандартное отклонение вычисляются отдельно для каждого измерения по всем мини-пакетам в одних и тех же группах процессов. γ\gamma и β\beta — обучаемые векторы параметров размера C (где C — размер входных данных). По умолчанию элементы γ\gamma выбираются из распределения U(0,1)\mathcal{U}(0, 1), а элементы β\beta устанавливаются равными 0. Стандартное отклонение вычисляется с помощью смещённой оценки, эквивалентной torch.var(input, correction=0).

Также по умолчанию во время обучения этот слой сохраняет скользящие оценки вычисленных среднего значения и дисперсии, которые затем используются для нормализации во время оценки. Скользящие оценки сохраняются с коэффициентом momentum, равным по умолчанию 0.1.

Если track_running_stats установлено в False, этот слой не сохраняет скользящие оценки, а во время оценки вместо этого использует статистики мини-пакета.

Примечание

Этот аргумент momentum отличается от аргумента, используемого в классах оптимизаторов, и от общепринятого понятия импульса. Математически правило обновления скользящих статистик здесь имеет вид x^new=(1−momentum)×x^+momentum×xt\hat{x}_\text{new} = (1 - \text{momentum}) \times \hat{x} + \text{momentum} \times x_t, где x^\hat{x} — оценённая статистика, а xtx_t — новое наблюдаемое значение.

Поскольку пакетная нормализация выполняется для каждого канала в измерении C, вычисляя статистики по срезам (N, +), обычно этот метод называют объёмной пакетной нормализацией или пространственно-временной пакетной нормализацией.

В настоящее время SyncBatchNorm поддерживает только DistributedDataParallel (DDP) с одним графическим процессором на процесс. Используйте torch.nn.SyncBatchNorm.convert_sync_batchnorm(), чтобы преобразовать слой BatchNorm*D в SyncBatchNorm перед обёртыванием сети в DDP.

Параметры:
  • num_features (int) – CC для ожидаемого входного тензора размера (N,C,+)(N, C, +)
  • eps (float) – значение, добавляемое к знаменателю для численной устойчивости. По умолчанию: 1e-5
  • momentum (float | None) – значение, используемое для вычисления running_mean и running_var. Можно задать None для вычисления накопительного скользящего среднего (то есть простого среднего). По умолчанию: 0.1
  • affine (bool) – логическое значение: если установлено в True, у этого модуля есть обучаемые аффинные параметры. По умолчанию: True
  • track_running_stats (bool) – логическое значение: если установлено в True, модуль отслеживает скользящие среднее значение и дисперсию; если установлено в False, модуль не отслеживает эти статистики и инициализирует буферы статистик running_mean и running_var значением None. Если эти буферы имеют значение None, модуль всегда использует статистики мини-пакета как в режиме обучения, так и в режиме оценки. По умолчанию: True
  • process_group (Any | None) – синхронизация статистик выполняется отдельно в каждой группе процессов. По умолчанию синхронизация выполняется во всём мире
  • bias (bool) – если установлено в False, слой не будет обучать аддитивное смещение (актуально, только если affine равно True). По умолчанию: True
Размерность:
  • Вход: (N,C,+)(N, C, +)
  • Выход: (N,C,+)(N, C, +) (такая же размерность, как у входа)

Примечание

Синхронизация статистик пакетной нормализации выполняется только во время обучения, то есть синхронизация отключается, когда model.eval() установлено или если self.training в противном случае равно False.

Примеры:

>>> # With Learnable Parameters
>>> m = nn.SyncBatchNorm(100)
>>> # creating process group (optional)
>>> # ranks is a list of int identifying rank ids.
>>> ranks = list(range(8))
>>> r1, r2 = ranks[:4], ranks[4:]
>>> # Note: every rank calls into new_group for every
>>> # process group created, even if that rank is not
>>> # part of the group.
>>> process_groups = [torch.distributed.new_group(pids) for pids in [r1, r2]]
>>> process_group = process_groups[0 if dist.get_rank() <= 3 else 1]
>>> # Without Learnable Parameters
>>> m = nn.BatchNorm3d(100, affine=False, process_group=process_group)
>>> input = torch.randn(20, 100, 35, 45, 10)
>>> output = m(input)

>>> # network is nn.BatchNorm layer
>>> sync_bn_network = nn.SyncBatchNorm.convert_sync_batchnorm(network, process_group)
>>> # only single gpu per process is currently supported
>>> ddp_sync_bn_network = torch.nn.parallel.DistributedDataParallel(
>>>                         sync_bn_network,
>>>                         device_ids=[args.local_rank],
>>>                         output_device=args.local_rank)
classmethod convert_sync_batchnorm(module, process_group=None) [исходный код]

Преобразует все слои BatchNorm*D модели в слои torch.nn.SyncBatchNorm.

Параметры:
  • module (nn.Module) – модуль, содержащий один или несколько слоёв BatchNorm*D
  • process_group (необязательно) – группа процессов, в рамках которой выполняется синхронизация; по умолчанию — весь мир
Возвращает:

Исходный module с преобразованными слоями torch.nn.SyncBatchNorm. Если исходный module является слоем BatchNorm*D, вместо него будет возвращён новый объект слоя torch.nn.SyncBatchNorm.

Пример:

>>> # Network with nn.BatchNorm layer
>>> module = torch.nn.Sequential(
>>>            torch.nn.Linear(20, 100),
>>>            torch.nn.BatchNorm1d(100),
>>>          ).cuda()
>>> # creating process group (optional)
>>> # ranks is a list of int identifying rank ids.
>>> ranks = list(range(8))
>>> r1, r2 = ranks[:4], ranks[4:]
>>> # Note: every rank calls into new_group for every
>>> # process group created, even if that rank is not
>>> # part of the group.
>>> process_groups = [torch.distributed.new_group(pids) for pids in [r1, r2]]
>>> process_group = process_groups[0 if dist.get_rank() <= 3 else 1]
>>> sync_bn_module = torch.nn.SyncBatchNorm.convert_sync_batchnorm(module, process_group)
forward(input) [исходный код]

Выполняет прямой проход.

Тип возвращаемого значения:

Tensor

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

Spec-Zone.ru

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