Diese Präsentation wurde erfolgreich gemeldet.
Die SlideShare-Präsentation wird heruntergeladen. ×

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

Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Nächste SlideShare
大话Php之性能
大话Php之性能
Wird geladen in …3
×

Hier ansehen

1 von 25 Anzeige

Weitere Verwandte Inhalte

Aktuellste (20)

Anzeige

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

  1. 1. 演讲者: 林东 - 阿里巴巴高级技术专家 Apache Kafka PMC 高赟 - 阿里巴巴技术专家 Apache Flink Committer 共同作者: 张智鹏 – 阿里巴巴高级开发工程师 为实时机器学习设计的算法接口与迭代引擎
  2. 2. 流批一体的迭代引擎 Flink ML 生态建设 面向实时机器学习的API #1 #2 #3
  3. 3. #1 面向实时机器学习的API
  4. 4. 为什么需要Flink ML API 减少重复开发。 提升社区合作效率。 复用 算法模块 隐藏实现细节。 统一算法使用体验。 提升业务开发效率。 提升算法开发效率。 支持以json格式表达组合。 组合并封装 算法模块 优化 用户体验
  5. 5. Flink ML API需要改进的要素 传统的Estimator/Model API无法表达需要多输入 多输出的算法 表达能力 传统的Estimator/Model API无法透出会被实时 更改的模型数据 实时训练 之前的Flink ML API 存取大型模型需要 用户的繁琐操作 易用性
  6. 6. 支持模型数据 实时传输的API 1 4 5 6 3 2 提供无模型 语义的抽象类 更易用的 模块存取API 流批一体的 训练和推理API 更易用的 参数存取API 支持多输入图结构 的机器学习作业 Flink ML API设计要素
  7. 7. 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()
  8. 8. 在线训练+实时模型部署 静态数据 (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)
  9. 9. 支持DAG图结构的模块组合及封装 特征处理 (AlgoOperator) 在线训练 (Estimator) 特征处理 (AlgoOperator) 在线推理 (Model) EstimatorA ModelA 训练数据A 训练数据B 推理数据A 推理数据B 推理结果 生成ModelA GraphBuilder 生成EstimatorA 算法开发者不需要 为生成的算子实现 fit/transform/save/load 构建DAG
  10. 10. #2 流批一体的迭代引擎
  11. 11. 流批一体迭代:场景 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
  12. 12. 流批一体迭代:场景 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
  13. 13. 流批一体迭代:需求 Unified Iteration for Streaming / Batch: Requirements • 统一的迭代图结构 • 统一的迭代终止判断 • 提供整个数据集处理完一轮的通知 • 由上层提供mini-batch处理的功能 - 更好的兼容逐个mini-batch / 并行多个mini-batch的处理 - 更好的兼容per-record类型的处理 - 简化迭代本身的实现,避免功能耦合产生的复杂设计
  14. 14. 流批一体迭代:设计 Unified Iteration for Streaming / Batch: Design Union Union 回边 回边 迭代体 有回边的输入 无回边的输入 输出 输出 迭代体 In: 有回边的输入 In: 无回边的输入 Out: 回边 Out: 输出 进度追踪 所有数据每处理一轮后给出通知 无回边的输入 每轮重放 每轮不重放 算子生命周期 每轮重建 每轮不重建 终止 所有输入结束&&迭代中没有数据 特定算子某一轮没有输出数据 有回边的输入
  15. 15. 流批一体迭代: 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"); 有回边的输入数据 无回边的输入数据 算子每轮不重建 迭代体 回边更新 最终输出
  16. 16. 流批一体迭代: 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 最终输出 收齐所有更新后再发 布新模型,从而实现 同步计算
  17. 17. 流批一体迭代: 实现 Unified Iteration for Streaming / Batch: Implementation Input节点 Input节点 Head节点 Tail节点 基于内存的队列 Head Operator Coordinator 算子Wrapper • 增加新的节点 • 对用户节点进行Wrap,从而可以管理算子的生命周期 • 基于colocation和本地内存队列的回边
  18. 18. 流批一体迭代: 实现 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
  19. 19. Input节点 Input节点 Head节点 Tail节点 基于内存的队列 Head Operator Coordinator 算子Wrapper 正常的Checkpoint Barier OperatorCoordinator的虚 拟Barrier • 带环的Chandy-Lamport算法:同时存储来自回边的数据 • 增加来自OperatorCoordinator的虚拟Barrier - 保证全局对齐消息与Barrier的顺序 • 对齐消息后的Checkpoint:最小化需要缓存的数据(开发中) 流批一体迭代: 实现 Unified Iteration for Streaming / Batch: Implementation
  20. 20. 流批一体迭代: 总结 Unified Iteration for Streaming / Batch: Summary • 流批统一的迭代执行引擎 • 支持Exactly-Once容错 • 未来将进一步支持Batch模式 • 未来将提供更多的上层算法开发工具
  21. 21. #3 Flink ML 生态建设
  22. 22. 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的在线训练+在线推理
  23. 23. Flink ML 未来工作 支持Python程序编 写机器学习作业和 调用Java算子 支持Python 调用 Clink 提供C++特征处理算子。 适配Flink ML API 并对接flink-ml中的Estimator。 开箱即用的 Java算子 将Alink适配Flink ML API 并迁移进入flink-ml代码库
  24. 24. 参考资料 • 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
  25. 25. THANKS

×