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

原标题:云原生联邦学习平台 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/

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

免责声明:非本网注明原创的信息,皆为程序自动获取互联网,目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责;如该页面侵犯到您的权益,请给站长发送邮件,并提供相关证明(版权证明、身份证正反面、侵权链接),站长将在收到邮件12小时内删除。