Настроить GPU Direct RDMA

ТЕХНИЧЕСКОЕ ЗАДАНИЕ: Настроить GPU Direct RDMA

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

Освоить диагностику и верификацию инфраструктуры для GPU Direct RDMA — технологии, позволяющей GPU напрямую обмениваться данными с InfiniBand/ROCE-адаптером без копирования через CPU. Выполнить набор системных команд для проверки, что GPU и RDMA-интерфейс видят друг друга, и подтвердить готовность к высокопроизводительной распределённой тренировке.

Ключевой результат nvidia-smi topo -m показывает P2P=OK для связки GPU с InfiniBand HCA, и ibv_devinfo отображает корректные RDMA-устройства с активными портами, доступными из CUDA-контекста.


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

Что нужноОткуда взять
Сервер с GPU NVIDIA (минимум 1, желательно 2+) и InfiniBand HCA (Mellanox ConnectX-4/5/6) или RDMA-совместимый Ethernet (RoCE v2)Физический стенд, облачный инстанс (AWS EC2 P3/P4d с EFA, Azure ND-series)
Драйверы NVIDIA (видео + CUDA) версии >= 12.0Сайт NVIDIA или пакетный менеджер системы
Драйверы Mellanox OFED (OpenFabrics Enterprise Distribution) версии >= 5.xСайт NVIDIA Networking (Mellanox) или apt-get install mlnx-ofed-kernel-dkms
Пакет ibverbs-utils (ibv_devinfo, ibv_rc_pingpong)Репозиторий ОС (Ubuntu/Debian: ibverbs-utils, RHEL: libibverbs-utils)
Утилита nvidia-smiВходит в драйвер NVIDIA
Пакет nvidia-peermem (nv_peer_memory) для P2P через RDMANVIDIA GPU Peer Direct Memory (исходники на GitHub)
Права root или sudoСистемная настройка

Если нет реального инструмента (физического сервера с RDMA) — симулируем:

  1. Используйте виртуальную машину с GPU (например, Google Colab Pro + T4) и программный InfiniBand (Soft-RoCE). Внутри контейнера Docker с Debian/Ubuntu установите rdma-core и создайте виртуальный RDMA-адаптер (rxe).
  2. Шаги симуляции:
    • apt-get install rdma-core ibverbs-utils
    • modprobe rdma_rxe
    • ip link add eth_veth type veth peer name eth_veth_peer
    • Привяжите RXE: rdma link add rxe_0 type rxe netdev eth0 (замените eth0 на имя сетевого интерфейса, например, eth0). Если нет физического интерфейса — создайте bridge/veth.
    • Проверьте: ibv_devinfo покажет устройство rxe_0 (эмуляция RDMA без реальных пакетов, но для изучения команд подойдёт).
  3. Для nvidia-smi topo -m — она работает с GPU любой виртуализации, пока NVML видит GPU (в Colab работает).
  4. В симуляции P2P не будет физического DMA между GPU и сетевым адаптером — P2P=OK не появится. Поэтому дополнительным критерием симуляции считаем успешное выполнение ibv_devinfo и корректное отображение nvidia-smi topo -m (даже если P2P — Not Supported; признак успеха в симуляции — отсутствие ошибок при выполнении и понимание вывода).

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

КомпонентИнструментыНазначение
Операционная системаUbuntu 22.04 / Rocky Linux 9Базовая среда
GPU NVIDIATesla V100 / A100 / H100 (или эмуляция через NVIDIA Docker)Вычислительный ускоритель
Драйвер GPUNVIDIA driver >= 545, CUDA toolkit >= 12.0Доступ к GPU через NVML и CUDA
RDMA адаптерMellanox ConnectX-5 (или Soft-RoCE)Сетевое взаимодействие с DMA
Библиотеки RDMAlibibverbs, librdmacm, libibumadУправление RDMA-ресурсами
Пакет для P2Pnvidia-peermem (nv_peer_memory)Прямой доступ NIC к GPU памяти
Утилиты диагностикиibv_devinfo, nvidia-smi, lspci, ibv_rc_pingpong, gdrcopyПроверка связности и P2P
Средства разработкиgcc, make, gitСборка модулей при необходимости

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

