SlideShare une entreprise Scribd logo
1  sur  25
演讲者:
林东 - 阿里巴巴高级技术专家 Apache Kafka PMC
高赟 - 阿里巴巴技术专家 Apache Flink Committer
共同作者:
张智鹏 – 阿里巴巴高级开发工程师
为实时机器学习设计的算法接口与迭代引擎
流批一体的迭代引擎
Flink ML 生态建设
面向实时机器学习的API
#1
#2
#3
#1 面向实时机器学习的API
为什么需要Flink ML API
减少重复开发。
提升社区合作效率。
复用
算法模块
隐藏实现细节。
统一算法使用体验。
提升业务开发效率。
提升算法开发效率。
支持以json格式表达组合。
组合并封装
算法模块
优化
用户体验
Flink ML API需要改进的要素
传统的Estimator/Model
API无法表达需要多输入
多输出的算法
表达能力
传统的Estimator/Model
API无法透出会被实时
更改的模型数据
实时训练
之前的Flink ML API
存取大型模型需要
用户的繁琐操作
易用性
支持模型数据
实时传输的API 1 4
5
6
3
2
提供无模型
语义的抽象类
更易用的
模块存取API
流批一体的
训练和推理API
更易用的
参数存取API
支持多输入图结构
的机器学习作业
Flink ML API设计要素
Flink ML API代码概览
更易用的参数存取API
更易用的模块存取API
支持多输入的
训练API
支持多输入多
输出的推理API
支持模型数据
实时传输的API
提供无模型
语义的抽象类
<<Interface>>
WithParams
...
<<Interface>>
Stage
void save(String path)
static Stage load(String path)
<<Interface>>
Estimator
Model fit(Table… inputs)
<<Interface>>
Transformer
<<Interface>>
AlgoOperator
Table[] transform(Table… inputs)
<<Interface>>
Model
Model setModelData(Table… data)
Table[] getModelData()
在线训练+实时模型部署
静态数据
(Flink HDFS Source)
动态数据
(Flink Kafka Source)
特征处理
(AlgoOperator
)
在线训练
(Estimator)
前端服务器
模型数据
(Flink Kafka sink)
训练数据
原始数据
outputs =
algoOperator.transform(inputs)
model = estimator.fit(inputs)
model.getModelData.sinkTo(…)
前端服务器
前端服务器
model = new ModelA(…)
model.setModelData(…)
outputs = model.transform(inputs)
支持DAG图结构的模块组合及封装
特征处理
(AlgoOperator)
在线训练
(Estimator)
特征处理
(AlgoOperator)
在线推理
(Model)
EstimatorA
ModelA
训练数据A
训练数据B
推理数据A
推理数据B
推理结果
生成ModelA
GraphBuilder
生成EstimatorA
算法开发者不需要
为生成的算子实现
fit/transform/save/load
构建DAG
#2 流批一体的迭代引擎
流批一体迭代:场景
Unified Iteration for Streaming / Batch: Scenarios
离线训练算法
Offline Training
线性分类 / 拟合
决策树 / Boost Tree
聚类
KNN
频繁项集
LDA
…
实时训练算法
Online Training
FTRL
在线聚类算法
…
前向反馈
Backward Notification
预测服务实时参数调整
…
需要同时支持离线与在线场景
Required supports for both offline and online cases
流批一体迭代:场景
Unified Iteration for Streaming / Batch: Scenarios
初始模型
Initial Model
模型缓存
Model Cache
训练数据源(有限)
Training Data
Source (Bounded)
模型更新
Model Update
训练节点 * n
Training Node * n
离线训练
1. 模型缓存节点读入初始模型
2. 训练节点读入所有训练数据
3. while not converged:
3.1 模型缓存节点发布最新模型到训练节点
3.2 训练节点选择下一个mini-batch的数据并更新模型
同步:
模型缓存节点等到收齐n个更新后发布新版模型
异步:
模型缓存节点每收到一个更新后立刻向其发布新版模
型
初始模型
Initial Model
模型缓存
Model Cache
训练数据源(无限)
Training Data Source
(Unbounded)
模型更新
Model Update
在线训练
1. 模型缓存节点读入初始模型
2. While True:
3.1 模型缓存节点发布最新模型到训练节点
3.2 训练节点读入下一个Mini-batch的数据并更新模型
3.3 训练节点阻塞训练数据直到读取完模型更新
同步:
模型缓存节点等到收齐n个更新后发布新版模型
异步:
模型缓存节点每收到一个更新后立刻向其发布新版模
型
参数更新
对每一条数据的处理结果进行评估,按需更
新参数
输入数据
InputData
模型服务
Model
Servering
结果评估
Evaluation
参数更新
Parameter
Update
流批一体迭代:需求
Unified Iteration for Streaming / Batch: Requirements
• 统一的迭代图结构
• 统一的迭代终止判断
• 提供整个数据集处理完一轮的通知
• 由上层提供mini-batch处理的功能
- 更好的兼容逐个mini-batch / 并行多个mini-batch的处理
- 更好的兼容per-record类型的处理
- 简化迭代本身的实现,避免功能耦合产生的复杂设计
流批一体迭代:设计
Unified Iteration for Streaming / Batch: Design
Union
Union
回边
回边
迭代体
有回边的输入
无回边的输入
输出
输出
迭代体
In: 有回边的输入
In: 无回边的输入
Out: 回边
Out: 输出
进度追踪
所有数据每处理一轮后给出通知
无回边的输入
每轮重放
每轮不重放
算子生命周期
每轮重建
每轮不重建
终止
所有输入结束&&迭代中没有数据
特定算子某一轮没有输出数据
有回边的输入
流批一体迭代: API
Unified Iteration for Streaming / Batch: API
DataStream<double[]> initParameters = …
DataStream<Tuple2<double[], Double>> dataset = …
DataStreamList resultStreams =
Iterations.iterate(
DataStreamList.of(initParameters),
ReplayableDataStreamList.notReplay(dataset),
IterationConfig.newBuilder().setOperatorRoundMode(ALL_ROUND).build();
(variableStreams, dataStreams) -> {
DataStream<double[]> modelUpdate = variableStreams.get(0);
DataStream<Tuple2<double[], Double>> dataset = dataStreams.get(0);
DataStream<double[]> newModelUpdate = …
DataStream<double[]> modelOutput = …
return new IterationBodyResult(
DataStreamList.of(newModelUpdate),
DataStreamList.of(modelOutput)
});
DataStream<double[]> finalModel = resultStreams.get("final_model");
有回边的输入数据
无回边的输入数据
算子每轮不重建
迭代体
回边更新
最终输出
流批一体迭代: API
Unified Iteration for Streaming / Batch: API
public static class ModelCacheFunction extends ProcessFunction<double[], double[]>
implements IterationListener<double[]> {
private final double[] parameters = new double[N_DIM];
public void processElement(double[] update, Context ctx, Collector<O> output) {
// Suppose we have a util to add the second array to the first.
ArrayUtils.addWith(parameters, update);
}
void onEpochWatermarkIncremented(int epochWatermark, Context context, Collector<T> collector) {
if (epochWatermark < N_EPOCH * N_BATCH_PER_EPOCH) {
collector.collect(parameters);
}
}
public void onIterationEnd(int[] round, Context context) {
context.output(FINAL_MODEL_OUTPUT_TAG, parameters);
}
}
初始模型
Initial Model
模型缓存
Model Cache
训练数据源(有限)
Training Data
Source (Bounded)
模型更新
Model Update
训练节点 * n
Training Node * n
最终输出
收齐所有更新后再发
布新模型,从而实现
同步计算
流批一体迭代: 实现
Unified Iteration for Streaming / Batch: Implementation
Input节点
Input节点
Head节点 Tail节点
基于内存的队列
Head
Operator
Coordinator
算子Wrapper
• 增加新的节点
• 对用户节点进行Wrap,从而可以管理算子的生命周期
• 基于colocation和本地内存队列的回边
流批一体迭代: 实现
Unified Iteration for Streaming / Batch: Implementation
Input节点
Input节点
Head节点 Tail节点
基于内存的队列
Head
Operator
Coordinator
算子Wrapper
对输入数据进行
Wrapper
{
epoch = 0
element = 5
}
每经过一轮epoch加1
{
epoch = 1
element = 5
}
所有数据之后增加标记元
素
{
epoch 0 finished
}
每经过一轮epoch加1
Input节点
Input节点
Head节点 Tail节点
基于内存的队列
Head
Operator
Coordinator
算子Wrapper
正常的Checkpoint
Barier
OperatorCoordinator的虚
拟Barrier
• 带环的Chandy-Lamport算法:同时存储来自回边的数据
• 增加来自OperatorCoordinator的虚拟Barrier
- 保证全局对齐消息与Barrier的顺序
• 对齐消息后的Checkpoint:最小化需要缓存的数据(开发中)
流批一体迭代: 实现
Unified Iteration for Streaming / Batch: Implementation
流批一体迭代: 总结
Unified Iteration for Streaming / Batch: Summary
• 流批统一的迭代执行引擎
• 支持Exactly-Once容错
• 未来将进一步支持Batch模式
• 未来将提供更多的上层算法开发工具
#3 Flink ML 生态建设
Flink ML 现状
github.com/apache/flink-ml
独立的
ML代码库
建立实时机器学习API的
事实标准。促进实时机器
学习交流发展。
标准化机器
学习API
中立的
生态项目
支持深度
学习算子
由Flink PMC授权建立的
中立的Flink生态项目组织
github.com/flink-extended
Deep Learning on Flink。
适配Flink ML API并支持基于
TensorFlow的在线训练+在线推理
Flink ML 未来工作
支持Python程序编
写机器学习作业和
调用Java算子
支持Python
调用
Clink
提供C++特征处理算子。
适配Flink ML API
并对接flink-ml中的Estimator。
开箱即用的
Java算子
将Alink适配Flink ML API
并迁移进入flink-ml代码库
参考资料
• FLIP-173: Support DAG of algorithms
• FLIP-174: Improve the WithParam interface
• FLIP-175: Compose Estimator/Model/AlgoOperator from DAG of Estimator/Model/AlgoOperator
• FLIP-176: Unified Iteration to Support Algorithms
• Flink ML repo: github.com/apache/flink-ml
• Deep Learning on Flink
github.com/flink-extended/flink-ai-extended/tree/master/deep-learning-on-flink
THANKS

Contenu connexe

Similaire à 为实时机器学习设计的算法接口与迭代引擎_FFA_2021

利用Signalr打造即時通訊@Tech day geek
利用Signalr打造即時通訊@Tech day geek利用Signalr打造即時通訊@Tech day geek
利用Signalr打造即時通訊@Tech day geekJohnson Gau
 
Real World ASP.NET MVC
Real World ASP.NET MVCReal World ASP.NET MVC
Real World ASP.NET MVCjeffz
 
C++中级培训胶片
C++中级培训胶片C++中级培训胶片
C++中级培训胶片ff1
 
ES5 introduction
ES5 introductionES5 introduction
ES5 introductionotakustay
 
Flex 4.5 action custom component development
Flex 4.5 action custom component developmentFlex 4.5 action custom component development
Flex 4.5 action custom component developmentjexchan
 
容器驅動開發 - .NET Conf 2017 @ 台中
容器驅動開發 - .NET Conf 2017 @ 台中容器驅動開發 - .NET Conf 2017 @ 台中
容器驅動開發 - .NET Conf 2017 @ 台中Andrew Wu
 
信息系统开发平台OpenExpressApp
信息系统开发平台OpenExpressApp信息系统开发平台OpenExpressApp
信息系统开发平台OpenExpressAppzhoujg
 
Clipper@datacon.2019.tw
Clipper@datacon.2019.twClipper@datacon.2019.tw
Clipper@datacon.2019.twWei-Yu Chen
 
Introduction to C++ over CLI
Introduction to C++ over CLIIntroduction to C++ over CLI
Introduction to C++ over CLI建興 王
 
深入浅出Netty l.t
深入浅出Netty   l.t深入浅出Netty   l.t
深入浅出Netty l.toleone
 
廖雪峰 Saa s ovp
廖雪峰 Saa s ovp廖雪峰 Saa s ovp
廖雪峰 Saa s ovpdrewz lin
 
千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7javatwo2011
 
Spring 2.x 中文
Spring 2.x 中文Spring 2.x 中文
Spring 2.x 中文Guo Albert
 
Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有Wade Huang
 
TypeScript 開發實戰:開發即時互動的 html5 websocket 聊天室應用程式
TypeScript 開發實戰:開發即時互動的 html5 websocket 聊天室應用程式TypeScript 開發實戰:開發即時互動的 html5 websocket 聊天室應用程式
TypeScript 開發實戰:開發即時互動的 html5 websocket 聊天室應用程式Will Huang
 
Different QTP.v3
Different QTP.v3Different QTP.v3
Different QTP.v3Dean Lee
 

Similaire à 为实时机器学习设计的算法接口与迭代引擎_FFA_2021 (20)

利用Signalr打造即時通訊@Tech day geek
利用Signalr打造即時通訊@Tech day geek利用Signalr打造即時通訊@Tech day geek
利用Signalr打造即時通訊@Tech day geek
 
Php
PhpPhp
Php
 
Real World ASP.NET MVC
Real World ASP.NET MVCReal World ASP.NET MVC
Real World ASP.NET MVC
 
C++中级培训胶片
C++中级培训胶片C++中级培训胶片
C++中级培训胶片
 
ES5 introduction
ES5 introductionES5 introduction
ES5 introduction
 
Flex 4.5 action custom component development
Flex 4.5 action custom component developmentFlex 4.5 action custom component development
Flex 4.5 action custom component development
 
容器驅動開發 - .NET Conf 2017 @ 台中
容器驅動開發 - .NET Conf 2017 @ 台中容器驅動開發 - .NET Conf 2017 @ 台中
容器驅動開發 - .NET Conf 2017 @ 台中
 
信息系统开发平台OpenExpressApp
信息系统开发平台OpenExpressApp信息系统开发平台OpenExpressApp
信息系统开发平台OpenExpressApp
 
Clipper@datacon.2019.tw
Clipper@datacon.2019.twClipper@datacon.2019.tw
Clipper@datacon.2019.tw
 
Introduction to C++ over CLI
Introduction to C++ over CLIIntroduction to C++ over CLI
Introduction to C++ over CLI
 
深入浅出Netty l.t
深入浅出Netty   l.t深入浅出Netty   l.t
深入浅出Netty l.t
 
廖雪峰 Saa s ovp
廖雪峰 Saa s ovp廖雪峰 Saa s ovp
廖雪峰 Saa s ovp
 
千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7
 
Spring 2.x 中文
Spring 2.x 中文Spring 2.x 中文
Spring 2.x 中文
 
Osgi Intro
Osgi IntroOsgi Intro
Osgi Intro
 
Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有Asp.net mvc網站的從無到有
Asp.net mvc網站的從無到有
 
C+
C+C+
C+
 
C#
C#C#
C#
 
TypeScript 開發實戰:開發即時互動的 html5 websocket 聊天室應用程式
TypeScript 開發實戰:開發即時互動的 html5 websocket 聊天室應用程式TypeScript 開發實戰:開發即時互動的 html5 websocket 聊天室應用程式
TypeScript 開發實戰:開發即時互動的 html5 websocket 聊天室應用程式
 
Different QTP.v3
Different QTP.v3Different QTP.v3
Different QTP.v3
 

为实时机器学习设计的算法接口与迭代引擎_FFA_2021