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

Но на пути все еще стоят некоторые критические проблемы. Одним из них является развертывание и обслуживание модели. Специалисты по данным, которые обычно отвечают за построение и обучение модели, часто не имеют опыта, чтобы запустить ее в производство. В то же время инженерам, которые не привыкли работать с моделями, требующими непрерывной итерации и улучшения, сложно использовать свои ноу-хау и общепринятые методы (такие как CI/CD, IaC и т. д.) для их развертывания. В этой статье мы представим фреймворк под названием BentoML, который заполняет пробел между моделированием и обслуживанием и помогает командам перейти от обученных моделей машинного обучения к службам прогнозирования производственного уровня, написав всего несколько строк кода.

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

  1. Почему нам нужно обслуживать модели машинного обучения?
  2. Модель обслуживания вызовов
  3. Что такое BentoML и как он работает?
  4. Подготовка набора данных и моделирование обнаружения мошенничества
  5. Преобразование модели BentoML в локальный API
  6. Создание бенто
  7. Развертывание Bento в Cloud RUN

1. Почему нам нужно обслуживать модели машинного обучения?

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

Но ваш друг узнал, что вы написали свою модель на Python, пока ваш друг создает свое приложение на Java. Так? Нельзя ли будет интегрировать вашу модель машинного обучения в приложение вашего друга?

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

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

Теперь обернуть модель машинного обучения в API не очень сложно, и именно этим мы и будем заниматься в этой статье! Мы создадим простую модель обнаружения мошенничества и развернем ее как REST API с использованием платформы BentoML.

2. Модель обслуживания вызовов :

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

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

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

Обслуживание моделей — один из последних и наиболее важных этапов жизненного цикла машинного обучения, поскольку бизнес не может предлагать продукты ИИ большой пользовательской базе, не делая свой продукт доступным. Развернуть модель машинного обучения в производственной среде непросто, так как возникает множество проблем:

  • Поддержка нескольких платформ машинного обучения (Torch, Scikit Learn, Tensorflow…). Исследователь данных может внедрять и переключать модели из многих платформ, и будет утомительной задачей адаптировать процесс обслуживания каждый раз, когда мы меняем структуру модели.
  • Производительность и масштабируемость. Размер матрицы признаков и алгоритм прогнозирования определяют сложность вычислений одной модели. Например, прогноз с помощью модели PyTorch по встраиванию тысяч товаров, каждый из которых имеет десятки измерений. Кроме того, в одном запросе может быть несколько вычислений модели, когда мы пытаемся выполнить иерархические или многоэтапные прогнозы. Вот почему масштабируемая производственная среда, которая хорошо интегрирована с различными технологиями моделирования и высокопроизводительными прогнозами, имеет решающее значение для успеха модели машинного обучения.
  • Микропакетная обработка. Пропускная способность моделей машинного обучения обычно выигрывает от пакетного прогнозирования, т. е. прогнозирование 100 точек данных в пакете, как правило, быстрее, чем их последовательное прогнозирование. Поэтому, когда модель получает несколько запросов в течение короткого периода времени (например, 50 мс), вместо прогнозирования по одному мы можем сгруппировать эти запросы вместе и запустить пакетный прогноз. Следовательно, эта функция также важна при работе с моделями.
  • Управление версиями: когда количество моделей и версий моделей растет, развертывание становится сложным, и становится трудно управлять всеми моделями и версиями.
  • Практика DevOps: в зависимости от нашей технической среды нам необходимо использовать инструмент DevOps для управления gitflow, реализации конвейеров CICD, упаковки нашего кода в образ Docker, разработки кода Ansible или Terraform для создания облачных ресурсов, управления уровнями безопасности и доступа и т. д. Соблюдение лучших практик DevOps при автоматизации и упаковке нашей модели имеет решающее значение.
  • Мониторинг модели: мы должны отслеживать, как работает каждая модель машинного обучения, и обнаруживать, когда производительность ухудшается и требуется переобучение.

