Тихий сбой в 3 часа ночи: почему ваш LLM-сервер умирает без предупреждения
Вы запустили локальную LLM-ферму. Llama 3.2, GLM-4.7 Flash, Claude Code - все работает. До тех пор, пока в 3 часа ночи не закончится VRAM, не перегреется GPU или не упадет контейнер с моделью. Вы узнаете об этом только утром, когда пользователи жалуются на недоступность сервиса.
Проблема в том, что локальные LLM-фермы - это черные ящики. Они молча потребляют ресурсы, молча перегреваются и молча умирают. Стандартные системные мониторы показывают только загрузку CPU и RAM, но не говорят о критическом: сколько VRAM съела модель, какая температура у GPU, сколько токенов в секунду генерирует сервер.
Без мониторинга вы летите вслепую. Один сбойный запрос может занять всю видеопамять, и следующие 8 часов ваш сервер будет просто висеть, пока кто-то не перезапустит его вручную.
Решение: стек мониторинга, который видит все
Мы собираем промышленный стек мониторинга для домашней LLM-фермы. Не просто "посмотреть нагрузку", а полноценную систему с алертами, дашбордами и историей метрик.
Вот что нам нужно отслеживать:
- Использование VRAM по GPU и по процессу
- Температуру GPU (критично для долгой работы)
- Загрузку GPU (utilization) - чтобы понять, не простаивает ли железо
- Потребление энергии (power draw) - для расчета стоимости электричества
- Производительность LLM-сервера: токены в секунду, latency запросов
- Статус контейнеров Docker
- Сетевую активность между клиентами и сервером
Стек технологий: Prometheus как сборщик метрик, Grafana для визуализации, DCGM-exporter для мониторинга NVIDIA GPU, cAdvisor для мониторинга контейнеров, и node-exporter для системных метрик.
Шаг 1: Подготовка системы и установка Docker
Предположим, у вас уже есть работающая LLM-ферма. Если нет - посмотрите мой гайд по запуску локальной LLM-инфраструктуры на домашнем железе.
Проверяем, что Docker установлен и работает:
docker --version
systemctl status docker
Если Docker не установлен:
# Для Ubuntu/Debian
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USER
newgrp docker
Важно: если вы используете NVIDIA GPU, убедитесь, что установлены драйверы версии 550 или новее и nvidia-container-toolkit. Без этого DCGM-exporter не увидит ваши карты.
1 Создаем сеть Docker для мониторинга
Все компоненты стека должны общаться между собой. Создаем изолированную сеть:
docker network create monitoring
Эта сеть будет использоваться всеми контейнерами мониторинга. LLM-серверы могут оставаться в своих сетях или в этой же - зависит от вашей архитектуры.
Шаг 2: Запускаем Prometheus - сборщик метрик
Prometheus - это временная база данных, которая будет собирать и хранить все метрики. Создаем конфигурационный файл:
# prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node-exporter'
static_configs:
- targets: ['node-exporter:9100']
- job_name: 'cadvisor'
static_configs:
- targets: ['cadvisor:8080']
- job_name: 'dcgm-exporter'
static_configs:
- targets: ['dcgm-exporter:9400']
- job_name: 'llama-server'
static_configs:
- targets: ['llama-server:8000'] # Ваш LLM-сервер
metrics_path: '/metrics' # Если поддерживает Prometheus метрики
Теперь запускаем Prometheus в Docker:
docker run -d \
--name=prometheus \
--network=monitoring \
-p 9090:9090 \
-v $(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml \
prom/prometheus:latest
Проверяем, что Prometheus работает:
curl http://localhost:9090/-/healthy
Шаг 3: DCGM-exporter - мониторинг GPU от NVIDIA
Это самый важный компонент для LLM-фермы. DCGM-exporter дает доступ к метрикам, которые nvidia-smi показывает только в реальном времени.
Запускаем контейнер с DCGM-exporter:
docker run -d \
--name=dcgm-exporter \
--network=monitoring \
--runtime=nvidia \
-p 9400:9400 \
-v /run/nvidia:/run/nvidia \
nvcr.io/nvidia/k8s/dcgm-exporter:3.5.0
Ключевые моменты:
--runtime=nvidia- обязательно для доступа к GPU-v /run/nvidia:/run/nvidia- монтируем сокет NVIDIA- Используем версию 3.5.0 или новее
Проверяем, что метрики доступны:
curl http://localhost:9400/metrics | grep -i "gpu" | head -5
Вы должны увидеть что-то вроде:
DCGM_FI_DEV_GPU_TEMP{gpu="0",UUID="GPU-1234"} 65
DCGM_FI_DEV_MEM_COPY_UTIL{gpu="0",UUID="GPU-1234"} 45
DCGM_FI_DEV_FB_USED{gpu="0",UUID="GPU-1234"} 12000
Ошибка: если вы видите "No GPUs found", проверьте, что nvidia-container-toolkit установлен и работает. Перезапустите Docker: sudo systemctl restart docker.
Шаг 4: cAdvisor и node-exporter - мониторинг контейнеров и системы
cAdvisor отслеживает ресурсы Docker-контейнеров, node-exporter - системные метрики хоста.
Запускаем cAdvisor:
docker run -d \
--name=cadvisor \
--network=monitoring \
-p 8080:8080 \
-v /:/rootfs:ro \
-v /var/run:/var/run:ro \
-v /sys:/sys:ro \
-v /var/lib/docker/:/var/lib/docker:ro \
gcr.io/cadvisor/cadvisor:latest
Запускаем node-exporter:
docker run -d \
--name=node-exporter \
--network=monitoring \
-p 9100:9100 \
-v "/proc:/host/proc:ro" \
-v "/sys:/host/sys:ro" \
-v "/:/rootfs:ro" \
prom/node-exporter:latest
Шаг 5: Grafana - визуализация и дашборды
Теперь, когда метрики собираются, нужно их красиво отображать. Запускаем Grafana:
docker run -d \
--name=grafana \
--network=monitoring \
-p 3000:3000 \
-v grafana-storage:/var/lib/grafana \
grafana/grafana:latest
Открываем http://localhost:3000 в браузере. Логин: admin, пароль: admin (сразу меняем!).
Добавляем источник данных Prometheus:
- Configuration → Data Sources → Add data source
- Выбираем Prometheus
- URL: http://prometheus:9090 (важно: используем имя контейнера, так как они в одной сети)
- Save & Test
2 Импортируем готовые дашборды для LLM-фермы
Не нужно создавать дашборды с нуля. Используем готовые:
- DCGM Exporter Dashboard (ID: 12239) - мониторинг GPU
- Node Exporter Full (ID: 1860) - системные метрики
- Docker Monitoring (ID: 193) - мониторинг контейнеров
Импортируем дашборд для GPU:
- Create → Import
- Вводим 12239 → Load
- Выбираем Prometheus как источник данных
- Import
Теперь у вас есть дашборд с графиками температуры, использования VRAM, загрузки GPU и потребления энергии.
Шаг 6: Мониторинг самого LLM-сервера
Стандартные метрики - это хорошо, но нам нужно знать, как работает именно LLM-сервер. Если вы используете Ollama, vLLM или llama.cpp - у них есть встроенная поддержка Prometheus метрик.
Пример для Ollama (версия 0.5.0+):
# docker-compose.yml для Ollama с метриками
version: '3.8'
services:
ollama:
image: ollama/ollama:latest
container_name: ollama
ports:
- "11434:11434"
- "8000:8000" # Метрики Prometheus
volumes:
- ollama_data:/root/.ollama
environment:
- OLLAMA_METRICS=true # Включаем метрики
- OLLAMA_METRICS_PORT=8000
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
volumes:
ollama_data:
Запускаем и проверяем метрики:
curl http://localhost:8000/metrics | grep -i "llama"
Добавляем в prometheus.yml:
scrape_configs:
- job_name: 'ollama'
static_configs:
- targets: ['ollama:8000']
metrics_path: '/metrics'
Шаг 7: Настройка алертов - чтобы узнавать о проблемах первым
Мониторинг без алертов - просто красивые графики. Настраиваем алерты в Prometheus.
Создаем файл alerts.yml:
groups:
- name: llm-farm-alerts
rules:
- alert: HighGPUTemperature
expr: DCGM_FI_DEV_GPU_TEMP > 85
for: 5m
labels:
severity: critical
annotations:
summary: "GPU {{ $labels.gpu }} temperature is {{ $value }}°C"
description: "GPU temperature exceeded 85°C for 5 minutes"
- alert: HighVRAMUsage
expr: DCGM_FI_DEV_FB_USED / DCGM_FI_DEV_FB_FREE > 0.9
for: 2m
labels:
severity: warning
annotations:
summary: "GPU {{ $labels.gpu }} VRAM usage is {{ $value | humanizePercentage }}"
description: "VRAM usage exceeded 90% for 2 minutes"
- alert: LLMServerDown
expr: up{job="ollama"} == 0
for: 1m
labels:
severity: critical
annotations:
summary: "LLM server is down"
description: "Ollama server has been down for more than 1 minute"
Обновляем prometheus.yml:
rule_files:
- "alerts.yml"
Перезапускаем Prometheus:
docker restart prometheus
Теперь в Grafana можно настроить уведомления:
- Alerting → Contact points → Add contact point
- Выбираем тип (Email, Slack, Telegram)
- Настраиваем канал уведомлений
- Создаем правило алерта на основе Prometheus запроса
Шаг 8: Собираем все в docker-compose.yml
Управлять 5+ контейнерами через отдельные команды docker run - неудобно. Создаем единый docker-compose.yml:
version: '3.8'
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- ./alerts.yml:/etc/prometheus/alerts.yml
- prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.console.libraries=/etc/prometheus/console_libraries'
- '--web.console.templates=/etc/prometheus/consoles'
- '--storage.tsdb.retention.time=30d'
networks:
- monitoring
grafana:
image: grafana/grafana:latest
container_name: grafana
ports:
- "3000:3000"
volumes:
- grafana_data:/var/lib/grafana
environment:
- GF_SECURITY_ADMIN_PASSWORD=secure_password_here
networks:
- monitoring
depends_on:
- prometheus
node-exporter:
image: prom/node-exporter:latest
container_name: node-exporter
ports:
- "9100:9100"
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- '--path.procfs=/host/proc'
- '--path.rootfs=/rootfs'
- '--path.sysfs=/host/sys'
- '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)'
networks:
- monitoring
cadvisor:
image: gcr.io/cadvisor/cadvisor:latest
container_name: cadvisor
ports:
- "8080:8080"
volumes:
- /:/rootfs:ro
- /var/run:/var/run:ro
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
networks:
- monitoring
dcgm-exporter:
image: nvcr.io/nvidia/k8s/dcgm-exporter:3.5.0
container_name: dcgm-exporter
ports:
- "9400:9400"
runtime: nvidia
environment:
- NVIDIA_VISIBLE_DEVICES=all
volumes:
- /run/nvidia:/run/nvidia
networks:
- monitoring
networks:
monitoring:
driver: bridge
volumes:
prometheus_data:
grafana_data:
Запускаем все одной командой:
docker-compose up -d
Типичные ошибки и как их избежать
| Ошибка | Причина | Решение |
|---|---|---|
| DCGM-exporter не видит GPU | Отсутствует nvidia-container-toolkit или устаревшие драйверы | Установить nvidia-container-toolkit и драйверы версии 550+ |
| Prometheus не собирает метрики | Неправильные имена хостов в конфигурации | Использовать имена контейнеров, а не localhost |
| Высокая нагрузка на CPU от Prometheus | Слишком частый сбор метрик (scrape_interval) | Увеличить interval до 30s для ненужных метрик |
| Grafana не подключается к Prometheus | Разные сети Docker | Поместить все контейнеры в одну сеть |
| Метрики LLM-сервера не отображаются | Сервер не поддерживает Prometheus или порт закрыт | Включить метрики в настройках сервера или написать экспортер |
Что дальше? Продвинутый мониторинг для продвинутых ферм
Базовый мониторинг работает. Теперь можно добавить продвинутые фичи:
- Мониторинг качества ответов: отслеживайте perplexity, точность ответов на тестовых запросах
- A/B тестирование моделей: запустите две версии модели и сравнивайте их метрики в реальном времени
- Прогнозирование нагрузки: используйте машинное обучение для предсказания пиков нагрузки
- Интеграция с системами оркестрации: если у вас несколько серверов, добавьте мониторинг в Kubernetes
Если вы строите серьезную ферму с несколькими GPU, посмотрите мой гайд по сборке компактного DGX-кластера - там есть секция по мониторингу распределенных систем.
Самый важный совет: настройте алерт на температуру GPU. Одна перегретая карта может стоить вам $2000+ на замену. Лучше получить 100 ложных срабатываний, чем пропустить одно настоящее.
Теперь у вас есть полноценная система мониторинга локальной LLM-фермы. Вы видите не только что сервер работает, но и как он работает, насколько эффективно использует ресурсы, и когда нужно вмешаться до того, как все упадет.
Больше не нужно гадать, почему модель тормозит. Откройте Grafana, посмотрите на графики VRAM, температуры и latency - и вы сразу поймете, в чем проблема. Это не роскошь, это необходимость для любой серьезной LLM-инфраструктуры.