Модель 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:
- Scikit-Learn - Документация | "Примеры"
- PyTorch - Документы | "Примеры"
- Tensorflow 2 - Документы | "Примеры"
- Tensorflow Keras - Документы | "Примеры"
- XGBoost - Документы | "Примеры"
- LightGBM - Документы | "Примеры"
- FastText - Документы | "Примеры"
- FastAI - Документы | "Примеры"
- H2O - Документы | "Примеры"
- ONNX - Документы | "Примеры"
- Spacy - Документы | "Примеры"
- Statsmodels - Документы | "Примеры"
- CoreML - Документы
- Трансформеры - Документы
- Глюон - Документы
- Detectron - Документы
- PaddlePaddle - Документы | "Пример"
- EvalML - Документы
- EasyOCR - Документы
- ONNX-MLIR - Документы
Основные элементы:
Теперь, когда у нас есть представление о том, что делает 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, который затем можно использовать для обслуживания нашей модели. Шаги, связанные с сохранением в качестве бенто, следующие:
- Обучение модели
- Создание экземпляра BentoService
- Упаковка артефактов обученной модели с помощью
pack(
- Сохранение в бенто с
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. Он предоставляет базовые функции развертывания модели с минимальной настройкой. Вот подробные руководства для каждой платформы:
- Развертывание в AWS Lambda
- Развертывание в AWS SageMaker
- Развертывание на AWS EC2
- Развертывание в Функциях Azure
BentoML также упрощает развертывание наших моделей на любых облачных платформах или в вашей внутренней пользовательской инфраструктуре. Вот руководства по развертыванию популярных облачных сервисов и платформ с открытым исходным кодом:
- Развертывание в AWS ECS (Elastic Container Service)
- Развертывание в Heroku
- Развертывание в Google Cloud Run
- Развертывание в Google Cloud AI Platform Unified
- Развертывание в экземпляре контейнера Azure
- Развертывание в Knative
- Развертывание в Kubeflow
- Развертывание в KFServing
- Развертывание в Clipper Cluster
- Развертывание в службах машинного обучения SQL Server
На этом моя попытка кратко объяснить все о BentoML и рабочем процессе bentoML подошла к концу.
Некоторые примеры обслуживания моделей BentoML можно найти здесь: в репозитории bentoml/gallery, сгруппированные по основному учебному фреймворку ML, используемому в проекте, который служит полным руководством по обслуживанию моделей BentoML.
Так что в следующий раз, когда вы захотите развернуть или обслуживать свою модель ML/DL, обратите внимание на BentoML!
Дайте мне знать ваши отзывы и комментарии, которые всегда приветствуются :)