Этап 1: Проверка оборудования и драйверов (20-30 минут)

Действия

  1. Определите тип GPU и RDMA-адаптера

    lspci | grep -i nvidia
    lspci | grep -i infiniband
    lspci | grep -i "Network controller"   # для RoCE
    

    Пример вывода:

    01:00.0 3D controller: NVIDIA Corporation GA100 [A100 SXM4 80GB] (rev a1)
    02:00.0 InfiniBand: Mellanox Technologies MT28908 Family [ConnectX-6]
    
  2. Проверьте загруженные модули ядра

    lsmod | grep -E "nvidia|mlx|ib_|rdma"
    

    Должны быть видны nvidia, nvidia_uvm, mlx5_core, mlx5_ib, ib_core, ib_umad, ib_uverbs, rdma_cm.

  3. Убедитесь, что драйверы установлены корректно:

    nvidia-smi          # показывает GPU, нет ошибок
    ibv_devinfo         # показывает хотя бы одно устройство с активным портом
    

    Если ibv_devinfo выдаёт no IB devices found — перейдите к этапу 2.

  4. Зафиксируйте вывод команд в текстовый файл для последующего отчёта.

Ожидаемый результат этапа Сервер идентифицирован, GPU и IB-адаптер видны в lspci. Модули ядра загружены. nvidia-smi работает.

Этап 2: Установка и настройка драйверов RDMA (30-60 минут)

Действия

  1. Установите пакеты RDMA (если отсутствуют):

    sudo apt update
    sudo apt install -y ibverbs-utils infiniband-diags libibverbs-dev librdmacm-dev
    

    На RHEL: yum install -y libibverbs-utils infiniband-diags.

  2. Для реальной HCA (Mellanox):

    • Скачайте и установите OFED с сайта NVIDIA Networking (MLNX_OFED).
    • Или используйте пакетный менеджер: sudo apt install mlnx-ofed-kernel-dkms (если в репозитории).
    • Перезагрузите систему после установки.
  3. Для Soft-RoCE (симуляция):

    • Установите rdma-core: sudo apt install -y rdma-core.
    • Создайте RXE устройство (если нет физических RDMA-портов):
      sudo modprobe rdma_rxe
      sudo ip link set dev eth0 up   # замените eth0 на ваш интерфейс (например, docker)
      sudo rdma link add rxe_0 type rxe netdev eth0
      
    • Проверьте: ibv_devinfo | grep -A5 rxe.
  4. Установите nvidia-peermem (для реального P2P):

    git clone https://github.com/NVIDIA/gdrcopy.git
    cd gdrcopy
    make
    sudo insmod nvidia-peermem.ko
    

    Для работы модуля требуется, чтобы был загружен nvidia-uvm и mlx5_ib. Проверьте: lsmod | grep nvidia_peermem.

Ожидаемый результат этапа ibv_devinfo выводит список RDMA-устройств (минимум одно) с state: PORT_ACTIVE (для реального) или «ACTIVE» для Soft-RoCE. Модуль nvidia_peermem загружен.

Этап 3: Диагностика топологии GPU и RDMA (20-30 минут)

Действия

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

    nvidia-smi topo -m
    

    Результат — матрица связности GPU/NIC. Пример для A100 с ConnectX-6 (2 GPU, 2 HCA):

            GPU0    GPU1    NIC0    NIC1    CPU Affinity    NUMA Affinity
    GPU0     X      NV8     PIX     PHB     0-31            0
    GPU1    NV8      X      PHB     PIX     32-63           1
    NIC0    PIX     PHB      X      PIX
    NIC1    PHB     PIX     PIX      X
    

    Ключевые коды: PIX (P2P через PCIe), PHB (через CPU — не прямой P2P). Для успеха в связке GPU-HCA должен быть PIX или PXB (если HCA на отдельном PCIe root), но не PHB.

  2. Определите, какие пары GPU-HCA имеют P2P:

    • Ищите строку, где NIC0 пересекается с GPU0 и GPU1.
    • Если напротив GPU стоит PIX или PXB — P2P возможен.
    • Критерий задачи хотя бы для одной пары GPU–NIC должно быть PIX или PXB (а не PHB). В случае Soft-RoCE (виртуального rxe) nvidia-smi topo -m не покажет NIC (так как rxe не PCIe) — это нормально, задача считается выполненной при корректном выводе с реальными GPU и (опционально) отсутствии ошибок.
  3. Дополнительно проверьте PCIe топологию

    nvidia-smi topo -p
    

    Покажет полную иерархию PCIe.

