Модель ML/DL обучена и готова, но действительно ли она готова к внедрению в рабочую среду?

Команды по науке о данных и специалисты по данным в организации разрабатывают модели ML/DL, необходимые для их вариантов использования, создавая либо пользовательские, либо точно настроенные предварительно обученные модели с достаточно быстрым оборотом.

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

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

Когда мы думаем о внедрении нашей модели ML/DL в производство, мы обычно выбираем один из следующих способов: развертывание модели и/или обслуживание модели.

Развертывание модели и обслуживание модели:

Развертывание модели относится к процессу использования обученной модели ML/DL и предоставления ее прогнозов пользователям или другим системам.

Model Serving также делает что-то подобное, но позволяет размещать модели машинного обучения из Model Registry в качестве конечных точек REST, которые автоматически обновляются в зависимости от доступности версий моделей и их этапов. Обычно это означает, что модель развернута как веб-служба, и другие службы могут взаимодействовать с ней, запрашивать прогнозы и использовать результаты для принятия собственных решений.

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

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

Роль BentoML:

Итак, какова же роль BentoML здесь, спросите вы.

Чтобы быть простым и точным, BentoML ускоряет доставку моделей ML/DL в производство. Это упрощает тестирование и развертывание моделей, расширяющих практики DevOps в мире ИИ, эффективно преодолевая разрыв между наукой о данных и DevOps.

Звучит здорово, но распространяется ли мой фреймворк? Хорошая новость: да. Вот несколько фреймворков, которые BentoML поддерживает «из коробки».

Платформы машинного обучения, поддерживаемые BentoML:

Основные элементы:

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

Элемент 1. Магазин моделей

BentoML предоставляет простые в использовании хранилища для создания моделей ML/DL и управления ими.

Локальные хранилища BentoML — можно использовать для сохранения моделей с помощью API, специфичных для платформы машинного обучения. (Например, чтобы сохранить модель sk-learn в локальном хранилище bentoML, это можно сделать, импортировав библиотеку bentoML и выполнив быстрый sklearn.save())

Импорт из реестра моделей конкретной платформы. Модели также можно импортировать из реестров моделей. (Например, модель можно импортировать из реестра моделей MLFlow.)

Элемент 2: Артефакт Бенто

API-интерфейс артефакта модели BentoML позволяет нам указывать обученные модели, необходимые для службы Bento.

import bentoml
from bentoml.adapters import DataframeInput
from bentoml.frameworks.sklearn import SklearnModel
from bentoml.frameworks.xgboost import _XgBoostModel
@bentoml.env(infer_pip_packages=True)
@bentoml.artifacts([
    SklearnModel("model_a"),
    _XgBoostModel("model_b")
])

В BentoML есть артефакты, специфичные для платформы, а артефакт модели автоматически обрабатывает сериализацию и десериализацию в соответствии с выбранным артефактом.

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

Элемент 3. Обслуживание бенто

Как только мы выясним, как создавать нашу модель и управлять ею, мы переходим к определению логики обслуживания модели с помощью Bento Service.

Используя Bento Service, мы определяем свойства, специфичные для API вывода, и упаковываем модель с помощью bentoML, причем некоторые из свойств:

import bentoml
from bentoml.adapters import DataframeInput
from bentoml.frameworks.sklearn import SklearnModel
from bentoml.frameworks.xgboost import _XgBoostModel
@bentoml.env(infer_pip_packages=True)
@bentoml.artifacts([
    SklearnModel("model_a"),
    _XgBoostModel("model_b")
])
class MyPredictionService(bentoml.BentoService):
@bentoml.api(input=DataframeInput(), batch=True)
    def predict(self, df):
        # assume the output of model_a will be the input of model_b in this example:
        df = self.artifacts.model_a.predict(df)
return self.artifacts.model_b.predict(df)
  • Обработка типа данных — ввода и вывода — ожидаемого конечной точкой (с использованием адаптеров ввода и вывода bentoML)
  • Обработка зависимостей, если таковые имеются (используя infer_pip_packages)
  • Обработка того, как модель обрабатывает входные данные и как создаются выходные данные (с помощью сценариев предварительной и последующей обработки) и многое другое.

Элемент 4. Настройка веб-интерфейса

С помощью декоратора @web_static_content мы можем добавить каталог нашего внешнего интерфейса в наш класс BentoService.

@env(auto_pip_dependencies=True)
@artifacts([SklearnModel('model')])
@web_static_content('./static')
class IrisClassifier(BentoService):

    @api(input=DataframeInput(), batch=True)
    def predict(self, df):
        return self.artifacts.model.predict(df)

