Python 如何使用ApacheSpark上培训的ML模型开发RESTAPI?

Python 如何使用ApacheSpark上培训的ML模型开发RESTAPI?,python,rest,apache-spark,apache-flink,Python,Rest,Apache Spark,Apache Flink,假设这种情况: 我们分析数据,使用手头的任何工具训练一些机器学习模型,并保存这些模型。这是在Python中完成的,使用ApacheSparkPythonshell和API。我们知道apachespark擅长批处理,因此对于aboce场景来说是一个不错的选择 现在进入生产阶段,对于每个给定的请求,我们需要返回一个响应,该响应也取决于经过训练的模型的输出。我想这就是人们所说的流处理,通常推荐使用ApacheFlink。但是,您将如何在Flink管道中使用使用Python中可用工具训练的相同模型 Sp

假设这种情况:

我们分析数据,使用手头的任何工具训练一些机器学习模型,并保存这些模型。这是在Python中完成的,使用ApacheSparkPythonshell和API。我们知道apachespark擅长批处理,因此对于aboce场景来说是一个不错的选择

现在进入生产阶段,对于每个给定的请求,我们需要返回一个响应,该响应也取决于经过训练的模型的输出。我想这就是人们所说的流处理,通常推荐使用ApacheFlink。但是,您将如何在Flink管道中使用使用Python中可用工具训练的相同模型

Spark的微批量模式在这里不起作用,因为我们确实需要响应每个请求,而不是批量响应

我还看到一些库试图用Flink进行机器学习,但这不能满足那些使用Python而不是Scala的各种工具,甚至不熟悉Scala的人的需求

所以问题是,人们如何处理这个问题

这个问题是相关的,但不是重复的,因为作者明确提到使用Spark MLlib。该库在JVM上运行,并且有更多的潜力被移植到其他基于JVM的平台上。但这里的问题是,如果人们使用的是
scikit-learn
、或
GPy
或他们使用的任何其他方法/软件包,他们会如何处理这个问题。

请看一看


我们已经成功地将在Spark上学习到的模型外部化到单独的服务中,这些服务提供对新传入数据的预测。我们将LDA主题建模管道外部化,尽管是在Scala中。但它们确实支持python,因此值得一看。

我需要一种方法,为ml
管道创建一个自定义的
转换器
,并将该自定义对象与管道的其余部分一起保存/加载。这让我深入挖掘了
spark
模型序列化/反序列化的丑陋深度。简言之,所有的
spark
ml模型都有两个组件
元数据
模型数据
,其中模型数据是在
.fit()过程中学习到的参数。元数据保存在模型save dir下名为
metadata
的目录中,据我所知是
json
,所以这不应该是个问题。模型参数本身似乎被保存为save dir中的
parquet
文件。这是保存LDA模型的实现

override protected def saveImpl(path: String): Unit = {
      DefaultParamsWriter.saveMetadata(instance, path, sc)
      val oldModel = instance.oldLocalModel
      val data = Data(instance.vocabSize, oldModel.topicsMatrix, oldModel.docConcentration,
        oldModel.topicConcentration, oldModel.gammaShape)
      val dataPath = new Path(path, "data").toString
      sqlContext.createDataFrame(Seq(data)).repartition(1).write.parquet(dataPath)
    }
注意最后一行的
sqlContext.createDataFrame(Seq(data)).repartition(1).write.parquet(dataPath)
。所以好消息是,您可以将文件加载到Web服务器中,如果服务器是Java/Scala,您只需要将spark JAR保存在类路径中

但是,如果您在Web服务器上使用say
python
,那么您可以使用python()的拼花库,坏消息是拼花文件中的部分或所有对象将是二进制Java转储,因此您无法在python中实际读取它们。我想到了几个选项,使用
Jython
(meh),使用Py4J加载对象,这是pyspark用来与JVM通信的,因此这实际上可以工作。不过,我并不认为这是一个直截了当的问题


或者从链接的问题中,使用
jpmml spark
,希望一切顺利。

如果需要,它可以不连接到流处理。请看这个问题:建议Flink使用实时、毫秒响应,但如果您可以等待一秒钟来处理更大的小批量,Spark非常好。然而,我建议保存模型,然后通过其他图书馆提供可能的副本