TL; DR; Я ищу способ предоставить специалистам по обработке данных инструменты для независимого развертывания растущего числа моделей с минимальными усилиями по разработке и DevOps для каждого развертывания. Рассмотрев несколько решений для обслуживания моделей, я пришел к выводу, что Seldon Core наиболее подходит для нужд этого проекта.

Редактировать 27 августа 2021 г .:

Я создал видеоурок для начала работы с Seldon Core, посмотрите его здесь:
Учебное пособие по обслуживанию моделей машинного обучения в масштабе - Seldon Core

Контекст

В настоящее время я создаю для своего клиента систему на основе машинного обучения.
Чтобы дать вам упрощенный контекст, не вдаваясь в детали - цель системы машинного обучения - помочь основной бизнес-системе, предоставляя прогнозы на основе на обученных моделях НЛП:

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

Ориентация в пространстве машинного обучения

В статье 2015 года Скрытый технический долг в системах машинного обучения фигурирует следующий рисунок:

В этом посте мы сосредоточимся на его части, «обслуживающей инфраструктуру».

Что такое обслуживание моделей?

Чтобы понять, что такое обслуживание модели, мы рассмотрим ее с нескольких точек зрения: код и рабочий процесс.
Начнем с кода. Ниже приведен базовый пример, взятый из учебника SKLearn:

Мы могли бы концептуально разделить приведенный выше код на два фрагмента: этап обучения и этап прогнозирования.
Этап обучения заканчивается, когда мы выгружаем модель в файл.
Этап прогнозирования начинается, когда мы загружаем его.

Мы можем использовать те же фазы при изучении рабочего процесса ML-разработки.
Фазы характеризуются тем, какая роль в группе данных отвечает за них, а также какие соображения принимаются во внимание.

В то время как фаза обучения находится в сфере Data Scientists, в которых соображения касаются того, какой алгоритм будет обеспечивать наилучшие показатели отзыва и точности (и, возможно, многие другие), фаза прогнозирования находится в области Data Engineers и DevOps. , где рассмотрение будет в строках:

  • Как обернуть код прогнозирования как готовую к производству услугу?
  • Как отправить и загрузить файл дампа модели?
  • Какой API / протокол использовать?
  • Масштабируемость, пропускная способность, задержка.
  • Развертывания - как развернуть новые версии модели? Как откатиться? Можем ли мы протестировать это с помощью Canary Deployments или Shadow Deployments?
  • Мониторинг.
  • Какие фреймворки машинного обучения мы можем поддерживать? (например, SKLearn, TensorFlow, XGBoost, Pytorch и т. д.)
  • Как подключить индивидуальную предварительную и постобработку?
  • Как сделать процесс развертывания простым и доступным для Data Scientist?

Решения

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

Они есть:

  • Просто оболочка REST API
  • «Проекты обслуживания моделей K8»: KFServing и Seldon Core
  • BentoML
  • MLFlow

Просто оболочка REST API

Как бы просто это ни звучало. Например - «Учебник: Обслуживание моделей машинного обучения с FastAPI в Python | Ян Форстер | Середина"

Проекты обслуживания моделей K8

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

КФСервинг

KFServing предоставляет настраиваемое определение ресурса Kubernetes для обслуживания моделей машинного обучения (ML) на произвольных фреймворках. Он нацелен на решение производственной модели, обслуживающей варианты использования, путем предоставления эффективных интерфейсов с высокой степенью абстракции для распространенных фреймворков машинного обучения, таких как Tensorflow, XGBoost, ScikitLearn, PyTorch и ONNX.
Он инкапсулирует сложность автомасштабирования, работы в сети, проверки работоспособности и сервера. Конфигурация для внедрения передовых функций обслуживания, таких как автоматическое масштабирование графического процессора, масштабирование до нуля и развертывание Canary для ваших развертываний машинного обучения. Он обеспечивает простую, подключаемую и полную историю для обслуживания производственного машинного обучения, включая прогнозирование, предварительную обработку, постобработку и объяснимость. KFServing используется в различных организациях.

Селдон Ядро

Ядро Seldon преобразует ваши модели машинного обучения (Tensorflow, Pytorch, H2o и т. Д.) Или языковые оболочки (Python, Java и т. Д.) В производственные микросервисы REST / GRPC.
Селдон выполняет масштабирование до тысяч производственных моделей машинного обучения и предоставляет расширенные возможности машинного обучения из коробки, включая расширенные метрики, ведение журнала запросов, объяснения, детекторы выбросов, A / B-тесты, Canaries и многое другое.

KFServing - это сотрудничество нескольких компаний, работающих в сфере машинного обучения (а именно Seldon, Google, Bloomberg, NVIDIA, Microsoft и IBM), с целью создания стандартизированного решения для типичных проблем с обслуживанием машинного обучения.
Поэтому неудивительно, что эти двое используют схожие механизмы и даже компоненты кода.

