来源 | Apache Flink 官方博客
翻译 | 林东,云骞
Apache Flink 社区很荣幸地宣布 Apache Flink ML 2.0.0 版本正式发布!Flink ML 提供了算法接口以及基础类,以支持开发具有高易用性,高性能,低延迟的机器学习算法库。
本次发布的版本对之前的 Flink ML 做了大量的重构,并对算法接口以及迭代引擎做出了许多重要的扩展。新版本可以支持具有多输入多输出的算子,支持将算子以图的方式连接组合,以及提供了基于 DataStream 的流批一体的迭代引擎。目前的版本包含了五个算法的实现。将来我们会在 Flink ML 中提供更多的具有高性能的开箱可用的算法提供社区使用。
我们相信此版本是增加 Apache Flink 所支持的机器学习使用场景,尤其是实时机器学习场景,所迈出的重要一步。
我们鼓励您下载该版本[1] 并通过 Flink 邮件列表[2] 或 JIRA[3] 与社区分享您的反馈! 我们希望您喜欢新版本,并且我们期待了解您的使用体验。
重要特性
1. 算子接口和基础设施
1.1 支持需要多输入多输出的算子
机器学习工作流中的算子可能需要多个输入,并返回多个输出。 例如,图嵌入算法可能需要两个输入,来分别表示图的边和节点。 一个工作流可能需要算子,将输入的数据集拆分为两个数据集,分别用于训练和测试。
有了这个功能后,开发人员可以将多个算子以有向无环图 (DAG) 的方式进行组合来表达一个机器学习工作流。这项功能将极大扩展 Flink ML 的易用性以及可以支持的工作流场景。
1.2 用于支持原生实时机器学习的模型数据接口
在原生的在线机器学习场景中,机器学习训练作业会持续处理训练数据并更新机器学习模型。机器学习推理作业可能会运行在多个前端服务器上来做在线推理。最新的模型数据需要从训练作业实时传输到所有的推理作业上。
传统的 Estimator/Transformer 上没有接口以实时数据流的方式提供模型数据。用户必须反复调用 fit() 来更新和获得模型数据。尽管用户可能做到每隔几分钟更新一次模型数据,但这种方法将很难支持用户做到每隔几秒钟更新一次模型数据。即使可以做到,很可能是非常低效的。
通过使用 FLIP-173[4] 所提供的接口,模型数据可以通过 getModelData() 作为无界数据流提供给用户。然后算法用户可以将模型数据实时传输到前端服务器,并用最新的模型数据进行在线推理。 这个功能可以显著增强 Flink ML 支持在线学习应用的能力。
1.3 更易于使用的算法参数接口
我们非常关心 Flink ML 的易用性和开发人员的体验。 在新版本中,我们重构并简化了用于定义和读写算法参数的接口。
通过使用 FLIP-174[5] 所提供的接口,算法参数被定义为 interface 上的静态变量;任何实现了该interface的算法都可以继承这些变量的定义。算法库提供了常用的参数验证器。为了进一步简化参数接口,我们从参数定义中删除了 isOptional 等字段。
1.4 支持将算子图打包成算子的工具
Pipeline[6] 是现有的机器学习算法库(例如 Scikit-learn, Flink, Spark 等)中最有用的工具之一。Pipeline 支持用户将包含 Estimator/Transformer 的有序列表打包成为一个新的 Estimator,同时不需要用户为新的 Estimator,以及 Estimator 所生成的 Model,去额外实现 fit/transform 接口。
FLIP-175[7] 将此功能从有序列表扩展到了有向无环图 (DAG)。 用户现在可以将一个由 Estimator/Transformer 组合而成的算子图打包成为一个新的 Estimator。这个功能将允许开发人员把复杂的工作流分割成更简单的模块,并在多个工作流中重复使用这些模块。我们相信此功能可以极大方便用户使用 Flink ML 构建和部署复杂工作流。
2. 流批一体的迭代引擎
为支持算法训练以及根据预测结果动态调整模型参数等场景,框架必须提供迭代处理数据的能力。由于 Flink 本身是基于 DAG 来描述计算逻辑的,因此我们必须在 Flink ML 中单独提供迭代引擎。此外,由于我们同时需要支持离线训练与在线训练 / 参数调整的场景,迭代引擎也必须能够同时支持批和流的处理场景。
针对上述需求,FLIP-176[8] 实现了一套流批一体的迭代执行引擎 。它为使用迭代的用户提供了将数据反馈回前序算子进行处理的功能以及在迭代体中监听每一轮进度的能力。用户可以直接基于 DataStream API 与 Table API 来实现上层的处理逻辑。此外,它还扩展了 Flink 现有的 Checkpoint 机制,从而令使用迭代的作业也可以做到 Exactly-Once 的容错。
3. Python SDK
由于 Python 的易用性和优秀的生态,如今许多机器学习从业者已经习惯于用 Python 开发机器学习工作流。 为了满足这些用户的需求,我们从这个版本开始创建了一个专用于 Flink ML 的 Python 包。Flink ML Python 包目前提供类似于 Flink ML Java 库的接口来支持开发机器学习算子。
用户可以通过如下命令通过 pip 来安装 Flink ML Python 包。
pip install apache-flink-ml
作为下一步计划,我们会增加 Python SDK 与 Flink ML 的 Java 库的交互能力。例如,我们希望支持用户将来自于 Flink ML Java 库的算子,以及 Python SDK 实现的 Python 算子 (比如 TensorFlow 程序),用 Python SDK 连接成为一个机器学习工作流。
4. 算法库
随着 Flink ML API 设计的完成,我们接下来的主要工作是在 Flink ML 中添加开箱可用的算法。作为该计划的一部分,我们借鉴了 Alink[9] 项目的许多想法,并与 Alink 项目的开发人员密切合作,设计了新的 Flink ML API,重构,优化和将算法从 Alink 迁移到 Flink。我们的长期目标是提供一个易于使用,调试和定制的高性能算法库。
我们在新版本中实现了五种算法,分别是 logistic regression, k-means, k-nearest neighbors, naive bayes 和 one-hot encoder。 目前这些算法专注于验证 API 和迭代引擎的功能。除了增加越来越多的算法之外,我们还将对算法的性能进行压力测试和优化,以确保这些算法具有最先进的性能。 敬请关注!
相关工作
1. 机器学习迁移到单独的仓库
为了提高 Flink ML 的开发效率,Flink ML 的代码已经被转移到了属于 Flink 项目的 flink-ml[10] 代码仓库。我们采用类似于 Stateful Function 项目的管理方式,通过使用一个单独的仓库,来简化代码贡献的流程,并且可以进行单独的版本发布,从而提高开发的效率。
2. 为 Flink 生态系统项目而创建的 Github 组织
为促进社区协作开发 Apache Flink 的生态项目,进一步扩大 Apache Flink 的生态,Apache Flink PMC 已授权使用 flink-extended 作为此 GitHub 组织[11] 的名称。
两个 Flink ML 相关的项目已经转移到这个组织。dl-on-flink[12] 可以支持使用 TensorFlow 来实现 Flink ML 算子。clink[13] 提供了基础设施来方便开发者使用 C++ 来实现 Flink ML 算子,用以支持需要极低延迟的场景,比如在线特征处理。
我们希望您能加入这项工作,并在这个 Github 组织中分享您的 Flink 生态项目。敬请关注生态项目的相关信息。
升级说明
有关升级过程中可能需要做出的调整及确认,请参阅原文发布公告[14]。
发布说明和相关资源
用户可以查看发布说明[15] 来获得修改和新功能的详细列表。
二进制文件和源代码可以从 Flink 官网的下载页面[1] 获得,最新的 Flink ML Python 发布可以从 PyPI[16] 获得。
贡献者列表
Apache Flink 社区感谢对此版本做出贡献的每一位贡献者:
Yun Gao, Dong Lin, Zhipeng Zhang, huangxingbo, Yunfeng Zhou, Jiangjie (Becket) Qin, abdelrahman-ik, weibo.
原文链接:https://flink.apache.org/news/2022/01/07/release-ml-2.0.0.html
参考链接:
[1] https://flink.apache.org/downloads.html
[2] https://flink.apache.org/community.html#mailing-lists
[3] https://issues.apache.org/jira/browse/flink
[4] https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=184615783
[5] https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=181311361
[6] https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.Pipeline.html
[7] https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=181311363
[8] https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=184615300
[9] https://github.com/alibaba/alink
[10] https://github.com/apache/flink-ml
[11] https://github.com/flink-extended/
[12] https://github.com/flink-extended/dl-on-flink
[13] https://github.com/flink-extended/clink
[14] https://flink.apache.org/news/2022/01/07/release-ml-2.0.0.html
[15] https://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=12315522&version=12351079