Решения

Мониторинг и логи 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.