Профилировать network congestion на 64 GPU

ТЕХНИЧЕСКОЕ ЗАДАНИЕ: Профилировать network congestion на 64 GPU

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

Научиться профилировать сетевую нагрузку в кластере из 64 GPU (8 узлов × 8 GPU) с InfiniBand, выявлять горячие точки (hot spots) с помощью инструментов perfquery и ibdiagnet, измерять влияние на all-reduce и уменьшать утилизацию сети. Задача развивает навыки низкоуровневой диагностики InfiniBand и оптимизации коллективных операций в HPC/NVIDIA DGX-like системах.

Ключевой результат Утилизация сети (средняя загрузка портов узлов) во время all-reduce снижена с >85% до <70%, документация hot spots и рекомендации.


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

Что нужноОткуда взять
Кластер 64 GPU (8 узлов × 8 GPU, NVLink + InfiniBand HDR 200Gb/s)Реальный тестовый стенд или облачная симуляция (см. ниже)
InfiniBand инструменты (perfquery, ibdiagnet, ibstat, ibswitches, ibroute)Пакет infiniband-diags (обычно предустановлен на узлах с Mellanox)
Бенчмарк all-reduceNCCL-tests (собрать из исходников на каждом узле)
Python 3.8+ с библиотекамиАнализ логов: pandas, matplotlib, seaborn
Среда для визуализации топологииGraphviz (dot) или вывод ibdiagnet -o topo

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

  1. Развернуть 8 виртуальных машин (Ubuntu 22.04) с сетевым мостом, имитирующим InfiniBand (например, Soft-RoCE или эмуляция через ip link add с лимитом пропускания 10G).
  2. Установить на каждую ВМ пакет infiniband-diags (не все команды будут работать, но ibstat, ibswitches, ibroute эмулировать можно).
  3. Для генерации трафика использовать iperf3 в режиме множественных потоков — запустить на всех ВМ all-to-all или all-reduce-like паттерн (через скрипт на Python с subprocess).
  4. Собрать псевдо-логи perfquery, сгенерировав файлы со случайными значениями (но направленными — один порт перегружен). Это даст навык парсинга и анализа.

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

КомпонентИнструментыНазначение
СетьInfiniBand HDR (Mellanox ConnectX-6/7)Целевое оборудование
Диагностика IBibdiagnet, perfquery, ibstat, ibswitches, ibroute, ibstatusСбор статистики портов, топологии, счетчиков ошибок
БенчмаркNCCL-tests (sendrecv, all_reduce_perf)Генерация нагрузки all-reduce
Симуляция (опционально)softiwarp, iperf3, Python, docker-composeИмитация кластера при отсутствии железа
АнализPython + pandas, matplotlib, seaborn, networkxПарсинг логов, визуализация графа, построение heatmap
Визуализация топологииGraphviz, ibdiagnet -o topoКарта сети с горячими точками

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

Этап 1: Подготовка окружения и сбор baseline (45-60 минут)

Действия

  1. Проверить доступность InfiniBand адаптеров на каждом узле

    ibstat   # на каждом из 8 узлов
    

    Убедиться, что все порты активны (State: Active, Physical: LinkUp). Записать GUID портов.

  2. Установить/обновить infiniband-diags

    sudo apt-get install infiniband-diags
    
  3. Собрать NCCL-tests
    На каждом узле (или одной копии, затем скопировать бинарники через mpi или pdsh):

    git clone https://github.com/NVIDIA/nccl-tests.git
    cd nccl-tests
    make MPI=1 MPI_HOME=/usr/lib/x86_64-linux-gnu/openmpi   # пример для OpenMPI
    
  4. Измерить baseline утилизации сети без нагрузки
    Запустить ibdiagnet и perfquery для записи исходных счётчиков:

    ibdiagnet -o all -c   # генерирует .csv и диаграммы в /var/log/ibdiagnet/
    perfquery -x -P -G <lid_порта>   # снять счётчики с одного порта
    

    Сохранить вывод в baseline/.

  5. Запустить all-reduce для загрузки сети
    На одном из узлов (например, master) запустить MPI-задачу:

    mpirun --hostfile hosts.txt -np 64 ./build/all_reduce_perf -b 128M -e 8G -f 2 -n 10 -w 5
    

    где hosts.txt содержит IP всех 8 узлов × 8 процессов.

Ожидаемый результат этапа

  • ibdiagnet output с начальными значениями.
  • Лог perfquery до нагрузки.
  • Утилизация сети >85% (зафиксировать точное значение).

