Решения
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 и топологии связи
дают значительно более высокую пропускную способность и низкие задержки по сравнению с PCIe; TP обычно стоит «паковать» внутри NVLink‑домена.
NCCL поверх высокоскоростной сети (например, RoCE/IB или быстрый Ethernet). Для PP/DP межузловая связь обычно переносится легче, чем для TP.
Как выбрать стратегию (решающее дерево)
- Модель помещается в память 1 GPU?
— Да → DDP (простота, масштабируемость).
— Нет → FSDP/ZeRO (шардирование модели/состояний). - Всё ещё упираетесь в вычисления/скорость слоя?
— Добавьте TP (внутрислойное деление) и оставьте FSDP/ZeRO для экономии памяти. - Глубокая модель, хорошие ссылки между узлами?
— Добавьте PP (деление по слоям) и «намотайте» микро‑батчи для заполнения конвейера. - Большой кластер?
— Комбинируйте 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=:29500 train.py
# На узле rank 1
torchrun --nnodes=2 --node_rank=1 --nproc_per_node=8 \
--rdzv_backend=c10d --rdzv_endpoint=: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.
Навигация по смежным страницам