Как визуализировать метрики Tensorflow в Kibana
Ключевые слова: Tensorflow, Kibana, Prometheus, визуализация, дашбординг, мониторинг.
Цель этого сообщения в блоге - предоставить краткое объяснение и минимальный рабочий пример того, как внимательно отслеживать, отслеживать и визуализировать производительность вашей модели машинного обучения в развернутой службе, работающей в производственной среде. В частности, как визуализировать метрики Tensorflow Serving в Kibana внутри эластичного стека с помощью Prometheus и Metricbeat. Для этого используется цепочка различных инструментов и фреймворков, и, надеюсь, этот пост может помочь в качестве справочника о том, как легко настроить и интегрировать все различные части вместе. В конце концов, вы сможете отслеживать все соответствующие показатели вашего сервиса машинного обучения.
Почему мониторинг так важен для служб искусственного интеллекта
Во-первых, мотивация важности мониторинга. Являясь неотъемлемой частью жизненного цикла модели машинного обучения, мониторинг дает представление о производительности модели с разных точек зрения. Например, существует ряд различных показателей, которые обычно отслеживаются и могут оказаться полезными во многих случаях:
- Внутренние метрики сервера Tensorflow, такие как количество попыток загрузки модели или продолжительность вывода.
- Метрики, показывающие количество входящих запросов.
- Метрики хост-системы, такие как использование памяти и сетевой трафик.
- Пользовательские метрики, относящиеся к типу обслуживаемой модели. Например, если модель представляет собой классификатор «кошки против собак», тогда подсчитайте количество прогнозов для каждого класса и выведите его на приборную панель. Это может быть особенно полезно при поиске информации о смене домена.
Мониторинг также упрощает информирование о производительности модели и демонстрацию ее влияния на бизнес.
Основными фреймворками в посте являются:
- Обслуживание Tensorflow: платформа машинного обучения, используемая для обслуживания моделей.
- Flask API: оболочка для обслуживаемой модели. Обрабатывает предварительную обработку, постобработку, обработку ошибок и т. Д.
- Prometheus: платформа для мониторинга, сбора и хранения метрик, которые уже экспортированы службой Tensorflow, а также пользовательских метрик, которые можно экспортировать с помощью клиента Python Prometheus.
- Metricbeat: облегченный экспортер метрик.
- Эластичный стек: платформа для ведения журнала, индексации и визуализации экспортированных показателей.
Обзор архитектуры представлен на следующем рисунке:
В зависимости от приложения и количества необходимых моделей / контейнеров альтернативным подходом может быть централизованный контейнер Prometheus и Metricbeat, который опрашивает метрики из разных моделей и экспортирует их все сразу в Elasticsearch.
Сборка различных компонентов
В этом разделе показаны шаги, необходимые для того, чтобы различные фреймворки работали и взаимодействовали друг с другом.
Создайте Dockerfile, который установит Prometheus и Metricbeat.
Начиная с экспортированной модели Tensorflow, которая состоит из следующих файлов: saved_model.pb
и variables
(дополнительную информацию о том, как экспортировать модели, можно найти здесь), мы создаем контейнер Docker на основе обслуживающего образа Tensorflow. Обратите внимание, что версия Tensorflow, используемая при экспорте модели, должна быть такой же, как и версия, используемая для обслуживания модели, в противном случае могут возникнуть ошибки, по крайней мере, для версий TF ‹1.15.
Указание эталонного образа для обслуживания Tensorflow выполняется путем добавления следующей строки в начало файла Dockerfile. В этом примере Tensorflow версии 1.14 используется для экспорта модели, а также для обслуживания.
FROM tensorflow/serving:1.14.0
В Dockerfile мы также устанавливаем Prometheus и Metricbeat. Конечно, может быть отдельный контейнер для Prometheus и Metricbeat, который может извлекать метрики из нескольких моделей, но для простоты мы можем установить их в тот же контейнер, что и сервер модели.
Ниже приведен фрагмент файла Dockerfile, который обрабатывает установку и копирование наиболее важных файлов конфигурации. Обратите внимание, что копируются разные файлы конфигурации. Мы подробно рассмотрим каждый из них и их содержание ниже.
# Copy Prometheus config files
RUN mkdir /var/lib/prometheus
RUN mkdir /etc/prometheus
COPY configs/prometheus.yml /etc/prometheus/
# Install Prometheus
RUN curl -LO https://github.com/prometheus/prometheus/releases/download/v2.0.0/prometheus-2.0.0.linux-amd64.tar.gz
RUN sha256sum prometheus-2.0.0.linux-amd64.tar.gz
RUN tar xvf prometheus-2.0.0.linux-amd64.tar.gz
RUN cp prometheus-2.0.0.linux-amd64/prometheus /usr/local/bin/
RUN cp prometheus-2.0.0.linux-amd64/promtool /usr/local/bin/
RUN cp -r prometheus-2.0.0.linux-amd64/consoles /etc/prometheus
RUN cp -r prometheus-2.0.0.linux-amd64/console_libraries /etc/prometheus
# Install Metricbeat for Prometheus metrics export to Kibana
RUN curl -L -O https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-7.6.0-amd64.deb
RUN dpkg -i metricbeat-7.6.0-amd64.deb
RUN metricbeat modules enable prometheus
# Copy Metricbeat config files
COPY configs/metricbeat/metricbeat.yml /etc/metricbeat/
COPY configs/metricbeat/prometheus.yml /etc/metricbeat/modules.d
RUN chmod go-w /etc/metricbeat/metricbeat.yml
RUN chmod go-w /etc/metricbeat/modules.d/prometheus.yml
Создайте сценарий точки входа для контейнера
Следующим шагом является настройка сценария точки входа, который будет выполняться после запуска контейнера. Этот скрипт запускает обслуживание Tensorflow, Flask API, Prometheus и Metricbeat.
# Entrypoint script to the container
/usr/local/bin/prometheus --config.file=/etc/prometheus/prometheus.yml &
/usr/bin/tensorflow_model_server --rest_api_port=8501 \
--model_config_file="${TF_CONFIG_FILE}" \
--monitoring_config_file="${TF_MONITORING_CONFIG_FILE}" &
flask run --host=0.0.0.0 --port=80 &
metricbeat modules enable prometheus &
metricbeat -e
Настройте службу Tensorflow для обслуживания экспортированной модели и начала регистрации внутренних метрик.
Конфигурационный файл обслуживания Tensorflow, указанный в TF_CONFIG_FILE, должен указывать, какие модели должны обслуживаться, например:
model_config_list {
config {
name: "mnist_classifier",
base_path: "models/mnist_classfier",
model_platform: "tensorflow"
}
}
Конфигурационный файл мониторинга должен содержать следующее:
prometheus_config {
enable: true,
path: "/metrics"
}
Это скажет серверу модели начать регистрацию показателей и позволит Prometheus очистить их через указанный порт, которым в данном случае является 8501.
Кроме того, нам нужно указать 3 разных файла конфигурации;
Настройте Prometheus для очистки метрик
Файл конфигурации Prometheus:
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: 'prometheus'
scrape_interval: 10s
static_configs:
- targets: ['localhost:9090']
- job_name: 'tensorflow_serving'
scrape_interval: 10s
static_configs:
- targets: ['localhost:8501']
- job_name: 'api'
scrape_interval: 10s
static_configs:
- targets: ['localhost']
Настройте Metricbeat для экспорта показателей в эластичный
Основная конфигурация Metricbeat:
metricbeat.config.modules:
path: ${path.config}/modules.d/*.yml
#==== Dashboards ====
setup.dashboards.enabled: true
#==== Kibana ====
setup.kibana:
host: "${KIBANA}"
#---- Elasticsearch output ----
output.elasticsearch:
hosts: ["${ELASTICSEARCH}"]
Модуль Metricbeat Prometheus:
# Module: prometheus
# Docs: https://www.elastic.co/guide/en/beats/metricbeat/7.6/metricbeat-module-prometheus.html
- module: prometheus
period: 1s
hosts: ["localhost:${TF_SERVE_PORT}", "localhost"]
metrics_path: /metrics
Создание docker-compose для сборки и запуска обоих контейнеров
version: '3.7'
services:
mnist_classifier.api:
image: mnist_classifier_image
container_name: mnist_classifier_container
build:
context: "${PROJECT_PATH}"
dockerfile: "${PROJECT_PATH}/src/Dockerfile"
environment:
- ENVIRONMENT
- ELASTICSEARCH
- KIBANA
- LOGSTASH
- LOGLEVEL
- FLASK_DEBUG
- TF_SERVE_PORT
- TF_CONFIG_DIR
depends_on:
- elasticsearch
ports:
- "9090:9090"
- "80:80"
volumes:
- /models:/models:ro
networks:
- mnist-classifier-network
elasticsearch:
image: sebp/elk
container_name: local_elasticsearch
ports:
- "5601:5601"
- "5044:5044"
- "9200:9200"
networks:
- mnist-classifier-network
networks:
mnist-classifier-network:
name: mnist_classifier_network
со следующим файлом .env
:
PROJECT_PATH=/home/user/workspace/tf-serving-kibana-demo/
ELASTICSEARCH=elasticsearch:9200
KIBANA=elasticsearch:5601
LOGSTASH=localhost:5044
TF_SERVE_PORT=8501
LOGLEVEL=DEBUG
FLASK_DEBUG=1
TF_CONFIG_DIR=mnist_classifier
Обратите внимание, что экспортированные модели помещаются в /models
.
├── mnist_classifier
│ ├── mnist_classifier
│ │ └── 1
│ │ ├── saved_model.pb
│ │ └── variables
│ │ ├── variables.data-00000-of-00001
│ │ └── variables.index
│ ├── monitoring.config
│ └── tf_serving.config
Изучение показателей
Чтобы убедиться, что все настроено правильно, сначала проверьте состояние указанных целей Prometheus (http: // localhost: 9090 / target), и все они должны быть запущены и работать, как показано ниже:
Кроме того, при просмотре метрик в Prometheus в списке отображаются различные метрики, экспортируемые внутри службой Tensorflow, а также любые метрики, которые определены внутри API, в этом случае внутри API определена одна метрика, которая равна api:class_0_total
и api:class_1_total
. Более подробную информацию о том, как писать метрики Prometheus с помощью клиента Python, можно найти здесь https://github.com/prometheus/client_python.
На этом этапе мы убедились, что обслуживание Tensorflow, Flask API и Prometheus настроены правильно. Следующий шаг - убедиться, что Metricbeat экспортирует эти показатели в эластичный контейнер. При переходе по адресу http: // localhost: 5601 должен быть шаблон индекса metricbeat.*
.
Наконец, создайте панель мониторинга для отслеживания и мониторинга хост-сервера, а также внутренних метрик для Tensorflow и API.
Ниже приведена настраиваемая панель управления черновиком, показывающая, например, количество прогонов внутреннего графика в Tensorflow и количество прогнозов для класса 0 и для класса 1:
Кроме того, панели мониторинга по умолчанию также могут использоваться для проверки состояния хост-системы, как показано на следующем рисунке:
Резюме
В этом посте мы покажем, как визуализировать и отображать метрики обслуживания Tensorflow в Kibana, настроив Prometheus для сбора метрик и Metricbeat для их экспорта. Визуализацию можно настроить для множества различных приложений, чтобы четко отразить влияние на бизнес и указать интересные периоды. В Fourthline мы используем такой мониторинг для наших моделей автоматизации KYC.
Надеюсь, вы нашли это полезным :).
Ссылки: