Как визуализировать метрики 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.
Надеюсь, вы нашли это полезным :).

Ссылки: