Настроить NVLink topology для 8× GPU

ТЕХНИЧЕСКОЕ ЗАДАНИЕ: Настроить NVLink topology для 8× GPU

1. Цель задачи

Получить практический навык диагностики и оптимизации топологии NVLink на многопроцессорной GPU-системе. Вы научитесь интерпретировать вывод утилиты nvidia-smi topo -m, выявлять узкие места межсоединений и настраивать размещение GPU-процессов (placement) для достижения максимальной пропускной способности peer-to-peer обмена.

Ключевой результат Каждая из 8 GPU получает прямой NVLink-доступ (peer access) ко всем остальным 7 GPU, а топология отображается как полный граф, что подтверждается отсутствием узлов NM (NVLink disabled) в выводе nvidia-smi topo -m и результатами теста nvidia-smi nvlink -s.


2. Исходные данные

Что нужноОткуда взять
Сервер с 8× GPU (NVIDIA Tesla/Quadro/GeForce с поддержкой NVLink)Лабораторный стенд, облачная инстанция (например, AWS p4d/p4de, GCP a2-highgpu-8g), собственный сервер
Утилита nvidia-smi версии 450.80.02 или вышеУстановленный драйвер NVIDIA
Права root или sudoАдминистратор системы
Доступ к nvlink тестамУтилита nvidia-smi nvlink (входит в драйвер)
(Опционально) Кластер с MPIДля запуска тестов производительности с переключением топологии

Если нет реального сервера с 8 GPU — симулируем:

  1. Используем облачный сервис с GPU-on-demand, поддерживающий NVLink (например, Lambda Labs, Vast.ai, RunPod). Выберите инстанцию с 8× A100/H100 и гарантированным NVLink.
  2. Если облачный доступ невозможен, разверните виртуальную среду с помощью NVIDIA Isaac Sim или GPU-SIM (например, nvtopo-gen.py на Python, который генерирует реалистичный вывод nvidia-smi topo -m для 8× GPU). Файл симуляции можно создать, вручную заполнив таблицу на основе документированных топологий (DGX A100, DGX H100).
  3. Для тестирования placement используйте CUDA Sample simpleP2P (доступен в CUDA Samples) — он проверяет peer access без реального оборудования.

3. Технологический стек

КомпонентИнструментыНазначение
Мониторинг GPU и NVLinknvidia-smi, nvidia-smi topo -m, nvidia-smi nvlink -sДиагностика топологии, статуса линков
Управление GPUnvidia-persistencedУдержание GPU в активном режиме (P0)
Планирование процессовCUDA_VISIBLE_DEVICES, NCCL_IB_DISABLE, NCCL_NET_GDR_LEVELПривязка GPU к конкретным процессам
Бенчмаркингtensorflow/benchmark или pytorch/ngc с коллективными операциямиИзмерение реальной производительности
Системный анализnumactl, lstopo (hwloc)Топология NUMA и связь с CPU
Среда выполненияDocker / Singularity + NVIDIA Container ToolkitИзолированная среда для повторяемых тестов

4. Этапы выполнения

Этап 1: Сбор базовой информации о топологии (30 мин)

Действия

  1. Выполнить команду:

    nvidia-smi topo -m
    

    Сохраните вывод в файл topo_initial.txt.

  2. Проанализировать таблицу:

    • Найдите строки с меткой NVLink — это прямые соединения.
    • Идентифицируйте пары GPU, у которых значение PIX или PHB (соединение через PCIe root complex).
    • Запишите GPU с меткой NM (NVLink disabled) — они не имеют NVLink-соединения с другими.
  3. Проверить активность линков:

    nvidia-smi nvlink -s
    

    Вывод покажет количество активных линков на каждую GPU. Норма: 6 или 12 (зависит от поколения, для H100 — 18). Сохраните в nvlink_status.txt.

  4. Зафиксировать версии драйвера и CUDA:

    nvidia-smi --query-gpu=name,driver_version,pci.bus_id,index --format=csv
    

Ожидаемый результат этапа Файлы с сырыми данными (topo_initial.txt, nvlink_status.txt) и текстовый отчёт с перечислением всех GPU, их NVLink-соседей и выявленных проблем (недоступные линки, NM статусы).


