云原生联邦学习平台 KubeFATE 原理详解
Posted 亨利笔记
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了云原生联邦学习平台 KubeFATE 原理详解相关的知识,希望对你有一定的参考价值。
题图摄于越南会安
(本文作者系 VMware 中国研发云原生实验室工程师,联邦学习 KubeFATE / FATE-Operator 开源项目维护者。)
相关文章
关于FATE
FATE 是一个联邦学习的开源项目,旨在提供一个安全的计算框架来支持联合AI生态系统。它实现了多种安全计算协议,以实现符合数据保护法规的大数据协作。通过模块化的可扩展建模管道,清晰的可视界面和灵活的调度系统,FATE 可以访问即用型可用性和出色的运营性能。
关于Kubernetes
Kubernetes 是开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。
在 Kubernetes 中,我们可以创建多个容器,每个容器里面运行一个应用实例,然后通过内置的负载均衡策略,实现对这一组应用实例的管理、发现、访问,而这些细节都不需要运维人员去进行复杂的手工配置和处理。
为什么要在 Kubernetes 上部署 FATE
但随着联邦学习的正式投入使用,训练集、模型都会逐渐变大。在生产环境里,我们会遇到以下问题:
FATE 集群如何适应企业组织内部各种安全、合规要求,以及网络、安全域等IT 环境;
一台服务器已经无法支撑联邦学习的算力需求,如何部署多计算节点,并易于管理;
某些节点出现问题,是否有自愈能力,保证服务的可靠性;
能否实现横向扩展,适应业务的成长;
FATE 版本能否很好的升级管理;
一个组织内是否可以有不同的联邦集群,对应不同的业务、合作伙伴、应用场景需要,如何管理多个集群。
Kubernetes 是目前最流行的基础设施平台,大量的实践证明,Kubernetes 很适合作为企业内部运维大规模分布式系统的平台。根据 Ovum 的统计,截至2019年底,一半的大数据负载都运行在 Kubernetes 之上。我们团队也推荐 Kubernetes 作为运行 FATE 联邦学习集群生产环境的平台。KubeFATE 提供了在 Kubernetes 部署运维 FATE 的解决方案。
在了解如何在 Kubernetes 上部署 FATE 之前呢,你最好先了解 Kubernetes 和 FATE 的基本原理。
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
部署 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
这里报错,原因一般有两点:
没有 ingress-controller ;
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(星型)。
直连模式(网状):
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 原理详解的主要内容,如果未能解决你的问题,请参考以下文章