SyncBatchNorm
-
class torch.nn.SyncBatchNorm(num_features, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True, process_group=None, device=None, dtype=None)[source] -
Применяет пакетную нормализацию к N-мерному входу (мини-пакету входов [N-2]D с дополнительным канальным измерением), как описано в статье Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift .
Среднее и стандартное отклонение вычисляются по каждому измерению по всем мини-пакетам одной группы процессов. и являются обучаемыми векторами параметров размера
C(гдеCявляется размером входных данных). По умолчанию элементы берутся из , а элементы устанавливаются в 0. Стандартное отклонение вычисляется с помощью смещенного оценщика, эквивалентногоtorch.var(input, unbiased=False).Также по умолчанию, во время обучения, этот слой сохраняет текущие оценки вычисленных среднего и дисперсии, которые затем используются для нормализации во время оценки. Текущие оценки сохраняются с настройкой по умолчанию
momentum0,1.Если
track_running_statsустановлено в значениеFalse, этот слой не сохраняет текущие оценки, а вместо этого использует статистику по пакету во время оценки.Примечание
Этот
momentumаргумент отличается от аргумента, используемого в классах оптимизаторов, и от общепринятого понятия импульса. Математически правило обновления для текущих статистик здесь таково: , где — оценка статистики, а — новое наблюдаемое значение.Поскольку пакетная нормализация выполняется для каждого канала в измерении
C, вычисление статистик по(N, +)срезам, этот термин обычно называют объёмной пакетной нормализацией или пространственно-временной пакетной нормализацией.В настоящее время
SyncBatchNormподдерживает толькоDistributedDataParallel(DDP) с одним графическим процессором на процесс. Используйтеtorch.nn.SyncBatchNorm.convert_sync_batchnorm()для преобразованияBatchNorm*Dслоя вSyncBatchNormперед обертыванием сети с помощью DDP.- Параметры:
-
- num_features (int) – из ожидаемого входа размера
-
eps (float) – значение, добавляемое к знаменателю для обеспечения числовой устойчивости. По умолчанию:
1e-5 -
momentum (float) – значение, используемое для вычисления 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 (Optional[Any]) – синхронизация статистик происходит внутри каждой группы процессов индивидуально. По умолчанию синхронизация происходит по всему миру
- Форма:
-
- Вход:
- Выход: (такая же форма, как у входа)
Примечание
Синхронизация статистик пакетной нормализации происходит только во время обучения, то есть синхронизация отключена, когда
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)[source] -
Вспомогательная функция для преобразования всех
BatchNorm*Dслоев в модели вtorch.nn.SyncBatchNormслои.- Параметры:
-
-
module (nn.Module) – модуль, содержащий один или несколько
BatchNorm*Dслоев - process_group (optional) – группа процессов для определения области синхронизации, по умолчанию используется весь мир
-
module (nn.Module) – модуль, содержащий один или несколько
- Возвращаемое значение:
-
Исходный
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)
© 2024, PyTorch Contributors
PyTorch has a BSD-style license, as found in the LICENSE file.
https://pytorch.org/docs/1.13/generated/torch.nn.SyncBatchNorm.html