中文翻译暂不可用,显示俄语原文。
Настроить 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 — симулируем:
- Используем облачный сервис с GPU-on-demand, поддерживающий NVLink (например, Lambda Labs, Vast.ai, RunPod). Выберите инстанцию с 8× A100/H100 и гарантированным NVLink.
- Если облачный доступ невозможен, разверните виртуальную среду с помощью NVIDIA Isaac Sim или GPU-SIM (например,
nvtopo-gen.pyна Python, который генерирует реалистичный вывод nvidia-smi topo -m для 8× GPU). Файл симуляции можно создать, вручную заполнив таблицу на основе документированных топологий (DGX A100, DGX H100). - Для тестирования placement используйте CUDA Sample simpleP2P (доступен в CUDA Samples) — он проверяет peer access без реального оборудования.
3. Технологический стек
| Компонент | Инструменты | Назначение |
|---|---|---|
| Мониторинг GPU и NVLink | nvidia-smi, nvidia-smi topo -m, nvidia-smi nvlink -s | Диагностика топологии, статуса линков |
| Управление GPU | nvidia-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 мин)
Действия
-
Выполнить команду:
nvidia-smi topo -mСохраните вывод в файл
topo_initial.txt. -
Проанализировать таблицу:
-
Проверить активность линков:
nvidia-smi nvlink -sВывод покажет количество активных линков на каждую GPU. Норма: 6 или 12 (зависит от поколения, для H100 — 18). Сохраните в
nvlink_status.txt. -
Зафиксировать версии драйвера и 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 мин)
Действия
-
Построить матрицу связности на основе вывода nvidia-smi topo -m. Используйте Python-скрипт:
import subprocess output = subprocess.check_output(["nvidia-smi", "topo", "-m"]).decode() lines = output.strip().split("\n") # парсите строки, извлекая связи NVLink -
Определить GPU, которые не имеют peer access до других (например, из-за разных NUMA-доменов или отсутствия NVSwitch).
-
Проверить, не заблокирован ли NVLink на уровне драйвера:
nvidia-smi --query-gpu=pcie.link.gen.current,pcie.link.width.current --format=csv # проверьте, нет ли GPU в состоянии P8 (медленный PCIe) -
Если обнаружены 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 час)
Действия
-
Разработать стратегию привязки для типовых нагрузок (коллективные операции, data parallelism). Для каждой пары GPU, которые должны обмениваться данными, они должны быть в одном NVLink-домене.
-
Создать контейнер с явным указанием GPU через
CUDA_VISIBLE_DEVICES. Например, для 8× GPU с топологией «звезда» — выбрать центральную GPU как «hub». Пример для DGX A100 (4 NVSwitch, полный граф): можно брать любые 8. -
Написать скрипт проверки peer access с помощью CUDA API:
import ctypes # используйте cudaDeviceEnablePeerAccess для каждой пары -
Оптимизировать NCCL параметры:
export NCCL_NET_GDR_LEVEL=5 export NCCL_IB_DISABLE=0 export NCCL_NET=gpu -
Запустить синтетический тест с
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 мин)
Действия
-
Повторно выполнить
nvidia-smi topo -m— ни одна ячейка в строках NVLink не должна содержатьNM. ТолькоNV1,NV2, ... (илиSYS,PIX,PHBдля не-NVLink путей, но это нормально, если нет NM и есть альтернативный NVLink путь). -
Выполнить
nvidia-smi nvlink -s— для каждой GPU количество линков должно быть максимальным (например, 6 для A100, 18 для H100). -
Запустить официальный тест NVIDIA
/usr/local/cuda/samples/1_Utilities/p2pBandwidthLatencyTest/p2pBandwidthLatencyTestПроверить, что для каждой пары
bandwidth = enabledи задержка в пределах нормы (для NVLink ~300-500 ns). -
Зафиксировать итоговую конфигурацию в виде
Dockerfileили скриптаsetup_nvlink.sh, который автоматически включает persistence mode, отключает автоблокировку и устанавливает нужные переменные окружения.
Ожидаемый результат этапа Файл p2p_results.log со всеми парами GPU, где access = enabled. Итоговый скрипт настройки.
Этап 5: Документация и отчёт (30 мин)
Действия
-
Написать краткий отчёт по структуре:
- Исходная топология (копия
topo_initial.txt). - Обнаруженные проблемы (NM GPU, отключённые линки).
- Выполненные действия (persistence mode, настройка NCCL, выделение GPU).
- Итоговая топология (вывод
nvidia-smi topo -m). - Метрики производительности (allreduce, p2p bandwidth).
- Исходная топология (копия
-
Добавить выводы — какие практические рекомендации следует применять при запуске распределённого обучения на подобной архитектуре.
Ожидаемый результат этапа Файл 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 accesssetup_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. Выявление проблемных GPU | 1.0 |
| 3. Оптимизация placement | 1.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) и способы их решения.