ПО для GPU
Тесты NCCL на сервере с несколькими GPU: all_reduce_perf шаг за шагом
Перед длительным обучением убедитесь, что все восемь GPU обмениваются данными на полной скорости. Эти проверки занимают немного времени и заранее выявляют большинство проблем с интерконнектом.
На этой странице
Проверка топологии GPU
nvidia-smi topo -m
nvidia-smi nvlink --status
systemctl status nvidia-fabricmanager
В матрице topo запись 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
- Установите инструменты сборки и проверьте, есть ли заголовочный файл NCCL для разработки:
sudo apt install -y git build-essential ls /usr/include/nccl.h - Если
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 - Соберите тесты:
Исполняемые файлы появятся в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 () и перебирает размеры от 8 байт () до 8 ГБ (), удваивая размер на каждом шаге (). В каждой строке — время и два значения пропускной способности, algbw и busbw
- в столбцах
#wrongв каждой строке стоит 0, то есть результаты верны; - busbw растёт с увеличением размера сообщения и выходит на плато на самых больших размерах;
- итоговая строка «Avg bus bandwidth» стабильна от запуска к запуску.
Другие коллективные операции тестируются так же: all_gather_perf, reduce_scatter_perf и sendrecv_perf.
Что означает busbw
algbw — это объём данных, делённый на время. Это значение меняется в зависимости от числа 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
Запуск задач 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 разных узлов обменивались данными на полной скорости, нужна GB300 NVL72 объединяет все 72 GPU в одном домене NVLink.RDMA-фабрика (InfiniBand или RoCE), проложенная и настроенная между вашими серверами, — частная сеть её не обеспечивает. Если одной задаче нужно больше восьми GPU, которые обмениваются данными на скорости NVLink, стойка
Не получается?
Создайте тикет в личном кабинете: укажите сервер, что вы запускали, и приложите вывод ошибок, если он есть. Инженеры отвечают круглосуточно.