Ожидаемый результат этапа Ясное понимание, какие GPU и какие NIC находятся на одном PCIe-switch или CPU, что необходимо для P2P.

Этап 4: Проверка RDMA-доступности GPU памяти (30-40 минут)

Действия

  1. Убедитесь, что RDMA-устройства зарегистрированы в CUDA:

    # Создайте маленькую программу (C, скомпилировать с -libverbs -lcuda)
    

    Либо используйте готовый тест из пакета gdrcopy/tests:

    cd gdrcopy/tests
    make
    ./copytest
    

    Если тест пройден — GPU память доступна через RDMA.

  2. Выполните проверку через ibv_devinfo с ключами для GPU: Современные драйверы автоматически регистрируют GPU память как MR (memory region). Проверить можно через ibv_devinfo -v — для каждого порта отобразится список GUID. Если GPU память видна, она появится как vendor part number NVIDIA.

  3. Тестирование P2P (опционально):

    # Используйте ibv_rc_pingpong на одном узле (сам с собой) с выделением GPU-памяти
    # Пример (требуется поддержка в драйвере):
    CUDA_VISIBLE_DEVICES=0 ibv_rc_pingpong -d mlx5_0 -g 3 -s 1000000
    

    Если ibv_rc_pingpong поддерживает опцию -d для CUDA device (не везде), можно пропустить.

Ожидаемый результат этапа GPU-память успешно зарегистрирована как RDMA-регион (или тест copytest проходит без ошибок).

Этап 5: Финальная верификация и документирование (15-20 минут)

Действия

  1. Выполните итоговые команды для сбора артефактов:

    nvidia-smi topo -m > topo_matrix.txt
    ibv_devinfo > ibv_devinfo_output.txt
    lspci -vvv | grep -A10 "NVIDIA\|Mellanox" > pci_info.txt
    
  2. Проверьте, что в topo_matrix.txt напротив одного из NIC напротив GPU стоит PIX (или PXB).

  3. Убедитесь, что ibv_devinfo показывает порт в состоянии PORT_ACTIVE (для реального адаптера) или ACTIVE для Soft-RoCE.

  4. Задокументируйте полученные результаты

    • Скриншот или текст вывода nvidia-smi topo -m.
    • Вывод ibv_devinfo.
    • Отметка, что P2P=OK (или Not Supported для симуляции) с пояснением.

Ожидаемый результат этапа Заполненный отчёт (может быть в виде простого README), содержащий выводы и интерпретацию.


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

  • nvidia-smi отражает корректное количество GPU, драйвер загружен.
  • ibv_devinfo выводит список RDMA-устройств (минимум одно), каждое с активным портом (state = PORT_ACTIVE).
  • nvidia-smi topo -m показывает хотя бы одну пару GPU – NIC с кодом PIX или PXB (для реальной HCA) или не выводит ошибок при выполнении.
  • Модуль nvidia_peermem загружен (lsmod | grep nvidia_peermem).
  • Скрипт/тест gdrcopy (copytest) проходит без ошибок.
  • Собран полный лог команд (nvidia-smi topo -m, ibv_devinfo).
  • Если используется симуляция Soft-RoCE: rdma link show показывает rxe-устройство, ibv_devinfo показывает его порт, nvidia-smi topo -m работает без падений (даже если P2P не поддерживается — это фиксируется в отчёте).

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

Основной артефакт Файл report_gpu_direct_rdma.md (или .txt) с результатами проверки.

