Развернуть NCCL бенчмарк на 2-8 GPU
ТЕХНИЧЕСКОЕ ЗАДАНИЕ: Развернуть NCCL бенчмарк на 2-8 GPU
1. Цель задачи
Освоить запуск и интерпретацию результатов стандартного бенчмарка nccl-tests (all_reduce_perf) на кластере с несколькими GPU (2–8 штук). Научиться выявлять узкие места в меж-GPU коммуникации: различать пропускную способность NVLink (прямое соединение GPU) и PCIe (через CPU/Root Complex). В результате вы сможете быстро оценить реальную производительность interconnect и диагностировать типовые проблемы (неправильная топология, driver/cuda-версии, конфигурация MPI).
Ключевой результат Запуск all_reduce_perf на 2, 4, 8 GPU, запись результатов (bandwidth, latency), построение графика зависимости пропускной способности от размера сообщения и идентификация bottleneck (NVLink vs PCIe).
2. Исходные данные
| Что нужно | Откуда взять |
|---|---|
| Кластер с 2–8 GPU NVIDIA (поддерживаются все архитектуры начиная с Volta) | Реальный сервер, облачный инстанс (AWS P3/P4/P5, Azure ND-series, GCP A2), или несколько виртуалок с GPU (например, Vast.ai, Lambda Cloud) |
| Доступ к shell (или Jupyter с root/sudo) | SSH, консоль |
| CUDA и драйвер NVIDIA | nvidia-smi — драйвер, nvcc --version — CUDA. Ожидаемая версия >= 11.0 |
| nccl-tests | Git-репозиторий: https://github.com/NVIDIA/nccl-tests.git |
| Инструменты для построения графиков | Python 3, matplotlib / pandas / seaborn |
Если нет реального кластера с GPU — симулируем:
- Используйте инстанс с одной GPU и запустите all_reduce_perf с
-b 8 -e 128M -f 2. Это даст данные только для одного узла, но можно сымитировать multi-GPU, указав-g 2 --cuda_graph_launch. - Альтернативно: возьмите опубликованные таблицы результатов из документации NVIDIA (NVLink vs PCIe) и на их основе постройте график-анализ.
- Для симуляции bottleneck: установите переменные окружения NCCL_ALGO=Ring и NCCL_NET_GDR_LEVEL=0 (отключение GPU Direct RDMA), чтобы увидеть более низкую пропускную способность и сравнить с нормальным режимом.
3. Технологический стек
| Компонент | Инструменты | Назначение |
|---|---|---|
| Коммуникационная библиотека | NCCL (NVIDIA Collective Communications Library), встроена в CUDA | Бэкенд для all_reduce |
| Бенчмарк | nccl-tests (all_reduce_perf) | Измерение пропускной способности и задержки |
| Система сборки | CUDA Toolkit >= 11, Make/g++ | Компиляция тестов |
| Мониторинг и визуализация | Python (pandas, matplotlib) | Построение графика bandwidth vs message size |
| Диагностика топологии | nvidia-smi topo -m, nvidia-smi nvlink -s | Карта соединений GPU, NVLink status |
4. Этапы выполнения
Этап 1: Установка и проверка окружения (30–45 минут)
Действия
-
Проверить наличие GPU и драйвера
- nvidia-smi — вывести список GPU, убедиться что видно все 2–8 карт.
- Зафиксировать версию драйвера и архитектуры (например, A100, V100, H100).
-
Клонировать и собрать nccl-tests
git clone https://github.com/NVIDIA/nccl-tests.git cd nccl-tests make MPI=0 # если MPI не нужен для одной ноды; MPI=1 если есть MPI и multi-node- В случае ошибок убедиться, что CUDA
binиlibв PATH иLD_LIBRARY_PATH.
- В случае ошибок убедиться, что CUDA
-
Проверить топологию NVLink
- nvidia-smi topo]] -m]] — вывести матрицу связности (PIX, PXB, NODE, NV). NV означает NVLink.
- nvidia-smi nvlink -s — статус NVLink линков (количество активных, ошибки CRC).
- Ожидаемый результат этапа Окружение готово, топология зафиксирована, бинарник all_reduce_perf собран.
Этап 2: Запуск all_reduce_perf для 2, 4, 8 GPU (30–45 минут)
Действия
- Запустить тест для 2 GPU
./all_reduce_perf -b 8 -e 128M -f 2 -g 2 -n 5 -w 5- Опции:
-b 8(min size 8 bytes),-e 128M(max size 128MB),-f 2(factor 2 — размер удваивается),-g 2(число GPU),-n 5(число итераций для статистики),-w 5(warmup).
- Опции:
- Повторить для 4 GPU и 8 GPU:
- Изменить
-gна 4 и 8 (если доступно). Если GPU меньше 8, используйте то, что есть (например, 4).
- Изменить
- Записать вывод в файл
./all_reduce_perf -b 8 -e 128M -f 2 -g 2 -n 5 -w 5 | tee results_nccl_2gpu.log - Запустить с принудительным отключением NVLink (для контраста):
- NCCL_ALGO=Ring NCCL_NET_GDR_LEVEL=0 ./all_reduce_perf -b 8 -e 128M -f 2 -g 2 -n 5 -w 5 — это приведёт к использованию только PCIe (через P2P или CPU), bandwidth будет ниже.
- Записать как results_pcie.log. Ожидаемый результат этапа Сырые данные по bandwidth и latency для каждого размера сообщения, для разных конфигураций GPU (2,4,8) и для режима PCIe-only.
Этап 3: Парсинг результатов и построение графика (30–40 минут)
Действия
-
Считать данные из логов с помощью Python:
- В выводе all_reduce_perf столбцы:
size,count,type,redop,root, time, algbw, busbw. - algbw — алгоритмическая пропускная способность (GB/s), busbw — фактическая bandwidth шины (обычно algbw * (n-1)/n для all_reduce).
- Пример парсинга (регулярками или pandas):
import pandas as pd # текст лога в строку lines = """size count type redop root time algbw busbw 8 1024 float sum -1 0.01 0.001 0.001 16 1024 float sum -1 0.01 0.003 0.003 ...""" # используем github.com/NVIDIA/nccl-tests/blob/master/doc/PERFORMANCE.md для формата - Удобнее использовать готовый скрипт
parse_nccl_tests.py, но можно написать свой.
- В выводе all_reduce_perf столбцы:
-
Построить график log-log plot: размер сообщения (bytes) vs bus bandwidth (GB/s).
- Добавить линии для разных количеств GPU и для PCIe-only.
- Добавить горизонтальные линии для теоретических пиков NVLink и PCIe (например, NVLink 4.0: 900 GB/s aggregated для 8 GPU, PCIe Gen5 x16: ~60 GB/s).
import matplotlib.pyplot as plt plt.loglog(sizes, bw_2gpu, label='2 GPU (NVLink)') plt.loglog(sizes, bw_pcie, label='2 GPU (PCIe)') # ... plt.legend() -
Определить bottleneck точка, где кривая выходит на плато или существенно ниже теоретического пика.
Этап 4: Анализ и выводы (15–20 минут)
Действия
- Зафиксировать максимальные bandwidth для каждой конфигурации:
- Выявить bottleneck
- Написать краткий отчёт (3-5 предложений):
Этап 5: Проверка воспроизводимости и альтернативные протоколы (20–30 минут)
Действия
- Запустить с разными алгоритмами
- Проверить влияние
NCCL_PROTONCCL_PROTO=LL(Low Latency),NCCL_PROTO=SIMPLE(высокая пропускная способность).
- Запустить тест с
-c 2(используя только 2 канала NVLink) и сравнить.NCCL_NCHANNELS=2или флаг-c 2. Ожидаемый результат этапа Понимание влияния алгоритмов и протоколов на производительность.
5. Критерии приемки (Definition of Done)
-
all_reduce_perfуспешно собран и запущен на 2/4/8 GPU. - Собраны логи для всех конфигураций (минимум 2,4,8 GPU + PCIe simulation).
- Построен график log-log bandwidth vs message size с подписями.
- На графике отмечены теоретические пики NVLink и PCIe для данной архитектуры.
- В выводах явно указано, где bottleneck (NVLink, PCIe, latency).
- Проведен эксперимент с отключенным NVLink (PCIe-only) для контраста.
- Проверено влияние хотя бы двух алгоритмов (Ring, Tree).
- Создан файл
README.mdс описанием окружения, команд запуска, графиком и интерпретацией.
6. Ожидаемый результат
Основной артефакт Каталог (например, nccl_benchmark_results) со следующими файлами:
results_nccl_2gpu.log(и аналоги для 4, 8, pcie)bandwidth_plot.png— график.README.md— отчёт, включающий:- Информацию о кластере (GPU, драйвер, CUDA, топология).
- Команды запуска.
- Таблицу пиковых bandwidth для каждого размера.
- Вывод о bottleneck.
- Дополнительно (опционально):
analysis.py— скрипт для парсинга и построения графика.
7. Возможные сложности и их решение
| Сложность | Решение |
|---|---|
| Нет доступа к multi-GPU кластеру | Использовать симуляцию через одну GPU с -g 2 и --cuda_graph_launch, или взять готовые данные из NVIDIA. |
Ошибка сборки nccl-tests (несовместимость CUDA) | Убедиться, что CUDA в PATH. Можно использовать mpi вариант, если установлен MPI: make MPI=1. |
nvidia-smi nvlink показывает все линки отключены | Проверить, что GPU действительно поддерживают NVLink (например, Tesla T4 не имеет NVLink). Запустить только PCIe тест. |
| Странные результаты (bandwidth ниже ожидаемого) | Проверить nvidia-smi topo -m; возможно GPU висят на разных PCIe корнях. Повторить с NCCL_NET_GDR_LEVEL=0 для проверки. |
| Out of memory на больших размерах | Уменьшить -e (например, до 16M) или использовать меньше GPU. |
8. Бюджет времени (оценка)
| Этап | Время |
|---|---|
| Этап 1: Установка и проверка окружения | 30–45 мин |
| Этап 2: Запуск all_reduce_perf | 30–45 мин |
| Этап 3: Парсинг и построение графика | 30–40 мин |
| Этап 4: Анализ и выводы | 15–20 мин |
| Этап 5: Проверка альтернативных протоколов | 20–30 мин |
| Итого (чистое время) | ~2–3 часа |
| Примечание Для первого раза с настройкой окружения — до 4 часов |
9. Связанные вопросы из базы знаний
| Вопрос | Тема |
|---|---|
| 1 | Что такое NCCL и как он реализует коллективные операции? |
| 5 | Разница между NVLink и PCIe для передачи данных между GPU |
| 18 | Как работает all_reduce: кольцевой алгоритм vs дерево |
| 23 | Влияние топологии (P2P, NVLink) на пропускную способность |
| 47 | Диагностика производительности GPU interconnect с помощью nvidia-smi |
| 89 | Настройка NCCL параметров (алгоритм, протокол, количество каналов) |
| 124 | Сравнение пропускной способности NVLink 3.0, 4.0, 5.0 |
| 217 | Как определить bottleneck в распределённом обучении через nccl-tests |
| 356 | Использование NCCL в PyTorch Distributed Data Parallel (DDP) |
| 543 | Метрики all_reduce_perf: algbw vs busbw, их интерпретация |
10. Чек-лист самопроверки
- Я проверил, что
nvidia-smiвидит все GPU и их топология соответствует ожидаемой. - Я убедился, что
all_reduce_perfсобрался без ошибок. - Я запустил тесты минимум для 2, 4, 8 GPU (или доступного количества) и записал вывод в лог.
- Я построил график с нормальной шкалой (log-log) и отметил теоретические пики.
- Я выполнил тест с отключением NVLink (через переменные окружения) для контраста.
- В отчёте я объяснил, почему на маленьких размерах bandwidth мала (latency), а на больших упирается в пик интерконнекта.
- Я зафиксировал bottleneck: NVLink недогружен или уже насыщен; если насыщен — предложил что делать (увеличить число каналов, использовать Tree).