Этап 2: Сбор data во время all-reduce (30-40 минут)

Действия

  1. Запустить фоновый сбор perfquery
    Написать скрипт collect_perf.sh, который каждые 5 секунд снимает счётчики со всех активных портов (8 узлов × 1 порт) и пишет в CSV с timestamp:

    #!/bin/bash
    while true; do
      ts=$(date +%s)
      for node in node1 node2 ... node8; do
        ssh $node "perfquery -x -P -G <local_port_guid> 2>/dev/null" | awk -v ts="$ts" -v node="$node" '{print ts, node, $0}'
      done
      sleep 5
    done
    
  2. Параллельно запустить all-reduce (как в этапе 1)

    mpirun --hostfile hosts.txt -np 64 ./build/all_reduce_perf -b 128M -e 8G -f 2 -n 10 -w 5 &
    
  3. После завершения all-reduce остановить сбор (Ctrl+C).
    Накопленные данные склеить в один CSV-файл (например, perf_allreduce.csv).

  4. Собрать ibdiagnet с нагрузкой

    ibdiagnet -o all -c -l /tmp/ibdiagnet_loaded
    

Ожидаемый результат этапа

  • CSV с временными рядами счётчиков портов (packets sent, packets rcvd, errors, CRC errors, link down).
  • Дамп ibdiagnet_loaded/ с топологией и состояниями.
  • Лог вывода all_reduce_perf (время, пропускная способность).

Этап 3: Анализ собранных данных и выявление hot spots (1-1.5 часа)

Действия

  1. Парсинг CSV perfquery (Python)
    Считать CSV, построить heatmap средней загрузки порта (packets per second) для каждого порта во времени. Определить порты, где загрузка >90% (potential hot spots).

  2. Анализ ошибок и повторных передач

    import pandas as pd
    df = pd.read_csv('perf_allreduce.csv', names=['ts','node','port','xmit','recv','errors','crc','link_down'])
    summary = df.groupby('node')[['xmit','errors','crc']].agg(['mean','max'])
    print(summary[summary['errors']['mean'] > 0])
    
  3. Построение графа InfiniBand (интеграция с ibdiagnet)

    ibdiagnet -o topo -l /tmp/ibdiagnet_loaded
    

    Найти файл ibdiagnet.topo.txt или .dot. Визуализировать с dot -Tpng ibdiagnet.topo.dot -o topo.png.
    Наложить тепловую карту на граф: окрасить узлы/линки в соответствии с загрузкой из анализа perfquery.

  4. Идентификация hot spots

    • Порты с близкой к линейке пропускной способностью (200Gbps) при all-reduce.
    • Линки с CRC error count > 0 (физические проблемы).
    • Узлы, где загрузка порта дисбалансна (один порт >90%, соседний <30%).

Ожидаемый результат этапа

  • Графики: утилизация каждого порта (время vs packets/sec), heatmap по узлам.
  • Карта топологии с горячими точками (highlighted links).
  • Список портов, признанных hot spots.

Этап 4: Оптимизация и повторное измерение (45-60 минут)

Действия

  1. Применить одну или несколько оптимизаций

    • Смена алгоритма маршрутизации (на коммутаторе): ibdiagnet -r routing -H adaptive (адаптивная маршрутизация).
    • Уменьшение числа потоков NCCL (изменить NCCL_NTHREADS или NCCL_MAX_NCHANNELS).
    • Pin mapping (привязка процессов к GPU): проверить, что коммуникация идёт через NVLink + InfiniBand оптимально.
    • Настройка QoS (приоритетные очереди для all-reduce).
  2. Запустить all-reduce повторно (те же параметры)

    mpirun --hostfile hosts.txt -np 64 ./build/all_reduce_perf -b 128M -e 8G -f 2 -n 10 -w 5
    
  3. Повторный сбор perfquery во время нового прогона (как в этапе 2).
    Сравнить утилизацию: средняя загрузка портов после оптимизации.

  4. Документировать изменения и результаты
    Записать baseline, целевые значения, фактическое снижение.

Ожидаемый результат этапа

  • Новая утилизация сети (средняя) <70%.
  • Список применённых оптимизаций с эффектом.
  • Сравнительные графики (до/после).

Этап 5: Оформление отчёта (30-60 минут)

Действия

  1. Создать Markdown-отчёт с разделами:

    • Цель.
    • Конфигурация кластера (IB версия, топология).
    • Методика сбора.
    • Baseline (утилизация, ошибки).
    • Hot spots (таблица портов с утилизацией >85% и ошибками).
    • Оптимизации и их влияние.
    • Итоговая утилизация.
    • Рекомендации (аппаратные/программные).
  2. Приложить визуализации (heatmap, топология с hot spots, график временного ряда).

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

  4. Выложить артефакты в Git-репозиторий (папка network_profiling/).

