Решения

Multi‑GPU и multi‑node: стратегии параллелизма, NCCL и топологии

Задача страницы. Помочь выбрать стратегию масштабирования (на одном узле и на кластере), понять, когда достаточно data‑parallel, а когда нужны шардирование модели (FSDP/ZeRO), tensor/pipeline‑параллелизм, и как топология (NVLink/NVSwitch/сеть) влияет на производительность.

Когда масштабировать и «что именно»

  • Хотите выше throughput при том же размере модели → начните с data parallel (DDP). Модель копируется на каждый GPU, градиенты синхронизируются all‑reduce; профиль «быстро и просто», но память параметров дублируется на всех девайсах.
  • Модель не влезает в один GPU → используйте шардирование модели (FSDP/ZeRO), чтобы распределить параметры/градиенты/состояния оптимизатора между участниками.
  • Даже после шардирования узкое место — математика слоя → добавляйте tensor parallel (деление внутри слоя) и/или pipeline parallel (деление по слоям), комбинируя с DDP в «3D‑параллелизм».

Три оси параллелизма — кратко

Data parallel (DDP)

Каждый процесс тренирует полную копию модели на своей доле данных; после backward выполняется all‑reduce градиентов (NCCL). Отлично масштабируется по узлам, но дублирует память модели.

Model sharding (FSDP / ZeRO)

FSDP шардирует параметры, градиенты и состояния оптимизатора между процессами, загружая «кусок» модели на каждый GPU и сокращая пиковое потребление VRAM; вдохновлён идеями ZeRO из DeepSpeed (стадии 1–3).

Tensor / Pipeline parallel

  • Tensor parallel режет крупные матричные операции внутри слоя (например, attention/FFN), требуя скоростной связи между GPU. Реализовано, в частности, в Megatron‑LM.
  • Pipeline parallel делит сеть по слоям на стадии; микро‑батчи «текут» по конвейеру, уменьшая idle‑время; есть варианты расписаний (в т.ч. interleaved), комбинируется с DDP/TP.

NCCL и топологии связи

предоставляет высокоэффективные коллективные операции (all‑reduce, all‑gather, reduce‑scatter и др.) и является стандартным бэкендом для обменов между GPU в DL‑тренировках.

дают значительно более высокую пропускную способность и низкие задержки по сравнению с PCIe; TP обычно стоит «паковать» внутри NVLink‑домена.

NCCL поверх высокоскоростной сети (например, RoCE/IB или быстрый Ethernet). Для PP/DP межузловая связь обычно переносится легче, чем для TP.

Как выбрать стратегию (решающее дерево)

  1. Модель помещается в память 1 GPU?
    — Да → DDP (простота, масштабируемость).
    — Нет → FSDP/ZeRO (шардирование модели/состояний).
  2. Всё ещё упираетесь в вычисления/скорость слоя?
    — Добавьте TP (внутрислойное деление) и оставьте FSDP/ZeRO для экономии памяти. 
  3. Глубокая модель, хорошие ссылки между узлами?
    — Добавьте PP (деление по слоям) и «намотайте» микро‑батчи для заполнения конвейера.
  4. Большой кластер?
    — Комбинируйте DDP × TP × PP (3D‑параллелизм) и подбирайте факторы под топологию кластера.

Инференс на нескольких GPU/узлах

  • vLLM поддерживает распределённый инференс (tensor/pipeline‑parallel) и масштабирование реплик; удобно для высоких TPS при генерации.
  • TensorRT‑LLM (в т.ч. через бэкенд Triton) использует MPI/коллективы и поддерживает режимы распределённого запуска на нескольких GPU/узлах для минимальной латентности.

Быстрый старт: типовые команды

Одноузловой DDP (8 GPU):

				
					torchrun --standalone --nproc_per_node=8 train.py --config cfg.yaml
				
			

См. основы DDP и рекомендации по разбиению данных/эмбеддингу самплеров.

Многоузловой запуск (2 узла):

				
					# На узле rank 0
torchrun --nnodes=2 --node_rank=0 --nproc_per_node=8 \
  --rdzv_backend=c10d --rdzv_endpoint=<host0>:29500 train.py

# На узле rank 1
torchrun --nnodes=2 --node_rank=1 --nproc_per_node=8 \
  --rdzv_backend=c10d --rdzv_endpoint=<host0>:29500 train.py

				
			

Проверьте согласованность world_size = nnodes * nproc_per_node и доступность rendezvous‑порта.

DeepSpeed (ZeRO/FSDP‑подходы):

				
					deepspeed --num_gpus=8 train.py --deepspeed ds_config.json

				
			

Выбирайте ZeRO‑стадии/оффлоады в конфиге в зависимости от VRAM и пропускной способности сети.

Практические настройки, которые «делают погоду»

  • Микро‑батчи и grad accumulation. Для PP количество микро‑батчей ≥ числу стадий, чтобы заполнить конвейер; для DDP/FSDP — используйте accumulation для выхода на целевой эффективный батч.
  • Чекпоинтинг активаций. Снижает пик памяти, особенно полезен в TP/PP‑схемах. (См. общий гайд по оптимизации производительности.)
  • Размещение по топологии. TP внутри NVLink/NVSwitch; PP/DP — между узлами; минимизируйте сквозные «дорогие» обмены.
  • Коллективы NCCL. Следите за балансом all‑reduce/all‑gather/reduce‑scatter; избыточные обмены «съедают» масштабирование.

Типовые композиции (ориентиры)

  • Средние LLM (влезают в 1 GPU по параметрам): DDP × (grad_accum) — просто и быстро.
  • Крупные LLM (не влезают): FSDP (или ZeRO‑3) × DDP; при необходимости добавить TP для ускорения слоёв.
  • Очень глубокие сети/много узлов: PP × TP × DDP с расписанием конвейера (interleaved, 1F1B), под NVLink/межузловую сеть.

Типичные проблемы и диагностика

  • Зависания/таймауты. Несогласованные world_size/rank, закрытый rendezvous‑порт, разные версии NCCL/драйверов. Проверьте запуск «hello‑world» и конфигурацию сети перед тренировкой.
  • Низкая загрузка GPU. Конвейер не заполнен (PP), «узкие» коллективы NCCL, горячие точки в I/O. См. чек‑лист в /solutions/performance-tuning/.
  • Out‑of‑memory. Снизьте размер микро‑батча, включите checkpointing, перейдите на FSDP/ZeRO‑3.