ПО для GPU

Тесты NCCL на сервере с несколькими GPU: all_reduce_perf шаг за шагом

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

На этой странице
  1. Проверка топологии GPU
  2. Сборка nccl-tests
  3. Запуск all_reduce_perf на 8 GPU
  4. Что означает busbw
  5. Отладка с NCCL_DEBUG=INFO
  6. Запуск задач DDP или FSDP через torchrun
  7. Работа на нескольких узлах

Тесты NCCL на сервере с несколькими GPU — самый быстрый способ убедиться, что GPU, NVLink и коммуникационный стек работают слаженно, прежде чем браться за длительное обучение. Эта страница относится к нашим 8-GPU-серверам: проверьте топологию, соберите nccl-tests от NVIDIA, запустите all_reduce_perf на восьми GPU, оцените busbw, а затем запускайте задачи PyTorch через torchrun. Заметки о работе на нескольких узлах — в конце. На серверах AMD используется RCCL, о нём — в руководстве по настройке ROCm.

Проверка топологии GPU

nvidia-smi topo -m
nvidia-smi nvlink --status
systemctl status nvidia-fabricmanager

В матрице topo -m запись NV# означает, что два GPU соединены через NVLink, а # — число каналов. PIX, PXB, PHB, NODE и SYS — пути через PCIe, от самого близкого к самому дальнему. Матрица также показывает, к каким процессорам и узлам NUMA привязан каждый GPU.

На серверах HGX (H100, H200, B200, B300) для каждой пары GPU должна быть запись NV, а Fabric Manager должен находиться в состоянии active (running). В сервере с RTX PRO 6000 NVLink нет: его GPU обмениваются данными через PCIe, поэтому записи PCIe там ожидаемы. Подробнее — в статье о сравнении NVLink и PCIe.

Сборка nccl-tests

  1. Установите инструменты сборки и проверьте, есть ли заголовочный файл NCCL для разработки:
    sudo apt install -y git build-essential
    ls /usr/include/nccl.h
  2. Если nccl.h нет, установите NCCL из репозитория CUDA от NVIDIA, подключённого так, как описано в руководстве по версиям драйвера и CUDA. Выведите список версий и выберите самую новую, у которой суффикс CUDA (например, +cuda12.8) не новее значения «CUDA Version» в выводе nvidia-smi:
    apt-cache madison libnccl2 | head
    sudo apt install -y libnccl2=VERSION libnccl-dev=VERSION
  3. Соберите тесты:
    git clone https://github.com/NVIDIA/nccl-tests.git
    cd nccl-tests
    make -j"$(nproc)" CUDA_HOME=/usr/local/cuda
    Исполняемые файлы появятся в ./build/.

Чтобы ничего не менять на хосте, соберите тесты так же внутри контейнера NGC с PyTorch, в котором уже есть CUDA и NCCL.

Запуск all_reduce_perf на 8 GPU

./build/all_reduce_perf -b 8 -e 8G -f 2 -g 8

Один процесс управляет восемью GPU (-g 8) и перебирает размеры от 8 байт (-b) до 8 ГБ (-e), удваивая размер на каждом шаге (-f 2). В каждой строке — время и два значения пропускной способности, algbw и busbw, для прогонов out-of-place и in-place. Проверьте, что:

  • в столбцах #wrong в каждой строке стоит 0, то есть результаты верны;
  • busbw растёт с увеличением размера сообщения и выходит на плато на самых больших размерах;
  • итоговая строка «Avg bus bandwidth» стабильна от запуска к запуску.

Другие коллективные операции тестируются так же: all_gather_perf, reduce_scatter_perf и sendrecv_perf.

Что означает busbw

algbw — это объём данных, делённый на время. Это значение меняется в зависимости от числа GPU, поэтому его трудно сравнивать между разными конфигурациями. busbw вводит поправочный коэффициент, чтобы значение отражало трафик, который реально проходит по каждому каналу. Для all-reduce коэффициент равен 2 × (n − 1) / n, то есть 1,75 для восьми GPU. Благодаря этому busbw можно сравнивать с пропускной способностью каналов самого оборудования, а также между серверами одной модели.