BentoML автоматически соберет для нас все файлы веб-интерфейса и разместит их при запуске сервера API.

Элемент 5. Сохранить как Bento

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

  1. Обучение модели
  2. Создание экземпляра BentoService
  3. Упаковка артефактов обученной модели с помощью pack(
  4. Сохранение в бенто с save()
from sklearn import svm
from sklearn import datasets
# 1. Model training
clf = svm.SVC(gamma='scale')
iris = datasets.load_iris()
X, y = iris.data, iris.target
clf.fit(X, y)
# 2. Create BentoService instance
iris_classifier_service = IrisClassifier()
# 3. Pack trained model artifacts
iris_classifier_service.pack("model", clf)
# 4. Save
saved_path = iris_classifier_service.save()

Элемент 6. Модель обслуживания

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

Существует 3 основных типа обслуживания моделей, которые предоставляет BentoML:

  • Онлайн-обслуживание: клиенты получают доступ к прогнозам через конечные точки API практически в режиме реального времени с высокопроизводительным сервером API, который может загружать сохраненный Bento и предоставлять REST API для клиентского доступа.
  • Пакетное обслуживание в автономном режиме — предварительное вычисление прогнозов и сохранение результатов в системе хранения с помощью инструментов для загрузки Bento и подачи на него пакета входных данных для вывода в автономном режиме.
  • Edge Serving — распространяйте модель и запускайте ее на мобильных устройствах или устройствах IoT, например. модель, работающая в маршрутизаторе или Raspberry Pi.

Элемент 7. Докеризация API-сервера, готового к работе

С Docker:

После того, как мы закончим рабочий процесс bentoML и подготовим bento, с помощью BentoML можно легко создать образ докера, содержащий сервер API нашей модели.

При сохранении Bento BentoML также создает Dockerfile в том же каталоге.

Для тех, кто не знаком с Docker, Dockerfile – это текстовый документ, содержащий все команды, необходимые для создания образа Docker, а команда docker build создает образ из Dockerfile.

# Find the local path of the latest version IrisClassifier saved bundle
saved_path=$(bentoml get IrisClassifier:latest --print-location --quiet)
# Build docker image using saved_path directory as the build context, replace the
# {username} below to your docker hub account name
docker build -t {username}/iris_classifier_bento_service $saved_path
# Run a container with the docker image built and expose port 5000
docker run -p 5000:5000 {username}/iris_classifier_bento_service
# Push the docker image to docker hub for deployment
docker push {username}/iris_classifier_bento_service

В Kubernetes:

После создания образа Docker его необходимо отправить в реестр Docker Hub, чтобы образ был указан в файле манифеста, чтобы модель была развернута в кластере Kubernetes.

Ниже приведен пример файла YAML для указания ресурсов, необходимых для запуска и предоставления сервера модели BentoML в кластере Kubernetes. Замените {docker_username} своим именем пользователя Docker Hub и сохраните его в iris-classifier.yaml.

#iris-classifier.yaml
apiVersion: v1
kind: Service
metadata:
    labels:
        app: iris-classifier
    name: iris-classifier
spec:
    ports:
    - name: predict
      port: 5000
      targetPort: 5000
    selector:
      app: iris-classifier
    type: LoadBalancer
---
apiVersion: apps/v1
kind: Deployment
metadata:
    labels:
        app: iris-classifier
    name: iris-classifier
spec:
    selector:
        matchLabels:
            app: iris-classifier
    template:
        metadata:
            labels:
                app: iris-classifier
        spec:
            containers:
            - image: {docker_username}/iris-classifier
              imagePullPolicy: IfNotPresent
              name: iris-classifier
              ports:
              - containerPort: 5000

В дополнение к вышесказанному BentoML обеспечивает полностью автоматизированное управление развертыванием для AWS EC2, AWS Lambda, AWS SageMaker и Azure Functions. Он предоставляет базовые функции развертывания модели с минимальной настройкой. Вот подробные руководства для каждой платформы:

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

На этом моя попытка кратко объяснить все о BentoML и рабочем процессе bentoML подошла к концу.

Некоторые примеры обслуживания моделей BentoML можно найти здесь: в репозитории bentoml/gallery, сгруппированные по основному учебному фреймворку ML, используемому в проекте, который служит полным руководством по обслуживанию моделей BentoML.

Так что в следующий раз, когда вы захотите развернуть или обслуживать свою модель ML/DL, обратите внимание на BentoML!

Дайте мне знать ваши отзывы и комментарии, которые всегда приветствуются :)