原标题:云原生联邦学习平台 KubeFATE 原理详解
题图摄于越南会安
(本文作者系 VMware 中国研发云原生实验室工程师,联邦学习 KubeFATE / FATE-Operator 开源项目维护者。)
需要加入KubeFATE开源项目讨论群的同学,请关注亨利笔记公众号后回复 “ kubefate” 即可。
VMware招聘联邦学习、隐私计算开发工程师
关于FATE
FATE 是一个联邦学习的开源项目,旨在提供一个安全的计算框架来支持联合AI生态系统。它实现了 多种安全计算协议,以实现符合数据保护法规的大数据协作。通过模块化的可扩展建模管道,清晰的可视界面和灵活的调度系统,FATE 可以访问即用型可用性和出色的运营性能。
关于Kubernetes
Kubernetes 是开源的一个 容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。
在 Kubernetes 中,我们可以创建多个容器,每个容器里面运行一个应用实例,然后通过内置的负载均衡策略,实现对这一组应用实例的管理、发现、访问,而这些细节都不需要运维人员去进行复杂的手工配置和处理。
为什么要在 Kubernetes 上部署 FATE
但随着联邦学习的正式投入使用,训练集、模型都会逐渐变大。在生产环境里,我们会遇到以下问题:
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的相关知识
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 安装KubeFATEserver
KubeFATE使用之前你需要在 Kubernetes 上部署 KubeFATEserver。
这部分包含 KubeFATEserver的 namespace 和 RBAC 权限,官方默认的权限是cluster-admin,对 Kubernetes 的 RBAC 机制比较了解的可以自己修改。
还包含 KubeFATE所使用的秘钥,MySQL 的用户名密码和 KubeFATE的用户名密码,部署之前建议先修改一下。
$ kubectl apply -f rbac-config.yaml
接下来就可以部署 KubeFATEserver了。
这个部署包含两部分: 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 状态正常那么说明 KubeFATEserver已经部署成功。
KubeFATE命令行对接
KubeFATE命令行是 KubeFATEserver的API调用实现,通过架构图我们知道 KubeFATE部署 FATE 是 KubeFATEserver 通过call Kubernetes API 来实现的, KubeFATE命令行与 KubeFATEserver 的通信是通过 Ingress 暴露的 URL kubefate.net (该域名可修改)来实现,所以 KubeFATE命令行可以在任意一台可以访问 Ingress 入口的机器使用,只需要配置 hosts 文件即可。
例如:
$ echo“192.168.100.123 kubefate.net”>>/etc/hosts
192.168.100.123 是 ingress 的入口 IP地址。
使用命令 kubefate version 检查是否连通。
$ kubefate version
*kubefate service version=v1.2.0
*kubefate commandLine version=v1.2.0
这里报错,原因一般有两点:
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 。
本文的 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 的信息,可以知道对应 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入口
- ip 表示可以 Kubernetes 使用 NodePort 的一个 Node 的 IP 地址
- pod 表示当前 FATE 集群在kubernetes 里面所有 pod
- status 表示当前 FATE 集群所有 container 的状态
- dashboard 是部署FATE包含的ingress入口
- ip 表示可以 Kubernetes 使用 NodePort 的一个 Node 的 IP 地址
- pod 表示当前 FATE 集群在kubernetes 里面所有 pod
- status 表示当前 FATE 集群所有 container 的状态
要检查 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 部署 FATE 的配置说明 ,或者点击阅读原文。
截至当前版本v1.5.0,FATE on Spark不支持exchange模式.
限于篇幅,更多关于KubeFATE 部署 FATE 配置参数的详细介绍,请查看这篇文章:联邦学习平台 KubeFATE 部署 FATE 的配置说明 ,或者点击阅读原文。
需要加入KubeFATE开源项目讨论群的同学,请先关注亨利笔记公众号,然后回复 “ kubefate” 即可。
相关链接
- KubeFATE: https://github.com/FederatedAI/KubeFATE
- FATE: https://github.com/FederatedAI/FATE
- Kubernetes: https://kubernetes.io/