Существуют различные облачные платформы или инструменты машинного обучения для развертывания моделей машинного обучения в безопасных средах в масштабе, включая TensorFlow Serving, API машинного обучения Amazon, Amazon SageMaker, Vertex AI от Google, IBM Watson, BentoML. .. Каждое решение имеет свои преимущества и ограничения, и вам, как правило, нужно выбирать в зависимости от технических ограничений вашей команды.

В этой статье мы решили выбрать BentoML из-за его простоты и зрелости, он также отвечает всем требованиям, когда речь идет об основных функциях, необходимых для обслуживания моделей и перечисленных выше. Я настоятельно рекомендую вам попробовать BentoML, если вы ищете готовый фреймворк для простого обслуживания моделей с высокой производительностью. Теперь давайте узнаем, насколько великолепен этот фреймворк!

3. Что такое BentoML и как он работает?

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

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

BentoML упаковывает все, что вам нужно в проекте машинного обучения, в формат дистрибутива, называемый бенто🍱,который изначально Японский ланч-бокс, который содержит одну порцию еды, состоящую из основного блюда и нескольких гарниров.

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

Ниже приведены наиболее важные функции BentoML:

  • Встроенная поддержка популярных сред машинного обучения: Tensorflow, PyTorch, XGBoost, Scikit-Learn и многих других! Пользователи также могут использовать Пользовательские модели в качестве обходного пути, если желаемая структура недоступна в Bento.
  • Развертывание в любой облачной среде: BentoML предоставляет пользователям простой способ развертывания масштабируемой, готовой к работе службы в выбранной вами облачной среде. BentoML создает артефакты, которые можно полностью развернуть как услугу во многих различных инфраструктурах. В зависимости от облачной среды артефакты будут упаковываться по-разному, чтобы соответствовать необходимым требованиям к инфраструктуре.
  • Оптимизировано для производительности: BentoML предоставляет множество методов оптимизации производительности, таких как Адаптивная микропакетная обработка, для более быстрого вывода группы входных данных и поддержки многоядерных машин путем управления различными процессами вывода.
  • Пользовательские конвейеры. Платформа поддерживает определение пользовательского конвейера обслуживания с моделями предварительной обработки, постобработки и ансамбля.
  • Простое управление версиями и развертывание. Стандартный формат .bento для упаковки кода, моделей и зависимостей для упрощения управления версиями и развертывания.
  • Современное обслуживание моделей.BentoML предлагает онлайн-обслуживание через REST API или gRPC, автономную оценку пакетных наборов данных с помощью Apache Spark или Dask, а также потоковое обслуживание с помощью Kafka, Beam и Flink.
  • BentoMl использует Terraform и Docker для упаковки модели, определения инфраструктуры и создания различных необходимых компонентов. Позже мы покажем, что весь код OPS будет сгенерирован автоматически всего двумя командами.

BentoML — это библиотека Python с открытым исходным кодом, поэтому для ее установки нужно запустить: pip install bentoml

После установки в вашу оболочку добавляется команда bentoml:

В следующих разделах мы увидим, как BentoML упрощает выполнение утомительных операций MLOps. Вот примеры:

  • Сохранение любой модели любого фреймворка в едином формате для облегчения совместной работы.
  • Создайте конечную точку HTTP API с одной функцией Python для более быстрой итерации.
  • Контейнеризируйте все, что нужно модели, с помощью Docker с помощью одной команды CLI.
  • Создавайте и развертывайте код инфраструктуры с помощью нескольких команд.

4. Подготовка набора данных и моделирование обнаружения мошенничества:

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

Для этого мы создадим сервис обнаружения мошенничества, используя набор данных IEEE-CIS Fraud Detection, содержащий реальные данные с независимыми переменными, что позволит классифицировать транзакции на мошеннические и доброкачественные. Мы будем обучать модель XGBoost и двигаться вперед, как если бы мы выполнили все предыдущие шаги жизненного цикла MLOps, такие как очистка данных, исследование, разработка функций, и нашли модель, которая лучше всего работает в нашем наборе данных. Мы максимально упростим вывод модели для демонстрационных целей, поэтому не стесняйтесь создавать или настраивать свою собственную модель, если хотите. Начнем 🚀 !