Этап 2: Выявление проблемных GPU и изоляция узких мест (45 мин)

Действия

  1. Построить матрицу связности на основе вывода nvidia-smi topo -m. Используйте Python-скрипт:

    import subprocess
    output = subprocess.check_output(["nvidia-smi", "topo", "-m"]).decode()
    lines = output.strip().split("\n")
    # парсите строки, извлекая связи NVLink
    
  2. Определить GPU, которые не имеют peer access до других (например, из-за разных NUMA-доменов или отсутствия NVSwitch).

  3. Проверить, не заблокирован ли NVLink на уровне драйвера:

    nvidia-smi --query-gpu=pcie.link.gen.current,pcie.link.width.current --format=csv
    # проверьте, нет ли GPU в состоянии P8 (медленный PCIe)
    
  4. Если обнаружены GPU с NM статусом, попробуйте перезапустить nvidia-persistenced:

    sudo nvidia-persistenced --persistence-mode
    nvidia-smi -pm 1
    nvidia-smi topo -m   # проверить снова
    

Ожидаемый результат этапа Список GPU с полным peer access (все линки активны) и список проблемных устройств, где NVLink недоступен или ограничен.


Этап 3: Оптимизация placement через выделение GPU (1 час)

Действия

  1. Разработать стратегию привязки для типовых нагрузок (коллективные операции, data parallelism). Для каждой пары GPU, которые должны обмениваться данными, они должны быть в одном NVLink-домене.

  2. Создать контейнер с явным указанием GPU через CUDA_VISIBLE_DEVICES. Например, для 8× GPU с топологией «звезда» — выбрать центральную GPU как «hub». Пример для DGX A100 (4 NVSwitch, полный граф): можно брать любые 8.

  3. Написать скрипт проверки peer access с помощью CUDA API:

    import ctypes
    # используйте cudaDeviceEnablePeerAccess для каждой пары
    
  4. Оптимизировать NCCL параметры:

    export NCCL_NET_GDR_LEVEL=5
    export NCCL_IB_DISABLE=0
    export NCCL_NET=gpu
    
  5. Запустить синтетический тест с allreduce через NCCL: nccl-tests/build/all_reduce_perf -b 1M -e 256M -f 2 -g 8.

Ожидаемый результат этапа Скрипт optimize_placement.sh и конфигурация окружения, при которых все GPU имеют peer access (подтверждено кодом). Скорость allreduce не менее 90% от теоретического NVLink bandwidth.


Этап 4: Верификация полного peer access и фиксация конфигурации (30 мин)

Действия

  1. Повторно выполнить nvidia-smi topo -m — ни одна ячейка в строках NVLink не должна содержать NM. Только NV1, NV2, ... (или SYS, PIX, PHB для не-NVLink путей, но это нормально, если нет NM и есть альтернативный NVLink путь).

  2. Выполнить nvidia-smi nvlink -s — для каждой GPU количество линков должно быть максимальным (например, 6 для A100, 18 для H100).

  3. Запустить официальный тест NVIDIA

    /usr/local/cuda/samples/1_Utilities/p2pBandwidthLatencyTest/p2pBandwidthLatencyTest
    

    Проверить, что для каждой пары bandwidth = enabled и задержка в пределах нормы (для NVLink ~300-500 ns).

  4. Зафиксировать итоговую конфигурацию в виде Dockerfile или скрипта setup_nvlink.sh, который автоматически включает persistence mode, отключает автоблокировку и устанавливает нужные переменные окружения.

Ожидаемый результат этапа Файл p2p_results.log со всеми парами GPU, где access = enabled. Итоговый скрипт настройки.


Этап 5: Документация и отчёт (30 мин)

Действия

  1. Написать краткий отчёт по структуре:

    • Исходная топология (копия topo_initial.txt).
    • Обнаруженные проблемы (NM GPU, отключённые линки).
    • Выполненные действия (persistence mode, настройка NCCL, выделение GPU).
    • Итоговая топология (вывод nvidia-smi topo -m).
    • Метрики производительности (allreduce, p2p bandwidth).
  2. Добавить выводы — какие практические рекомендации следует применять при запуске распределённого обучения на подобной архитектуре.

