如何为 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源码阅读-回归算法1-LinearRegression
学习笔记Spark—— Spark MLlib应用—— Spark MLlib应用