GPU-ML-Bench

0

Описание

Профессиональный односценарный бенчмарк производительности видеокарт под задачи ИИ/ML

Языки

  • Python100%
7 месяцев назад
7 месяцев назад
README.md

GPU‑ML‑Bench (v2.5.1)

Профессиональный односценарный бенчмарк производительности видеокарт под задачи ИИ/ML. Один Python‑файл

gpu_ml_bench.py
даёт репрезентативные метрики (HBM/D2D, PCIe, GEMM, свёртки и обучение CNN, Transformer‑inference, SDP‑attention) плюс энергопрофиль NVML, пиковую память, мульти‑GPU, пресеты запуска и автономный HTML‑отчёт с roofline‑диаграммой и историей запусков.


Что нового в 2.5.1

Крупные новинки и улучшения:

  • Расширенные проверки и бенчи:

    • RectGEMM — несколько прямоугольных форм матмулов (4096×8192×4096, 8192×4096×8192, 16384×1024×8192).
    • Активации — связка LayerNorm + GELU с оценкой elems/s.
    • Jitter‑бенч — распределение латентностей (p50/p90/p95/p99) для GEMM 2048³.
    • Перекрытие I/O и compute — параллельный H2D и GEMM в разных CUDA‑потоках, метрика overlap_efficiency.
    • Проверка точности Mixed Precision — сравнение FP16/BF16 против FP32 (rel L2 и max abs).
  • Профессиональные проверки окружения: причины троттлинга NVML, текущая/максимальная PCIe‑ссылка (gen/width), enforced power‑limit.

  • Эффективность по энергии: TFLOPS/W, tokens/s/W там, где доступен NVML (отключается

    --no-power
    ).

  • CSV‑сводка: ключевые метрики в

    summary.csv
    для BI/дашбордов.

  • Ускоренный поиск лимитов: экспоненциальный разгон + ограниченный бинпоиск, ограничение по времени шага

    --search-max-ms
    и числу попыток.

  • Больше контроля: режим детерминизма (

    --deterministic
    ), разделённые итерации
    --iters
    /
    --iters-light
    /
    --iters-heavy
    .

Совместимость: все режимы/пресеты/отчёты 2.4.x сохранены.


Требования и поддержка

  • GPU: NVIDIA с CUDA 11+; для FP16/BF16 и Flash SDP нужны Tensor Cores (cc ≥ 7.0; Flash SDP — обычно cc ≥ 8.0).
  • OS: Linux x86_64; Windows 10/11 поддерживается; macOS — только CPU‑часть (CUDA‑бенчи будут пропущены).
  • Python: 3.9+
  • Библиотеки: обязательно
    torch
    (CUDA), опционально
    torchvision
    ,
    pynvml
    ,
    psutil
    ,
    markdown
    .

На системах без CUDA бенчмарк завершится сообщением: скрипт ориентирован на CUDA‑GPU.


Установка


Быстрый старт

Все артефакты попадут в

./bench_out
:

  • report.json
    — полный структурированный отчёт.
  • report_YYYYmmdd_HHMMSS.json
    — архив предыдущих прогонов (для истории/спарклайнов).
  • report.md
    — читабельная сводка.
  • report.html
    — автономный отчёт (roofline + история). Откроется автоматически, если не указан
    --no-open
    .
  • summary.csv
    — агрегированные метрики (по флагу
    --csv-summary
    ).

Presets (пресеты запуска)

ПресетЧто делаетКому полезен
quick
Ускоренные итерации, пропущены
maxbatch
,
maxseqlen
.
Быстрый обзор GPU.
full
Все тесты, стандартные итерации.Полный профиль «в одно нажатие».
llm
Упор на LLM: Transformer + SDP (список длин из
--llm-seq
), без
conv/train/maxbatch
.
Инференс LLM/attention.
cv-train
Фокус на свёртках/обучении, пропускает LLM‑часть.Тренировка CV‑моделей.
io
Только I/O: HBM/PCIe.Диагностика ввода/вывода, NUMA.
smoke
Короткий дымовой тест без тяжёлых этапов.Проверка окружения.

Примеры:


CLI и параметры


Архитектура и методология

  • Все замеры делаются CUDA Events с прогревом.
  • Метрики усредняются по заданным итерациям (
    --iters
    ,
    --iters-light
    ,
    --iters-heavy
    ).
  • Энергопрофиль собирается параллельным NVML‑потоком (~10 мс шаг); вычисляется average/peak/energy и, при наличии, TFLOPS/W и tokens/s/W.
  • Пиковая память фиксируется
    torch.cuda.max_memory_allocated/reserved
    для каждого блока.
  • Пресеты управляют набором секций и итерациями;
    --skip
    позволяет тонкую селекцию.

Что именно измеряется

HBM/D2D и элементные операции

  • D2D copy (
    tensor.copy_
    ): суррогат пропускной способности HBM/L2.
  • Elem add (
    x.add_(1.0)
    ) и Reduce (sum): характерные элементные/редукционные шаблоны.
  • Буфер ≈ 256 MiB (
    float32
    ), точный тайминг, учёт пиков памяти и энергии.

