人们普遍认为机器学习始于数据终于模型。在实际的生产系统中,传统数据科学和机器学习工作流包括数据准备、特征工程和模型选择,尽管这个很重要,但它只是一个方面。缺失了一个关键的部分,即模型的部署和管理,以及模型创建和部署阶段之间的集成。

在部署针对低延迟评分的 Apache Spark ML 管道时,实现缺失部分尤其具有挑战性。尽管 MLlib 的 DataFrame API 很强大、很简洁,而且在批处理评分场景中很有效,但由于两个主要原因,它相对不太适合许多实时预测应用程序的需求。

首先,许多实时应用程序都有较低的延迟需求,而目前基于 DataFrame 的执行模型无法满足这些需求,因为即使在单个节点上运行,Spark 的 SQL 引擎也会产生包括查询计划和作业调度在内的大量开销。其次,实时评分环境通常与 Spark 集群分离,而且要求实时环境引入所有 Spark 及其依赖项过于复杂,容易导致冲突、错误和版本管理问题。

目前,要让用户加载 Spark 之外的受过训练的模型,他们必须执行以下操作:

  1. 为 Spark 的原生格式编写一个自定义读取器
  2. 创建自己的自定义格式
  3. 以一种标准格式(Spark ML 中目前不支持这一点,因此需要定制的导出库)导出

此外,要在 Spark 之外对 Spark 模型进行评分,用户必须重新实现评分算法,或者在 Spark ML 与另一个 ML 库之间创建一个自定义转换层。总的来说,对于希望将其模型部署到生产中的 Spark ML 用户,这些问题是主要痛点。

开放的模型部署标准

最近出现了一种导出和执行分析应用程序的新标准,即 Portable Format for Analytics (PFA)。PFA 获得了 Data Mining Group 的拥护,是相对被广泛采用的 Predictive Model Markup Language (PMML)(先前由 DMG 自行创建)的更强大和灵活的继任者。

PFA “文档” 是一个 JSON 文件,它指定了输入和输出数据模式(使用 Apache Avro 类型)、状态,以及应用于输入来返回输出的转换(或函数集)。可以认为它是一种迷你函数语言和一种数据模式规范的结合。

使用开放的模型部署标准意味着模型生产者(例如 Spark 或另一个 ML 框架)和模型使用者(例如评分环境)可以完全独立。对于 Spark ML 模型,标准化意味着一个评分引擎不仅可用于部署来自各种 Spark 环境和版本的模型,还可用于部署来自其他运行时和框架(例如 scikit-learn、R 和其他框架)的模型。独立性意味着模型评分速度快(因为它不通过与更高延迟相关的 Spark DataFrames 来执行),并且复杂性更低(因为它不依赖于 Spark 集群运行时)。

PFA 的魅力在于,该格式既指定了序列化,也指定了数据转换或机器学习模型的执行。也就是说,PFA 文档是完全独立的,可以由任何兼容的执行引擎执行,使得写入 PFA 的模型能够真正地跨语言、框架和运行时进行移植。

一个简单示例

为了演示 PFA 文档的元素,我将使用一个简单的多类逻辑回归模型。下图展示了输入和输出模式,以及应用于输入的操作

如您所见,输出(模型预测的类)是对输入(一个数组形式的特征向量)应用一组内置数学函数的结果。例如,如果使用 Python 代码,这些函数类似于可能在 Numpy 中调用的函数。

Aardpfark 简介:一个将 Spark ML 模型导出到 PFA 的库

日前,CODAIT 团队非常高兴地宣布了 Aardpfark 的发布,这是一个将 Spark ML 模型和管道导出到 PFA 的开源库。尽管已存在为 Python and R 编写 PFA 文档的参考实现,但没有针对 Scala 的实现。aardpfark-core 模块为编写 PFA 文档提供了一个通用的 Scala DSL。aardpfark-spark 模块使用核心 DSL 为 Spark ML 组件创建导出器,以及由受支持的组件组成的管道。

为了让您了解相对性能,我们使用线性回归模型对包含 47 个字符串索引转换器和 27 个原始数值列的典型管道了进行评分,结果表明,使用 Spark ML 处理每条记录需要 1.9 秒。使用 PFA 对相同管道进行评分时,每条记录的执行时间不到 1 毫秒,速度提高了许多数量级!

Aardpfark 仍处于早期开发阶段,但它已支持许多 Spark ML 预测器和转换器。在不久的将来,我们计划全面覆盖 Spark ML 组件,运行更详细的性能测试,完善 Scala DSL,添加 Python 支持,修复未解决的问题,并发布一个初始版本。我们期待听到您的反馈和对进一步开发项目的看法。我们也欢迎来自社区的贡献,以帮助开发前面提到的路线图!要获得更多信息,请查阅 Aardpfark on Github 并观看 CODAIT 的 Nick Pentreath 于 6 月 5 日在 Spark 峰会上发表关于 Spark ML 和 PFA 的演讲

本文翻译自:Introducing Aardpfark: Exporting Spark ML Models to PFA(2018-06-05)

加入讨论