Заявленные производителем скорости каналов — пиковые значения, которых тест не достигает, поэтому оценивайте стабильность результатов: сравнивайте запуски между собой и с идентичным сервером, если он у вас есть. Резкое падение на больших размерах, результат намного ниже, чем у такого же сервера, или зависание обычно указывают на проблему с топологией, Fabric Manager или оборудованием. Пришлите нам полный вывод и матрицу топологии в тикете в поддержку через личный кабинет.

Отладка с NCCL_DEBUG=INFO

NCCL_DEBUG=INFO ./build/all_reduce_perf -b 1G -e 1G -g 8 2>&1 \
  | tee nccl-debug.log

В журнале видны версия NCCL, транспорт, выбранный между GPU (P2P или NVLS через NVLink, SHM через память хоста, NET через сеть), а также кольца и деревья, которые построил NCCL. На серверах HGX должны использоваться транспорты NVLink. Если вместо них вы видите SHM, проверьте топологию и Fabric Manager. Если на сервере RTX PRO 6000, где GPU связаны через PCIe, тест зависает или сообщает об ошибках, перезапустите его с NCCL_P2P_DISABLE=1. Если такой запуск проходит успешно, проблема в прямом обмене данными между GPU (peer-to-peer): создайте тикет в личном кабинете, и мы поможем разобраться.

Запуск задач DDP или FSDP через torchrun

torchrun запускает по одному процессу на каждый GPU и задаёт переменные, которые нужны пакету распределённых вычислений PyTorch. В окружении с PyTorch сохраните эту проверку как allreduce_check.py:

import os
import torch
import torch.distributed as dist

dist.init_process_group("nccl")
rank = int(os.environ["LOCAL_RANK"])
torch.cuda.set_device(rank)
x = torch.ones(1024, device="cuda") * (rank + 1)
dist.all_reduce(x)
print(f"rank {rank}: {x[0].item()}")
dist.destroy_process_group()

Запустите её на всех восьми GPU:

torchrun --standalone --nproc_per_node=8 allreduce_check.py

Каждый ранг должен вывести 36.0 — сумму чисел от 1 до 8. Ваш обучающий скрипт с DDP или FSDP запускается так же. DDP хранит полную копию модели на каждом GPU и усредняет градиенты. FSDP шардирует параметры, градиенты и состояние оптимизатора между GPU, поэтому можно обучать модели, которые не помещаются в память одного GPU. Если задача зависает, добавьте NCCL_DEBUG=INFO перед командой.

Работа на нескольких узлах

  • Сеть. Попросите настроить частную сеть между вашими серверами — в примечаниях к заказу при их развёртывании или в тикете через личный кабинет — и используйте частные адреса для rendezvous и трафика NCCL.
  • Интерфейс. Найдите частный интерфейс с помощью ip -br addr и на каждом узле задайте его имя в NCCL_SOCKET_IFNAME, чтобы NCCL не выбрал публичный интерфейс.
  • Запуск. Выполните одну и ту же команду на каждом узле, меняя только ранг. Здесь 10.0.0.1 — частный адрес первого узла:
    torchrun --nnodes=2 --nproc_per_node=8 --node_rank=0 \
      --master_addr=10.0.0.1 --master_port=29500 train.py
    На втором узле укажите --node_rank=1 и, если включён файрвол, разрешите этот порт между узлами.
  • Сетевая фабрика. Чтобы GPU разных узлов обменивались данными на полной скорости, нужна RDMA-фабрика (InfiniBand или RoCE), проложенная и настроенная между вашими серверами, — частная сеть её не обеспечивает. Если одной задаче нужно больше восьми GPU, которые обмениваются данными на скорости NVLink, стойка GB300 NVL72 объединяет все 72 GPU в одном домене NVLink.

Не получается?

Создайте тикет в личном кабинете: укажите сервер, что вы запускали, и приложите вывод ошибок, если он есть. Инженеры отвечают круглосуточно.

Создать тикет

Вход в FullGPU

Управляйте GPU-серверами, балансом и счетами.

Впервые в FullGPU? Создать аккаунт