0Pricing
Learn AI with Python · Урок

DistributedDataParallel (DDP)

Группы процессов, dist.init_process_group, DistributedSampler, синхронизация градиентов

«DistributedDataParallel (DDP)» — бесплатный урок Learn AI with Python на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Learn AI with Python, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Learn AI with Python содержит 4 уроков всего.

Что такое DDP

DistributedDataParallel (DDP) — высокопроизводительный подход PyTorch к параллельному обучению по данным. Он запускает по одному процессу на GPU, каждый из которых содержит полную копию модели, и эффективно синхронизирует градиенты. DDP обеспечивает почти линейное масштабирование между GPU и машинами.

Группа процессов

DDP координирует процессы с помощью группы процессов. Каждый процесс получает уникальный ранг и знает общий размер мира. Они взаимодействуют через коммуникационный бэкенд; на GPU NVIDIA этим бэкендом является nccl.

init_process_group

Каждый процесс начинает с присоединения к группе. dist.init_process_group с параметром backend="nccl" настраивает обмен данными между GPU.

import torch.distributed as dist
import os

dist.init_process_group(backend="nccl")
rank = dist.get_rank()
world_size = dist.get_world_size()

Закрепление устройства

Каждый процесс должен владеть одной GPU. Используйте локальный ранг, чтобы задать устройство: процесс 0 использует cuda:0, процесс 1 — cuda:1 и так далее.

local_rank = int(os.environ["LOCAL_RANK"])
torch.cuda.set_device(local_rank)
device = torch.device("cuda", local_rank)

Оборачивание модели

Переместите модель на её GPU, а затем оберните её в DDP с параметром device_ids=[local_rank]. DDP регистрирует обработчики, которые синхронизируют градиенты во время обратного распространения ошибки.

from torch.nn.parallel import DistributedDataParallel as DDP

model = MyModel().to(device)
model = DDP(model, device_ids=[local_rank])

DistributedSampler

Каждый процесс должен видеть отдельную часть данных без пересечений. DistributedSampler разделяет набор данных между рангами, так что их объединение охватывает весь набор данных ровно один раз за эпоху.

from torch.utils.data import DataLoader
from torch.utils.data.distributed import DistributedSampler

sampler = DistributedSampler(dataset)
loader = DataLoader(dataset, batch_size=32, sampler=sampler)

Перемешивание на каждой эпохе

Вызывайте sampler.set_epoch(epoch) в начале каждой эпохи. Это единообразно инициализирует перемешивание во всех процессах, поэтому каждый ранг перемешивает данные одинаково, а части остаются непересекающимися.

for epoch in range(epochs):
    sampler.set_epoch(epoch)
    for x, y in loader:
        ...

Коллективное сведение градиентов

Во время loss.backward() DDP выполняет коллективное сведение: каждый процесс отправляет свои градиенты и получает усреднённый результат, поэтому все копии модели применяют одинаковые обновления. Коллективное сведение выполняется одновременно с обратным распространением ошибки, что скрывает стоимость обмена данными.

Без узкого места GPU 0

В отличие от DataParallel, DDP не использует центральную GPU для сбора результатов. Каждый процесс самостоятельно вычисляет функцию потерь и градиенты; между процессами передаются только градиенты посредством коллективного сведения. Именно эта симметрия позволяет DDP значительно лучше масштабироваться.

Запуск через torchrun

torchrun запускает процессы для отдельных GPU и задаёт переменные окружения, содержащие ранги. Параметр --nproc_per_node=4 запускает 4 процесса (по одному на GPU) на этом узле.

torchrun --nproc_per_node=4 train.py

Сохранение только на ранге 0

Все ранги содержат одинаковые веса, поэтому во избежание перезаписи контрольную точку должен записывать только один процесс. Ограничьте сохранение проверкой ранга.

if rank == 0:
    torch.save(model.module.state_dict(), "model.pt")
dist.barrier()

Проверка знаний

Проверьте свои знания о DDP.

Итоги

Вы изучили DistributedDataParallel:

  • dist.init_process_group(backend="nccl") присоединяет процесс к группе процессов
  • DistributedSampler предоставляет каждому рангу непересекающуюся часть данных
  • DDP(model, device_ids=[rank]) синхронизирует градиенты с помощью коллективного сведения
  • Запускайте обучение с помощью torchrun --nproc_per_node=4
  • Сохраняйте данные только на ранге 0

Часто задаваемые вопросы

Урок «DistributedDataParallel (DDP)» бесплатный?

Да — полный текст урока «DistributedDataParallel (DDP)» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Learn AI with Python, подпишись на CoddyKit PRO. Курс Learn AI with Python содержит 4 уроков всего.

Чему я научусь в уроке «DistributedDataParallel (DDP)»?

Группы процессов, dist.init_process_group, DistributedSampler, синхронизация градиентов Ты практикуешь Learn AI with Python с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Learn AI with Python?

Предыдущий опыт не требуется. Learn AI with Python на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «DistributedDataParallel (DDP)»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Learn AI with Python?

Да. Каждый урок Learn AI with Python включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Обучение на нескольких GPU с DataParallel
  2. DistributedDataParallel (DDP)
  3. Обучение со смешанной точностью и AMP
  4. Эффективное обучение с Hugging Face Accelerate
← Назад к Learn AI with Python