Pipeline Parallelism
Узнай, как конвейерный параллелизм распределяет модели глубокого обучения между GPU. Научись предотвращать ошибки нехватки памяти и оптимизировать распределённое обучение.
Конвейерный параллелизм — это передовой метод распределённого обучения, предназначенный для разделения большой нейронной сети (NN) между несколькими вычислительными устройствами, например GPU, за счёт разделения модели по глубине. Когда веса модели и состояния оптимизатора современной архитектуры превышают объём памяти одного ускорителя, инженеры разделяют последовательные слои сети на «этапы». Например, первые 10 слоёв могут находиться на GPU 0, а следующие 10 — на GPU 1. Во время прямого прохода данные перемещаются с одного устройства на другое. Объединяя эти устройства в цепочку, исследователи могут обучать масштабные алгоритмы глубокого обучения (DL), не сталкиваясь с ошибками нехватки памяти, ограничивающими возможности оборудования.
Как работает конвейерный параллелизм#
Наивная реализация разделения слоёв между устройствами приводит к серьёзной неэффективности, известной как «пузырьки конвейера». Поскольку слои обрабатываются последовательно, GPU 1 полностью простаивает, пока GPU 0 обрабатывает начальные слои. Чтобы максимально повысить загрузку оборудования, современные планировщики конвейеров разделяют общий размер пакета на более мелкие «микропакеты».
Вместо ожидания завершения обработки всего пакета GPU 0 сразу начинает обрабатывать второй микропакет, как только передаёт первый микропакет GPU 1. Такие инструменты, как Microsoft DeepSpeed и API конвейерного распараллеливания PyTorch, обычно используют стратегию планирования 1F1B (один прямой проход, один обратный проход). Этот метод поочерёдно выполняет прямые и обратные проходы для разных микропакетов одновременно, значительно уменьшая пузырьки конвейера и потребление памяти. Последние достижения 2024 и 2025 годов даже привнесли конвейерный параллелизм без пузырьков — стратегию прогнозирования весов с учётом оптимизатора, которая почти полностью устраняет простои в вычислительных кластерах.
Отличия связанных методов распараллеливания#
Конвейерный параллелизм является частью более широкой экосистемы стратегий распределённых вычислений. Понимание различий между ними критически важно для эффективного масштабирования AI-моделей:
- Параллелизм моделей: это общий термин для разделения модели между устройствами. Конвейерный параллелизм — это узкоспециализированная форма параллелизма моделей, при которой архитектура последовательно разделяется по глубине.
- Тензорный параллелизм: в отличие от разделения по глубине при конвейерном параллелизме, тензорный параллелизм разделяет отдельные матричные операции по горизонтали между GPU. Эти два метода часто объединяют для максимального повышения пропускной способности.
- Параллелизм данных: при параллелизме данных полная модель реплицируется на каждом GPU, а обучающие данные распределяются между ними. Для компактных, высокооптимизированных архитектур обнаружения объектов и сегментации изображений, таких как модель Ultralytics YOLO26, которая изначально помещается в VRAM одного устройства, предпочтительным методом ускорения обучения является параллелизм данных через DistributedDataParallel (DDP) в PyTorch.
Практическое применение в ИИ и ML#
Масштабирование сложной инфраструктуры необходимо для создания современных передовых AI-систем:
- Обучение базовых моделей: разработка гигантских больших языковых моделей (LLMs) и базовых моделей, таких как Llama 3 от Meta, требует объединения тензорного, дата- и конвейерного параллелизма. Такие фреймворки, как NVIDIA Megatron-LM, используют эти стратегии для обучения масштабных архитектур смеси экспертов (MoE) на тысячах GPU в облачных платформах, таких как AWS SageMaker.
- Медицинская диагностика высокого разрешения: в области AI в здравоохранении и научного моделирования трёхмерные объёмные сканы часто создают активации, слишком большие для одного ускорителя. Конвейерное распределение слоёв сети между узлами позволяет исследовательским больницам обучать глубокие сети на огромных наборах данных MRI без снижения разрешения изображений.
Пример кода: концепция разделения слоёв#
Ранее распределение слоёв между устройствами требовало сложного пользовательского кода. Сегодня базовая логика сопоставляет определённые слои с разными идентификаторами устройств. Ниже приведено концептуальное представление того, как этапы сети разделяются между устройствами в PyTorch, формируя основу для конвейерных операций параллелизма:
import torch.nn as nn
class SimplePipelineModel(nn.Module):
def __init__(self):
super().__init__()
# Stage 1 is assigned to the first GPU
self.stage1 = nn.Sequential(nn.Linear(1024, 1024), nn.ReLU()).to("cuda:0")
# Stage 2 is assigned to the second GPU
self.stage2 = nn.Sequential(nn.Linear(1024, 1024), nn.ReLU()).to("cuda:1")
def forward(self, x):
# The forward pass seamlessly crosses device boundaries
x_out = self.stage1(x.to("cuda:0"))
return self.stage2(x_out.to("cuda:1"))Хотя создание базовых моделей требует сложной оркестрации, разработка быстрых и масштабируемых проектов в области компьютерного зрения (CV) обычно проще. Для упрощённого развёртывания моделей и автоматизированного использования нескольких GPU разработчики доверяют Ultralytics Platform, которая автоматически масштабирует рабочие нагрузки. Используя эффективные рекомендации по обучению моделей, платформа скрывает от пользователя управление инфраструктурой и позволяет инженерам полностью сосредоточиться на создании точных AI-решений, способных выполнять вывод в реальном времени.









