如何提供 Spark MLlib 模型?
How to serve a Spark MLlib model?
我正在评估基于生产 ML 的应用程序的工具,我们的选择之一是 Spark MLlib,但我有一些关于模型训练后如何提供服务的问题?
例如在 Azure ML 中,一旦经过训练,模型就会公开为可以从任何应用程序使用的 Web 服务,这与 Amazon ML 的情况类似。
您如何 serve/deploy Apache Spark 中的 ML 模型?
您正在比较两个截然不同的事物。 Apache Spark 是一个计算引擎,而你提到亚马逊和微软解决方案提供服务。这些服务还不如在后台使用带有 MLlib 的 Spark。它们使您免于自己构建 Web 服务的麻烦,但您需要支付额外费用。
许多公司,如 Domino Data Lab、Cloudera 或 IBM 提供的产品,您可以部署在自己的 Spark 集群上,并轻松地围绕您的模型构建服务(具有不同程度的灵活性)。
您自然会使用各种开源工具自行构建服务。具体是哪个?这完全取决于你追求的是什么。用户应该如何与模型交互?应该有某种 UI 还是开玩笑的 REST API?您是否需要更改模型或模型本身的某些参数?这些作业更多是批处理的还是实时的?您自然可以构建一体化解决方案,但这需要付出巨大的努力。
我个人的建议是,如果可以的话,利用亚马逊、Google、微软或其他公司提供的一项可用服务。需要本地部署?查看 Domino Data Lab,他们的产品很成熟,可以轻松使用模型(从构建到部署)。 Cloudera更专注于集群计算(包括Spark),但他们还需要一段时间才能有成熟的东西。
[编辑] 我建议看一下 Apache PredictionIO,开源机器学习服务器 - 具有很大潜力的惊人项目。
一方面,使用 Spark 构建的机器学习模型无法像在 Azure ML 或 Amazon ML 中以传统方式提供服务。
Databricks 声称能够使用它的笔记本部署模型,但我还没有真正尝试过。
另一方面,您可以通过三种方式使用模型:
- 在应用程序内即时训练,然后应用预测。这可以在 spark 应用程序或笔记本中完成。
- 训练模型并保存它(如果它实现了
MLWriter
然后加载到应用程序或笔记本中并 运行 根据您的数据。
- 使用 Spark 训练模型并使用 jpmml-spark 将其导出为 PMML 格式。 PMML 允许不同的统计和数据挖掘工具使用相同的语言。通过这种方式,预测解决方案可以轻松地在工具和应用程序之间移动,而无需自定义编码。例如从 Spark ML 到 R.
这就是三种可能的方式。
当然,您可以考虑一个架构,其中您有 RESTful 服务,您可以在每个示例中使用 spark-jobserver 进行构建以进行训练和部署,但需要一些开发。它不是开箱即用的解决方案。
您还可以使用像 Oryx 2 这样的项目来创建完整的 lambda 架构来训练、部署和服务模型。
不幸的是,对上述每个解决方案的描述都非常宽泛,不属于 SO 的范围。
一种选择是使用 MLeap 在线服务 Spark PipelineModel,不依赖于 Spark/SparkContext。不必使用 SparkContext 很重要,因为它将单个记录的评分时间从 ~100 毫秒减少到 single-digit 微秒.
要使用它,您必须:
- 使用 MLeap 实用程序序列化您的 Spark 模型
- 在 MLeap 中加载模型(不需要 SparkContext 或任何 Spark 依赖项)
- 在 JSON(不是 DataFrame)中创建您的输入记录
- 使用 MLeap 为您的记录评分
MLeap 与 Spark MLlib 中可用的所有流水线阶段很好地集成(在撰写本文时 LDA 除外)。但是,如果您使用自定义 Estimators/Transformers.
,事情可能会变得有点复杂
查看 MLeap FAQ 了解有关自定义 transformers/estimators、性能和集成的更多信息。
我已经能够让它工作了。注意事项: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 评估答案,这可以使过程 运行 更快,但我想我会专门回答这个问题
我正在评估基于生产 ML 的应用程序的工具,我们的选择之一是 Spark MLlib,但我有一些关于模型训练后如何提供服务的问题?
例如在 Azure ML 中,一旦经过训练,模型就会公开为可以从任何应用程序使用的 Web 服务,这与 Amazon ML 的情况类似。
您如何 serve/deploy Apache Spark 中的 ML 模型?
您正在比较两个截然不同的事物。 Apache Spark 是一个计算引擎,而你提到亚马逊和微软解决方案提供服务。这些服务还不如在后台使用带有 MLlib 的 Spark。它们使您免于自己构建 Web 服务的麻烦,但您需要支付额外费用。
许多公司,如 Domino Data Lab、Cloudera 或 IBM 提供的产品,您可以部署在自己的 Spark 集群上,并轻松地围绕您的模型构建服务(具有不同程度的灵活性)。
您自然会使用各种开源工具自行构建服务。具体是哪个?这完全取决于你追求的是什么。用户应该如何与模型交互?应该有某种 UI 还是开玩笑的 REST API?您是否需要更改模型或模型本身的某些参数?这些作业更多是批处理的还是实时的?您自然可以构建一体化解决方案,但这需要付出巨大的努力。
我个人的建议是,如果可以的话,利用亚马逊、Google、微软或其他公司提供的一项可用服务。需要本地部署?查看 Domino Data Lab,他们的产品很成熟,可以轻松使用模型(从构建到部署)。 Cloudera更专注于集群计算(包括Spark),但他们还需要一段时间才能有成熟的东西。
[编辑] 我建议看一下 Apache PredictionIO,开源机器学习服务器 - 具有很大潜力的惊人项目。
一方面,使用 Spark 构建的机器学习模型无法像在 Azure ML 或 Amazon ML 中以传统方式提供服务。
Databricks 声称能够使用它的笔记本部署模型,但我还没有真正尝试过。
另一方面,您可以通过三种方式使用模型:
- 在应用程序内即时训练,然后应用预测。这可以在 spark 应用程序或笔记本中完成。
- 训练模型并保存它(如果它实现了
MLWriter
然后加载到应用程序或笔记本中并 运行 根据您的数据。 - 使用 Spark 训练模型并使用 jpmml-spark 将其导出为 PMML 格式。 PMML 允许不同的统计和数据挖掘工具使用相同的语言。通过这种方式,预测解决方案可以轻松地在工具和应用程序之间移动,而无需自定义编码。例如从 Spark ML 到 R.
这就是三种可能的方式。
当然,您可以考虑一个架构,其中您有 RESTful 服务,您可以在每个示例中使用 spark-jobserver 进行构建以进行训练和部署,但需要一些开发。它不是开箱即用的解决方案。
您还可以使用像 Oryx 2 这样的项目来创建完整的 lambda 架构来训练、部署和服务模型。
不幸的是,对上述每个解决方案的描述都非常宽泛,不属于 SO 的范围。
一种选择是使用 MLeap 在线服务 Spark PipelineModel,不依赖于 Spark/SparkContext。不必使用 SparkContext 很重要,因为它将单个记录的评分时间从 ~100 毫秒减少到 single-digit 微秒.
要使用它,您必须:
- 使用 MLeap 实用程序序列化您的 Spark 模型
- 在 MLeap 中加载模型(不需要 SparkContext 或任何 Spark 依赖项)
- 在 JSON(不是 DataFrame)中创建您的输入记录
- 使用 MLeap 为您的记录评分
MLeap 与 Spark MLlib 中可用的所有流水线阶段很好地集成(在撰写本文时 LDA 除外)。但是,如果您使用自定义 Estimators/Transformers.
,事情可能会变得有点复杂查看 MLeap FAQ 了解有关自定义 transformers/estimators、性能和集成的更多信息。
我已经能够让它工作了。注意事项: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 评估答案,这可以使过程 运行 更快,但我想我会专门回答这个问题