Как обслуживать модель 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, это может ускорить процесс, но я подумал, что отвечу на вопрос конкретно