【问题标题】:How to develop a REST API using an ML model trained on Apache Spark?如何使用在 Apache Spark 上训练的 ML 模型开发 REST API?
【发布时间】:2017-07-31 21:22:48
【问题描述】:

假设这种情况:

我们分析数据,使用我们手头的任何工具训练一些机器学习模型,然后保存这些模型。这是在 Python 中使用 Apache Spark python shell 和 API 完成的。我们知道 Apache Spark 擅长批处理,因此是 aboce 场景的不错选择。

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

Spark 的微批处理模式在这里行不通,因为我们确实需要响应每个请求,而不是批量响应。

我也看到一些库试图在 Flink 中进行机器学习,但这并不能满足那些在 Python 而不是 Scala 中有多种工具,甚至不熟悉 Scala 的人的需求。

所以问题是,人们如何解决这个问题?

This 问题是相关的,但不是重复的,因为那里的作者明确提到使用 Spark MLlib。该库在 JVM 上运行,并且更有可能移植到其他基于 JVM 的平台。但这里的问题是,如果人们使用scikit-learnGPy 或他们使用的任何其他方法/包,他们将如何处理它。

【问题讨论】:

标签: python rest apache-spark apache-flink


【解决方案1】:

我需要一种为 ml Pipeline 创建自定义 Transformer 的方法,并将该自定义对象与管道的其余部分一起保存/加载。这使我深入研究了spark 模型序列化/反序列化的非常丑陋的深度。简而言之,看起来所有spark ml 模型都有两个组件metadatamodel data,其中模型数据是在.fit() 期间学习到的任何参数。元数据保存在模型保存目录下名为metadata 的目录中,据我所知是json,所以这应该不是问题。模型参数本身似乎被保存为保存目录中的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)。所以好消息是您可以将文件加载到您的网络服务器中,如果服务器使用 Java/Scala,您只需将 spark jar 保存在类路径中。

但是,如果您将 python 用于网络服务器,您可以使用 python 的 parquet 库 (https://github.com/jcrobak/parquet-python),坏消息是 parquet 文件中的部分或全部对象将是二进制 Java转储,因此您实际上无法在 python 中读取它们。想到了几个选项,使用Jython (meh),使用 Py4J 加载对象,这是 pyspark 用来与 JVM 通信的,所以这实际上可以工作。不过,我不希望这会非常简单。

或者从链接的问题中使用jpmml-spark 并希望最好。

【讨论】:

    【解决方案2】:

    看看MLeap

    我们在将 Spark 上学习的模型外部化为单独的服务方面取得了一些成功,这些服务提供对新传入数据的预测。我们将 LDA 主题建模管道外部化,尽管是在 Scala 中。但他们确实支持 python,所以值得一看。

    【讨论】:

      猜你喜欢
      • 2021-03-02
      • 2017-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-14
      • 1970-01-01
      • 2015-11-18
      • 1970-01-01
      相关资源
      最近更新 更多