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