云原生联邦学习平台 KubeFATE 原理详解

Posted 亨利笔记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了云原生联邦学习平台 KubeFATE 原理详解相关的知识,希望对你有一定的参考价值。

题图摄于越南会安


(本文作者系 VMware 中国研发云原生实验室工程师,联邦学习 KubeFATE / FATE-Operator 开源项目维护者。)




相关文章







关于FATE 

FATE 是一个联邦学习的开源项目,旨在提供一个安全的计算框架来支持联合AI生态系统。它实现了多种安全计算协议,以实现符合数据保护法规的大数据协作。通过模块化的可扩展建模管道,清晰的可视界面和灵活的调度系统,FATE 可以访问即用型可用性和出色的运营性能。

关于Kubernetes 

Kubernetes 是开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。

在 Kubernetes 中,我们可以创建多个容器,每个容器里面运行一个应用实例,然后通过内置的负载均衡策略,实现对这一组应用实例的管理、发现、访问,而这些细节都不需要运维人员去进行复杂的手工配置和处理。

为什么要在 Kubernetes 上部署 FATE

但随着联邦学习的正式投入使用,训练集、模型都会逐渐变大。在生产环境里,我们会遇到以下问题:

  1. FATE 集群如何适应企业组织内部各种安全、合规要求,以及网络、安全域等IT 环境;

  2. 一台服务器已经无法支撑联邦学习的算力需求,如何部署多计算节点,并易于管理;

  3. 某些节点出现问题,是否有自愈能力,保证服务的可靠性;

  4. 能否实现横向扩展,适应业务的成长;

  5. FATE 版本能否很好的升级管理;

  6. 一个组织内是否可以有不同的联邦集群,对应不同的业务、合作伙伴、应用场景需要,如何管理多个集群。

Kubernetes 是目前最流行的基础设施平台,大量的实践证明,Kubernetes 很适合作为企业内部运维大规模分布式系统的平台。根据 Ovum 的统计,截至2019年底,一半的大数据负载都运行在 Kubernetes 之上。我们团队也推荐 Kubernetes 作为运行 FATE 联邦学习集群生产环境的平台。KubeFATE 提供了在 Kubernetes 部署运维 FATE 的解决方案。

在了解如何在 Kubernetes 上部署 FATE 之前呢,你最好先了解 Kubernetes 和 FATE 的基本原理。


KubeFATE

KubeFATE 是 FATE 的容器化部署的支持项目,主要包括 FATE 的 docker-compose部署和  Kubernetes 部署,Juypter Notebook 支持等。

KubeFATE 主要由 VMware 中国研发中心云原生实验室、微众银行、社区用户共同参与开源贡献。随着容器化技术的发展,相关技术也越来越成熟,出现了多优秀的项目 Kubernetes、Docker、Harbor 等。容器化部署应用解决了很多部署问题,还大大提高了研发运维效率,容器化部署将是未来服务运维的重要方式。在生产环境的容器化部署首先想到就是 Kubernetes,使用 KubeFATE 部署FATE将是你部署FATE的首要选择。

KubeFATE是对 FATE 的 Kubernetes 部署的具体实现。KubeFATE使用golang开发,通过一个部署在 Kubernetes 上的 server 服务来实现对 Kubernetes 的操作,可以实现集群外对 FATE 的部署操作,通过简单命令行实现简单快速的 FATE 集群的部署运维工作。

KubeFATE部署架构

云原生联邦学习平台 KubeFATE 原理详解


KubeFATE的相关知识

KubeFATE部署 FATE 可以通过命令行或者 rest API 来操作,可以操作的资源如下:

Cluster

cluster是KubeFATE的主要资源,KubeFATE每成功部署一个FATE就会生成一个cluster,每一个 cluster 对应一组 Kubernetes 的资源,包含FATE (Training) 和 FATE-Serving 两种类型。

命令行和 API 主要有 install update delete describe list 五种操作。

Job

job是KubeFATE部署 cluster 的时候产生的中间资源,负责完成 cluster 在 Kubernetes 上对应的操作,包括三种类型 Install、Update 和 Delete。

执行的基本过程分四步:

1. 生成job的元数据, 

