Интуитивно понятное руководство, показывающее, как развернуть обученную модель и делать прогнозы на основе новых данных.

Развертывание модели машинного обучения — один из самых важных навыков специалиста по данным. После того, как вы очистите данные, выберете лучшие функции из набора данных, настроите гиперпараметры и обучите свою модель, последним шагом будет запуск модели в производство, чтобы оценить ее на новых данных.

Существует множество способов развертывания модели. Первый способ — использовать фреймворки веб-хостинга, такие как Flask и Django. Альтернативным методом является использование хорошо известных платформ облачных платформ, таких как AWS Sagemaker и Azure ML framework. Третий и последний способ — использовать службы бессерверных вычислений, такие какAWS Lambda,Google Cloud Functions и Azure Functions.

В этом посте мы запустим в производство обученную модель на AWS Lambda — вычислительной платформе, предоставляемой Amazon как часть Amazon Web Services, которая позволяет разработчикам развертывать модели и создавать приложения. Это также позволяет избежать настройки какого-либо окружения и ускорить нашу работу. Давайте начнем!

Какую проблему мы пытаемся решить?

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

В этом уроке мы будем использовать набор данных ECG5000, который содержит 5000 сердечных сокращений, случайно выбранных у пациента с сердечной недостаточностью. Первоначально он был найден в PhysioNet, хранилище медицинских данных, доступных для исследователей, а значения класса, которые указывают, является ли сердечный ритм аномальным или нет, были получены с помощью автоматической аннотации.

Мотивация

Специалисту по данным нужно не только построить модель машины, но и отслеживать эксперименты, данные версий, код и модель. На самом деле существуют разные платформы для разных целей. GitHub для разных версий кода и данных, а также для совместной работы с другими товарищами по команде, MLflow — одна из наиболее часто используемых платформ для отслеживания и развертывания модели. Но переход с одной платформы на другую может оказаться неэффективным.

Не лучше ли использовать одну платформу напрямую? Кроме того, GitHub не очень эффективен в работе с версиями данных, а огромные файлы не разрешены. По этим причинам я использую DagsHub для этого проекта. Это платформа, которая позволяет более эффективно сравнивать различные эксперименты и версии данных. Интерфейс интуитивно понятен и очень похож на GitHub. Другими словами, это похоже на использование GitHub и MLflow в уникальном месте. Ознакомьтесь с документацией, чтобы начать работу с DagsHub и его требованиями.

Настройте DVC и настройте DagsHub как удаленное хранилище DVC.

После того, как вы создали репозиторий DagsHub и у вас есть его копия на локальном ПК, я рекомендую вам работать с кодом Visual Studio в качестве IDE, поскольку он поддерживает несколько языков через расширения и включает терминал, который понадобится в этой части и в следующие разделы.

Прелесть Dagshub в том, что вы можете найти все результаты экспериментов в своем репозитории и легко изменить соответствующие столбцы для сравнения экспериментов. Это возможно, поскольку DagsHub построен на основе GitHub и DVC, инструмента, который позволяет вам фиксировать версии ваших данных и моделей в коммитах Git.

Во-первых, нам нужно установить DVC в нашей локальной среде:

pip install dvc

Для получения более подробных инструкций есть также этот веб-сайт, на котором показаны различные решения при работе с macOS, Windows и Linux.

После того, как мы его установили, мы можем запустить dvc init внутри нашего проекта. Это важный шаг для инициализации DVC и создания нового каталога .dvc/, содержащего конфигурации.

Чтобы загрузить данные на DagsHub, вы можете найти необходимые командные строки в своем репозитории.

Оглавление:

Часть 1. Обучение модели Keras с отслеживанием MLflow

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

Следующие строки кода имеют решающее значение для создания переменных среды. Вы можете скопировать свои учетные данные в репозиторий DagsHub, щелкнув параметр MLflow под кнопкой Remote. Имя пользователя и пароль содержатся в файле parameters.yaml.

После того, как мы, наконец, сможем использовать MLflow для регистрации гиперпараметров, метрик и артефактов модели.

mlflow.tensorflow.autolog() позволяет автоматически регистрировать метрики, такие как оптимизатор и количество эпох, из Tensorflow в MLflow.

В конце скрипта мы также сохраняем модель в файл на вашем локальном ПК с Autoencoder.save(Path("Autoencoder")). После этого мы загружаем модель и сохраняем ее в локальном хранилище BentoML.