Первым шагом является создание приведенного ниже файла model.pypython, в котором мы выполним следующие шаги:

  1. Прочитайте данные.
  2. Создайте базовый процессор, который вменяет пропущенные значения и применяет порядковое кодирование к категориальным функциям (функция «build_preprocessor»).
  3. Обучите ванильный классификатор XGBoost, представьте, что это наша лучше всего настроенная модель, и вычислите несколько показателей машинного обучения для модели (функции «train_model» и «evaluate_model») .

4. Сохраните модель с помощью bentoML.

После обучения модели мы сохраним ее в формате, совместимом с BentoML, вызвав специфичную для фреймворка команду save.

Как упоминалось ранее, BentoML поддерживает практически все основные фреймворки машинного обучения. Когда модель сохраняется, она по умолчанию помещается в локальный каталог, называемый хранилищем моделей BentoML. У каждого из фреймворков есть соответствующая команда bentoml.framework.save_model.

В нашем случае мы использовали команду «bentoml.xgboost.save_model»:

resp = bentoml.xgboost.save_model(
        "fraud_detection_xgb_model",
        model,
        metadata=metrics,
        labels={"author": "Mohamed_DHAOUI"},
        signatures={
            "predict_proba": {"batchable": True},
        },
        custom_objects={"preprocessor": preprocessor},
    )

Теперь давайте запустим процесс моделирования:

Model(tag="fraud_detection_xgb_model:ioqolvwux2mfh3x3", path="/Users/mohamed_dhaoui/bentoml/models/fraud_detection_xgb_model/ioqolvwux2mfh3x3/")

Возвращаемый объект является экземпляром класса BentoML Model с меткой, называемой тег.

Тег состоит из двух частей — имени, заданного пользователем, и строки версии, позволяющей различать модели, сохраненные в разное время. Даже если будет сохранена идентичная модель, BentoML создаст новый каталог и строку версии. Это создает уникальную версию модели, которая позволяет позже получить соответствующую модель.

save_model имеет другие параметры для передачи дополнительной информации о модели, от метаданных до дополнительных пользовательских объектов. Выше мы сохраняем нашу модель XGBoost с дополнительными метаданными, такими как автор (я), оценка AUC и наш пользовательский препроцессор, который позже будет использоваться в прогнозе.

Из последнего вывода (параметр path) мы увидели, что хранилище нашей модели находится в /home/bentoml/models. Список всех ваших моделей мы можем посмотреть, вызвав команду bentoml models list в терминале:

BentoML создает папку с тегом модели. Если вы заглянете в эту папку, мы найдем двоичный файл и файл .YAML с именем model.yaml, который описывает метаданные модели:

Сохраненные модели можно загрузить обратно в память и отладить локально или в блокноте:

import bentoml
import pandas as pd
import numpy as np

model_ref = bentoml.xgboost.get("fraud_detection_xgb_model:latest")
model_runner = model_ref.to_runner()
model_runner.init_local()
model_preprocessor = model_ref.custom_objects["preprocessor"]
test_transactions = pd.read_csv("data/test_transaction.csv")
test_transactions = model_preprocessor.transform(test_transactions)
result = model_runner.predict_proba.run(test_transactions)
print(np.argmax(result, axis=1))

Выше мы извлекаем модель, загружая ее как бегун. Раннеры — это специальные объекты BentoML, оптимизированные для максимально эффективного использования системных ресурсов на основе их фреймворка. Бегуны — это основные компоненты API, которые мы создадим в следующем разделе.

Теперь мы готовы приступить к созданию API!

5. Преобразование модели BentoML в локальный API:

