Недавно академические и отраслевые исследователи провели много интересных и новаторских исследований в области глубокого обучения. Они разработали множество новых невероятно мощных моделей. Однако большая часть этого исследования (за исключением нескольких технологических гигантов) остается только этим исследованием, а не частью производственного приложения. Несмотря на постоянный поток новых статей, по-прежнему невероятно сложно фактически использовать любую из этих моделей в производстве (и это даже тогда, когда в документах содержится код). Развертывание моделей машинного обучения остается серьезной проблемой. В этой статье я сделаю обзор различных способов «производства» моделей машинного обучения и взвесу их плюсы и минусы, не вдаваясь в подробности. В следующих статьях я исследую эти подходы с реальным кодом и примерами.

Задача

Предположим, что мы уже обучили модель сами или у нас есть обученные веса, доступные в Интернете. Чтобы использовать вашу модель в приложении, вам необходимо:

  1. Загрузите свою модель ее весами
  2. Предварительная обработка ваших данных
  3. Выполните фактический прогноз
  4. Обработка данных ответа на прогноз

Звучит достаточно просто? На практике этот процесс может быть довольно сложным.

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

  1. Какие у меня требования? (т.е. сколько запросов вы ожидаете в секунду, какая требуется задержка и т. д.)
  2. Как я буду оценивать производительность модели в производстве? (и как я буду собирать и хранить дополнительные данные о взаимодействиях)
  3. Как часто я планирую переучивать свою модель?
  4. Что нужно для предварительной обработки данных?
  5. Будет ли формат входных данных производства сильно отличаться от данных обучения модели? Будет ли оно поступать партиями или потоком?
  6. Должна ли модель работать в автономном режиме?

Это основные вопросы, которые вы должны задать, прежде чем пытаться развернуть свою модель.

Загрузка модели прямо в приложение

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

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

Этот процесс усложняется, если ваше приложение написано не на Python. Например, нет хорошего способа загрузить PyTorch или Caffe в программы Java. Даже Tensorflow, у которого есть библиотека Java, требует написания большого количества дополнительного кода для полной интеграции в приложение. Наконец, это явно не решает проблему масштабируемости.

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

Вызов API

Второй вариант предполагает создание API и вызов API из вашего приложения. Это можно сделать разными способами. Я подробно описал здесь наиболее распространенные способы.

Kubernetes

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

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

Пользовательский REST-API с Flask / Django

Другой вариант - создать свой собственный REST-API с нуля (этот вариант можно также комбинировать с Docker) в зависимости от того, насколько вы знакомы с созданием API. Это можно сделать с помощью Flask относительно легко. Я не буду вдаваться в подробности того, как это сделать, поскольку существует ряд существующих руководств, которые охватывают именно эту тему. В зависимости от количества запросов вы обычно можете без особых проблем масштабировать Flask.

Однако даже это может стать довольно запутанным из-за различий в фреймворках машинного обучения, времени загрузки и конкретных требованиях к предварительной обработке модели. В настоящее время я работаю над классом независимого от модели экземпляра для использования с Flask / Django, чтобы упростить использование моделей и предоставить стандартизированный шаблон для работы с моделями. Поэтому вместо того, чтобы запоминать и реализовывать различные функции для разных моделей, вы можете вызывать model.preprocess() и model.predict() независимо от серверной части (подробнее об этом также в другой статье).

AWS Lambda / бессерверная версия

AWS Lambda - еще один возможный путь. Вы можете прочитать Документацию AWS о том, как это настроить. В разделе Машинное обучение есть хорошая статья об использовании AWS lambda с Caffe2.

Другие подходы

Apache Beam. Я не слишком много знаю об этом методе, но этот метод, похоже, предполагает использование Beam для предварительной обработки модели, а затем Tensorflow (пока поддерживается только структура) для фактического прогнозирования. Смотрите эти слайды для дополнительной информации.

Spark / Flink

Некоторые из основных платформ обработки данных, такие как Spark и Flink, находятся в процессе разработки пакетов для помощи в развертывании моделей машинного обучения. Flink имеет Flink Tensorflow, целью которого является интеграция моделей TF в потоковые конвейеры Flink. В Spark есть несколько различных пакетов и попыток интеграции глубокого обучения. Кроме того, Yahoo недавно выпустила свою собственную библиотеку, которая позволяет как распределенное обучение, так и обслуживание моделей.

Заключение

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