Функция destroy_process_group
Функция distributed.destroy_process_group завершает работу распределенной группы процессов, созданной с помощью init_process_group. Она освобождает ресурсы, связанные с группой процессов, закрывает сетевые соединения и очищает внутреннее состояние PyTorch. Если группа не была инициализирована, вызов функции не приводит к ошибке. Первым параметром можно указать конкретную группу для завершения, вторым - таймаут ожидания завершения операций.
Синтаксис
torch.distributed.destroy_process_group([group])
Параметры
Функция принимает следующие параметры:
-
group(необязательный) - группа процессов, которая будет завершена. Если параметр не указан, завершается текущая группа по умолчанию (default group).
Пример
Давайте инициализируем распределенную группу на одном процессе (для тестирования) и затем завершим её работу:
import torch
import torch.distributed as dist
# Инициализация группы для одного процесса
dist.init_process_group(
backend='gloo',
world_size=1,
rank=0
)
print(f"Группа инициализирована: {dist.is_initialized()}")
# Завершение работы группы
dist.destroy_process_group()
print(f"Группа завершена: {dist.is_initialized()}")
Результат выполнения кода:
"Группа инициализирована: True"
"Группа завершена: False"
Мы инициализируем группу, проверяем её статус через is_initialized, затем завершаем работу группы и снова проверяем статус. После вызова destroy_process_group группа становится неинициализированной.
Пример
Давайте создадим несколько групп и завершим только одну конкретную группу:
import torch
import torch.distributed as dist
# Инициализация основной группы
dist.init_process_group(
backend='gloo',
world_size=1,
rank=0
)
# Создание дополнительной группы
new_group = dist.new_group([0])
print(f"Основная группа инициализирована: {dist.is_initialized()}")
# Завершаем только дополнительную группу
dist.destroy_process_group(new_group)
# Основная группа всё ещё активна
print(f"Основная группа активна: {dist.is_initialized()}")
Результат выполнения кода:
"Основная группа инициализирована: True"
"Основная группа активна: True"
Мы создаём две группы: основную и дополнительную. Затем завершаем только дополнительную группу. Основная группа продолжает существовать, что проверяется через is_initialized.
Пример
Давайте выполним коллективную операцию до и после завершения группы:
import torch
import torch.distributed as dist
# Инициализация группы для одного процесса
dist.init_process_group(
backend='gloo',
world_size=1,
rank=0
)
t = torch.tensor([1, 2, 3, 4, 5])
print(f"До завершения: {t}")
# Выполняем операцию all_reduce
dist.all_reduce(t, op=dist.ReduceOp.SUM)
print(f"После all_reduce: {t}")
# Завершаем работу группы
dist.destroy_process_group()
# Попытка выполнить операцию после завершения вызовет ошибку
# dist.all_reduce(t)
Результат выполнения кода:
"До завершения: tensor([1, 2, 3, 4, 5])"
"После all_reduce: tensor([1, 2, 3, 4, 5])"
Этот пример демонстрирует, что после завершения группы нельзя вызывать коллективные операции. Если попытаться выполнить all_reduce после вызова destroy_process_group, программа завершится с ошибкой.
Смотрите также
-
функцию
init_process_group,
которая инициализирует распределенную группу процессов -
функцию
is_initialized,
которая проверяет, инициализирована ли группа -
функцию
get_rank,
которая возвращает номер текущего процесса в группе -
функцию
new_group,
которая создает новую подгруппу процессов