写点什么

只看这三点就够:快速了解联邦学习框架!

  • 2020-11-26
  • 本文字数:3298 字

    阅读完需:约 11 分钟

只看这三点就够:快速了解联邦学习框架!

01 部署


在实际落地时,不同企业间往往无法达到机器配置和网络环境的统一,因此会造成较高的先期训练及推理环境准备带来的的人力成本,从以往的经验来看,较为便捷的方式是通过打包联邦学习应用以及依赖包,到一个可移植的轻量容器——docker 中,让其可以在任何安装了 Docker 的机器上运行,而不用关心底层操作系统,这类似船舶使用的集装箱,可以便捷地装配到轮船、汽车等运载工具上。



这种做法往往具有以下优点:


  • 不仅能节约时间,快速部署和启动(秒级甚至毫秒级),还能节约成本,相于较虚拟机动辄几个 G 的磁盘空间,docker 容器可以减少到 MB 级;

  • 方便部署,直接运行已经配好的容器,解决开发人员由于安装环境带来的部署困难;docker 的镜像提供了除内核外完整的运行时环境,确保环境一致性,从而不会在出现“这段代码在我机器上没问题”这类问题;

  • 方便持续集成,通过与代码进行关联使持续集成非常方便;

  • 方便构建基于 SOA 架构或微服务架构的系统,通过服务编排,更好的松耦合;

  • 标准化应用发布,可以多平台部署。


02 训练


在实际生产中进行联邦学习训练时,不仅要考虑到系统的耦合性、稳定性,还要考虑业务需求对接多个数据源,需要支持市面上的各种计算引擎如 Spark、Flink、Storm 等,抑或需要满足高可用进行集群部署等等。因此,为了应对复杂的业务需求,对系统的各个组件,我们往往需要在灵活与便捷之间寻找一个平衡点。


模型训练往往较为耗时,这对系统的稳定性要求极高,一个完备的训练服务应该支持前期校验、中期容错、后期重试、全周期监控、信息可追踪等功能特性。工程落地涉及众多问题,面临大量挑战,真正能够实现落地便已非常复杂,实际生产应用时出现的问题更待陆续解决。如在当前的联邦学习实践场景下,训练过程中的“断点续跑”便是一个重要待解决难题。在实际业务场景中,一个模型的训练往往长达数十个小时,在此过程中,如果由于网络不稳定等问题导致训练过程中断,则该模型需要重新训练,这将极大地增加训练模型的时间成本,带来十分不友好的用户体验。


一个完整的训练框架常需要支持以下服务:



图一 训练框架示意图


通信服务 :由于端与端之间需要通信,为了能尽可能少地向对方暴露我方服务的信息,以及简便性调用训练服务,我们需要引入网关服务实现服务路由,对外暴露 gRPC 接口以及 HTTP 接口,外部系统的所有请求都将委托给网关服务进行请求转发。


训练服务 :该服务包括校验组件、任务调度组件,元数据中心管理组件,联邦学习组件。校验组件:负责校验我们提交的配置参数。任务调度组件:负责解析配置参数,以及进行整个训练任务的调度。在这里我们引入了设计模式中的责任链模式,按照我们指定的组件运行顺序,将一个训练任务转化成一条责任链,并提交给任务线程池去执行。元数据中心管理组件:负责记录每个训练任务的进度以及运行状态,配置参数,以及联邦学习合作方以及角色。联邦学习组件:这里面有很多小组件,用来完成模型训练过程中需要的各种功能。


模型管理服务 :当完成训练任务后,训练服务将训练好的模型信息发送给模型管理服务,由模型管理服务完成持久化存储,分组等操作。


注册中心 :为了保证服务的高可用,引入如 ZooKeeper 的注册服务,当服务启动的时候,会将服务信息注册到 ZooKeeper 中,当向网关服务发起训练请求的时候,网关服务会从 ZooKeeper 中拉取到可用的服务,通过指定的负载均衡策略完成服务调用。


在此基础上,训练流程大致可以分为如下几个步骤:



图二 训练流程示意图


提交训练任务 :当我们向网关服务提交一个训练任务之后,网关服务会将请求路由到训练服务。