Вы можете найти полный код train.py здесь.

Мы можем запустить python-скрипт train.py и каждый раз изменять гиперпараметры, чтобы понять, какие гиперпараметры больше способствуют повышению производительности автоэнкодера при обнаружении аномалий сигналов ЭКГ.

cd src
python train.py

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

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

Часть 2. Развертывание модели с помощью BentoML и AWS Lambda

Эту задачу можно разделить на несколько этапов:

  • Создание службы BentoML
  • Собери бенто
  • Развертывание в AWS Lambda

Создание службы BentoML

Прежде чем идти дальше, давайте проверим все модели, которые хранятся в локальном хранилище BentoML, написав эту командную строку в терминале:

bentoml models list

Он возвращает следующий вывод:

Как видно из списка сохраненных моделей, они отсортированы в порядке убывания в зависимости от времени создания. Итак, нас интересует модель со следующим тегом: keras_model:pdthevrih6w2iaav.

Теперь, когда мы уверены, что модель хранится в Bento, мы можем создать файл с именем service.py, в котором создадим сервис для развертывания нашей модели глубокого обучения. Это приведет к созданию конечной точки API.

Сначала мы указываем нужный тег модели, а затем создаем экземпляр бегуна поверх модели Keras. После создания экземпляра, принадлежащего классу bentoml.Service, мы указываем имя службы ecg_model и раннер, определенный ранее.

Теперь мы создаем конечную точку для службы BentoML с именем predict. Вы также можете заметить, что есть декоратор, обозначенный @, сервис, который является экземпляром сервиса, определенным ранее. Типы ввода и вывода также указываются в декораторе и являются bentoml.io.NumpyNdarray. Проверьте здесь для дальнейшей документации.

Вы можете найти полный код service.py здесь.

В функции прогнозирования мы снова ожидаем в качестве входных данных массив NumPy, поскольку у нас есть набор данных, состоящий из 140 функций и целевой метки. Тип выходных данных также представляет собой массив, который сообщает нам, являются ли сигналы ЭКГ аномальными или нет. Есть несколько шагов, прежде чем получить окончательный результат.

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

Наконец, мы можем запустить службу с помощью следующей командной строки:

bentoml serve service.py:service --reload

Выход:

После мы можем сделать сервисный запрос, чтобы проверить, работает ли обученная модель. Весь код находится в файле с именем servicerequest.py. Мы случайным образом выбираем 10 наблюдений данных из тестового набора и передаем их обученной модели и предоставляем прогнозы на основе этих наблюдений, отправляя запрос в сервис BentoML.

Вы можете найти полный код servicerequest.py здесь.

Пока предыдущая командная строка все еще работает, мы можем написать эту командную строку в другом терминале:

python servicerequest.py

Выход:

Кажется, что предсказания модели верны для 10 из 10 точек данных! Откройте http://127.0.0.1:3000 в вашем браузере, и вы должны увидеть такое окно:

Собери бенто

Как только мы определили службу BentoML, мы можем поместить весь исходный код, файлы моделей и зависимости в архив под названием Bento. Чтобы построить бэнто, необходимо соблюдать требования. Нам нужно создать файл bentofile.yaml в папке нашего проекта.

Затем мы можем запустить командную строку bentoml build в терминале и получить такой вывод:

Мы можем снова визуализировать список наших Bentos с помощью командной строки bentoml list :

Поздравляем! Трудная часть сделана. Модель, служба, требования Python и файл Docker сохраняются в папке, указанной в предыдущем выводе.

Развертывание в AWS Lambda

Это краткое изложение шагов, которые мы собираемся выполнить:

  1. Создайте учетную запись AWS и настройте учетные данные
  2. Инициализируйте развертывание с помощью bentoctl.
  3. Создание и отправка образа Docker, совместимого с AWS Lambda
  4. Применить развертывание с помощью Terraform

Также есть подробная документация по этим шагам здесь, если вы обнаружите какие-либо проблемы.

  1. Создайте учетную запись AWS и настройте учетные данные

Мы собираемся развернуть нашу модель обнаружения аномалий в виде лямбда-функции на AWS. Во-первых, вам нужно создать аккаунт AWS здесь. Не беспокойтесь, это позволяет развернуть модель бесплатно: уровень бесплатного пользования позволяет выполнять 1 миллион запросов в месяц с помощью AWS Lambda, чего вполне достаточно для такого небольшого проекта, как наш. После создания учетной записи вам необходимо настроить учетные данные AWS. Я предлагаю вам следить за этим видео на YouTube. Я также рекомендую вам установить Docker Desktop на ваш локальный ПК.

