Отслеживайте выводы машинного обучения с помощью панели управления CloudWatch и создавайте оповещения в канале Slack.
Контекст
Команда специалистов по обработке и анализу данных хочет использовать лямбда-функцию в качестве бессерверного вывода для модели. Он будет вызываться API Gateway, который подключен к мобильному интерфейсу. Кроме того, команда хочет отслеживать показатели выводов и моделей на панели управления CloudWatch и получать оповещения в Slack.
Отображаемые показатели:
- Лямбда: количество вызовов и ошибок (количество)
- Модель: вероятность предсказания модели
- Лямбда: Максимальный объем используемой памяти (МБ)
- Лямбда: время инициализации (мс)
Выполнение
Шаги начальной загрузки
- Установить AWS CLI и настроить учетные данные.
- Установите NodeJS, чтобы иметь возможность использовать CDK.
- Установите CDK с помощью команды
sudo npm install -g aws-cdk
. - Создайте новый каталог для своего проекта и измените на него текущий рабочий каталог.
- Запустите
cdk init --language python
, чтобы инициировать проект CDK. - Запустите
cdk bootstrap
, чтобы загрузить учетную запись AWS с ресурсами CDK. - Установить 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.
🎉 🎉🎉 Поздравляем, вы только что развернули свой стек, и он готов к использованию.
Очистка аккаунта
Вы можете удалить все ресурсы, созданные в вашей учетной записи во время разработки, выполнив следующие действия:
- Выполните следующую команду, чтобы удалить ресурсы стека:
cdk destroy
- Очистите репозиторий ECR и корзины S3, созданные для CDK, поскольку это может привести к затратам.
Не очень удобно удалять некоторые ресурсы вручную и есть несколько обсуждений с разработчиками AWS по исправлению.
Заключение
AWS CDK предоставляет чрезвычайно универсальный набор инструментов для разработки приложений. Поначалу это может быть сложно, но в конце концов ваши усилия окупятся, потому что вы сможете управлять своим приложением и передавать его с помощью одной команды.
Ресурсы CDK и полный код можно найти в репозитории GitHub.
🎀 Спасибо, что дочитали до конца. Я надеюсь, что это было полезно, пожалуйста, дайте мне знать, если вы заметили какие-либо ошибки в комментариях.