Решения
Мониторинг и логи 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.
Навигация по смежным страницам