Для Linux или OSX:

export AWS_ACCESS_KEY_ID=<YOUR_AWS_ACCESS_KEY_ID>
export AWS_SECRET_ACCESS_KEY=<YOUR_AWS_SECRET_ACCESS_KEY>

Для Windows:

setx AWS_ACCESS_KEY_ID <YOUR_AWS_ACCESS_KEY_ID>
setx AWS_SECRET_ACCESS_KEY <YOUR_AWS_SECRET_ACCESS_KEY>

Также есть два пакета для установки из терминала: оператор aws-lambda и его зависимый пакет boto3.

pip install bentoctl boto3
bentoctl operator install aws-lambda

2. Инициализировать развертывание с помощью bentoctl

После того, как мы инициализируем развертывание с помощью bentoctl, интерактивной команды CLI Bento.

bentoctl init

Эта командная строка сгенерирует три файла, необходимых для развертывания модели с AWS Lambda, deployment_config.yaml, bentoctl.tfvars и main.tf. Последний необходимый пакет для установки — terraform. Ознакомьтесь с инструкцией по установке здесь. Хороший способ проверить успешность установки — написать в командной строке:

terraform --version

3. Создайте образ Docker, совместимый с AWS Lambda

Теперь мы можем создать образ докера, совместимый с AWS Lambda, и отправить его в репозиторий AWS ECR.

bentoctl build -b keras_model_ad:latest -f deployment_config.yaml

Он возвращает следующий вывод:

Created the repository keras_model_ad
The push refers to repository [849711432510.dkr.ecr.us-west-1.amazonaws.com/keras_model_ad]
957db15fed12: Pushed 
1df100fb8cb9: Pushed 
3fef49d17991: Pushed 
11e8b0510c67: Pushed 
9e9bb09e42f7: Pushing 1022.1MiB/1.4GiB
...
920ee87a2ed2: Pushed 
3ce7d4d72da9: Pushed 
630337cfb78d: Pushed 
6485bed63627: Pushed 
🚀 Image pushed!
✨ generated template files.
  - bentoctl.tfvars
bentoctl has built and pushed the bento and generated the terraform files

4. Применить развертывание с помощью Terraform

Наконец, мы можем инициализировать проект terraform, который будет применяться для создания развертывания Lambda.

terraform init
terraform apply -var-file=bentoctl.tfvars -auto-approve

Это результат, который мы ожидаем:

aws_apigatewayv2_api.lambda: Creating...
aws_iam_role.lambda_exec: Creating...
aws_apigatewayv2_api.lambda: Creation complete after 2s [id=libobddgz8]
aws_cloudwatch_log_group.api_gw: Creating...
aws_iam_role.lambda_exec: Creation complete after 3s [id=keras_model_ad-iam]
aws_iam_role_policy_attachment.lambda_policy: Creating...
aws_lambda_function.fn: Creating...
aws_iam_role_policy_attachment.lambda_policy: Creation complete after 1s [id=keras_model_ad-iam-20220910214539285200000001]
aws_cloudwatch_log_group.api_gw: Creation complete after 5s [id=/aws/api_gw/keras_model_ad-gw]
aws_apigatewayv2_stage.lambda: Creating...
aws_apigatewayv2_stage.lambda: Creation complete after 5s [id=$default]
...

Ссылка на мой сервис API — https://libobddgz8.execute-api.us-west-1.amazonaws.com/. Мы можем быстро протестировать развернутую конечную точку, используя файл servicerequest.py, показанный в предыдущих разделах.

При повторном запуске servicerequest.py должен повторно получить этот вывод:

Последние мысли:

Надеюсь, вы нашли это руководство, чтобы начать отслеживать свои эксперименты с MLflow и развертывать модель машинного обучения с помощью BentoML и AWS Lambda. Это абсолютно бесплатно и является хорошим стартом для новичков.

Посмотрите код в моем репозитории DagsHub:



Вам понравилась моя статья? Стань участником и получай неограниченный доступ к новым публикациям по науке о данных каждый день! Это косвенный способ поддержать меня без каких-либо дополнительных затрат для вас. Если вы уже являетесь участником, подпишитесь, чтобы получать электронные письма всякий раз, когда я публикую новые руководства по науке о данных и Python!