Отслеживайте выводы машинного обучения с помощью панели управления CloudWatch и создавайте оповещения в канале Slack.

Контекст

Команда специалистов по обработке и анализу данных хочет использовать лямбда-функцию в качестве бессерверного вывода для модели. Он будет вызываться API Gateway, который подключен к мобильному интерфейсу. Кроме того, команда хочет отслеживать показатели выводов и моделей на панели управления CloudWatch и получать оповещения в Slack.

Отображаемые показатели:

  • Лямбда: количество вызовов и ошибок (количество)
  • Модель: вероятность предсказания модели
  • Лямбда: Максимальный объем используемой памяти (МБ)
  • Лямбда: время инициализации (мс)

Выполнение

Шаги начальной загрузки

  1. Установить AWS CLI и настроить учетные данные.
  2. Установите NodeJS, чтобы иметь возможность использовать CDK.
  3. Установите CDK с помощью команды sudo npm install -g aws-cdk.
  4. Создайте новый каталог для своего проекта и измените на него текущий рабочий каталог.
  5. Запустите cdk init --language python, чтобы инициировать проект CDK.
  6. Запустите cdk bootstrap, чтобы загрузить учетную запись AWS с ресурсами CDK.
  7. Установить Docker, чтобы запустить контейнер Docker внутри Lambda.

Стек CDK

Это окончательный вид каталога проекта. Я собираюсь предоставить пошаговое руководство, которое проведет вас через каждый компонент в нем.

InferenceMonitoring
├── assets
│   ├── lambda
│   │   ├── dockerfile
│   │   ├── sample_model.json
│   │   └── processing.py
├── cdk.out
│   └── ...
├── stack
│   ├── __init__.py
│   └── inference_monitoring_stack.py
├── app.py 
├── cdk.json
└── requirements.txt

Ваша отправная точка — каталог stack. Он содержит обязательный пустой файл __init__.py для определения пакета Python и файл inference_monitoring_stack.py, в котором вы будете определять стек.

Вам нужно открыть последний, импортировать все необходимые библиотеки и объявить класс InferenceMonitoringClass, который наследует класс Stack.

Затем вам нужно создать лямбда-функцию, используя конструкцию DockerImageFunction. Пожалуйста, обратитесь к приведенному ниже коду, чтобы увидеть, какие аргументы используются. Я думаю, что они говорят сами за себя, но в случае возникновения проблем обратитесь к документации. Вам также необходимо прикрепить к Lambda встроенную политику, чтобы она могла отправлять метрики в CloudWatch.

Затем вам нужно создать панель управления CloudWatch, используя конструкцию Dashboard, которая, в свою очередь, использует конструкцию TextWidget. TextWidget определяет заголовок панели мониторинга и поддерживает синтаксис уценки, так что вы можете предоставить описание модели в свободной форме в дополнение к заголовку.

Далее вам нужно создать показатели:

  • Метрика PredictionProbability — это настраиваемая метрика CloudWatch, сообщаемая во время выполнения функции Lambda. Определение пользовательской метрики приведено в следующих абзацах, а также в параметре dimension_map.
  • Метрики memory_utilization и init_duration относятся к метрикам Lambda Insights, и о них сообщает агент CloudWatch, работающий в контейнере.

Далее нужно разместить созданные метрики на дашборде в виде виджетов. Я использовал два типа виджетов GraphWidget и SingleValueWidget для отображения метрик, но есть и много других — см. документацию. Вам нужно явно указать ширину/высоту для каждого виджета, чтобы он идеально подходил. Для SingleValueWidget можно также указать параметр sparkline, чтобы совместить график и общее значение за весь период в одном виджете.

Далее с помощью конструкции Alarm нужно создать аларм CloudWatch, уведомляющий о низкой вероятности предсказания модели. Его параметры говорят сами за себя: вы должны определить threshold для метрики, количество datapoints_to_alarm, которое должно быть нарушено в течение evaluation_period, и передать comparison_operator.