2.执行对应类型的cluster操作,

3.检查操作是否成功,

4.更新job的状态。


命令行和 API 主要有 list, delete, describe 三种操作。

Chart

chart是KubeFATE存储不同类型不同版本的 FATE 的Yaml模板文件,是 Helm Chart 的超集,相比普通 Helm Chart 多了一个 values-template 文件。所有的chart 文件可以从这里下载: https://github.com/FederatedAI/KubeFATE/tree/gh-pages/package

命令行和 API 主要有 upload, list, delete三种操作。

User

KubeFATE对命令行的认证信息的体现。


部署过程

下载KubeFATE安装包

KubeFATE安装包可以从 GitHub 的 KubeFATE release 下载(https://github.com/FederatedAI/KubeFATE/releases)

$ version=v1.5.0

# 下载对应版本的 KubeFATE
$ wget https://github.com/FederatedAI/KubeFATE/releases/download/${version}/kubefate-k8s-${version}.tar.gz

解压之后安装就可以使用:

$ mkdir -p kubefate
$ tar -zxvf -C kubefate kubefate-k8s-${version}.tar.gz
$ chmod +x ./kubefate && sudo mv ./kubefate /usr/bin

解压之后得到这些文件:

$ ls
cluster-serving.yaml cluster-spark.yaml cluster.yaml config.yaml examples kubefate kubefate.yaml rbac-config.yaml
安装KubeFATE server

KubeFATE使用之前你需要在 Kubernetes 上部署KubeFATE server。

这部分包含KubeFATE server的 namespace 和 RBAC 权限,官方默认的权限是cluster-admin,对 Kubernetes 的 RBAC 机制比较了解的可以自己修改。

还包含KubeFATE所使用的秘钥,mysql 的用户名密码和KubeFATE的用户名密码,部署之前建议先修改一下。

$ kubectl apply -f rbac-config.yaml

接下来就可以部署KubeFATE server了。

这个部署包含两部分:KubeFATE和 MariaDB(MySQL),总共包含 5 个 Kubernetes组件,分别是KubeFATE和 MariaDB 的Deployment 与 Service、kubefate的Ingress。

$ kubectl apply -f kubefate.yaml
deployment.apps/kubefate created
deployment.apps/mariadb created
service/mariadb created
service/kubefate created
ingress.networking.k8s.io/kubefate created

可以看到5个 Kubernetes 组件成功创建,如果 deployment 创建的 pod 状态正常那么说明KubeFATE server已经部署成功。

KubeFATE命令行对接

KubeFATE命令行是KubeFATE server的API调用实现,通过架构图我们知道KubeFATE部署 FATE 是KubeFATE server 通过call Kubernetes API 来实现的,KubeFATE命令行与KubeFATE server 的通信是通过  Ingress  暴露的 URL  kubefate.net (该域名可修改)来实现,所以KubeFATE命令行可以在任意一台可以访问 Ingress 入口的机器使用,只需要配置 hosts 文件即可。

例如:

$ echo "192.168.100.123 kubefate.net"  >> /etc/hosts

使用命令kubefate version检查是否连通。

$ kubefate version
* kubefate service version=v1.2.0
* kubefate commandLine version=v1.2.0

这里报错,原因一般有两点:

  1. 没有 ingress-controller ;

  2. KubeFATE的 pod 没有成功运行(第一次运行初始化数据库会需要一点时间)。

KubeFATE 服务部署成功就可以使用kubefate命令来部署 FATE 了。

使用 kubefate 命令部署FATE

使用kubefate cluster install命令,可以用kubefate安装一个指定FATE集群。使用--help参数可以更好的使用kubefate命令。

在安装之前,集群的参数可以通过配置 cluster.yaml 实现。详细的配置可以看配置介绍部分。

$ kubefate cluster install -f cluster.yaml
create job success, job id=94107328-958e-4fa6-8fa7-9a2b975114de

kubefate对集群的安装更改删除都会生成一个job,使用kubefate job describe <job_id>可以查看对应操作的进度。

本文的 FATE 集群是 FATE 的泛指,包含 FATE(Training) 和 FATE-Serving

kubefate的 job 分为三种:install、 update、 delete。

  • Install:创建Cluster

    首先会在数据库建立job的记录,然后创建cluster的记录,接着查看数据库是否有对应版本chart存在(如果不存在则下载对应版本chart存储到数据库),然后调用helm安装Cluster,检查等待安装成功,更新job和cluster的记录。

  • Update:更新Cluster

    首先会在数据库建立 job 的记录,然后创建 cluster 的记录,接着查看数据库是否有更新 Cluster 对应版本 chart 存在(如果不存在则下载对应版本chart存储到数据库),然后调用 helm 更新 Cluster,检查等待更新成功,更新 job 和 cluster 的记录。 

  • Delete:删除Cluster

    首先会在数据库建立 job 的记录,更改 Cluster 状态,然后调用 helm 删除Cluster,检查等待删除成功,接着删除 Cluster 记录,更新 job 的记录。

检查是否部署成功

查看 job 状态

通过查看 job 的信息,可以知道对应 FATE 集群安装的进度

$ kubefate job describe 94107328-958e-4fa6-8fa7-9a2b975114de
UUID 94107328-958e-4fa6-8fa7-9a2b975114de
StartTime 2020-11-25 03:03:41
EndTime 2020-11-25 03:05:38
Duration 117s
Status Success
Creator admin
ClusterId 9e693e93-bf2a-4229-8485-ea922ed33dcf
Result Cluster install success
SubJobs mysql PodStatus: Running, SubJobStatus: Success, Duration: 83s, StartTime: 2020-11-25 03:03:41, EndTime: 2020-11-25 03:05:05
nodemanager-0 PodStatus: Running, SubJobStatus: Success, Duration: 11s, StartTime: 2020-11-25 03:03:41, EndTime: 2020-11-25 03:03:53
nodemanager-1 PodStatus: Running, SubJobStatus: Success, Duration: 11s, StartTime: 2020-11-25 03:03:41, EndTime: 2020-11-25 03:03:53
python PodStatus: Running, SubJobStatus: Success, Duration: 116s, StartTime: 2020-11-25 03:03:41, EndTime: 2020-11-25 03:05:38
rollsite PodStatus: Running, SubJobStatus: Success, Duration: 11s, StartTime: 2020-11-25 03:03:41, EndTime: 2020-11-25 03:03:53
client PodStatus: Running, SubJobStatus: Success, Duration: 116s, StartTime: 2020-11-25 03:03:41, EndTime: 2020-11-25 03:05:38
clustermanager PodStatus: Running, SubJobStatus: Success, Duration: 11s, StartTime: 2020-11-25 03:03:41, EndTime: 2020-11-25 03:03:53
fateboard PodStatus: Running, SubJobStatus: Success, Duration: 116s, StartTime: 2020-11-25 03:03:41, EndTime: 2020-11-25 03:05:38

当 job 的状态变成Success,代表部署任务成功。

subjob 表示当前 job 中每个组件的子 job 的状态。

查看FATE集群信息

通过命令kubefate cluster describe <cluster_id>可以查看部署的FATE集群的信息

$ kubefate cluster describe 9e693e93-bf2a-4229-8485-ea922ed33dcf
UUID 9e693e93-bf2a-4229-8485-ea922ed33dcf
Name fate-10000
NameSpace fate-10000
ChartName fate
ChartVersion v1.5.0
Revision 1
Age 9m3s
Status Running
Spec backend: eggroll
chartName: fate
chartVersion: v1.5.0
istio:
enabled: false
modules:
- rollsite
- clustermanager
- nodemanager
- mysql
- python
- fateboard
- client
name: fate-10000
namespace: fate-10000
partyId: 10000
persistence: false
pullPolicy: null
python:
grpcNodePort: 30102
httpNodePort: 30107
type: NodePort
registry: ""
rollsite:
nodePort: 30101
partyList:
- partyId: 9999
partyIp: 192.168.9.1
partyPort: 30091
type: NodePort
servingIp: 192.168.10.1
servingPort: 30105

Info dashboard:
- 10000.notebook.kubefate.net
- 10000.fateboard.kubefate.net
ip: 192.168.10.2
pod:
- clustermanager-76bb7d4dd4-hhpw6
- mysql-57b7d859bc-pw4x5
- nodemanager-0-8d85fd46c-pwcz2
- nodemanager-1-6d67b96bc-qp4bx
- python-9c857bbcc-lgx2d
- rollsite-6b685d468d-bcrzw
status:
modules:
client: Running
clustermanager: Running
fateboard: Running
mysql: Running
nodemanager-0: Running
nodemanager-1: Running
python: Running
rollsite: Running

当Status是"Running"的时候表示部署的FATE已经正常运行。

集群的其他信息:

  • Name、NameSpace、 ChartName、 ChartVersion 这些是基本信息与配置文件字段对应

  • Status 代表部署的 FATE 的状态("Running"表示正常运行)

  • Revision 代表 update 的次数,创建成功也算一次。

  • Spec 对应部署的时候的 cluster.yaml

  • Info 当前 FATE 的特有信息

    • dashboard 是部署FATE包含的ingress入口

    • pod 表示当前 FATE 集群在kubernetes 里面所有 pod

    • status 表示当前 FATE 集群所有 container 的状态

 检查 FATE 是否正常

要检查 FATE 是否成可以运行 FATE 的一些测试任务,具体如何使用可以参考 FATE examples,也可以参考。

FATE 互联

FATE 联邦学习的实现依赖多个 Party 的数据交换,多个 Party 的互联有两种方式,分别是直连模式(网状)和 exchange(星型)。

直连模式(网状):

云原生联邦学习平台 KubeFATE 原理详解


exchange(星型):

一个Party的对外连接信息包含三项,

  • PartyID

    partyID部署FATE的时候必须指定,

  • IP

    rollsite对外是通过NodePort的方式暴露,所以IP就是NodeIP(通过查看cluster的具体信息也可以得到Info.ip),

  • Port

    就是配置的rollsite.nodePort

直连模式

直连模式是指在一个联邦网络内某个Party包含了他需要连接的所有party的集群入口信息(PartyID、IP、Port),对应的对方Party也必须包含它的信息。

当某个新的Party想要加入网络,需要配置一个网络内唯一的PartyID,还需要在rollsite.partyList的配置项增加所以需要关联的Party的信息,而且对方也需要在自己的rollsite.partyList增加己方的信息。

exchange 模式

也叫星型部署模式,所有的 Party 只需要配置 exchange 集群的信息,就可以通过exchange连接其他的Party,exchange负责管理所有Party的集群信息。

如果使用exchange模式部署,只需要配置rollsite.exchange即可连接exchange集群。exchange集群则需要配置各方的Party信息([exchange集群配置](#FATE exchange))。

Spark 模式

当FATE使用 Spark 计算引擎,集群的连接方式不同于之前,类似于直连模式,不过互联要包含两个组件 nginx 和 rabbitmq。

FATE使用Spark 的 party 之间互联就需要配置 nginx 的 route_table 和 rabbitmq 的route_table。

  • nginx 的 route_table 需要配置对方集群的 nginx 和 python 的 grpcNodePort。

  • rabbitmq 的 route_table 则需要配置对方集群的rabbitmq。

截至当前版本v1.5.0,FATE on Spark不支持exchange模式.


限于篇幅,更多关于KubeFATE 部署 FATE  配置参数的详细介绍,请查看这篇文章: ,或者点击阅读原文。


相关链接

  • KubeFATE:https://github.com/FederatedAI/KubeFATE

  • FATE:https://github.com/FederatedAI/FATE

  • Kubernetes:https://kubernetes.io/





欢迎转发、收藏和点 “在看”。

以上是关于云原生联邦学习平台 KubeFATE 原理详解的主要内容,如果未能解决你的问题,请参考以下文章

用Spark计算引擎执行FATE联邦学习任务

云原生应用平台 TCAP 重磅更新,支持集群联邦及IPV6

云原生|Docker系列7Docker Machine 使用详解

原生Kubernetes容器云平台基本测试使用

阅读笔记联邦学习实战——联邦个性化推荐案例

跟我学ModelArts丨探索ModelArts平台个性化联邦学习API