PCIe H2D/D2H

  • Хостовая pinned‑память + неблокирующий
    copy_
    .
  • Итог: GB/s и ms/op в оба направления.

GEMM 8192³ + RectGEMM

  • FP32/TF32, FP16, BF16 (AMP при наличии Tensor Cores).
  • Вычисление TFLOPS и ms; при NVML — TFLOPS/W.
  • RectGEMM отражает реальные батчи/формы в продакшене.

Свёртки (cuDNN) и обучение CNN

  • Свёртки:
    7×7 s=2
    ,
    3×3 s=1
    ,
    1×1 s=1
    (батч 32) и трен‑шаг.
  • Обучение:
    ResNet18
    (если есть
    torchvision
    ) либо
    SimpleCNN
    ; батчи 32/64/128.

Transformer‑inference

  • Мини‑энкодер (6 слоёв,
    d_model=512
    ,
    nhead=8
    ,
    norm_first=True
    ).
  • Метрики: tokens/s, ms/forward, AMP‑флаг.

SDP Attention

  • Бенч
    F.scaled_dot_product_attention
    на Q/K/V
    [B,H,S,D]
    .
  • Переключение бэкендов:
    auto|flash|mem|math
    .
  • Свип по
    S
    из
    --llm-seq
    ; метрики tokens/s, ms/call, tokens/s/W.

Дополнительные проверки 2.5.1

  • Активации: LayerNorm + GELU для формы
    [4, 2048, 1024]
    elems/s и ms/iter.
  • Jitter‑бенч: p50/p90/p95/p99, среднее и σ для серии GEMM 2048³ — диагностика «дрожи» латентностей.
  • Перекрытие H2D+GEMM: последовательный vs двухпоточный запуск, overlap_efficiency = (t_copy+t_gemm)/t_overlapped.
  • Точность Mixed Precision: rel L2 и max abs ошибок матмулов FP16/BF16 относительно FP32.

Энергопрофиль и эффективность

  • NVML‑сэмплер ~10 мс: avg/peak мощность, энергия Дж, температура, частоты SM/MEM.
  • При наличии power‑данных считаются TFLOPS/W и tokens/s/W.
  • Отдельно сохраняются причины троттлинга (NVML), текущая/максимальная PCIe‑ссылка и enforced power‑limit.

Отключение сбора — флаг

--no-power
.


Отчёты (JSON/Markdown/HTML/CSV)

  • JSON
    report.json
    — полный отчёт. Каждому запуску дополнительно соответствует архив
    report_YYYYmmdd_HHMMSS.json
    .
  • Markdown
    report.md
    — краткая сводка для Git/Wiki.
  • HTML
    report.html
    — автономная страница с roofline и спарклайнами истории (24 последних архивов). Открывается автоматически.
  • CSV
    summary.csv
    — пополняется одной строкой при
    --csv-summary
    .

Roofline‑диаграмма

  • Горизонтальная линия — пик TFLOPS (по лучшему GEMM).
  • Наклонная — «крышка» памяти: Perf = BW × OI.
  • Точки: GEMM FP32/FP16/BF16; D2D/ElemAdd — память‑ограниченные точки.

История запусков

  • На основе 24 последних архивов строятся мини‑графики: FP16/FP32 TFLOPS, D2D GB/s, tokens/s, imgs/s.

Пример
report.json

Числа приведены как пример; реальные значения зависят от GPU, драйверов, версий CUDA/cuDNN, тепла/питания и пр.


Схема
report.json
(ключи и типы)

  • meta.timestamp: str

  • system: dict

    • gpu_name: str
    • compute_capability: str
    • total_vram_bytes: int
    • cuda_runtime_version: str
    • cudnn_version: int|null
    • pcie_link: {max_gen:int, max_width:int, cur_gen:int, cur_width:int, busId:str}
    • power_limit_w: float|null
    • throttle_reasons: [str]|null
  • bandwidth: {d2d_copy_GBps: float, elem_add_GBps: float, reduce_ms_per_op: float, *_power:dict|null, *_memory:dict}

  • pcie: {h2d_GBps: float, d2h_GBps: float, *_power:dict|null}

  • gemm: {gemm_fp16_TFLOPS: float|null, gemm_fp32_TFLOPS: float|null, gemm_bf16_TFLOPS: float|null, *_ms: float, *_TFLOPS_per_W: float|null, rect: [ {M:int,N:int,K:int,tflops:float,ms:float} ]}

  • conv: {cases:[{name:str, imgs_per_s:float|null, ms_per_step:float|null, oom?:bool, power?:dict, memory?:dict}]}

  • train_cnn: {per_batch:[{batch:int, imgs_per_s:float|null, ms_per_step:float|null, oom:bool, power?:dict, memory?:dict}], mode:str}

  • transformer: {seq_len:int, batch:int, ms_per_forward:float, tokens_per_s:float, amp:bool, tokens_per_s_per_W?:float, power?:dict, memory?:dict}

  • sdp_attention: {mode:str, cases:[{seq_len:int, batch:int, heads:int, head_dim:int, ms_per_call:float, tokens_per_s:float, tokens_per_s_per_W?:float}]}

  • activations: {shape:[int,int,int], ms_per_iter:float, elems_per_s:float, power?:dict, memory?:dict}

  • overlap: {copy_s:float, gemm_s:float, sequential_s:float, overlapped_s:float, overlap_efficiency:float, power?:dict}

  • accuracy: {fp16_rel_l2:float|null, bf16_rel_l2:float|null, fp16_max_abs?:float, bf16_max_abs?:float}

  • jitter: {samples:[float], mean_ms:float, stdev_ms:float, p50_ms:float, p90_ms:float, p95_ms:float, p99_ms:float, n:int}

  • max_batch_search: {max_batch_infer_simplecnn:int, img_size:int, trials:int, search_dtype:str, search_max_ms:int}

  • max_seq_len_search: {max_seq_len_infer_transformer:int, batch:int, trials:int, search_dtype:str, search_max_ms:int}

  • classification: str