检验参数 :在训练服务接受到网关服务请求之后,开始训练之前,我们会先检验配置参数的准确性,比如说需要的算法组件库是否存在、训练的参数是否合理、格式是否正确等,当校验通过后,训练服务会解析我们上传的配置参数,根据我们的配置去实例化所需要的联邦学习组件。


加载样本数据 :将不同类型的数据源(如: CSV 文件、HDFS、MySQL)的样本数据转换为训练服务可识别的格式类型。


特征数据相交 :比如 A 方的用户 ID 为 u1,u2,u3,u4,而 B 方的用户名为 u1,u2,u3,u5。交集后,A 方和 B 方知道他们相同的用户 ID,分别为 u1,u2,u3,但 A 方对 B 方的其他用户 ID(如 u5)一无所知,B 方对 A 方其它用户(u4)一无所知。


联邦训练 :指定联邦算法组件(如:LR、DNN)进行联合模型训练。


模型评估 :评估组件提供一些用于分类和回归的评估方法,它包含 AUC、KS 等指标用来评估模型。


模型存储 :完成训练任务后,训练服务会将训练好的模型信息发送给模型管理服务,由模型管理服务将模型进行分类,版本管理等等,然后将模型信息存储到存储服务中,并保存模型的元数据信息、地址等。


最后当我们将模型持久化存储后,我们可以通过评估组件选择出效果最好的模型,然后将模型导入到推理环境中进行预测,这样我们就可以将联邦学习的成果运用到了企业生产了。


03 推理


在我们完成联邦建模任务并且成功将最终训练好的模型存储在相应的存储模块后,发起方 A 端就可以发起推理任务,在与 B 端的配合下展开预测,根据双方的特征值,得到预测结果,而这个结果正是我们联合建模的最终目的。



与训练不同,由于具有实时调用场景,往往对推理服务的性能有很高的要求,并且要求推理服务能在不影响线上实时调用的基础上,实现无感知的服务升级。企业间的推理预测,往往涉及对账问题,于是对端监控变得极为重要,这能保证在推理完成后,合作方之间能够根据监控信息做到有帐可查,并能排查推理失败等异常情况。


一个完整的推理框架通常需要支持以下服务:



图三 推理框架示意图


通信服务 :端与端之间需要通信,所以我们需要一个代理,对外暴露 gRPC 接口跟 HTTP 接口,路由的转发以及外部系统的所有请求都委托给这一个代理,同时也可以根据业务的特点,决定负载均衡的方式,比如在接入代理之前部署 Nginx 来实现反向代理。


推理服务 :当一个新的推理请求过来时,它可以将所有推理相关的接口注册到如 ZooKeeper 的注册中心,外部系统可以通过服务发现获取接口地址加以调用;从远程存储系统中存储模型到本地,根据请求信息从本地存储系统中选择模型并加载模型;匹配到需要参与预测的用户信息,开展预测任务。


模型管理服务 :完成模型持久化存储,分组等,保存训练好的模型信息。


注册中心 :为了保证服务的高可用,引入如 ZooKeeper 的注册服务,当服务启动的时候,会将服务信息注册,当向网关服务发起推理请求的时候,网关服务会从注册服务中拉取到可用的服务,通过指定的负载均衡策略完成服务调用。


存储服务 :我们还需要将每次预测的结果存储起来以满足一些业务的需求,同时也需要将模型存储起来,持久化模型到本地可以保证在推理中某些组件发生问题时快速恢复过来,以及不需要每次发起推理请求时都从分布式存储系统中加载模型,从而保证安全也提高了效率。


在此基础上,整个推理的流程大致可以分为以下几个步骤:



图四 推理流程示意图


提交训练任务 :当我们向网关服务提交一个推理任务之后,网关服务会将请求路由到推理服务。


获取模型 :如果是第一次加载该模型,则会将其从分布式存储系统持久化到本地的存储系统系统中,如果已经被加载过,则直接从本地存储系统中读取。


预处理 &预测 :在 A,B 都加载完模型后,B 端根据 Featureid 从本侧外部系统中获取相应的特征信息,双方都需要对本地特征进行预处理,然后开始预测,并将结果通过通信服务传给 A 端。


