РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
758 of 769 menu

Функция all_gather_into_tensor

Функция distributed.all_gather_into_tensor собирает тензоры от всех процессов распределенной группы в один выходной тензор. Первым параметром функция принимает выходной тензор, в который будут записаны собранные данные. Вторым параметром передается входной тензор текущего процесса. Третьим параметром указывается группа процессов. В отличие от функции all_gather, которая собирает данные в список тензоров, данная функция записывает результаты в один предварительно выделенный тензор.

Синтаксис

import torch.distributed as dist dist.all_gather_into_tensor( tensor_out, tensor_in, group=None )

Параметры

Функция принимает следующие параметры:

  • tensor_out - выходной тензор, в который будут записаны собранные данные. Его размер должен быть достаточным для размещения тензоров от всех процессов.
  • tensor_in - входной тензор текущего процесса, который будет отправлен другим процессам.
  • group - группа процессов, участвующих в операции. Если параметр не указан, используется группа по умолчанию.

Пример

Давайте соберем данные от двух процессов в один тензор:

import torch import torch.distributed as dist import os # Инициализация процесса dist.init_process_group(backend='gloo', init_method='env://') # Получение ранга текущего процесса rank = dist.get_rank() world_size = dist.get_world_size() # Создание входного тензора t_in = torch.tensor([rank + 1, rank + 2]) # Создание выходного тензора t_out = torch.zeros(world_size * 2) # Сбор данных dist.all_gather_into_tensor(t_out, t_in) if rank == 0: print(t_out) dist.destroy_process_group()

Результат выполнения кода для процесса с рангом 0:

tensor([1., 2., 2., 3.])

Пример

Давайте соберем данные в тензор с заданной размерностью:

import torch import torch.distributed as dist import os # Инициализация процесса dist.init_process_group(backend='gloo', init_method='env://') # Получение ранга текущего процесса rank = dist.get_rank() world_size = dist.get_world_size() # Создание входного тензора (вектор) t_in = torch.tensor([rank * 10 + 1, rank * 10 + 2, rank * 10 + 3]) # Создание выходного тензора (матрица) t_out = torch.zeros(world_size, 3) # Сбор данных dist.all_gather_into_tensor(t_out, t_in) if rank == 0: print(t_out) dist.destroy_process_group()

Результат выполнения кода для процесса с рангом 0:

tensor([ [1., 2., 3.], [11., 12., 13.], ])

Пример

Давайте используем функцию с указанием конкретной группы процессов:

import torch import torch.distributed as dist import os # Инициализация процесса dist.init_process_group(backend='gloo', init_method='env://') # Получение ранга текущего процесса rank = dist.get_rank() world_size = dist.get_world_size() # Создание подгруппы из первых двух рангов if rank < 2: group = dist.new_group(ranks=[0, 1]) else: group = dist.new_group(ranks=[0, 1]) # Проверка принадлежности к группе if rank in [0, 1]: # Создание входного тензора t_in = torch.tensor([rank * 100, rank * 100 + 1]) # Создание выходного тензора t_out = torch.zeros(4) # Сбор данных в подгруппе dist.all_gather_into_tensor(t_out, t_in, group=group) if rank == 0: print(t_out) dist.destroy_process_group()

Результат выполнения кода для процесса с рангом 0:

tensor([0., 1., 100., 101.])

Смотрите также

  • функцию all_gather,
    которая собирает данные со всех процессов в список тензоров
  • функцию all_reduce,
    которая выполняет редукцию данных со всех процессов
  • функцию get_rank,
    которая возвращает ранг текущего процесса
  • функцию init_process_group,
    которая инициализирует группу распределенных процессов
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить