Мониторинг и логи GPU‑нагрузок: NVML, Prometheus и Grafana

Цель. Дать минимальную, но рабочую схему наблюдаемости под ML/рендер/HPC: как собирать метрики GPU (через DCGM/NVML), метрики узла (CPU/память/диск/сеть), строить дашборды в Grafana и настроить алерты. Плюс — базовые варианты логирования (Loki/Promtail или OpenTelemetry Collector).

Из чего состоит стек наблюдаемости

  • GPU‑метрики: DCGM Exporter (контейнер) публикует метрики GPU на HTTP‑эндпойнте /metrics в формате Prometheus; разворачивается на каждом узле с GPU.
  • Базовые метрики узла: Prometheus node_exporter (CPU, RAM, диск, сеть, файловые системы).
  • Сборщик/хранилище метрик: Prometheus (scrape джобы для dcgm‑exporter и node_exporter).
  • Визуализация: Grafana, готовые дашборды под DCGM (включая MIG‑режим).
  • Низкоуровневые утилиты: NVML (библиотека, на которой основан nvidia-smi), сама утилита nvidia-smi и режим dmon для точечных проверок.
  • Почему DCGM, а не просто nvidia-smi? DCGM‑Exporter штатно отдаёт метрики в формате Prometheus и легко масштабируется (вплоть до DaemonSet в Kubernetes), тогда как nvidia-smi — консольная утилита, удобная для ад‑hoc диагностики.

Быстрый старт на одном узле (Docker Compose)

Сервисы: dcgm-exporter (порт 9400), node-exporter (порт 9100), prometheus, grafana.

# docker-compose.yml
services:
 dcgm-exporter:
 image: nvcr.io/nvidia/k8s/dcgm-exporter:4.4.0-4.5.0-ubuntu22.04
 command: ["dcgm-exporter", "-c", "1000"] # интервал сбора 1000 мс (пример)
 runtime: nvidia
 deploy: { restart_policy: { condition: on-failure } }
 ports: ["9400:9400"]
 cap_add: ["SYS_ADMIN"] # требуется экспортеру
 privileged: false
 # при желании: том с кастомным списком метрик (-f /etc/dcgm-exporter/custom.csv)
 node-exporter:
 image: quay.io/prometheus/node-exporter:latest
 pid: host
 network_mode: host
 command: ["--path.rootfs=/host"]
 volumes:
 - "/:/host:ro,rslave"
 prometheus:
 image: prom/prometheus:latest
 volumes:
 - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
 ports: ["9090:9090"]
 grafana:
 image: grafana/grafana:latest
 ports: ["3000:3000"]
prometheus.yml — минимальная конфигурация:
global:
 scrape_interval: 15s
scrape_configs:
 - job_name: "dcgm"
 static_configs: [{ targets: ["localhost:9400"] }]
 - job_name: "node"
 static_configs: [{ targets: ["localhost:9100"] }]
  • DCGM‑Exporter действительно публикует эндпойнт /metrics и может настраиваться по интервалу/перечню счётчиков (CSV).
  • Для node_exporter при контейнерном запуске важно смотреть на хост, а не внутрь контейнера: --path.rootfs=/host, маунты корня и/или host‑сети/pid. Kubernetes‑вариант за 10 минут Установите DCGM‑Exporter Helm‑чарт (или через GPU Operator, где экспортер уже включён):
helm repo add gpu-helm-charts https://nvidia.github.io/dcgm-exporter/helm-charts
helm repo update
helm install --generate-name gpu-helm-charts/dcgm-exporter
  • Документация DCGM‑Exporter/Helm и интеграция с Prometheus/Grafana доступны в официальном гиде.
  • Для OpenShift есть готовая инструкция по добавлению NVIDIA DCGM Exporter Dashboard в консоль наблюдения.

Готовые дашборды Grafana

Импортируйте один из преднастроенных дашбордов (ID → «Import» в Grafana):

  • Официальный DCGM Exporter Dashboard — ID 12239.

  • Альтернативный улучшенный лэйаут — ID 15117 или 22515.

  • MIG‑режим (A100/H100, нарезка GPU) — ID 16640 или 23382. Базовые метрики и быстрые запросы (PromQL)

  • **Загрузка GPU: avg by (gpu) (DCGM_FI_DEV_GPU_UTIL) — средняя загрузка по каждому GPU.

