Тензорный параллелизм — torch.distributed.tensor.parallel
Создано: 13 июня 2025 г. | Последнее обновление: 12 мая 2026 г.
Тензорный параллелизм (TP) построен на основе PyTorch DistributedTensor (DTensor) и предоставляет различные стили параллелизма: по столбцам, по строкам и параллелизм последовательностей.
Предупреждение
API тензорного параллелизма являются экспериментальными и могут измениться.
Точка входа для распараллеливания вашего nn.Module с помощью тензорного параллелизма:
-
torch.distributed.tensor.parallel.parallelize_module(module, device_mesh=None, parallelize_plan=None, *, src_data_rank=0)[источник] -
Применяет тензорный параллелизм в PyTorch, распараллеливая модули или подмодули в соответствии с планом, заданным пользователем.
Мы распараллеливаем модуль или подмодули на основе parallelize_plan. parallelize_plan содержит
ParallelStyle, указывающий, как пользователь хочет распараллелить модуль или подмодуль.Пользователь также может указать разные стили параллелизма для каждого полного квалифицированного имени модуля (FQN).
Обратите внимание, что
parallelize_moduleпринимает только одномерныйDeviceMesh. Если у вас есть двумерный или N-мерныйDeviceMesh, сначала выполните срез DeviceMesh, чтобы получить одномерный подчинённый DeviceMesh, а затем передайте его этому API (т. е.device_mesh["tp"]).- Параметры:
-
-
module (
nn.Module) – Модуль, который требуется распараллелить. -
device_mesh (
DeviceMesh, необязательный) – Объект, описывающий топологию сетки устройств для DTensor. Если параметр не указан, вызов должен выполняться в контексте DeviceMesh. -
parallelize_plan (Union[
ParallelStyle, Dict[str,ParallelStyle]], необязательный) – План, используемый для распараллеливания модуля. Это может быть объектParallelStyle, содержащий описание подготовки входных данных и выходных данных для тензорного параллелизма, либо словарь, сопоставляющий FQN модуля с соответствующим объектомParallelStyle. Если параметр не указан, на данный момент вызов ничего не делает.
-
module (
- Именованные аргументы:
-
src_data_rank (int, необязательный) – ранг исходных данных логического/глобального тензора. Он используется
distribute_tensor()для распределения/широковещательной передачи фрагментов/реплик на другие ранги. По умолчанию в качестве источника данных для каждого измерения DeviceMesh используетсяgroup_rank=0, чтобы сохранить семантику одного устройства. Если явно передатьNone,parallelize_module()просто использует локальные данные, вместо того чтобы пытаться сохранить семантику одного устройства с помощью распределения/широковещательной передачи. По умолчанию: 0 - Возвращает:
-
Распараллеленный объект
nn.Module. - Тип возвращаемого значения:
- Module
- Пример::
-
>>> from torch.distributed.tensor.parallel import parallelize_module, ColwiseParallel >>> from torch.distributed.device_mesh import init_device_mesh >>> >>> # Define the module. >>> m = Model(...) >>> tp_mesh = init_device_mesh("cuda", (8,)) >>> m = parallelize_module(m, tp_mesh, {"w1": ColwiseParallel(), "w2": RowwiseParallel()}) >>>
Примечание
Для сложных архитектур модулей, таких как Attention и слои MLP, рекомендуем объединять разные ParallelStyles (например,
ColwiseParallelиRowwiseParallel) и передавать их в качестве parallelize_plan, чтобы добиться требуемого разбиения на шарды.
-
torch.distributed.tensor.parallel.api.parallelize_module(module, device_mesh=None, parallelize_plan=None, *, src_data_rank=0)[источник] -
Применяет тензорный параллелизм в PyTorch, распараллеливая модули или подмодули в соответствии с планом, заданным пользователем.
Мы распараллеливаем модуль или подмодули на основе parallelize_plan. parallelize_plan содержит
ParallelStyle, указывающий, как пользователь хочет распараллелить модуль или подмодуль.Пользователь также может указать разные стили параллелизма для каждого полного квалифицированного имени модуля (FQN).
Обратите внимание, что
parallelize_moduleпринимает только одномерныйDeviceMesh. Если у вас есть двумерный или N-мерныйDeviceMesh, сначала выполните срез DeviceMesh, чтобы получить одномерный подчинённый DeviceMesh, а затем передайте его этому API (т. е.device_mesh["tp"]).- Параметры:
-
-
module (
nn.Module) – Модуль, который требуется распараллелить. -
device_mesh (
DeviceMesh, необязательный) – Объект, описывающий топологию сетки устройств для DTensor. Если параметр не указан, вызов должен выполняться в контексте DeviceMesh. -
parallelize_plan (Union[
ParallelStyle, Dict[str,ParallelStyle]], необязательный) – План, используемый для распараллеливания модуля. Это может быть объектParallelStyle, содержащий описание подготовки входных данных и выходных данных для тензорного параллелизма, либо словарь, сопоставляющий FQN модуля с соответствующим объектомParallelStyle. Если параметр не указан, на данный момент вызов ничего не делает.
-
module (
- Именованные аргументы:
-
src_data_rank (int, необязательный) – ранг исходных данных логического/глобального тензора. Он используется
distribute_tensor()для распределения/широковещательной передачи фрагментов/реплик на другие ранги. По умолчанию в качестве источника данных для каждого измерения DeviceMesh используетсяgroup_rank=0, чтобы сохранить семантику одного устройства. Если явно передатьNone,parallelize_module()просто использует локальные данные, вместо того чтобы пытаться сохранить семантику одного устройства с помощью распределения/широковещательной передачи. По умолчанию: 0 - Возвращает:
-
Распараллеленный объект
nn.Module. - Тип возвращаемого значения:
- Module
- Пример::
-
>>> from torch.distributed.tensor.parallel import parallelize_module, ColwiseParallel >>> from torch.distributed.device_mesh import init_device_mesh >>> >>> # Define the module. >>> m = Model(...) >>> tp_mesh = init_device_mesh("cuda", (8,)) >>> m = parallelize_module(m, tp_mesh, {"w1": ColwiseParallel(), "w2": RowwiseParallel()}) >>>
Примечание
Для сложных архитектур модулей, таких как Attention и слои MLP, рекомендуем объединять разные ParallelStyles (например,
ColwiseParallelиRowwiseParallel) и передавать их в качестве parallelize_plan, чтобы добиться требуемого разбиения на шарды.
Тензорный параллелизм поддерживает следующие стили параллелизма:
-
class torch.distributed.tensor.parallel.ColwiseParallel(*, input_layouts=None, output_layouts=None, use_local_output=True)[источник] -
Разделяет совместимый nn.Module по столбцам. В настоящее время поддерживаются nn.Linear и nn.Embedding. Пользователи могут объединить этот стиль с RowwiseParallel, чтобы разделить на шарды более сложные модули (например, MLP и Attention).
- Именованные аргументы:
-
- input_layouts (Placement, необязательный) – Размещение DTensor входного тензора для nn.Module; используется для аннотирования входного тензора и преобразования его в DTensor. Если параметр не указан, предполагается, что входной тензор реплицирован.
- output_layouts (Placement, необязательный) – Размещение DTensor выходных данных nn.Module; используется для приведения выходных данных nn.Module к требуемому пользователем размещению. Если параметр не указан, выходной тензор разбивается на шарды по последнему измерению.
-
use_local_output (bool, необязательный) – Использовать ли локальный
torch.TensorвместоDTensorдля выходных данных модуля. Значение по умолчанию: True.
- Возвращает:
-
Объект
ParallelStyle, представляющий разбиение nn.Module на шарды по столбцам.
- Пример::
-
>>> from torch.distributed.tensor.parallel import parallelize_module, ColwiseParallel >>> from torch.distributed.device_mesh import init_device_mesh >>> ... >>> m = Model(...) # m is a nn.Module that contains a "w1" nn.Linear submodule >>> tp_mesh = init_device_mesh("cuda", (8,)) >>> >>> # By default, the input of the "w1" Linear will be converted to Replicated DTensor >>> # and the output of "w1" will return :class:`torch.Tensor` that shards on the last dim. >>> >>> sharded_mod = parallelize_module(m, tp_mesh, {"w1": ColwiseParallel()}) >>> ...
Примечание
По умолчанию выходные данные
ColwiseParallelразбиваются на шарды по последнему измерению, еслиoutput_layoutsне указано. Если существуют операции, требующие определённой формы тензора (например, перед парнымRowwiseParallel), учитывайте, что при разбиении выходных данных на шарды может потребоваться адаптировать операцию под размер шарда.
-
class torch.distributed.tensor.parallel.RowwiseParallel(*, input_layouts=None, output_layouts=None, use_local_output=True)[источник] -
Разделяет совместимый nn.Module по строкам. В настоящее время поддерживаются nn.Linear и nn.Embedding. Пользователи могут объединить этот стиль с ColwiseParallel, чтобы разделить на шарды более сложные модули (например, MLP и Attention).
- Именованные аргументы:
-
- input_layouts (Placement, необязательный) – Размещение DTensor входного тензора для nn.Module; используется для аннотирования входного тензора и преобразования его в DTensor. Если параметр не указан, предполагается, что входной тензор разбит на шарды по последнему измерению.
- output_layouts (Placement, необязательный) – Размещение DTensor выходных данных nn.Module; используется для приведения выходных данных nn.Module к требуемому пользователем размещению. Если параметр не указан, выходной тензор реплицируется.
-
use_local_output (bool, необязательный) – Использовать ли локальный
torch.TensorвместоDTensorдля выходных данных модуля. Значение по умолчанию: True.
- Возвращает:
-
Объект
ParallelStyle, представляющий разбиение nn.Module на шарды по строкам.
- Пример::
-
>>> from torch.distributed.tensor.parallel import parallelize_module, RowwiseParallel >>> from torch.distributed.device_mesh import init_device_mesh >>> ... >>> m = Model(...) # m is a nn.Module that contains a "w2" nn.Linear submodule >>> tp_mesh = init_device_mesh("cuda", (8,)) >>> >>> # By default, the input of the "w2" Linear will be converted to DTensor that shards on the last dim >>> # and the output of "w2" will return a replicated :class:`torch.Tensor`. >>> >>> sharded_mod = parallelize_module(m, tp_mesh, {"w2": RowwiseParallel()}), >>> ...
-
class torch.distributed.tensor.parallel.SequenceParallel(*, sequence_dim=1, use_local_output=False)[источник] -
SequenceParallel реплицирует совместимые параметры
nn.Moduleи выполняет вычисления с разделением на шарды, при этом входные данные разбиты на шарды по измерению последовательности. В настоящее время поддерживаютсяnn.LayerNorm,nn.Dropoutи реализация RMSNorm на Python.Этот стиль реализует операцию, описанную в статье Сокращение повторных вычислений активаций в больших моделях Transformer.
Если переданные в этот
nn.Moduleвходные данные имеют типtorch.Tensor, предполагается, что они уже разбиты на шарды по измерению последовательности; вход преобразуется вDTensor, разбитый на шарды по этому измерению. Если переданные в этотnn.Moduleвходные данные уже являютсяDTensor, но не разбиты на шарды по измерению последовательности, выполняется перераспределение входных данных для разбиения на шарды по этому измерению.Выходные данные
nn.Moduleбудут разбиты на шарды по измерению последовательности.- Именованные аргументы:
-
-
sequence_dim (int, необязательный) – Измерение последовательности входного тензора для
nn.Module; используется для аннотирования входного тензора и преобразования его в DTensor, разбитый на шарды по измерению последовательности. Значение по умолчанию: 1. -
use_local_output (bool, необязательный) – Использовать ли локальный
torch.TensorвместоDTensorдля выходных данных модуля. Значение по умолчанию: False.
-
sequence_dim (int, необязательный) – Измерение последовательности входного тензора для
- Возвращает:
-
Объект
ParallelStyle, представляющий параллелизм последовательностей дляnn.Module.
- Пример::
-
>>> from torch.distributed.tensor.parallel import parallelize_module, SequenceParallel >>> from torch.distributed.device_mesh import init_device_mesh >>> ... >>> m = Model(...) # m is a nn.Module that contains a "norm" nn.LayerNorm submodule >>> tp_mesh = init_device_mesh("cuda", (8,)) >>> >>> # By default, the input of the "norm" will be converted to DTensor that shards on the sequence dim >>> # and the output of "norm" will return a sharded on sequence dimension :class:`DTensor`. >>> >>> sharded_mod = parallelize_module(m, tp_mesh, {"norm": SequenceParallel()}), >>> ...
Примечание
Стиль SequenceParallel предполагает инициализацию единицами, если в nn.Module имеются веса (например,
nn.LayerNormилиRMSNorm; по умолчанию для них используется инициализация единицами). Если для весов этих модулей используются пользовательские методы инициализации, необходимо выполнить широковещательную передачу весов до или после распараллеливания, чтобы обеспечить их репликацию.
Чтобы просто настроить входные и выходные данные nn.Module с помощью размещений DTensor и выполнить необходимое перераспределение размещения, не преобразуя параметры модуля в DTensor, при вызове parallelize_module в parallelize_plan можно использовать следующие ParallelStyle:
-
class torch.distributed.tensor.parallel.PrepareModuleInput(*, input_layouts=None, desired_input_layouts=None, input_kwarg_layouts=None, desired_input_kwarg_layouts=None, use_local_output=False)[источник] -
Настраивает входные данные nn.Module так, чтобы во время выполнения входные тензоры nn.Module преобразовывались в DTensor в соответствии с
input_layouts, а перераспределение размещения выполнялось в соответствии сdesired_input_layouts.- Именованные аргументы:
-
-
input_layouts (Union[Placement, Tuple[Optional[Placement]]]) – Размещения DTensor входных тензоров nn.Module; используются для преобразования входных тензоров в DTensor. Если некоторые входные данные не являются torch.Tensor или их не нужно преобразовывать в DTensor, вместо них необходимо указать
None. Значение по умолчанию: None. -
desired_input_layouts (Union[Placement, Tuple[Optional[Placement]]]) – Требуемое размещение DTensor входных тензоров nn.Module; используется для обеспечения нужных размещений DTensor для входных данных nn.Module. Длина этого аргумента должна совпадать с длиной
input_layouts. Значение по умолчанию: None. - input_kwarg_layouts (Dict[str, Placement]) – Размещения DTensor именованных входных аргументов nn.Module; используются для преобразования тензоров именованных входных аргументов в DTensor. Значение по умолчанию: None
- desired_input_kwarg_layouts – (Dict[str, Placement]): Требуемое размещение DTensor именованных входных аргументов nn.Module; используется для обеспечения нужных размещений DTensor для входных данных nn.Module. Значение по умолчанию: None.
-
use_local_output (bool, необязательный) – Использовать ли локальный
torch.TensorвместоDTensorдля входных данных модуля. Значение по умолчанию: False.
-
input_layouts (Union[Placement, Tuple[Optional[Placement]]]) – Размещения DTensor входных тензоров nn.Module; используются для преобразования входных тензоров в DTensor. Если некоторые входные данные не являются torch.Tensor или их не нужно преобразовывать в DTensor, вместо них необходимо указать
- Возвращает:
-
Объект
ParallelStyle, который подготавливает размещения шардинга для входных данных nn.Module.
- Пример::
-
>>> from torch.distributed.tensor.parallel import parallelize_module, PrepareModuleInput >>> from torch.distributed.device_mesh import init_device_mesh >>> ... >>> block = TransformerBlock(...) # block is a nn.Module that contains an "attn" Attention submodule >>> tp_mesh = init_device_mesh("cuda", (8,)) >>> >>> # According to the style specified below, the first input of attn will be annotated to Sharded DTensor >>> # and then redistributed to Replicated DTensor. >>> parallelize_module( >>> block, # this can be a submodule or module >>> tp_mesh, >>> parallelize_plan={ >>> "attn": PrepareModuleInput( >>> input_layouts=(Shard(0), None, None, ...), >>> desired_input_layouts=(Replicate(), None, None, ...) >>> ), >>> } >>> )
-
class torch.distributed.tensor.parallel.PrepareModuleOutput(*, output_layouts, desired_output_layouts, use_local_output=True)[источник] -
Настраивает выходные данные nn.Module так, чтобы во время выполнения выходные тензоры nn.Module преобразовывались в DTensor в соответствии с
output_layouts, а перераспределение размещения выполнялось в соответствии сdesired_output_layouts.- Именованные аргументы:
-
-
output_layouts (Union[Placement, Tuple[Placement]]) – Размещения DTensor выходных тензоров nn.Module; используются для преобразования выходных тензоров в DTensor, если они являются
torch.Tensor. Если некоторые выходные данные не являются torch.Tensor или их не нужно преобразовывать в DTensor, вместо них необходимо указатьNone. - desired_output_layouts (Union[Placement, Tuple[Placement]]) – Требуемые размещения DTensor выходных тензоров nn.Module; используются для обеспечения нужных размещений DTensor для выходных данных nn.Module.
-
use_local_output (bool, необязательный) – Использовать ли локальный
torch.TensorвместоDTensorдля выходных данных модуля. Значение по умолчанию: True.
-
output_layouts (Union[Placement, Tuple[Placement]]) – Размещения DTensor выходных тензоров nn.Module; используются для преобразования выходных тензоров в DTensor, если они являются
- Возвращает:
-
Объект ParallelStyle, который подготавливает размещения шардинга для выходных данных nn.Module.
- Пример::
-
>>> from torch.distributed.tensor.parallel import parallelize_module, PrepareModuleOutput >>> from torch.distributed.device_mesh import init_device_mesh >>> ... >>> block = TransformerBlock(...) # block is a nn.Module that contains an "attn" Attention submodule >>> tp_mesh = init_device_mesh("cuda", (8,)) >>> >>> # According to the style specified below, the output of the TransformerBlock will be converted to Replicated DTensor >>> # and then redistributed to Sharded DTensor. >>> parallelize_module( >>> block, # this can be a submodule or module >>> tp_mesh, >>> parallelize_plan = PrepareModuleOutput( >>> output_layouts=Replicate(), >>> desired_output_layouts=Shard(0) >>> ) >>> )
-
class torch.distributed.tensor.parallel.PrepareModuleInputOutput(*, input_layouts=None, desired_input_layouts=None, input_kwarg_layouts=None, desired_input_kwarg_layouts=None, use_local_input=False, output_layouts, desired_output_layouts, use_local_output=True)[источник] -
Настраивает входные данные (и выходные данные) nn.Module так, чтобы во время выполнения входные тензоры (и, соответственно, выходные тензоры) nn.Module преобразовывались в DTensor в соответствии с
input_layouts(и, соответственно, output_layouts), а перераспределение размещения выполнялось в соответствии сdesired_input_layouts(и, соответственно,desired_output_layouts). Это сочетаниеPrepareModuleInputиPrepareModuleOutput.- Именованные аргументы:
-
-
input_layouts (Union[Placement, Tuple[Optional[Placement]]]) – Размещения DTensor входных тензоров nn.Module; используются для преобразования входных тензоров в DTensor. Если некоторые входные данные не являются torch.Tensor или их не нужно преобразовывать в DTensor, вместо них необходимо указать
None. Значение по умолчанию: None. -
desired_input_layouts (Union[Placement, Tuple[Optional[Placement]]]) – Требуемое размещение DTensor входных тензоров nn.Module; используется для обеспечения нужных размещений DTensor для входных данных nn.Module. Длина этого аргумента должна совпадать с длиной
input_layouts. Значение по умолчанию: None. - input_kwarg_layouts (Dict[str, Placement]) – Размещения DTensor именованных входных аргументов nn.Module; используются для преобразования тензоров именованных входных аргументов в DTensor. Значение по умолчанию: None
- desired_input_kwarg_layouts – (Dict[str, Placement]): Требуемое размещение DTensor именованных входных аргументов nn.Module; используется для обеспечения нужных размещений DTensor для входных данных nn.Module. Значение по умолчанию: None.
-
use_local_input (bool, необязательный) – Использовать ли локальный
torch.TensorвместоDTensorдля входных данных модуля. Значение по умолчанию: False. -
output_layouts (Union[Placement, Tuple[Placement]]) – Размещения DTensor выходных тензоров nn.Module; используются для преобразования выходных тензоров в DTensor, если они являются
torch.Tensor. Если некоторые выходные данные не являются torch.Tensor или их не нужно преобразовывать в DTensor, вместо них необходимо указатьNone. - desired_output_layouts (Union[Placement, Tuple[Placement]]) – Требуемые размещения DTensor выходных тензоров nn.Module; используются для обеспечения нужных размещений DTensor для выходных данных nn.Module.
-
use_local_output (bool, необязательный) – Использовать ли локальный
torch.TensorвместоDTensorдля выходных данных модуля. Значение по умолчанию: True.
-
input_layouts (Union[Placement, Tuple[Optional[Placement]]]) – Размещения DTensor входных тензоров nn.Module; используются для преобразования входных тензоров в DTensor. Если некоторые входные данные не являются torch.Tensor или их не нужно преобразовывать в DTensor, вместо них необходимо указать
- Возвращает:
-
Объект
ParallelStyle, который подготавливает размещения шардинга для входных и выходных данных nn.Module.
- Пример::
-
>>> from torch.distributed.tensor.parallel import parallelize_module, PrepareModuleInputOutput >>> from torch.distributed.device_mesh import init_device_mesh >>> ... >>> block = TransformerBlock(...) # block is a nn.Module that contains an "attn" Attention submodule >>> tp_mesh = init_device_mesh("cuda", (8,)) >>> >>> # According to the style specified below, the first input of attn will be annotated as Sharded DTensor >>> # and then redistributed to Replicated DTensor, and the output of the TransformerBlock will be annotated >>> # as Replicated DTensor and then redistributed to Sharded DTensor. >>> parallelize_module( >>> block, # this can be a submodule or module >>> tp_mesh, >>> parallelize_plan={ >>> "attn": PrepareModuleInputOutput( >>> input_layouts=(Shard(0), None, None, ...), >>> desired_input_layouts=(Replicate(), None, None, ...), >>> output_layouts=Replicate(), >>> desired_output_layouts=Shard(0), >>> ), >>> } >>> )
Примечание
При использовании Shard(dim) в качестве размещений входных/выходных данных для указанных выше ParallelStyle предполагается, что входные/выходные тензоры активаций равномерно разбиты на шарды по измерению тензора dim в DeviceMesh, с которым работает TP. Например, поскольку RowwiseParallel принимает входные данные, разбитые на шарды по последнему измерению, предполагается, что входной тензор уже равномерно разбит на шарды по последнему измерению. Для тензоров активаций, неравномерно разбитых на шарды, можно напрямую передавать DTensor в разделённые на шарды модули и использовать use_local_output=False для возврата DTensor после каждого ParallelStyle; при этом DTensor может отслеживать информацию о неравномерном разбиении на шарды.
Для таких моделей, как Transformer, рекомендуем использовать ColwiseParallel и RowwiseParallel вместе в parallelize_plan, чтобы добиться требуемого разбиения на шарды всей модели (например, Attention и MLP).
Параллельные вычисления функции потерь кросс-энтропии (параллелизм функции потерь) поддерживаются с помощью следующего менеджера контекста:
-
torch.distributed.tensor.parallel.loss_parallel()[исходный код] -
Менеджер контекста, включающий параллелизм вычисления функции потерь, который позволяет эффективно распараллелить вычисление функции потерь, если входные данные разбиты по измерению классов. В настоящее время поддерживается только функция потерь перекрёстной энтропии.
Внутри этого менеджера контекста можно как обычно использовать
cross_entropy()илиCrossEntropyLossпри следующих предположениях относительно входных параметров. Соответствующий вызовbackward(), если он есть, также должен выполняться внутри этого менеджера контекста.Поддерживаются как одномерные, так и многомерные
DeviceMesh. В многомерной сетке ровно одно измерение сетки должно разбивать измерение классов — это измерение считается измерением «TP» и может находиться в любой позиции (не обязательно последней). Остальные измерения сетки могут бытьShard(например, разбиты по пакету данных для DP/CP) илиReplicate.- Параметры:
-
-
input (
DTensor) – Входные логиты. Предполагается, что данные разбиты по измерению классов ровно в одном измерении сетки. -
target (Union[
torch.Tensor,DTensor]) –Должен содержать индексы истинных классов (вероятности классов в настоящее время не поддерживаются). Размещения выводятся из размещений
inputследующим образом: (1) заменаShard(class_dim)измерения TP наReplicateи (2) сдвиг любого другогоShard(d)сd > class_dimна единицу вниз (так как измерение классов тензора удаляется из результата):input tensor shape input placements target shape target placements ---------------------- -------------------------- --------------- ------------------------ (batch, class) (Shard(0), Shard(1)) (batch,) (Shard(0), Replicate()) (batch, class) (Replicate(), Shard(1)) (batch,) (Replicate(), Replicate()) (batch, class, seq) (Shard(2), Shard(1)) (batch, seq) (Shard(1), Replicate()) (batch, class, seq) (Shard(0), Shard(1)) (batch, seq) (Shard(0), Replicate())
Обычный
torch.Tensorпринимается только тогда, когда все выведенные размещения target являютсяReplicate(например, в одномерной сетке); в противном случае необходимо явно передатьDTensor, чтобы предполагаемое разбиение было однозначным. -
weight (Union[
torch.Tensor,DTensor], optional) – Если задан, предполагается, что он реплицирован поDeviceMesh. - label_smoothing – В настоящее время не поддерживается.
-
input (
- Возвращает:
-
-
reduction="none"— функция потерь для каждого примера; наследует размещенияtarget(Shardв измерениях параллельной обработки пакетов,Replicateв TP). -
reduction="sum"— скаляр;Replicateв измерении TP (пользовательская операция all-reduce обеспечивает глобальную корректность локального значения каждого ранга по TP),Partial("sum")в каждом другом измерении сеткиShard, чтобы сведение между рангами выполнялось отложенно при материализации/перераспределении, иReplicateв измерениях сеткиReplicate. -
reduction="mean"— поддерживается только в одномерной сетке; возвращает полностью реплицированныйDTensor.
В одномерной сетке все три варианта сводятся к полностью реплицированному
DTensor(исходное поведение). -
- Тип возвращаемого значения:
-
Объект
DTensor, размещения которого зависят отreduction
Примечание
reduction="mean"поддерживается только в одномернойDeviceMesh. В многомерной сетке деление на каждом ранге наtotal_weightиспользует локальное количество, поэтому агрегирование по измерениям, отличным от TP, не даёт правильного глобального среднего; вместо этого используйтеreduction="sum"или"none"и при необходимости самостоятельно делите на глобальное количество.Пример
Здесь вручную создаётся разбитый DTensor, чтобы показать, как его использовать. На практике это обычно результат работы модуля TP.
>>> from torch.distributed.tensor.parallel import loss_parallel >>> from torch.distributed.device_mesh import init_device_mesh >>> ... >>> device_mesh = init_device_mesh("cuda", (8,)) >>> input = torch.randn(4, 16, device="cuda", requires_grad=True) >>> dist_input = distribute_tensor(input, device_mesh, placements=[Shard(1)]) >>> target = torch.randint(16, (4,), device="cuda") >>> with loss_parallel(): >>> loss = F.cross_entropy(dist_input, target, reduction="mean") >>> loss.backward() >>> ...
Предупреждение
The loss_parallel API is experimental and subject to change.
-
torch.distributed.tensor.parallel.loss.loss_parallel()[исходный код] -
Менеджер контекста, включающий параллелизм вычисления функции потерь, который позволяет эффективно распараллелить вычисление функции потерь, если входные данные разбиты по измерению классов. В настоящее время поддерживается только функция потерь перекрёстной энтропии.
Внутри этого менеджера контекста можно как обычно использовать
cross_entropy()илиCrossEntropyLossпри следующих предположениях относительно входных параметров. Соответствующий вызовbackward(), если он есть, также должен выполняться внутри этого менеджера контекста.Поддерживаются как одномерные, так и многомерные
DeviceMesh. В многомерной сетке ровно одно измерение сетки должно разбивать измерение классов — это измерение считается измерением «TP» и может находиться в любой позиции (не обязательно последней). Остальные измерения сетки могут бытьShard(например, разбиты по пакету данных для DP/CP) илиReplicate.- Параметры:
-
-
input (
DTensor) – Входные логиты. Предполагается, что данные разбиты по измерению классов ровно в одном измерении сетки. -
target (Union[
torch.Tensor,DTensor]) –Должен содержать индексы истинных классов (вероятности классов в настоящее время не поддерживаются). Размещения выводятся из размещений
inputследующим образом: (1) заменаShard(class_dim)измерения TP наReplicateи (2) сдвиг любого другогоShard(d)сd > class_dimна единицу вниз (так как измерение классов тензора удаляется из результата):input tensor shape input placements target shape target placements ---------------------- -------------------------- --------------- ------------------------ (batch, class) (Shard(0), Shard(1)) (batch,) (Shard(0), Replicate()) (batch, class) (Replicate(), Shard(1)) (batch,) (Replicate(), Replicate()) (batch, class, seq) (Shard(2), Shard(1)) (batch, seq) (Shard(1), Replicate()) (batch, class, seq) (Shard(0), Shard(1)) (batch, seq) (Shard(0), Replicate())
Обычный
torch.Tensorпринимается только тогда, когда все выведенные размещения target являютсяReplicate(например, в одномерной сетке); в противном случае необходимо явно передатьDTensor, чтобы предполагаемое разбиение было однозначным. -
weight (Union[
torch.Tensor,DTensor], optional) – Если задан, предполагается, что он реплицирован поDeviceMesh. - label_smoothing – В настоящее время не поддерживается.
-
input (
- Возвращает:
-
-
reduction="none"— функция потерь для каждого примера; наследует размещенияtarget(Shardв измерениях параллельной обработки пакетов,Replicateв TP). -
reduction="sum"— скаляр;Replicateв измерении TP (пользовательская операция all-reduce обеспечивает глобальную корректность локального значения каждого ранга по TP),Partial("sum")в каждом другом измерении сеткиShard, чтобы сведение между рангами выполнялось отложенно при материализации/перераспределении, иReplicateв измерениях сеткиReplicate. -
reduction="mean"— поддерживается только в одномерной сетке; возвращает полностью реплицированныйDTensor.
В одномерной сетке все три варианта сводятся к полностью реплицированному
DTensor(исходное поведение). -
- Тип возвращаемого значения:
-
Объект
DTensor, размещения которого зависят отreduction
Примечание
reduction="mean"поддерживается только в одномернойDeviceMesh. В многомерной сетке деление на каждом ранге наtotal_weightиспользует локальное количество, поэтому агрегирование по измерениям, отличным от TP, не даёт правильного глобального среднего; вместо этого используйтеreduction="sum"или"none"и при необходимости самостоятельно делите на глобальное количество.Пример
Здесь вручную создаётся разбитый DTensor, чтобы показать, как его использовать. На практике это обычно результат работы модуля TP.
>>> from torch.distributed.tensor.parallel import loss_parallel >>> from torch.distributed.device_mesh import init_device_mesh >>> ... >>> device_mesh = init_device_mesh("cuda", (8,)) >>> input = torch.randn(4, 16, device="cuda", requires_grad=True) >>> dist_input = distribute_tensor(input, device_mesh, placements=[Shard(1)]) >>> target = torch.randint(16, (4,), device="cuda") >>> with loss_parallel(): >>> loss = F.cross_entropy(dist_input, target, reduction="mean") >>> loss.backward() >>> ...
-
torch.distributed.tensor.parallel.input_reshard.input_reshard(module, tp_device_mesh, input_reshard_dim=None)[исходный код] -
Регистрирует хуки для nn.Module, обеспечивающие переразбиение входных данных и позволяющие разбивать и восстанавливать их во время обратного прохода.
Регистрирует хуки для nn.Module с переразбиением входных данных, чтобы можно было разбивать данные согласно заданным
tp_device_meshиinput_reshard_dim, а затем восстанавливать входные данные при повторном вычислении активаций во время обратного прохода. Это возможно, потому что при параллелизме тензоров (TP) входные данные одинаковы на всех рангах TP.- Параметры:
-
-
module (
nn.Module) – Модуль, для которого регистрируется переразбиение входных данных. -
tp_device_mesh (
DeviceMesh) – Объект, описывающий топологию сетки устройств для параллелизма тензоров. - input_reshard_dim (Optional[int]) – Измерение, по которому выполняется разбиение входных данных. Если задано None, входные данные не разбиваются. По умолчанию: None
-
module (
- Возвращает:
-
Объект
nn.Module, для которого зарегистрировано переразбиение входных данных TP. - Тип возвращаемого значения:
- Модуль
© 2026, PyTorch Contributors
PyTorch has a BSD-style license, as found in the LICENSE file.
https://docs.pytorch.org/docs/2.14/distributed.tensor.parallel.html