如何为 Spark MLlib 模型提供服务?

Posted

技术标签:

【中文标题】如何为 Spark MLlib 模型提供服务?【英文标题】:How to serve a Spark MLlib model? 【发布时间】:2017-03-24 20:01:16 【问题描述】:

我正在评估基于生产 ML 的应用程序的工具,我们的选项之一是 Spark MLlib,但我对如何在模型训练后为其提供服务有一些疑问?

例如在 Azure ML 中,一旦经过训练,模型就会公开为可以从任何应用程序使用的 Web 服务,这与 Amazon ML 的情况类似。

您如何在 Apache Spark 中提供/部署 ML 模型?

【问题讨论】:

【参考方案1】:

一方面,使用 Spark 构建的机器学习模型无法像在 Azure ML 或 Amazon ML 中以传统方式提供服务那样提供服务。

Databricks 声称能够使用它的笔记本部署模型,但我还没有真正尝试过。

另一方面,您可以通过三种方式使用模型:

在应用程序中进行动态训练,然后应用预测。这可以在 spark 应用程序或笔记本中完成。 训练模型并在它实现MLWriter 时保存它,然后加载到应用程序或笔记本中并针对您的数据运行它。 使用 Spark 训练模型并使用 jpmml-spark 将其导出为 PMML 格式。 PMML 允许不同的统计和数据挖掘工具使用相同的语言。通过这种方式,预测解决方案可以在工具和应用程序之间轻松移动,而无需自定义编码。例如从 Spark ML 到 R。

这是三种可能的方式。

当然,您可以考虑一个架构,其中您有 RESTful 服务,您可以在每个示例中使用 spark-jobserver 构建该服务来训练和部署,但需要一些开发。这不是一个开箱即用的解决方案。

您还可以使用 Oryx 2 等项目来创建完整的 lambda 架构,以训练、部署和服务模型。

不幸的是,对上述每个解决方案的描述都非常广泛,不适合 SO 的范围。

【讨论】:

我会给 spark-jobserver 一个机会。您可以轻松快速地缓存模型(甚至是完整的 Spark 管道)回答与机器学习相关的查询,例如分类或查询。它还使您有机会缓存​​聚合表并快速返回包含此数据或部分数据的 json,以便在另一个应用程序中进行可视化或进一步处理。【参考方案2】:

一种选择是使用MLeap 在线提供Spark PipelineModel,不依赖于Spark/SparkContext。不必使用 SparkContext 很重要,因为它会将单个记录的评分时间从约 100 毫秒减少到 个位数微秒

要使用它,您必须:

使用 MLeap 实用程序序列化您的 Spark 模型 在 MLeap 中加载模型(不需要 SparkContext 或任何 Spark 依赖项) 在 JSON(不是 DataFrame)中创建您的输入记录 用 MLeap 记录你的记录

MLeap 与 Spark MLlib 中可用的所有流水线阶段都很好地集成(在撰写本文时 LDA 除外)。但是,如果您使用自定义 Estimators/Transformers,事情可能会变得更复杂。

查看MLeap FAQ,了解有关自定义转换器/估计器、性能和集成的更多信息。

【讨论】:

MLeap 的功能列表看起来像是 spark ML 管道中缺失的谜题。但是,当我尝试序列化一个包含Imputer 的简单 pyspark ML 管道时,我未能使其工作。所有示例都显示了各种转换器,它们也适用于我,但遗憾的是似乎不支持 Imputer :(【参考方案3】:

您正在比较两个完全不同的事物。 Apache Spark 是一个计算引擎,而您提到的亚马逊和微软解决方案正在提供服务。这些服务还不如在幕后使用带有 MLlib 的 Spark。它们使您免于自己构建 Web 服务的麻烦,但您需要支付额外费用。

Domino Data Lab、Cloudera 或 IBM 等公司提供的产品可以部署在您自己的 Spark 集群上,并围绕您的模型轻松构建服务(具有不同程度的灵活性)。

您自然会使用各种开源工具自己构建服务。具体是哪个?这一切都取决于你所追求的。用户应该如何与模型交互?应该有某种 UI 还是开玩笑的 REST API?您是否需要更改模型或模型本身的某些参数?这些工作是批处理还是实时的?您自然可以构建一体化解决方案,但这将是一项巨大的工作。

如果可以的话,我个人的建议是利用亚马逊、谷歌、微软或其他任何公司的可用服务之一。需要本地部署?检查 Domino Data Lab,他们的产品很成熟,可以轻松使用模型(从构建到部署)。 Cloudera 更专注于集群计算(包括 Spark),但它们需要一段时间才能成熟。

[编辑] 我建议看看 Apache PredictionIO,开源机器学习服务器 - 具有很大潜力的惊人项目。

【讨论】:

【参考方案4】:

我已经能够让它工作了。注意事项:Python 3.6 + 使用 Spark ML API(不是 MLLIB,但确保它应该以相同的方式工作)

基本上,遵循MSFT's 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 评估答案,这可以使流程运行得更快,但我想我会专门回答这个问题

【讨论】:

以上是关于如何为 Spark MLlib 模型提供服务?的主要内容,如果未能解决你的问题,请参考以下文章

Spark Mllib分类模型——各分类模型使用

spark.mllib源码阅读-回归算法1-LinearRegression

十spark MLlib的scala示例

学习笔记Spark—— Spark MLlib应用—— Spark MLlib应用

学习笔记Spark—— Spark MLlib应用—— Spark MLlib应用

Java应用XIII使用Apache Spark MLlib构建机器学习模型上