后期处理 :A 端将 B 端的结果进行整合,在本地进行规则映射等后期处理,并将最终的结果保存。


综上所述,整个推理流程都比较简单,但是当我们以工程的角度去看的时候是远远不够的,不管考虑到系统的耦合性还是稳定性,例如,当业务需求是要将整个推理从联邦系统中抽出来单独部署的时候,当我们要查询不同模型不同版本预测的历史结果的时候,又或者需要满足高可用进行集群部署的时候等等。因此为了应对复杂的业务需求,对系统的各个组件,我们亦需在灵活与便捷之间寻找一个平衡点。由于在实际生产中有着复杂的业务需求以及不可预测的问题,因此需要我们根据实际情况完善架构,例如添加相应的服务治理功能,以及线程池的规划等等。


本文转载自公众号京东数科技术说(ID:JDDTechTalk)。


原文链接


只看这三点就够:快速了解联邦学习框架!


2020-11-26 14:002372

评论

发布
暂无评论
发现更多内容

参与tdengine开源的方式

williamcai

fork git 学习

Android C++系列:Linux文件系统(二)

轻口味

c++ android jni 11月日更

面试必备(背)--Go语言八股文系列!

微客鸟窝

Go 语言 八股文 11月日更

kafka常用命令

williamcai

kafka

【死磕Java并发】-----Java内存模型之总结

chenssy

11月日更 死磕 Java 死磕 Java 并发

网络安全—如何从IP源地址角度,预防DDoS攻击?

郑州埃文科技

CSS架构揭秘之Ant design

Augus

CSS 11月日更

requests-html库初识 + 无资料解BUG之 I/O error : encoder error,Python爬虫第30例

梦想橡皮擦

11月日更

Go 的 Panics 处理

baiyutang

golang 11月日更

前端开发:VS Code编辑器新建Vue文件自定义模板的方法

三掌柜

11月日更

dart系列之:dart中的异步编程

程序那些事

flutter dart 程序那些事 11月日更

数据库版本控制中间件flyway企业落地

小鲍侃java

11月日更

【架构实战营】模块四

衣谷

架构实战营

模块四作业:千万级学生管理系统的考试试卷存储方案

dean

架构实战营

【LeetCode】最长和谐子序列Java题解

Albert

算法 LeetCode 11月日更

通过USB接入双目UVC协议外接人脸比对相机实现1:1比对开发

Todd Wong

数字化办公

Hive数据抽样与存储格式详解

五分钟学大数据

11月日更

Redis 实现限流的三种方式

大数据技术指南

11月日更

基于海思Hi3559A或者Atlas_200模块,Hi3559A(主)+Atlas_200(从)开发AI加速边缘计算主板的三种模式

Todd Wong

人工智能 深度学习

[Pulsar] ChunkMessageID介绍及其原理

Zike Yang

Apache Pulsar 11月日更

【Redis集群原理专题】(1)介绍一下常用的Redis集群机制方案的原理和分析

码界西柚

集群 redis cluster redis sentinel 11月日更

十分钟搞懂WebAssembly

俞凡

Wasm

【Flutter 专题】03 图解第一个程序 Hello World!

阿策小和尚

Flutter 小菜 0 基础学习 Flutter Android 小菜鸟 11月日更

别被你的框架框住了

Teobler

angular.js 大前端 React 框架 编程范式

Python Qt GUI设计:QLabel标签类(基础篇—11)

不脱发的程序猿

Python PyQt GUI设计 QLabel标签类

Prometheus Exporter (三)容器信息监控

耳东@Erdong

container Prometheus exporter 11月日更 cAdvisor

自定义View:如何手写ViewGroup实现ListView效果

Changing Lin

11月日更

Prometheus 都可以采集那些指标?-- 常用 Exporter 合集

耳东@Erdong

内容合集

自动驾驶 传感器和计算硬件 易筋 ARTS 打卡 Week 76

John(易筋)

ARTS 打卡计划 arts

搞定大厂算法面试之leetcode精讲1.开篇介绍

全栈潇晨

算法面经

Go语言学习查缺补漏ing Day2

Regan Yue

Go 语言 11月日更

只看这三点就够:快速了解联邦学习框架!_容器_京东数科风险算法与技术_InfoQ精选文章