Содержание файла

  • Титул, дата, окружение (ОС, версии драйверов).
  • Вывод lspci для GPU и InfiniBand.
  • Вывод nvidia-smi (сводка).
  • Вывод nvidia-smi topo -m с цветовой кодировкой (или текстовой матрицей).
  • Вывод ibv_devinfo для каждого устройства.
  • Результат теста gdrcopy.
  • Заключение: готовность к GPU Direct RDMA (да/нет/требуется дополнительная настройка).

Дополнительные результаты

  • Навык интерпретации топологии PCIe.
  • Понимание разницы между PIX, PHB, PXB.
  • Опыт работы с Soft-RoCE для эмуляции RDMA.

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

СложностьРешение
ibv_devinfo показывает «No IB devices found»Установите пакеты ibverbs-utils и загрузите драйверы (mlx5_core для Mellanox или rdma_rxe для Soft-RoCE). Проверьте lspci наличие HCA.
nvidia-smi topo -m не показывает NICВероятно, HCA не поддерживается NVML. Обновите драйвер NVIDIA (>= 470). Убедитесь, что на HCA установлено прошивку с поддержкой GPU Direct.
nvidia-smi topo -m показывает PHB для всех пар GPU-NICHCA и GPU находятся на разных CPU sockets и/или не соединены через PCIe switch. Для работы P2P может потребоваться физическое реконфигурирование сервера. В задаче достаточно зафиксировать этот факт.
nvidia-peermem не собирается или не вставляетсяУбедитесь, что установлены заголовки ядра (linux-headers). Проверьте версию CUDA и драйвера NVIDIA — они должны быть совместимы с gdrcopy.
Soft-RoCE не работает — rdma link add возвращает ошибкуУбедитесь, что ядро собрано с поддержкой RXE (CONFIG_RDMA_RXE=y). В Docker может потребоваться --privileged и загрузка модулей.
Тесты gdrcopy падают с ошибкой доступа к GPUЗапускайте от root или добавьте пользователя в группу video. Убедитесь, что nvidia-peermem загружен.

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

ЭтапВремя
1. Проверка оборудования и драйверов20-30 мин
2. Установка и настройка драйверов RDMA30-60 мин
3. Диагностика топологии GPU и RDMA20-30 мин
4. Проверка RDMA-доступности GPU памяти30-40 мин
5. Финальная верификация и документирование15-20 мин
Итого (реальный стенд)~2-3 часа
Итого (симуляция Soft-RoCE)~1.5-2 часа

Примечание Время для первого раза может увеличиться в два раза из-за необходимости разобраться с нюансами установки драйверов и Soft-RoCE. Планируйте резерв.


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

ВопросТема
45Что такое GPU Direct RDMA и как оно ускоряет распределённое обучение?
78Настройка NVIDIA NCCL для работы с InfiniBand
112Как проверить совместимость GPU и IB-адаптера по PCIe топологии?
189Установка драйверов NVIDIA в Ubuntu 22.04
203Установка Mellanox OFED из репозитория
267Soft-RoCE: эмуляция RDMA без физического адаптера
319Команды ibv_devinfo и ibstatus: расшифровка вывода
425Ошибки nvidia-peermem: причины и исправление
511gdrcopy: пример программы для проверки GPU Direct RDMA
674Оптимизация PCIe расположения GPU и HCA для ML-кластеров

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

  • Я проверил, что lspci находит GPU и InfiniBand/RDMA адаптер.
  • Я установил и загрузил модули nvidia, mlx5_ib, ib_uverbs (или rdma_rxe для симуляции).
  • Я выполнил ibv_devinfo и убедился, что вижу активное RDMA-устройство.
  • Я запустил nvidia-smi topo -m и интерпретировал матрицу (нашёл PIX хотя бы для одной пары GPU–NIC при реальной HCA или зафиксировал отсутствие ошибок).
  • Я установил gdrcopy, скомпилировал и запустил copytest — он завершился без ошибок.
  • Я сохранил вывод всех ключевых команд в файл и оформил отчёт.