Ожидаемый результат этапа Файл nvlink_optimization_report.md вместе с конфигурационными артефактами.


5. Критерии приемки (Definition of Done)

  • После настройки команда nvidia-smi topo -m показывает для каждой GPU хотя бы одну строку с NVLink без NM (за исключением явно не поддерживаемых устройств, если они есть).
  • Команда nvidia-smi nvlink -s показывает количество активных линков, равное спецификации GPU (6 для A100, 12 для V100, 18 для H100).
  • Тест p2pBandwidthLatencyTest завершается без ошибок, для всех пар GPU указано P2P Access: Enabled.
  • Скрипт setup_nvlink.sh воспроизводит конфигурацию на чистом старте (docker restart).
  • Результаты теста allreduce показывают пропускную способность не менее 80% от теоретической пиковой (например, 300 ГБ/с для H100 с 18 линками).
  • Документ отчёта оформлен в markdown, содержит все исходные и финальные данные.

6. Ожидаемый результат

Основной артефакт Директория nvlink_opt_result/ со следующими файлами:

  • topo_initial.txt — исходная топология
  • topo_final.txt — финальная топология
  • nvlink_status.txt — статус линков
  • p2p_results.log — результаты теста peer access
  • setup_nvlink.sh — скрипт автоматизации
  • nvlink_optimization_report.md — отчёт анализа

Дополнительно Видео/скринкаст выполнения шагов (если требуется отчётность).


7. Возможные сложности и их решение

СложностьРешение
GPU отображаются как NM, хотя NVLink должен работатьПерезагрузить драйвер (nvidia-smi -r), проверить, что все GPU в одной PCIe-группе, проверить lspci -tv. Иногда требуется сброс nvidia-fabricmanager (для кластеров).
После установки CUDA_VISIBLE_DEVICES теряется peer accessУбедиться, что выбранные GPU находятся внутри одного NVSwitch. Используйте nvidia-smi topo -m для поиска изолированных подмножеств. Может потребоваться физическая перестановка карт (не в симуляции).
Недостаточная ширина PCIe для управления NVLinkУбедиться, что GPU подключены к x16 слотам. Проверить через `lspci -vv
Тест P2P падает с ошибкой cudaErrorPeerAccessUnsupportedПроверить, что драйвер поддерживает Peer-to-Peer для данных моделей. Старые драйверы (<418) могут не иметь поддержки. Обновите.
В симуляции нет реального устройстваИспользуйте virtual_gpu_sim.py для эмуляции вывода. Для тестирования placement пишите скрипт, который читает конфигурационный файл вместо реальных команд.

8. Бюджет времени (оценка)

ЭтапВремя (часы)
1. Сбор базовой информации0.5
2. Выявление проблемных GPU1.0
3. Оптимизация placement1.5
4. Верификация фиксация0.5
5. Документация0.5
Итого4.0 часа

Для первого выполнения с незнакомым оборудованием заложите +2 часа на изучение документации.


9. Связанные вопросы из базы знаний

ВопросТема
12Как работает NVLink на уровне протокола?
14Влияние топологии NVLink на эффективность allreduce
25Настройка GPU affinity для MPI-задач
34Диагностика slow P2P с помощью NVProf
42Обход поломанного NVLink через PCIe fallback
57Разница между NVLink 1.0, 2.0, 3.0
81Инструменты выявления NUMA-конфликтов
103Профилирование коллективных операций NCCL
118Сравнение NVSwitch и NVLink mesh
205Как привязать GPU к NUMA node через numactl

10. Чек-лист самопроверки

  • Я выполнил nvidia-smi topo -m в начале и в конце и сравнил изменения.
  • Для каждой GPU я проверил количество активных NVLink-линков через nvidia-smi nvlink -s.
  • Я написал хотя бы один тест на CUDA, который проверяет peer access для всех пар.
  • Я зафиксировал итоговые переменные окружения и добавил их в скрипт setup_nvlink.sh.
  • У меня есть документ, который объясняет причину изначальных проблем (например, отсутствие persistence mode, неверный NUMA placement) и способы их решения.