Как обслуживать модель Spark MLlib?

Я оцениваю инструменты для приложений на основе ML и один из наших вариантов - Spark MLlib, но у меня есть некоторые вопросы о том, как служить модели после ее обучения?

Например, в Azure ML, после обучения, модель экспонируется как веб-служба, которую можно использовать из любого приложения, и это аналогичный случай с Amazon ML.

Как вы обслуживаете/развертываете модели ML в Apache Spark?

Ответ 1

С одной стороны, модель машинного обучения, построенная с использованием искры, не может быть использована так, как вы используете в Azure ML или Amazon ML традиционным способом.

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

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

  • Обучение "на лету" внутри приложения, а затем прогнозирование. Это можно сделать в искровом приложении или ноутбуке.
  • MLWriter модель и сохраните ее, если она реализует MLWriter затем загружает приложение или ноутбук и запускает его против ваших данных.
  • Обучите модель Spark и экспортируйте ее в формат PMML с использованием jpmml-spark. PMML позволяет различным инструментам сбора статистических данных и данных работать на одном языке. Таким образом, интеллектуальное решение может быть легко перемещено между инструментами и приложениями без необходимости в пользовательском кодировании. например, от Spark ML до R.

Это три возможных способа.

Разумеется, вы можете подумать о архитектуре, в которой у вас есть служба RESTful, за которой вы можете создавать с помощью spark-jobserver на пример для обучения и развертывания, но для этого требуется определенная разработка. Это не готовое решение.

Вы также можете использовать такие проекты, как Oryx 2, чтобы создать свою полную лямбда-архитектуру для обучения, развертывания и обслуживания модели.

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

Ответ 2

Одним из вариантов является использование MLeap для обслуживания Spark PipelineModel в режиме онлайн без каких-либо зависимостей от Spark/SparkContext. Важно не использовать SparkContext, так как он уменьшит время оценки для одной записи с ~ 100 мс до однозначных микросекунд.

Для того, чтобы использовать его, вы должны:

  • Сериализуйте модель Spark с помощью утилит MLeap
  • Загрузите модель в MLeap (не требует SparkContext или каких-либо зависимостей Spark)
  • Создайте свою входную запись в JSON (не в DataFrame)
  • Забей свой рекорд с MLeap

MLeap хорошо интегрирован со всеми этапами конвейера, доступными в Spark MLlib (за исключением LDA на момент написания этой статьи). Тем не менее, все может быть немного сложнее, если вы используете собственные оценщики/трансформеры.

Посмотрите часто задаваемые вопросы по MLeap для получения дополнительной информации о пользовательских трансформаторах/оценщиках, характеристиках и интеграции.

Ответ 3

Вы сравниваете две довольно разные вещи. Apache Spark - это вычислительный механизм, в то время как упомянутые вами решения Amazon и Microsoft предлагают услуги. Эти сервисы могут также иметь Spark с MLlib за сценой. Они избавляют вас от проблем, связанных с созданием веб-сервиса, но вы платите дополнительно.

Количество компаний, таких как Domino Data Lab, Cloudera или IBM, предлагает продукты, которые можно развернуть на свой собственный Spark-кластер и легко создавать сервисы вокруг своих моделей (с разной степенью гибкости).

Естественно, вы создаете сервис самостоятельно с помощью различных инструментов с открытым исходным кодом. Что конкретно? Все зависит от того, что вам нужно. Как пользователь должен взаимодействовать с моделью? Должен ли быть какой-то пользовательский интерфейс или шутить REST API? Вам нужно изменить некоторые параметры на модели или самой модели? Являются ли рабочие места более частыми или реальными? Естественно, вы можете создать решение "все-в-одном", но это будет огромным усилием.

Моя личная рекомендация заключалась бы в том, чтобы воспользоваться, если можно, одним из доступных сервисов Amazon, Google, Microsoft и т.д. Нужно ли размещать на месте? Проверьте Domino Data Lab, их продукт зрелый и позволяет легко работать с моделями (от здания до развертывания). Cloudera больше ориентирована на кластерные вычисления (включая Spark), но это займет некоторое время, прежде чем они что-то созрели.

[EDIT] Я бы рекомендовал взглянуть на Apache PredictionIO, сервер обучения с открытым исходным кодом - удивительный проект с большим потенциалом,

Ответ 4

Я смог просто заставить это работать. Предостережения: Python 3.6 + с использованием Spark ML API (не MLLIB, но уверен, что он должен работать так же)

В основном следуйте этому примеру, предоставленному на MSFT AzureML github.

Слово предупреждения: будет предоставлен код "как есть", но в конце примера в методе run() есть ошибка:

        #Get each scored result
        preds = [str(x['prediction']) for x in predictions]
        result = ",".join(preds)
        # you can return any data type as long as it is JSON-serializable
        return result.tolist()

Должно быть:

        #Get each scored result
        preds = [str(x['prediction']) for x in predictions]
        #result = ",".join(preds)
        # you can return any data type as long as it is JSON-serializable
        output = dict()
        output['predictions'] = preds
        return json.dumps(output)

Кроме того, полностью согласен с оценочным ответом MLeap, это может ускорить процесс, но я подумал, что отвечу на вопрос конкретно