0Pricing
Learn AI with Python · Урок

Обучение на нескольких GPU с DataParallel

nn.DataParallel, балансировка памяти GPU, узкие места пропускной способности, когда DDP эффективнее

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

Зачем нужны несколько GPU

Современные модели и пакеты данных перерастают возможности памяти и вычислительной мощности одной GPU. Использование нескольких GPU позволяет обучать более крупные модели или обрабатывать большие пакеты за меньшее календарное время. PyTorch предлагает несколько способов это сделать; самый простой — DataParallel.

Параллелизм по данным

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

nn.DataParallel

nn.DataParallel оборачивает модель одной строкой. Вы передаёте идентификаторы используемых GPU, а PyTorch автоматически распределяет входные данные и собирает результаты.

import torch
import torch.nn as nn

model = MyModel().cuda()
model = nn.DataParallel(model, device_ids=[0, 1])

Автоматическое разделение пакета

Во время прямого прохода DataParallel разделяет пакет данных по измерению 0 между указанными GPU. Пакет из 64 элементов на двух GPU превращается в два подпакета по 32 элемента. Каждая GPU параллельно запускает одну и ту же модель для своего подпакета.

# batch of 64 with device_ids=[0, 1]
# GPU 0 processes samples 0..31
# GPU 1 processes samples 32..63

Усреднение градиентов

Во время обратного прохода градиенты отдельных GPU собираются на основном устройстве и усредняются (фактически складываются и масштабируются), чтобы обновление модели учитывало весь пакет. Затем копии модели повторно синхронизируются перед следующим шагом.

Обычный цикл обучения

Главное преимущество заключается в том, что ваш цикл обучения почти не меняется. Вы перемещаете данные на основную GPU и как обычно вызываете обёрнутую модель; DataParallel выполняет распределение скрытым образом.

for x, y in loader:
    x, y = x.cuda(), y.cuda()
    optimizer.zero_grad()
    out = model(x)            # auto-split across GPUs
    loss = criterion(out, y)
    loss.backward()           # gradients averaged
    optimizer.step()

Дисбаланс GPU 0

У DataParallel есть известный недостаток: основная GPU (обычно GPU 0) собирает все результаты и вычисляет функцию потерь, поэтому на неё приходится дополнительная нагрузка на память и вычисления. При большом количестве GPU GPU 0 становится узким местом и может исчерпать память раньше остальных.

Один процесс, много потоков

DataParallel работает в одном процессе Python и использует потоки для управления GPU. Глобальная блокировка интерпретатора Python и накладные расходы на распределение и сбор ограничивают эффективность масштабирования, особенно при использовании более 2–4 GPU.

Почему предпочтителен DDP

По этим причинам для серьёзной работы с несколькими GPU рекомендуется DistributedDataParallel (DDP). DDP запускает по одному процессу на GPU, синхронизирует градиенты с помощью эффективного коллективного сведения и устраняет узкое место GPU 0, обеспечивая почти линейное масштабирование.

Когда DataParallel всё ещё подходит

DataParallel подходит для быстрых экспериментов на одной машине с 2 GPU, где простота настройки одной строкой важнее снижения эффективности. Для обучения на нескольких узлах или большом количестве GPU вместо него используйте DDP.

Распространённая ошибка: сохранение

Словарь состояния обёрнутой модели содержит префикс module.. Чтобы сохранить чистую контрольную точку, сохраните model.module.state_dict(), тогда позднее её можно будет корректно загрузить в необёрнутую модель.

torch.save(model.module.state_dict(), "model.pt")

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

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

Итоги

Вы изучили обучение на нескольких GPU с помощью DataParallel:

  • nn.DataParallel(model, device_ids=[0, 1]) создаёт копии модели и разделяет пакеты данных
  • Градиенты усредняются между GPU на каждом шаге
  • Дисбаланс GPU 0 и архитектура с одним процессом ограничивают масштабирование
  • Для большого количества GPU или обучения на нескольких узлах предпочтителен DDP

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

Урок «Обучение на нескольких GPU с DataParallel» бесплатный?

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

Чему я научусь в уроке «Обучение на нескольких GPU с DataParallel»?

nn.DataParallel, балансировка памяти GPU, узкие места пропускной способности, когда DDP эффективнее Ты практикуешь Learn AI with Python с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

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

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

Сколько времени занимает урок «Обучение на нескольких GPU с DataParallel»?

Большинство уроков 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