Интерпретация результатов

  • TFLOPS vs GB/s: если GEMM упирается в горизонталь roofline — вычислительный потолок; если точка ниже наклонной — ограничение по памяти/PCIe.
  • imgs/s — метрика тренировки CV; tokens/s — throughput LLM‑инференса.
  • TFLOPS/W, tokens/s/W — эффективность по энергии; полезна при лимитах питания/охлаждения.

Класс GPU по сводному скору

Скор =

1.5·FP16_TFLOPS + 0.8·FP32_TFLOPS + 0.1·D2D_GBps
.

  • ≥ 250
    Ultra/Datacenter
  • ≥ 120
    High
  • ≥ 60
    Mid
  • иначе → Entry

Эвристика для ориентировки — не заменяет сравнение реальных задач.


Репродуцируемость и честность измерений

  • Зафиксируйте версии драйверов и библиотек; используйте
    --deterministic
    для сравнения.
  • Включите режим производительности GPU (Persistence, Prefer Maximum Performance).
  • Следите за троттлингом: в отчёте — температура и частоты; NVML отдаёт причины замедления.
  • Запускайте 2–3 раза, ориентируйтесь на медиану.

Рецепты

Сравнение с

torch.compile

Мульти‑GPU (оценка масштабирования)

Только PCIe и память

LLM‑бенч SDP разных бэкендов


Траблшутинг

  • Долгое зависание на поиске batch size: в 2.5.1 поиск ускорен, но можно снизить
    --search-max-ms
    и/или
    --search-max-trials
    , либо пропустить
    --skip maxbatch
    .
  • Предупреждение
    enable_nested_tensor is True ... norm_first was True
    : штатное предупреждение
    nn.Transformer
    ; безопасно игнорировать.
  • NVML метрики пустые: установите
    pynvml
    , проверьте доступ к драйверу, запустите без контейнерных ограничений; при необходимости добавьте
    --no-power
    .
  • Pinned‑memory ошибка: на части систем возможен фоллбэк на обычную память — PCIe‑метрики станут ниже, это ожидаемо.
  • OOM: для этапов поиска лимитов это штатно; бенч ловит исключение и продолжает.
  • torch.compile
    не сработал
    : нужен PyTorch 2.x; в противном случае флаг игнорируется.

Практические советы по производительности

  • CV‑тренировки: включайте AMP (autocast) и
    cudnn.benchmark
    .
  • LLM‑инференс: контролируйте размеры KV‑кэша и рост затрат с длиной последовательности.
  • I/O: используйте pinned‑память, избегайте меж‑NUMA переносов.
  • Энергия: не всегда максимальный power‑limit даёт лучший perf/Вт — смотрите TFLOPS/W.

Безопасность и эксплуатация

  • Скрипт не требует прав superuser; для NVML нужны корректные драйверы.
  • В мульти‑пользовательских средах ограничивайте параллелизм и пиковое потребление памяти.

Лицензия и цитирование

  • Лицензия: Public Domain / Unlicense (без ограничений использования).
  • Цитирование: GPU‑ML‑Bench (v2.5.1): single‑file GPU benchmark for AI/ML workloads.

Changelog (коротко)

  • 2.5.1 — RectGEMM; активации (LayerNorm+GELU); jitter‑бенч p50/p95/p99; перекрытие H2D+GEMM; проверка точности FP16/BF16; причины троттлинга и PCIe‑линк; метрики эффективности по энергии; CSV‑сводка; улучшены комментарии и оформление кода.
  • 2.4.x — пресеты, SDP attention, ускоренный поиск лимитов, roofline/спарклайны, NVML‑температуры/частоты,
    torch.compile
    , мульти‑GPU, пиковая память, авто‑открытие HTML.
  • ≤ 2.3 — базовые бенчи, JSON/Markdown отчёты.