Селдон кажется более зрелым как проект с более полной документацией, более частыми выпусками и сообществом с активным каналом Slack, а также созывом рабочих групп раз в две недели. Для меня это оказалось чрезвычайно полезным (теперь вы знаете, какой из них я выбрал;)

Здесь вы можете найти подробное сравнение между ними.
Далее мы рассмотрим некоторые из основных функций:

Серверы вывода

Селдон вводит понятие многоразовые серверы вывода против одноразовых серверов вывода.

Он предоставляет готовые серверы моделей для стандартного вывода с использованием SKLearn, XGBoost, Tensorflow и MLflow.

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

Развертывания

Seldon Core и KFServing используют аналогичный подход к развертыванию служб прогнозирования моделей, основанный на использовании Kubernetes CRD (Custom Resource Definition).
Например:

apiVersion: machinelearning.seldon.io/v1alpha2
kind: SeldonDeployment
metadata:
 name: seldon-model
spec:
 name: test-deployment
 predictors:
 — componentSpecs:
 — spec:
 containers:
 — name: classifier
 image: seldonio/mock_classifier:1.0
 graph:
 children: []
 endpoint:
 type: REST
 name: classifier
 type: MODEL
 name: example
 replicas: 1

А затем вы можете развернуть его с помощью:

kubectl apply -f my_ml_deployment.yaml

Поддерживаемые протоколы API

Поскольку оба этих проекта находятся в разработке, меняются и протоколы.
KFServing имеет Протокол уровня данных (V1), а у Seldon Core есть собственный Протокол Селдона. Оба имеют поддержку Tensorflow Protocol.

Последние разработки в отношении протоколов - это предложение KFServing Data Plane (V2). Он все еще находится в стадии разработки, как и готовый сервер, реализующий его, разработанный компанией Seldon (SeldonIO / MLServer).

График вывода

Заметное различие между ними заключается в том, что в то время как KFServing ориентирован на простой вариант использования обслуживания единой модели, Seldon Core допускает более сложные графы вывода, которые могут включать несколько моделей, связанных вместе с ROUTERS, COMBINER и ТРАНСФОРМАТОРЫ.

BentoML

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

Унифицированный формат упаковки моделей, позволяющий работать как в режиме онлайн, так и в автономном режиме на любой платформе.

В 100 раз больше пропускной способности вашего обычного модельного сервера на основе флаконов, благодаря нашему усовершенствованному механизму микропакетов. Прочтите о тестах [здесь] (https://www.bentoml.ai/clkg/https/github.com/bentoml/benchmark).

Предоставляйте высококачественные услуги прогнозирования, отвечающие требованиям DevOps. язык и отлично интегрируется с общими инструментами инфраструктуры.

Серверы вывода

Подход BentoML к созданию службы прогнозирования аналогичен подходу Seldon Core и KFServing к созданию оболочек для пользовательских моделей.
Суть его заключается в создании подкласса базового класса и реализации в нем кода прогнозирования.

Основное заметное различие между «Проектами K8» и BentoML будет заключаться в отсутствии понятия многоразовых серверов логического вывода. Хотя вы, вероятно, могли бы реализовать его с помощью среды BentoML, этот подход в целом ориентирован на создание серверов, не подлежащих повторному использованию. Между тем «Проекты K8» явно предлагают оба варианта и имеют встроенную поддержку фреймворка для повторно используемых серверов (например, инициализатор контейнера, который загружает файл модели из хранилища при загрузке).

Поддерживаемые протоколы API

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

Развертывания

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

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

Еще одна интересная синергия между обсуждаемыми решениями - Развертывание BentoML на KFServing.

Модели MLFlow

Модель MLflow - это стандартный формат для упаковки моделей машинного обучения, которые можно использовать в различных последующих инструментах, например, для обслуживания в реальном времени через REST API или пакетного вывода в Apache Spark. Формат определяет соглашение, которое позволяет вам сохранять модель в различных «вариантах», которые могут быть поняты различными последующими инструментами.

Как и в случае с BentoML, мы получаем развертываемый модуль (который является либо контейнерным сервером REST API, либо функцией Python), и затем мы должны выяснить, как его развернуть.
Документация BentoML идет до сравнения это в MLFlow ».

Здесь также существует синергия между решениями, поскольку у Seldon Core есть предварительно упакованный сервер логического вывода для моделей MLFlow.

Резюме

Как я уже говорил, для этого проекта я выбрал Seldon Core.
Причины:

  • Частые релизы.
  • Обширная документация.
  • Активное сообщество.
  • Предварительно упакованные серверы вывода.
  • Простой процесс развертывания.

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

Контактная информация:
[email protected]