Распределённые оптимизаторы
Предупреждение
Распределённый оптимизатор в настоящее время не поддерживается при использовании тензоров CUDA
torch.distributed.optim предоставляет DistributedOptimizer, который принимает список удалённых параметров (RRef) и выполняет оптимизацию локально на узлах, где находятся параметры. Распределённый оптимизатор может использовать любой из локальных оптимизаторов Базовый класс для применения градиентов на каждом узле.
-
class torch.distributed.optim.DistributedOptimizer(optimizer_class, params_rref, *args, **kwargs)[source] -
DistributedOptimizer принимает удалённые ссылки на параметры, распределённые по узлам, и применяет заданный оптимизатор локально для каждого параметра.
Этот класс использует
get_gradients()для получения градиентов для определённых параметров.Одновременные вызовы
step(), как от одного, так и от разных клиентов, будут сериализованы на каждом узле — так как оптимизатор каждого узла может работать только с одним набором градиентов за раз. Однако нет гарантии, что полная последовательность вперёд-назад-оптимизатор будет выполняться для одного клиента за раз. Это означает, что применяемые градиенты могут не соответствовать последнему проходу вперёд, выполненному на данном узле. Также нет гарантии порядка между узлами.DistributedOptimizerсоздаёт локальный оптимизатор с включённой по умолчанию поддержкой TorchScript, чтобы обновления оптимизатора не блокировались блокировкой интерпретатора Python (GIL) в случае многопоточной тренировки (например, распределённого моделирования параллельно). Эта функция в настоящее время включена для большинства оптимизаторов. Также можно следовать рецепту в туториалах PyTorch, чтобы включить поддержку TorchScript для собственных пользовательских оптимизаторов.- Параметры:
-
- optimizer_class (optim.Optimizer) – класс оптимизатора, который следует создать на каждом узле.
- params_rref (список[RRef]) – список RRef к локальным или удалённым параметрам для оптимизации.
- args – аргументы для передачи в конструктор оптимизатора на каждом узле.
- kwargs – аргументы для передачи в конструктор оптимизатора на каждом узле.
- Пример::
-
>>> import torch.distributed.autograd as dist_autograd >>> import torch.distributed.rpc as rpc >>> from torch import optim >>> from torch.distributed.optim import DistributedOptimizer >>> >>> with dist_autograd.context() as context_id: >>> # Forward pass. >>> rref1 = rpc.remote("worker1", torch.add, args=(torch.ones(2), 3)) >>> rref2 = rpc.remote("worker1", torch.add, args=(torch.ones(2), 1)) >>> loss = rref1.to_here() + rref2.to_here() >>> >>> # Backward pass. >>> dist_autograd.backward(context_id, [loss.sum()]) >>> >>> # Optimizer. >>> dist_optim = DistributedOptimizer( >>> optim.SGD, >>> [rref1, rref2], >>> lr=0.05, >>> ) >>> dist_optim.step(context_id)
-
step(context_id)[source] -
Выполняет один шаг оптимизации.
Этот вызов
torch.optim.Optimizer.step()на каждом узле, содержащем параметры для оптимизации, и будет блокировать выполнение, пока все узлы не вернут результат. Предоставленныйcontext_idбудет использован для получения соответствующегоcontext, который содержит градиенты, которые должны быть применены к параметрам.- Параметры:
-
context_id – идентификатор контекста автографа, для которого должен быть выполнен шаг оптимизатора.
-
class torch.distributed.optim.PostLocalSGDOptimizer(optim, averager)[source] -
Обёртка произвольного
torch.optim.Optimizerи выполняет постоптимизацию локального SGD. Этот оптимизатор выполняет локальный оптимизатор на каждом шаге. После этапа разогрева он периодически усредняет параметры после применения локального оптимизатора.- Параметры:
-
- optim (Optimizer) – локальный оптимизатор.
- averager (ModelAverager) – экземпляр усреднителя модели для выполнения алгоритма постоптимизации локального SGD.
Пример:
>>> import torch >>> import torch.distributed as dist >>> import torch.distributed.algorithms.model_averaging.averagers as averagers >>> import torch.nn as nn >>> from torch.distributed.optim import PostLocalSGDOptimizer >>> from torch.distributed.algorithms.ddp_comm_hooks.post_localSGD_hook import ( >>> PostLocalSGDState, >>> post_localSGD_hook, >>> ) >>> >>> model = nn.parallel.DistributedDataParallel( >>> module, device_ids=[rank], output_device=rank >>> ) >>> >>> # Register a post-localSGD communication hook. >>> state = PostLocalSGDState(process_group=None, subgroup=None, start_localSGD_iter=100) >>> model.register_comm_hook(state, post_localSGD_hook) >>> >>> # Create a post-localSGD optimizer that wraps a local optimizer. >>> # Note that ``warmup_steps`` used in ``PostLocalSGDOptimizer`` must be the same as >>> # ``start_localSGD_iter`` used in ``PostLocalSGDState``. >>> local_optim = torch.optim.SGD(params=model.parameters(), lr=0.01) >>> opt = PostLocalSGDOptimizer( >>> optim=local_optim, >>> averager=averagers.PeriodicModelAverager(period=4, warmup_steps=100) >>> ) >>> >>> # In the first 100 steps, DDP runs global gradient averaging at every step. >>> # After 100 steps, DDP runs gradient averaging within each subgroup (intra-node by default), >>> # and post-localSGD optimizer runs global model averaging every 4 steps after applying the local optimizer. >>> for step in range(0, 200): >>> opt.zero_grad() >>> loss = loss_fn(output, labels) >>> loss.backward() >>> opt.step()
-
load_state_dict(state_dict)[source] -
Это то же самое, что и
torch.optim.Optimizerload_state_dict(), но также восстанавливает значение шага усреднителя модели до значения, сохранённого в предоставленномstate_dict.Если записи
"step"вstate_dictнет, будет выведено предупреждение и значение шага усреднителя модели будет инициализировано в 0.
-
state_dict()[source] -
Это то же самое, что и
torch.optim.Optimizerstate_dict(), но добавляет дополнительную запись для записи шага усреднителя модели в контрольную точку, чтобы гарантировать, что при загрузке не происходит ненужного разогрева снова.
-
step()[source] -
Выполняет один шаг оптимизации (обновление параметров).
-
class torch.distributed.optim.ZeroRedundancyOptimizer(params, optimizer_class, process_group=None, parameters_as_bucket_view=False, overlap_with_ddp=False, **defaults)[source] -
Этот класс оборачивает произвольный
optim.Optimizerи фрагментирует его состояния по рангам в группе, как описано в ZeRO. Локальный экземпляр оптимизатора в каждом ранге отвечает только за обновление приблизительно1 / world_sizeпараметров и, следовательно, нуждается только в хранении1 / world_sizeсостояний оптимизатора. После локального обновления параметров каждый ранг будет транслировать свои параметры всем остальным узлам, чтобы сохранить все копии модели в одинаковом состоянии.ZeroRedundancyOptimizerможет использоваться совместно сtorch.nn.parallel.DistributedDataParallelдля уменьшения пиковой потребности в памяти на ранг.ZeroRedundancyOptimizerиспользует алгоритм сортированного жадного выбора для упаковки определенного количества параметров в каждом ранге. Каждый параметр принадлежит одному рангу и не делится между рангами. Разбиение произвольное и может не совпадать с порядком регистрации или использования параметров.- Параметры:
-
params (
Iterable) – списокtorch.Tensorилиdict, содержащий все параметры, которые будут фрагментированы по рангам. - Ключевые аргументы:
-
-
optimizer_class (
torch.nn.Optimizer) – класс локального оптимизатора. -
process_group (
ProcessGroup, необязательно) –torch.distributedProcessGroup(по умолчанию:dist.group.WORLDинициализированныйtorch.distributed.init_process_group()). -
parameters_as_bucket_view (bool, необязательно) – если
True, параметры упаковываются в корзины для ускорения связи, и поляparam.dataуказывают на представления корзин в разных смещениях; еслиFalse, каждый отдельный параметр передается отдельно, и каждоеparams.dataостается неизменным (по умолчанию:False). -
overlap_with_ddp (bool, необязательно) – если
True,step()перекрывается с синхронизацией градиентовDistributedDataParallel; это требует (1) либо функционального оптимизатора для аргументаoptimizer_class, либо оптимизатора с функциональным эквивалентом, и (2) регистрации крючка связи DDP, построенного из одной из функций вddp_zero_hook.py; параметры упаковываются в корзины, совпадающие с корзинами вDistributedDataParallel, что означает, что аргументparameters_as_bucket_viewигнорируется. ЕслиFalse,step()выполняется независимо после обратного прохода (как обычно). (по умолчанию:False). - **defaults – любые последующие аргументы, которые передаются в локальный оптимизатор.
-
optimizer_class (
Пример:
>>> import torch.nn as nn >>> from torch.distributed.optim import ZeroRedundancyOptimizer >>> from torch.nn.parallel import DistributedDataParallel as DDP >>> model = nn.Sequential(*[nn.Linear(2000, 2000).to(rank) for _ in range(20)]) >>> ddp = DDP(model, device_ids=[rank]) >>> opt = ZeroRedundancyOptimizer( >>> ddp.parameters(), >>> optimizer_class=torch.optim.Adam, >>> lr=0.01 >>> ) >>> ddp(inputs).sum().backward() >>> opt.step()
Предупреждение
В настоящее время
ZeroRedundancyOptimizerтребует, чтобы все переданные параметры были одного и того же плотного типа.Предупреждение
Если вы передаете
overlap_with_ddp=True, будьте осторожны с следующим: учитывая способ, которым перекрытиеDistributedDataParallelсZeroRedundancyOptimizerреализовано в настоящее время, первые две или три итерации обучения не выполняют обновлений параметров в шаге оптимизатора, в зависимости от того, использует лиstatic_graph=Falseилиstatic_graph=Trueстратегию букетирования градиентов, соответственно. Это связано с тем, что ему необходима информация о стратегии букетирования градиентов, используемойDistributedDataParallel, которая не окончательно определена до второго прямого прохода, еслиstatic_graph=Falseили до третьего прямого прохода, еслиstatic_graph=True. Для корректировки этого одним из вариантов является добавление фиктивных входных данных.Предупреждение
ZeroRedundancyOptimizer является экспериментальным и может быть изменен.
-
add_param_group(param_group)[source] -
Добавить группу параметров к
Optimizer.Это может быть полезно при дообучении предварительно обученной сети, поскольку замороженные слои можно сделать обучаемыми и добавить в
Optimizerпо мере прохождения обучения.- Параметры:
-
param_group (dict) – определяет параметры, которые нужно оптимизировать, и параметры оптимизации для группы.
Предупреждение
Этот метод обрабатывает обновление фрагментов на всех разделах, но должен вызываться во всех рангах. Вызов этого метода в подмножестве рангов приведет к зависанию обучения, поскольку примитивы связи вызываются в зависимости от управляемых параметров и ожидают участия всех рангов в одном наборе параметров.
-
consolidate_state_dict(to=0)[source] -
Объединить список
state_dict(по одному на ранг) в целевом ранге.- Параметры:
-
to (int) – ранг, получающий состояния оптимизатора (по умолчанию: 0).
- Исключения:
-
RuntimeError – если
overlap_with_ddp=Trueи этот метод вызывается до полного инициализации этого экземпляраZeroRedundancyOptimizer, что происходит после того, как корзины градиентовDistributedDataParallelбыли перестроены.
Предупреждение
Это нужно вызвать во всех рангах.
-
join_hook(**kwargs)[source] -
Возвращает крючок присоединения ZeRO, который позволяет обучать на неравномерных входных данных, затеняя коллективные коммуникации в шаге оптимизатора.
Градиенты должны быть правильно установлены перед вызовом этого крючка.
- Параметры:
-
kwargs (dict) –
dict, содержащий любые ключевые аргументы для изменения поведения крючка присоединения во время выполнения; все экземплярыJoinable, использующие один и тот же менеджер контекста присоединения, получают одинаковое значение дляkwargs.
Этот крючок не поддерживает ключевые аргументы; т.е.
kwargsне используется.
-
load_state_dict(state_dict)[source] -
Загрузить состояние, относящееся к заданному рангу, из входного
state_dict, обновить локальный оптимизатор по мере необходимости.- Параметры:
-
state_dict (dict) – состояние оптимизатора; должно быть объектом, возвращенным из вызова
state_dict(). - Исключения:
-
RuntimeError – если
overlap_with_ddp=Trueи этот метод вызывается до полного инициализации этого экземпляраZeroRedundancyOptimizer, что происходит после того, как корзины градиентовDistributedDataParallelбыли перестроены.
-
state_dict()[source] -
Возвращает последнее глобальное состояние оптимизатора, известное этому рангу.
- Возможные исключения:
-
RuntimeError – если
overlap_with_ddp=Trueи этот метод вызван до полного инициализирования этого экземпляраZeroRedundancyOptimizer, что происходит после перестроения градиентных бакетовDistributedDataParallel; или если этот метод вызван без предшествующего вызоваconsolidate_state_dict(). - Тип возвращаемого значения:
-
step(closure=None, **kwargs)[source] -
Выполняет один шаг оптимизатора и синхронизирует параметры по всем рангам.
-
© 2024, PyTorch Contributors
PyTorch has a BSD-style license, as found in the LICENSE file.
https://pytorch.org/docs/1.13/distributed.optim.html