Затем вам нужно создать тему SNS для отправки уведомлений в Slack. Для этого мы должны использовать конструкцию Topic и добавить add_alarm_action к тревоге. Позже эта же тема может быть использована для других моделей аварийных сигналов производительности.

Наконец, вам нужно создать интеграцию с определенной рабочей областью/каналом в Slack, используя конструкцию SlackChannelConfiguration. Чтобы получить значение для slack_channel_id, вам нужно щелкнуть правой кнопкой мыши имя канала и скопировать последние девять символов URL-адреса. А чтобы получить значение параметра slack_workspace_id, вам нужно воспользоваться Руководством по чат-ботам AWS.

После настройки интеграции со Slack и развертывания стека вы будете получать такие уведомления, когда вероятность предсказания модели ниже порогового значения.

Теперь вам нужно переключиться в каталог assets и создать файл processing.py и dockerfile.

Скрипт processing.py содержит логику преобразования данных. В целом код примера состоит из нескольких частей:

  • импорт библиотек,
  • создание сеанса CloudWatch,
  • нагрузка модели.

Я должен отметить, что в приведенном примере я использовал data = pd.Dataframe(event), потому что мое событие имеет структуру, которую можно напрямую загрузить в фрейм данных. Обычно приложение передает дополнительную информацию в событии, поэтому вам может понадобиться дополнительно подготовить код для разбора события и извлечения функций.

Когда прогноз готов, я использую метод context.log() для реализации ведения журнала и отправляю PredictionProbability пользовательскую метрику в пространство имен SampleModel в CloudWatch. На этом этапе вы также можете добавить другие пользовательские метрики для обнаружения дрейфа модели/данных.

Пространство имен — это каталог для группировки метрик. Обычно все метрики, сообщаемые приложением, передаются в одно и то же пространство имен. Параметр — это пара "ключ-значение", назначенная показателю. Он может описывать версию приложения, среду разработки и т. д., т. е. используется для хранения метаданных метрики. Пожалуйста, обратитесь к документации для получения дополнительной информации о пространствах имен и измерениях.

dockerfile используется для определения образа, который будет запускаться в лямбда-функции, и состоит из следующих частей:

  • Ссылка на базовое изображение, на основе которого будет строиться наше изображение. Вы используете базовый образ public.ecr.aws/lambda/python:3.9, но вы можете использовать любую другую версию Python, поддерживаемую Lambda и требуемую семантикой вашего кода.
  • Установка библиотек Python.
  • Установка пакета расширений Lambda Insights.
  • Копирование processing.py, содержащего обработчик Lambda и артефакт sample_model.json.

Теперь вам нужно перейти в родительский каталог и открыть app.py. Внутри вы используете конструкцию App для объявления приложения CDK и метод synth() для создания шаблона CloudFormation.

🎉 🎉🎉 Поздравляем, вы только что развернули свой стек, и он готов к использованию.

Очистка аккаунта

Вы можете удалить все ресурсы, созданные в вашей учетной записи во время разработки, выполнив следующие действия:

  1. Выполните следующую команду, чтобы удалить ресурсы стека: cdk destroy
  2. Очистите репозиторий ECR и корзины S3, созданные для CDK, поскольку это может привести к затратам.

Не очень удобно удалять некоторые ресурсы вручную и есть несколько обсуждений с разработчиками AWS по исправлению.

Заключение

AWS CDK предоставляет чрезвычайно универсальный набор инструментов для разработки приложений. Поначалу это может быть сложно, но в конце концов ваши усилия окупятся, потому что вы сможете управлять своим приложением и передавать его с помощью одной команды.

Ресурсы CDK и полный код можно найти в репозитории GitHub.

🎀 Спасибо, что дочитали до конца. Я надеюсь, что это было полезно, пожалуйста, дайте мне знать, если вы заметили какие-либо ошибки в комментариях.