Ожидаемый результат этапа

  • Markdown-документ network_congestion_report.md.
  • Папка figures/ с PNG-графиками.
  • CSV-файлы сырых данных.

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

  • perfquery успешно выполнен на всех портах до, во время и после all-reduce; данные консистентны.
  • ibdiagnet построил топологию и CSV-отчёт без ошибок.
  • Выявлены не менее 2 горячих точек (порт с утилизацией >85%).
  • Зафиксирована baseline утилизация (среднее по времени) >85%.
  • После применения хотя бы одной оптимизации утилизация снижена до <70% (подтверждено повторным замером).
  • Отчёт содержит таблицу hot spots, графики, описание оптимизаций, рекомендации.
  • Все артефакты (CSV, скрипты, отчёт) структурированы и доступны для повторения.

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

Основной артефакт

  • network_congestion_report.md — детальный отчёт с метриками, визуализациями, выводами и рекомендациями.
  • Папка data/ с CSV-файлами perfquery (baseline, loaded, optimized).
  • Папка figures/ с графиками (heatmap_port_utilization.png, topology_hotspots.png, time_series.png).
  • Скрипты сбора: collect_perf.sh, analyze_hotspots.py.
  • Лог вывода all_reduce_perf до и после.

Дополнительные результаты (опционально):

  • Пулл-реквест с изменениями конфигурации сети (например, настройки QoS).
  • Документация по использованию perfquery и ibdiagnet для команды.

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

СложностьРешение
Нет физического InfiniBand кластераИспользовать симуляцию на Linux-ВМ с softiwarp и iperf3; сфабриковать данные для perfquery с помощью скрипта.
perfquery не даёт доступ ко всем портамЗапускать от root или с правами CAP_NET_RAW; проверить LID порта через ibstat.
ibdiagnet выводит огромные файлыФильтровать с -s <guid> или использовать grep; анализировать только интересующие порты.
All-reduce не запускается на 64 процессах из-за нехватки ресурсовУменьшить число GPU (например, 4 узла × 8 GPU = 32); масштабировать цель утилизации пропорционально.
Разница в производительности между стэком и симуляциейЧётко описать в отчёте среду; фокус на методологии, а не абсолютных цифрах.
Перегрузка сети приводит к падению all_reduce_perfУвеличить timeout (NCCL_TIMEOUT=30) или уменьшить размер сообщения.

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

ЭтапВремя (часы)
Этап 1: Подготовка + baseline1.0
Этап 2: Сбор данных под нагрузкой0.75
Этап 3: Анализ hot spots1.5
Этап 4: Оптимизация + повторный замер1.0
Этап 5: Отчёт0.75
Итого4.5

Примечание При первом выполнении потребуется дополнительное время на отладку инструментов (≈1 час). Рекомендуется заложить 6 часов с учётом нештатных ситуаций.


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

ВопросТема
12Основные причины падения производительности all-reduce в InfiniBand
31Счётчики производительности порта InfiniBand: какие собирать
48Построение графа сети с помощью ibdiagnet
63Настройка QoS для приоритизации трафика HPC
77Разница между адаптивной и статической маршрутизацией
92Сбор и интерпретация CRC ошибок на линках InfiniBand
108Оптимизация bunched kernel launches в NCCL
124Как работает коллективная операция all-reduce в мульти-GPU
141Профилирование intra-node vs inter-node коммуникаций
205Использование perfquery для мониторинга в реальном времени

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

  • У меня есть доступ к 8 узлам с InfiniBand (или симуляция готова).
  • Я могу выполнить ibstat на каждом узле и убедиться, что все порты активны.
  • ibdiagnet установлен и работает без ошибок.
  • NCCL-tests скомпилированы и all_reduce_perf запускается на 64 процессах.
  • Скрипт сбора perfquery работает и создаёт корректные CSV.
  • После сбора я построил визуализации (heatmap, топологию) и нашёл не менее двух горячих точек.
  • Я применил хотя бы одну оптимизацию (например, адаптивную маршрутизацию).
  • После оптимизации я снова запустил all-reduce и проверил, что утилизация <70%.
  • Отчёт содержит все обязательные разделы и приложены артефакты.
  • Я могу воспроизвести все шаги в течение 4-5 часов без посторонней помощи.