GPU-ML-Bench
Описание
Профессиональный односценарный бенчмарк производительности видеокарт под задачи ИИ/ML
Языки
- Python100%
GPU‑ML‑Bench (v2.5.1)
Профессиональный односценарный бенчмарк производительности видеокарт под задачи ИИ/ML. Один Python‑файл даёт репрезентативные метрики (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‑сводка: ключевые метрики в
для BI/дашбордов.summary.csv -
Ускоренный поиск лимитов: экспоненциальный разгон + ограниченный бинпоиск, ограничение по времени шага
и числу попыток.--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+
- Библиотеки: обязательно
(CUDA), опциональноtorch,torchvision,pynvml,psutil.markdown
На системах без CUDA бенчмарк завершится сообщением: скрипт ориентирован на CUDA‑GPU.
Установка
Быстрый старт
Все артефакты попадут в :
— полный структурированный отчёт.report.json— архив предыдущих прогонов (для истории/спарклайнов).report_YYYYmmdd_HHMMSS.json— читабельная сводка.report.md— автономный отчёт (roofline + история). Откроется автоматически, если не указанreport.html.--no-open— агрегированные метрики (по флагуsummary.csv).--csv-summary
Presets (пресеты запуска)
| Пресет | Что делает | Кому полезен |
|---|---|---|
| Ускоренные итерации, пропущены , . | Быстрый обзор GPU. |
| Все тесты, стандартные итерации. | Полный профиль «в одно нажатие». |
| Упор на LLM: Transformer + SDP (список длин из ), без . | Инференс LLM/attention. |
| Фокус на свёртках/обучении, пропускает LLM‑часть. | Тренировка CV‑моделей. |
| Только I/O: HBM/PCIe. | Диагностика ввода/вывода, NUMA. |
| Короткий дымовой тест без тяжёлых этапов. | Проверка окружения. |
Примеры:
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 (
): суррогат пропускной способности HBM/L2.tensor.copy_ - Elem add (
) и Reduce (sum): характерные элементные/редукционные шаблоны.x.add_(1.0) - Буфер ≈ 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(батч 32) и трен‑шаг.1×1 s=1 - Обучение:
(если естьResNet18) либоtorchvision; батчи 32/64/128.SimpleCNN
Transformer‑inference
- Мини‑энкодер (6 слоёв,
,d_model=512,nhead=8).norm_first=True - Метрики: tokens/s, ms/forward, AMP‑флаг.
SDP Attention
- Бенч
на Q/K/VF.scaled_dot_product_attention.[B,H,S,D] - Переключение бэкендов:
.auto|flash|mem|math - Свип по
изS; метрики tokens/s, ms/call, tokens/s/W.--llm-seq
Дополнительные проверки 2.5.1
- Активации: LayerNorm + GELU для формы
— elems/s и ms/iter.[4, 2048, 1024] - 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.
Отключение сбора — флаг .
Отчёты (JSON/Markdown/HTML/CSV)
- JSON
— полный отчёт. Каждому запуску дополнительно соответствует архивreport.json.report_YYYYmmdd_HHMMSS.json - Markdown
— краткая сводка для Git/Wiki.report.md - HTML
— автономная страница с roofline и спарклайнами истории (24 последних архивов). Открывается автоматически.report.html - 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 по сводному скору
Скор = .
→ Ultra/Datacenter≥ 250→ High≥ 120→ Mid≥ 60- иначе → Entry
Эвристика для ориентировки — не заменяет сравнение реальных задач.
Репродуцируемость и честность измерений
- Зафиксируйте версии драйверов и библиотек; используйте
для сравнения.--deterministic - Включите режим производительности GPU (Persistence, Prefer Maximum Performance).
- Следите за троттлингом: в отчёте — температура и частоты; NVML отдаёт причины замедления.
- Запускайте 2–3 раза, ориентируйтесь на медиану.
Рецепты
Сравнение с
Мульти‑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: для этапов поиска лимитов это штатно; бенч ловит исключение и продолжает.
не сработал: нужен PyTorch 2.x; в противном случае флаг игнорируется.torch.compile
Практические советы по производительности
- 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‑температуры/частоты,
, мульти‑GPU, пиковая память, авто‑открытие HTML.torch.compile - ≤ 2.3 — базовые бенчи, JSON/Markdown отчёты.