来源:Apache Flink
摘要:本文整理自阿里巴巴算法专家赵伟波,在 Flink Forward Asia 2023 AI 特征工程专场的分享。本篇内容主要分为以下四部分:
Flink ML 概况 在线学习的设计与应用 在线推理的设计与应用 特征工程算法与应用
01
Flink ML 概况
Flink ML 是 Apache Flink 的子项目,遵循 Apache 社区规范,愿景是成为实时传统机器学习的事实标准。
2022年1月份 Flink ML API 发布,7月份发布完备、高性能的 Flink ML 基础设施,2023年4月份发力特征工程算法并服务用户,6月份支持 Flink 多版本。
02
在线学习的设计与应用
2.1 在线机器学习工作流样例

存在的问题:
如何使数据拆分更加合理?对不同的业务有不同的要求,有的希望用时间,有的希望用大小,都需要一些策略。
因为数据和模型都是流动的,两个往同一个地方去流,那么如何决定一条样本来了之后用哪个模型进行推理?
如何保证模型的一致性?因为链路中有两个模型,如果两个模型的训练数据不一致会导致出现一些问题。
数据是用哪一个模型推理出来的?每一条样本是哪个模型推理出来的,预测的好坏需要去追溯源头。
2.2 在线机器学习的设计

支持将输入数据划分为多个 window 进行训练,产生一个模型流。 支持使用输入的模型流来对数据进行预测。 支持用户指定推理数据和当前模型数据的时间差。每一条样本来了之后,我们希望用最新的模型去进行推理,但是最新的模型可能还没有训练出来,这个时候就需要设定一个时间差,允许它用非最新的模型进行推理。 支持在输出数据中暴露预测每条数据时使用的模型版本。从预测结果追溯出模型的需求。

阿里云 ABM 运维中心会把阿里所有平台的日志都收集到一起,然后会针对错误日志做一个聚类,把错误日志发送到对应的部门,去进行后续的处理。
传统算法工程链路首先进行数据输入,用 Flink job 进行数据加工处理,数据会落盘,之后通过定时调度来拉起聚类算法,然后写出模型,这个模型再通过加载的方式拉起 Flink job 进行数据预测,但是整个链路具有局限性,流程比较复杂,运维成本比较高,实时性低,并且性能难以保证。
日志聚类算法流程把系统日志进行预处理和编码后分词,做特征选择提取关键词,然后做日志的特征表示和标准化,再做层次聚类,日志的类别,最后写出到数据库,用来指导分词。
针对该流程我们使用 Flink ML 构建流式日志聚类就可以把这个流程串起来。通过 Flink job 拼接 SLS 与数据库全量数据,接着进行清洗和编码日志数据,然后分词和标准化,计算聚类结果,最后选取簇内典型代表日志。
把这个案例中的算子进行抽取,像 SLS 流式读取,分词,日志的向量化,特征选择,特征的标准化,这些并不是业务独有的,而是很多在线学习业务都需要的算子,把它抽取出来,做成一个独立的组件,客户需要做在线学习流程的时候可以来复用这些算子。
日志聚类算法链路升级的收益:
在链路延迟方面,将原来 5 min 的延迟降低到 30s
运营成本降低,现在只需要维持 1 个 Flink 作业
分析成本降低
算法性能提升
03
在线推理的设计与应用
批量推理:例如,有 100w 条数据落盘,然后起一个批的任务对这100万条数据进行推理,再进行落盘。 Near-line (近线)推理:基于 Flink 的任务,读取 Kafka 数据,通过 Transformer 的方式对流式的数据进行推理。这种推理有一个比较大的问题是延迟比较高,一般在百毫秒量级,在实际的业务场景中,推理需要很低的延迟,一般是几十毫秒甚至几毫秒,这就需要我们做一个推理框架去适应高要求的业务场景。
在做这个之前我们对 Spark ML 的推理进行了一个调研。后来发现 Spark ML 本身是没有推理模块的,它有一个 mleap,把 Spark 推理这部分做成一个推理框架,这个推理框架与引擎 Runtime 完全无关,减少依赖冲突,是一个更轻量的框架,另外这个新框架可以为推理重写计算逻辑代码,拥有更大的优化空间。
3.1 设计需求
数据表示(与 Flink Runtime 无关) 单条数据表示:Row 批量数据表示:DataFrame 数据类型表示,提供 Vector、Matrix 等类型的支持 推理逻辑表示 模型加载 支持从 Model/Transoformer#save 的文件中加载 支持动态加载模型数据,而不需要重启 Utils 支持检查 Transformer/PipelineModel 是否支持在线推理 串联多个推理逻辑成单个推理逻辑






3.2 使用场景

04
特征工程算法与应用
4.1 特征工程算法

新增27个算法,总共33个,基本覆盖常用算法。
4.1 特征工程的应用



不同于精确去重:不要求完全一致,或者子串关系 基于局部敏感性哈希 Locality-sensitive hashing:相似的样本更容易被 Hash 到相同的 buckets 内 对于文本数据来说,通常基于文本特征化后的 Jaccard 距离,使用 MinHashLSH 来找到相似文本

Tokenizer:进行分词 HashingTF:将文本变换为 Binary 特征 MinHash:计算文本签名 MinHashLSH:进行 SimilarityJoin,找到相似对