После того, как модель построена и сохранена, мы готовы преобразовать ее в API.

Для этого мы создадим простой скрипт service.py. Скрипт начнет с загрузки нашей модели в качестве бегуна, а затем мы создадим объект с именем svc, который будет содержать наш бегун. svc — это экземпляр объекта BentoML Service, высокоуровневого класса, абстрактно представляющего наш API. Если вы знакомы с Flask или FastAPI, это похоже на объекты fastapi.FastAPI() или flask.Flask(__name__).

Мы добавляем одну конечную точку с именем classify в объект службы, создавая функцию с тем же именем:

Декоратор @service.api объявляет, что функция classify является API, чьим входом является PandasDataFrame, а выходом — NumpyNdarray.

Чтобы убедиться, что пользователи вставляют в API правильные значения с правильными типами данных, я рекомендую использовать pydantic или marshmallow для создания пользовательской модели данных вместо использования универсальных типов.

Теперь давайте попробуем наш сервис svcв режиме отладки, запустив bentoml serve service.py:svc :

Это откроет локальный HTTP-сервер, который мы можем запросить с помощью Python:

Мы также можем взаимодействовать с API, перейдя по адресу http://127.0.0.1:3000. Вы увидите, что BentoML предоставляет пользовательский интерфейс Swagger, где вы можете видеть, документировать и тестировать различные конечные точки прогнозирования. Он автоматически генерируется BentoML из спецификации OpenAPI с визуальной документацией, что упрощает внутреннюю реализацию и использование на стороне клиента.

Теперь нажмите на кнопку «Попробовать»:

Вставьте следующее значение:

[{
"TransactionID":3663549,
"TransactionDT":18403224,
"TransactionAmt":31.95,
"ProductCD":"W"
"card1":10409,
....
  }]

Тело ответа возвращает значение 0. Это означает, что модель предсказывает, что транзакция не является мошеннической.

6. Создание бенто:

Убедившись, что все выглядит хорошо, мы можем начать помещать модель, сервис и зависимости в Bento 🚀.

Как упоминалось ранее, Bento — это термин, введенный BentoML, который относится к архиву, содержащему все необходимое для работы нашего API — в унифицированном формате. Внутри Bento будут инструкции по сборке образа Docker и зависимости нашей модели API.

Мы начинаем сборку Bento с создания файла bentofile.yaml (имя должно быть таким же) в каталоге нашего проекта. Это будет выглядеть следующим образом:

Подробности о файле выше:

  • Раздел service сообщает BentoML, в каком файле python находится наша служба («service.py») и каково ее имя («svc»).
  • Раздел include сообщает BentoML, какие файлы включать в бенто.
  • Раздел python сообщает BentoML, от каких пакетов Python зависит служба.

Теперь мы готовы собрать Bentos, просто запустив волшебную командную строку build 🚀:

$ bentoml build . 

В случае успеха вы увидите вывод, как показано ниже:

Созданный Bentos будет сохранен в каталоге ~/bentoml/bentos/<model-name>/<tag>. Файлы в каталоге должны выглядеть примерно так:

Довольно круто! Мы только что создали папку с моделью, сервисом, процессорами, требованиями Python, определением swagger и Dockerfile в нескольких строках кода!

7. Развертывание Bento в Google Cloud Run:

Три наиболее распространенных варианта развертывания с помощью BentoML:

  • 🐳 Создавайте образы контейнеров из Bento для пользовательского развертывания докеров. Это полезно, когда мы хотим управлять развертыванием самостоятельно.
  • 🦄️ Yatai: Масштабное развертывание модели в Kubernetes, полезно, когда мы работаем над экосистемой K8S.
  • 🚀 bentoctl: Быстрое развертывание модели на любой облачной платформе.

