【发布时间】:2018-03-26 18:08:00
【问题描述】:
我们正在尝试找到一种方法来加载经过 Spark (2.x) ML 训练的模型,以便根据请求(通过 REST 接口)我们可以查询它并获得预测,例如http://predictor.com:8080/give/me/predictions?a=1,b=2,c=3
有一些开箱即用的库可以将模型加载到 Spark 中(假设它在使用 MLWritable 训练后存储在某个地方)然后将其用于预测,但将其包装在作业中并根据请求运行它似乎有点过头了/call 由于 SparkContext 的初始化。
但是,使用 Spark 的优势在于我们可以保存我们的 Pipeline 模型并执行相同的特征转换,而无需在 SparkContext 之外实现它。
经过一番挖掘,我们发现spark-job-server 可以通过允许我们为作业服务器初始化一个“热”火花上下文来帮助我们解决这个问题,因此,我们可以通过调用使用 spark-job-server 的 REST API 在现有上下文中预测作业(并获取结果)。
这是 API 化预测的最佳方法吗?由于特征空间,我们无法预测所有组合。
另外,我们正在考虑使用 Spark Streaming 并将预测保存到消息队列中。这允许我们不使用 spark-job-server,但不会简化整个流程。有没有人尝试过类似的方法?
【问题讨论】:
-
我们最近尝试使用 jobserver 来解决按需执行 Spark 作业的类似问题。虽然它很好,但它远不是一个准备发货的生产级产品。您必须手动进行大量调整,对 Spark 2.x 的支持处于预览状态,部署它需要工作。如果您准备好投入大量工作,请继续。我们最终选择了基于 Sparks 未记录的 REST API 的解决方案。
-
它甚至会在适当的时间内响应(低于 0.1 秒)吗?以我的经验,ML 管道真的很慢,因为它们的计算步骤很多,比如转换模式、类型检查,最重要的是至少在 NaiveBayes、W2V 和我使用过的其他一些模型/矩阵广播。 (当你有大量的预测要做时,成本会被摊销,但它们的设置在单个预测案例中是令人望而却步的)。无论如何,我看不到 spark ML 管道的性能接近亚秒级。你有其他成就吗?
-
@fritsjanb 你找到解决方案了吗?
标签: apache-spark apache-spark-ml spark-jobserver