**Память GPU (VRAM): 100 * (DCGM_FI_DEV_FB_USED / DCGM_FI_DEV_FB_TOTAL)

  • процент использования видеопамяти (если оба поля включены в список сборки DCGM).
  • **Температура и питание: max by (gpu) (DCGM_FI_DEV_GPU_TEMP) и avg by (gpu) (DCGM_FI_DEV_POWER_USAGE).
  • Разрез по Pod/Namespace (K8s): многие метрики имеют лейблы pod, namespace, container — можно строить атрибуцию потребления на уровень сервиса.
  • Для спотовых проверок и сравнения используйте nvidia-smi и режим dmon (там «mem%» — утилизация шины памяти, а не доля занятой VRAM).

Начните сейчас Алерты: шаблоны правил

GPU перегрет (5 минут):

- alert: GpuHighTemperature
 expr: max by (gpu) (DCGM_FI_DEV_GPU_TEMP) > 85
 for: 5m
 labels: { severity: warning }
 annotations:
 summary: "GPU {{ $labels.gpu }} перегрев (>85°C 5m)"

VRAM почти заполнена (5 минут):

- alert: GpuVramHigh
 expr: (DCGM_FI_DEV_FB_USED / DCGM_FI_DEV_FB_TOTAL) > 0.95
 for: 5m
 labels: { severity: warning }
 annotations:
 summary: "GPU {{ $labels.gpu }} VRAM >95% 5m"

Низкая загрузка при высоком потреблении энергии (эф‑ть просела):

- alert: GpuLowEff
 expr: (avg by (gpu) (DCGM_FI_DEV_GPU_UTIL) < 20)
 and (avg by (gpu) (DCGM_FI_DEV_POWER_USAGE) > 100)
 for: 10m
 labels: { severity: info }
 annotations:
 summary: "GPU {{ $labels.gpu }} работает неэффективно (низкая util, высокая мощность)"

Поля и имена метрик берутся из экспортера DCGM; список доступных счётчиков настраивается CSV‑файлом (--collectors / -f).

Логи приложений и системные логи

Вариант A — Grafana Loki + Promtail (просто и дёшево)
  • Promtail читает локальные логи (файлы и systemd‑journal) и отправляет в Loki; затем Grafana визуализирует и алертит по логам.

Минимальный promtail-config.yml (журнал systemd + файлы контейнеров):

server: { http_listen_port: 9080 }
positions: { filename: /tmp/positions.yaml }
clients:
 - url: http://loki:3100/loki/api/v1/push
scrape_configs:
 - job_name: journal
 journal: { path: /var/log/journal, labels: { job: systemd } }
 - job_name: containers
 static_configs:
 - targets: [localhost]
 labels:
 job: docker
 __path__: /var/lib/docker/containers/*/*-json.log
Вариант B — OpenTelemetry Collector (унификация метрик/логов/трейсов)

Позволяет принять логи/метрики/трейсы, обогатить и отослать в разные бэкенды (в т.ч. Prometheus‑совместимые, Grafana/Loki, OpenSearch и т.д.).

Практика: что действительно влияет на пользу

  • Коррелируйте GPU с узлом. Держите на дашборде рядом DCGM_FI_DEV_GPU_UTIL и CPU load, сетевой Throughput, I/O — помогает увидеть, что тормозит пайплайн (процессор, диск, сеть).
  • Сегментируйте по сервисам. В Kubernetes фильтруйте метрики по namespace/pod/container, чтобы атрибутировать стоимость и SLA.
  • MIG‑режим. Для A100/H100 в MIG включайте специализированные дашборды — видны метрики на уровне MIG‑инстансов.
  • Список метрик под задачу. Если вы не используете профилировочные счётчики — не включайте их; DCGM позволяет задавать кастомный CSV.

Траблшутинг

  • Метрики не приходят: проверьте, что DCGM‑Exporter слушает :9400/metrics, и что Prometheus скрейпит этот таргет.
  • node_exporter «видит контейнер», а не хост: запустите с --path.rootfs=/host и нужными маунтами/namespace.
  • Расхождения с nvidia-smi: помните, что dmon даёт утилизацию памяти (mem%), а не «процент занятой VRAM»; сравнивайте одинаковые величины.
  • Где найти список полей DCGM: официальный перечень Field IDs в документации DCGM API.

Навигация по смежным страницам

Оптимизация и профайлинг:

Multi‑GPU и топологии:

Хранение/чекпоинты:

Безопасность/PII и логи:

LLM‑наблюдаемость:

Готовы запустить?

Запустить GPU-сервер