Spark MLLib 模型的轻量级执行

数据挖掘 阿帕奇火花 爪哇
2022-02-17 01:38:07

我有一些训练数据,用于构建 Hive 数据库中的 Spark MLLib 模型。我正在使用简单的线性回归模型和 PySpark API。

我设置了一个代码来每天训练这个模型以获得最新的模型。(实际用例是我正在预测车辆卸载时间,并且我的模型必须始终是最近训练的,因为车辆和位置的特征会随着时间而变化。)

但是,当我使用我的模型进行推理时,我想从现有的 Java 代码库中进行推理。我需要对单个数据点进行快速推理,而不是批量推理。所以我需要一种轻量级的低延迟计算推理的方法。

我发现的一种解决方案是将我的 MLLib 模型的参数导出为 PMML 或其他表示形式,然后在纯 Java 中重新实现推理代码,而无需使用 Spark 附带的任何样板。所以我有这样的功能:

    public static double predict(double[] parameters) {
        double prediction = bias + weights[0] * parameters[0] +  ....;
        return prediction;
    }

其中数组权重每天都会使用从经过训练的 MLLib 模型导出的值进行更新。

然而,这似乎效率低下,因为模型设计的逻辑现在在 Java 代码中不必要地复制,并且也限制了我可以用这种方式表示的那种简单模型。例如,对于随机森林回归,我无法做到这一点。

理想情况下,我希望在 Java 中对 Spark MLLib 进行轻量级推理调用,而不需要任何 Spark 会话、服务器、API、URL 等的开销。

有没有我可以使用的轻量级 Spark Java 函数来推断单个实例?我不认为有人需要 Hive 和并行处理的好处来进行训练是一种不常见的情况,而只是以最小的开销进行快速简单的推理。

2个回答

您可以将模型(权重 + 超参数)从 Spark 导出为通用格式,然后在另一种语言/框架中执行相同的格式。

https://docs.databricks.com/spark/latest/mllib/model-export.html

上面的链接有 Python / Spark 的示例,也应该适用于 Java。

跑步

   local[*]

因为您Spark master的重量不够轻巧且速度不够快-英特尔的 8 核爆破core i7或者你可以找到更强大的机器来运行它。您需要亚分钟的响应时间吗?如果问题小到可以在单台计算机上运行,​​那么性能spark不错它使用BLAS库:您可以尝试不同的 BLAS 后端,看看是否可以根据需要获得额外的提升。

转换为 java 几乎没有什么好处 - 您打算将哪些库用于您的算法?最后,它们将在已经使用的相同内存上运行 - 并在最大程度上运行:jvmspark模式将获取所需的尽可能多的可用本地内存,同时为操作系统和其他正在运行的应用程序留出足够的内存.sparkstandalone

请注意,所有mllib例程都使用jvm- 即使pyspark是编程语言/接口。提交作业pyspark套接字通过套接字进行通信。py4jjvmspark

更新您可以通过禁用 GUI

-- conf spark.gui.enabled=false

在命令行或

conf.set("spark.gui.enabled","false")

这节省了启动时间,也减少了使用的端口。