Воспользуемся третьим вариантом, чтобы показать, насколько легко BentoML может взаимодействовать с облачными провайдерами. Я настоятельно рекомендую bentoctl, так как он помогает развернуть любой созданный bento в качестве готовой к работе конечной точки API в облаке. Он поддерживает множество облачных провайдеров (GCP, AWS, Azure, Heroku), а также несколько сервисов в рамках одного (GKE, Cloud RUN, Compute Engine, AWS Lambda, EC2 и т. д.).

В этой статье мы развернем нашу модель в Google Cloud Platform и будем использовать Cloud Run, наиболее подходящий вариант для обслуживания API в GCP!

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

В оставшейся части статьи мы покажем, как развернуть нашу модель Bento XGB в Google Cloud Run.

Предпосылки

  • проект GCP
  • Инструмент Google Cloud CLI: https://cloud.google.com/sdk/docs/install
  • Докер установлен и работает на машине
  • Terraform — Terraform — это инструмент для создания, настройки и управления инфраструктурой. Инструкция по установке: www.terraform.io/downloads

Подготовьте развертывание:

Как упоминалось ранее, мы можем установить bentoctl через pip:

pip install bentoctl

Теперь мы установим официальный оператор BentoML Google Cloud Run и его зависимости. Оператор содержит шаблоны Terraform и настраивает реестры, необходимые для упрощения взаимодействия с GCP и работы в облаке. Установка производится следующим образом:

bentoctl operator install google-cloud-run

Следуйте интерактивному руководству, чтобы инициализировать проект развертывания:

bentoctl init

Команда задаст вам несколько вопросов. Вам нужно только указать идентификатор проекта GCP и имя для развертывания. Остальные можно оставить по умолчанию.

Будут созданы три файла — deployment_config.yaml, bentoctl.tfvars и main.tf:

  • deployment_config.yaml наши спецификации развертывания (идентификатор проекта, название службы GCP, ресурсы для работы в облаке)
  • main.tf файл terraform, в котором указаны ресурсы, которые необходимо создать. В нашем случае это в основном реестр контейнеров, куда будет помещен образ bento, и облачный сервис.
  • bentoctl.tfvars содержит значения переменных, используемых в файле main.tf.

После этого мы создаем образ Docker, совместимый с Cloud Run, с помощью команды bentoctl build:

$ bentoctl build -b xgb_classifier:latest -f deployment_config.yaml

Мы добавляем имя и версию нашего Bento и указываем спецификации сборки через файл deployment_config.yaml.

Если образ создан успешно, вы должны увидеть вывод, подобный приведенному ниже:

Служба Fraud-detection-classifier теперь создана и помещена в реестр контейнеров, а также созданы необходимые файлы terraform. Вы увидите, что файл bentoctl.tfvars был обновлен с помощью «image_tag», «image_repository» и «image_version»:

Теперь мы можем использовать terraform для выполнения развертывания. Используйте следующие команды:

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

В конце вы увидите следующее сообщение, в котором показан URL-адрес нашего развернутого API Cloud Run:

Теперь наша модель обнаружения мошенничества развернута как API с помощью Cloud Run, и мы можем начать отправлять запросы и получать прогнозы:

Запустив приведенный выше скрипт, мы получим наш прогноз (не мошенническая транзакция):

ℹ️Bentoml по умолчанию создает общедоступный API и поэтому может быть подвержен атакам, поэтому обязательно удалите ресурс terraform «run_all_users» из файла «main.tf»:

Если вам действительно нужно сделать свой API общедоступным и правильно обрабатывать аутентификацию, вам следует рассмотреть возможность добавления Cloud API Gateway перед Cloud RUN. Я опишу процесс в отдельной статье в ближайшие месяцы.

Заключение

Поздравляем! Вы только что узнали, как создавать конечные точки API для модели машинного обучения с помощью BentoML. Я надеюсь, что эта статья была вам полезна, пожалуйста, дайте мне знать, если у вас есть какие-либо отзывы или вопросы, которые всегда приветствуются :)

Полезные ссылки

Дополнительные материалы на PlainEnglish.io.

Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter, LinkedIn, YouTube и Discord .