导读:本次分享的主题为构建端到端的联邦学习 Pipeline 生产服务。联邦学习的优势在于能够保证参与各方在数据不出本地,保持数据独立性的情况下,多方共建模型,共同提升机器学习效果。联邦机制下,安全隐私有了优势,但技术上也会面临更多挑战。作为一个工业级的框架,端到端的联邦学习 Pipeline 致力于完成高弹性、高性能的联邦学习任务,主要包括建模、训练、模型管理、生产发布和在线推理几个方面。本次将为大家分享如何灵活调度管理复杂的联邦学习任务、可视化联邦建模的实现以及在线联邦推理服务的思考与实践,解决实验性机器学习到实际生产应用落地的难点。
主要分享4个方面:
我们在日常建模过程中,会遇到哪些需求和痛点?
1. 机器学习任务编排
我们是如何编排机器学习任务的:
2. 机器学习任务状况观察
当我们千辛万苦的把任务运行起来,还需要不断观察任务的运行情况,运行到哪一步?每一步的数据输出是什么样的?指标输出是什么样的?Loss、AUC 等指标的趋势?然后,任务跑完了吗?
我们该如何观察到各种趋势,来尽可能做参数的调整等操作。这里要大家可以想想,平时是如何观察机器学习任务状态的呢?
如果是我,可能就会看日志。那有没有需求是看日志不能解决的?如果有,那就加几行日志!^_^
3. 联邦学习任务协同建模
刚刚介绍的都是一般机器学习任务中会遇到的挑战,在联邦机器学习下,因为涉及多方协同,会遇到更多的挑战:
接下来分享下 FATE 是如何尝试解决这样的问题,以及当前的方案和 Pipeline 调度。
1. 端到端的联邦学习 Pipeline
这是一个比较典型的纵向联邦学习 Pipeline 的例子:
交集 ( intersect ) -> 联邦统计 -> 联邦特征处理 -> Training -> 验证 -> 模型保存 -> 模型发布 ( 发布到线上服务 FATE-serving,后面会介绍 )
2. FATE-Flow:端到端的联邦学习 Pipeline 调度平台
① FATE-Flow 功能
FATE-Flow 是我们自研的联邦学习调度平台,主要有5项功能:
② FATE-Flow 架构
FATE-Flow 架构:
3. DAG 定义联邦学习 Pipeline
左边为我们的 DSL,它的结构比较简单,我们可以定义一串 Component,通过 Parser 解析出 DAG 图(如右图,可以清晰地看到整个算法流程的架构)。
构建 DSL 只需要三步:
① Module:模型组件,FATE 当前支持11个模型组件,基本满足当前 FATE 所支持的所有算法。
② Input:
③ Output:
可参考下面的例子:
构建 DSL 示例
DSL 怎么工作的呢?它是一个非常酷的模块,就像人类的大脑,它是 FATE-Flow 的中心:
① 根据 DSL 定义和任务配置,解析每个 Component 运行参数
② 分析 DSL 定义 data、model 输入输出,提取依赖关系
① 构建依赖关系邻接表
② 拓扑排序进行 DAG 依赖检测,因为用户定义的 DSL 不一定是有效的
① 实时输出 Component 无依赖上下游
② Component 依赖度自动递减
剔除预测阶段无用 Component 数据,模型依赖传递,推导预测 DSL
4. 联邦学习任务多方协同调度
联邦学习任务多方协同调度的流程:
首先,是以任务提交的一种方式,提交任务到 Queue,然后 JobScheduler 会把这个任务拿出来给到 Federated TaskScheduler 调度,Federated TaskScheduler 通过 Parser 取得下游 N 个无依赖的 Component,再调度 Executor ( 由两部分组成:Tracking Manager 和 Task ) 执行,同时这个任务会分发到联邦学习的各个参与方 Host。联邦参与方取得任务,如果是 New Job,则放入队列(参与方会定期调度队列中的 Job),否则启动多个 Executor 执行,Executor 在 run 的过程中,会利用 Federation API 进行联邦学习中的参数交互,对一个联邦学习任务,每一方的 Job id 是保持一致的,每跑一个 Component,它的 Task id 也是一致的。每个 Task 跑完 Initiator TaskScheduler 会收集各方的状态,进行下一步的调度。对于下一步的调度策略我们支持:all_succss,all_done,one_succss 等策略。由于我们基于 Task 为最小的调度单位,所以很容易实现 rerun,specified_task_run 等特定运行。
5. 联邦任务多方生命周期管理
分以下几个部分:
启动 Shutdown 的条件:
6. 联邦任务输入输出实时追踪
联邦任务输入输出实时追踪,首先会有几个 Definition 定义:
目前的 API 只有4~5个:
可能以前收集指标需要经过收集日志等一系列操作,任务像一座座大山一样摆在面前,现在则有可能成为我们的摇钱树,因为我们可以快速的收集各种指标,提交给需求方。
7. 联邦模型管理
左图中的两桶“大饼”,分别代表了某一方的模型,每一个“大饼”则代表了每个组件的 model,如:Dataio、FeatureBinning、FeatureSelection、FeatureTransform、HeteroLR、Pipeline。这里需要做个 Model Binding 模型的绑定,FATE-Flow 的做法还是比较简单的,我们会给每套模型赋予一对标志符 model_id 和 model_version 来唯一标识模型,model_id 由用户自定义的 role 和 party_id 及 model_key 拼接而成,model_version 也是可以自定义的,如果不自定义的话,会默认为 job_id。我们会有一个命名为 Pipeline 的模型存储 Pipeline 建模 DSL 及在线推理 DSL。
下面是某个算法模型数据结构的示例:
示例1
示例2
同时每个“大饼”算法模型,也由两部分组成:ModelParam 和 ModelMeta,也就是参数和元的信息。
8. 联邦模型版本管理
模型版本管理我们参考了 Git 的实现思路,但是我们没有做的那么复杂,是基于多叉树版本的记录:
9. 使用样例
上图为,FATE-Flow 的简单使用样例,主要就是使用 FATE-Flow CLI 提交一个 Job,需要提供 Job 的 DSL 描述以及配置文件,那么 FATE-Flow Server 会返回该 Job 的一些必要信息,尤其唯一 Job Id 比较重要。后面则是查询 Job 状态以及停止 Job 的操作指令,CLI 还支持许多丰富的指令,可以参考 github 上的文档。
第三部分介绍下联邦学习建模可视化:
1. FATE-Board
大体的架构如右图,有一些 Job DashBoard 和可视化,两个基本的管理和上面的 Web UI。
FATE-Board 作为 FATE 联邦建模的可视化工具,旨在跟踪和记录联邦建模全过程的信息,并通过可视化的方式呈现模型训练过程的变化以及模型训练结果,帮助用户简单而高效地深入探索模型与理解模型。
2. 建模交互及可视化
Demo
其基本步骤为:
① 用户配置 pipeline,建立 graph、定义 parameters 等;
② 用户提交 job,返回 job URL,同时启动 job 运行,进入 web 端查看 fateboard;
③ 观察 job 运行状态,查看运行时的统计信息,包括运行进度、日志、模型过程输出等;
④ 查看 job 运行完成的结果,包括模型输出、模型评分、日志等内容及可视化结果。
第四部主要讲怎么发挥模型的最大价值,我们构建了高性能的联邦学习在线推理服务:
1. FATE-Serving
FATE-Serving 设计原则:
FATE-Serving 模块:
2. 在线联邦模型管理
在线联邦模型管理,我们提供了两个 API:pulish load req 和 pulish online AB Test。为什么是两个 API?因为,Pulish load req 过程只是把整个模型通过 dynamic loaders 得到一个 model object 放入 model pool 中,是一个内存的池子。联邦各方的 model id 和 model version 都是保持一致的(在发布模型的时候,只需要在 Guest 侧发起就可以了,会自动走 proxy,把命令推到其他的 Host 中去),当各方都加载完之后,就可以应用了。
Pulish online AB Test 主要是做 default binding,比如有些业务方并不知道我们的模型版本,需要有一个默认的机制。
图中右下角,为动态加载器的一个基本功能。
3. 在线联邦推理 Pipeline
在线联邦推理 Pipeline 流程:
Req -> Service -> model selection ( 有三种不同策略:规定的方式和两种默认的方式 ) -> loader -> processing ( 前处理 ) -> inference Pipeline ( 是纵向model,会经过不同的组件,这里举例是三个,然后会把 user_id (用来做对齐的)发到不同的参与方,参与方会拿自己的半模型,进行最后的预测,最后把结果发到 Federated Network ) -> Processing ( 后处理 )
4. 在线推理服务缓存
在线推理服务缓存分为三种:
在业务的运行当中,按照这几个配比,一天下来发现命中远端联邦推理结果 Cache 的请求量占了28%,也就是说有28%的联邦请求都不需要这部分,就会大大的增加了用户的体验。
我们还有一个缓存唤醒的热身过程,我们会跑一些离线任务,然后对活跃度进行统计,把要缓存的用户按比例提取出来,在凌晨的时候发一些批次请求,让整个缓存热身。
5. 联邦模型应用生产服务流程
一个联邦模型应用到生产服务的大致流程:
① 全量加载联邦模型,通过 pulish load req 全量加载模型,每方的 Serving 都加载这个模型。
② 灰度上线联邦模型,pulish online AB test 可以指定多少用户上线 online 模型。(这时就会体现出为什么要做 pulish load req,因为在 Guest 方灰度上线时,这个 Serving 请求的 user_id 落到其他参与方,需要找到对应的模型,但是通常情况下 Serving 都是做负载均衡的,如果灰度这部分的 Serving 已经上线了新的模型,其它 Host 方没有预先加载这个模型,就会找不到这个模型,也就是说模型是被所有 Serving 所 load 的,但是并不是所有 Serving 当前生效的都是这个模型。)
③ 联邦模型效果验证
④ 全量上线联邦模型
作者介绍:
曾纪策
微众银行 | 人工智能系统架构师
本文来自 DataFun 社区
领取专属 10元无门槛券
私享最新 技术干货