-
Notifications
You must be signed in to change notification settings - Fork 222
使用KubeFATE在Kubernetes上部署FATE集群
FATE是由Webank的AI部门发起的一个开源项目,旨在提供一个安全的计算框架来支持联合AI生态系统。它实现了多种安全计算协议,以实现符合数据保护法规的大数据协作。通过模块化的可扩展建模管道,清晰的可视界面和灵活的调度系统,FATE可以访问即用型可用性和出色的运营性能。
Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。在生产环境中部署一个应用程序时,通常要部署该应用的多个实例以便对应用请求进行负载均衡。
在Kubernetes中,我们可以创建多个容器,每个容器里面运行一个应用实例,然后通过内置的负载均衡策略,实现对这一组应用实例的管理、发现、访问,而这些细节都不需要运维人员去进行复杂的手工配置和处理。
但随着联邦学习的正式投入使用,训练集、模型都会逐渐变大。在生产环境里,我们会遇到以下问题:
- FATE集群如何适应企业组织内部各种安全、合规要求,以及网络、安全域等IT环境;
- 一台服务器已经无法支撑联邦学习的算力需求,如何部署多计算节点,并易于管理;
- 某些节点出现问题,是否有自愈能力,保证服务的可靠性;
- 能否实现横向扩展,适应业务的成长;
- FATE版本能否很好的升级管理;
- 一个组织内是否可以有不同的联邦集群,对应不同的业务、合作伙伴、应用场景需要,如何管理多个集群。
Kubernetes 是目前最流行的基础设施平台,大量的实践证明,Kubernetes 很适合作为企业内部运维大规模分布式系统的平台。根据 Ovum 的统计,截至2019年底,一半的大数据负载都运行在Kubernetes之上。我们团队也推荐Kubernetes作为运行 FATE 联邦学习集群生产环境的平台。KubeFATE 提供了在 Kubernetes 部署运维 FATE 的解决方案。
在了解如何在Kubernetes上部署 FATE之前呢,你最好先知道这些下面这些知识或文章:
如果你已经比较了解Kubernetes和FATE可以跳过这部分
-
pod、service、deployment、namespace、PVC、PV、Ingress、nodeSelector、NodePort 。
-
Kubernetes RBAC
-
FATE组件:fateflow,fateboard,rollsite,nodemanager,clustermanager
KubeFATE是FATE的容器化部署的支持项目,主要包括FATE的docker-compose部署和Kubernetes部署,Notebook支持等。
KubeFATE主要由VMware中国研发中心实验室,微众银行,GitHub用户等开源贡献,随着容器化技术的发展,相关技术也越来越成熟,出现了多优秀的项目Kubernetes、Docker、Harbor等。容器化部署应用解决了很多部署问题,还大大提高了研发运维效率,容器化部署将是未来服务运维的重要方式。在生产环境的容器化部署首先想到就是Kubernetes,使用KubeFATE部署FATE将是你部署FATE的首要选择。
KubeFATE是对FATE的Kubernetes部署的具体实现。KubeFATE使用golang
开发,通过一个部署在Kubernetes上的server服务来实现对Kubernetes的操作,可以实现集群外对FATE的部署操作,通过简单命令行实现简单快速的FATE集群的部署运维工作。
KubeFATE的项目地址https://github.com/FederatedAI/KubeFATE/tree/master/k8s-deploy。
KubeFATE部署FATE可以通过命令行或者rest API来操作,可以操作的资源如下:
cluster是KubeFATE的主要资源,KubeFATE每成功部署一个FATE就会生成一个cluster,每一个cluster对应一组Kubernetes的资源,包含FATE(Training)和FATE-Serving两种类型。
命令行和API主要有install update delete describe list五种操作。
job是KubeFATE部署cluster的时候产生的中间资源,负责完成cluster在Kubernetes上对应的操作,包括三种类型Install、Update和Delete。
执行的基本过程分四步:1.生成job的元数据,2.执行对应类型的cluster操作,3.检查操作是否成功,4.更新job的状态。
命令行和API主要有list delete describe三种操作。
chart是KubeFATE存储不同类型不同版本的FATE的Yaml模板文件,是Helm Chart的超集,相比普通Helm Chart多了一个values-template文件。所有的chart文件可以从https://github.com/FederatedAI/KubeFATE/tree/gh-pages/package下载。
命令行和API主要有upload list delete三种操作。
是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使用之前你需要在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 server的API调用实现,通过架构图我们知道KubeFATE部署FATE是KubeFATE server通过call Kubernetes API 来实现的,KubeFATE命令行与KubeFATE server的通信是通过Ingress暴露的URL example.com来实现,所以KubeFATE命令行可以在任意一台可以访问Ingress入口的机器使用,只需要配置hosts文件即可。
例如:
$ echo "192.168.100.123 example.com" >> /etc/hosts
192.168.100.123
是ingress的入口IP地址。
使用命令kubefate version
检查是否连通。
$ kubefate version
* kubefate service version=v1.2.0
* kubefate commandLine version=v1.2.0
这里报错,原因一般有两点:
- 没有ingress-controller;
- KubeFATE的pod没有成功运行(第一次运行初始化数据库会需要一点时间)。
KubeFATE部署成功就可以使用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的信息,可以知道对应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的状态。
通过命令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.example.com
- 10000.fateboard.example.com
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的状态
要检查FATE是否成可以运行FATE的一些测试任务,具体如何使用可以参考FATE examples,也可以参考[notebook的使用](这里需要有连接)。
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
增加己方的信息。
也叫星型部署模式,所有的Party只需要配置exchange集群的信息,就可以通过exchange连接其他的Party,exchange负责管理所有Party的集群信息
如果使用exchange模式部署,只需要配置rollsite.exchange
即可连接exchange集群。exchange集群则需要配置各方的Party信息([exchange集群配置](#FATE exchange))。
当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(Training)和FATE-Serving,部署配置文件是YAML格式。
- name:集群名称,不能重复
- namespace:对应Kubernetes的namespace资源,目前KubeFATE部署最好一个namespace下只部署这个FATE集群的资源
- chartName:FATE集群的类型,包括fate和fate-serving
- chartVersion:FATE集群的版本,更多版本可以在这里找到https://github.com/FederatedAI/KubeFATE/tree/gh-pages/package
- partyId:FATE的概念,标识区分不同集群
- registry:镜像资源,默认是Docker hub,其他资源:例如国内的一个镜像资源
registry: "hub.c.163.com/federatedai"
- pullPolicy:Kubernetes镜像资源拉取策略,不填写默认是
IfNotPresent
- persistence:集群是否支持数据持久化
- istio:是否启用istio,(什么是istio?)
- modules:KubeFATE支持分模块部署,这里可以选择需要部署的不同模块
其余配置根据不同的部署模式选择不同的配置。
部署FATE(Training)集群。
必须组件包含[python, mysql]
如果使用eggroll引擎,还需要[rollsite, clustermanager, nodemanager]
如果使用Spark引擎,还需要[spark, hdfs, nginx, rabbitmq]
可选组件[fateboard, client]
FATE支持两种计算引擎eggroll和Spark。所以下面针对两种配置做详细说明。
- backend: FATE使用的计算引擎(eggroll、Spark)
- python:fateflow的一些配置
- type:fateflow服务端口的暴露方式,对应Kubernetes的service的type
- httpNodePort:如果上边选择的是NodePort,fateflow http端口的配置
- grpcNodePort:如果上边选择的是NodePort,fateflow grpc端口的配置
- nodeSelector:将 Pod 分配给某一节点,nodeselector
- spark:[FATE on Spark](FATE on Spark)的配置
- hdfs:[FATE on Spark](FATE on Spark)的配置
- rabbitmq:[FATE on Spark](FATE on Spark)的配置
- nginx:[FATE on Spark](FATE on Spark)的配置
- mysql:mysql的一些配置(使用其他mysql可以不配置这里)
- ip:mysql的kubernetes内部名称(不要修改)
- port:mysql的port(不要修改)
- database:FATE使用mysql的数据库名称
- user:mysql用户名
- password:mysql密码
- subPath:持久化的路径
- existingClaim:是否使用已有PVC
- storageClass:持久化的storageClass
- accessMode:ReadWriteOnce
- size:PV的大小
- nodeSelector:将 Pod 分配给某一节点,nodeselector
如果使用其他mysql配置这些
- externalMysqlIp:mysql的ip
- externalMysqlPort:mysql的port
- externalMysqlDatabase:mysql的数据库名称
- externalMysqlUser:mysql的用户名
- externalMysqlPassword:mysql的密码
如果要连接FATE-Serving才需要配置
- servingIp:FATE-Serving的servingServer的入口ip
- servingPort:FATE-Serving的servingServer的入口port
使用eggroll计算引擎,除了基础组件,还需要[rollsite, clustermanager, nodemanager]这些组件。
使用cluster.yaml,默认会部署一个FATE on eggroll的FATE集群。
默认的部署实现,体现在Kubernetes上的资源有以下这些:
kubernetes组件 | 资源实例 |
---|---|
Service | clustermanager,fateboard ,fateflow ,fateflow-client,mysql ,nodemanager-0,nodemanager-1,notebook,rollsite |
Deployment | clustermanager,mysql,nodemanager-0,nodemanager-1,python,rollsite |
Ingress | client,fateboard |
ConfigMap | eggroll-config,fateboard-config,mysql-config,nodemanager-0-config,nodemanager-1-config,python-config,rollsite-config |
下面是使用eggroll计算引擎需要的组件配置
- rollsite: rollsite组件的一些配置
- type: rollsite端口的暴露方式,对应Kubernetes的service的type
- nodePort:如果上边选择的是NodePort,这里可以配置具体的端口号,Kubernetes默认的范围是(30000-32767)
- exchange:rollsite连接的exchange信息(ip和port)
- partyList:FATE连接其他party的信息,假如要连接已经使用KubeFATE部署了的一个FATE,根据前边查看FATE集群信息,从中可以得到partyId、NodePort和NodeIP。
- nodeSelector:将 Pod 分配给某一节点,nodeselector
- nodemanager:nodemanager组件的一些配置
- count:部署nodemanager的数量
- sessionProcessorsPerNode:nodemanager的sessionProcessorsPerNode配置
- subPath:nodemanager持久化的路径
- storageClass:持久化的storageClass
- existingClaim:是否使用已有PVC
- accessMode:访问模式
- size:所需PV的大小
- nodeSelector:将 Pod 分配给某一节点,nodeselector
- clustermanager:nodemanager组件的配置
- nodeSelector:将 Pod 分配给某一节点,nodeselector
使用Spark计算引擎,除了基础组件,还需要[spark, hdfs, nginx, rabbitmq]这些组件。
使用cluster-spark.yaml,默认会部署一个FATE on Spark的FATE集群。
默认的部署实现,体现在Kubernetes上的资源有以下这些:
kubernetes组件 | 资源实例 |
---|---|
Service | fateboard, fateflow, fateflow-client, mysql, namenode, datanode, nginx, notebook, rabbitmq, spark-master, spark-worker-1 |
Deployment | datanode, mysql, namenode, nginx, python, rabbitmq, spark-master, spark-worker |
Ingress | client, fateboard, rabbitmq, spark |
ConfigMap | datanode-env, eggroll-config, fateboard-config, mysql-config, namenode-config, namenode-env, nginx-config, python-config, rabbitmq-config |
下面是使用Spark计算引擎需要的组件配置
-
spark:Spark组件的一些配置
- master:master节点的配置
- Image:master的镜像
- ImageTag:TAG
- replicas:pod副本数量
- cpu:请求CUP 数量
- memory:请求内存数量
- nodeSelector:将 Pod 分配给某一节点,nodeselector
- type:对应kubernetes的Service资源的type
- worker:worker节点的配置
- Image:worker的镜像
- ImageTag:TAG
- replicas:pod副本数量
- cpu:请求CUP 数量
- memory:请求内存数量
- nodeSelector:将 Pod 分配给某一节点,nodeselector
- type:对应kubernetes的Service资源的type
- master:master节点的配置
-
hdfs:hdfs组件的一些配置
- namenode:namenode配置
- nodeSelector:将 Pod 分配给某一节点,nodeselector
- type:对应kubernetes的Service资源的type
- datanode:datanode配置
- nodeSelector:将 Pod 分配给某一节点,nodeselector
- type:对应kubernetes的Service资源的type
- namenode:namenode配置
-
nginx:nginx组件的一些配置
- nodeSelector:将 Pod 分配给某一节点,nodeselector
- type:nginx端口的暴露方式,对应Kubernetes的service的type
- nodePort:如果上边选择的是NodePort,这里可以配置具体的端口号。
- route_table:配置FATE连接其他party的proxy和fateflow信息,假如要连接已经使用KubeFATE部署了的一个FATE,
- <party_id>: 其他party的id
- proxy:其他party的proxy信息,对应对方party的nginx的ip和port
- fateflow:其他party的fateflow信息,对应对方party的python模块的ip和grpcNodePort
- <party_id>: 其他party的id
-
rabbitmq:rabbitmq组件的一些配置
- nodeSelector:将 Pod 分配给某一节点,nodeselector
- type:rabbitmq端口的暴露方式,对应Kubernetes的service的type
- nodePort:如果上边选择的是NodePort,这里可以配置具体的端口号。
- default_user:rabbitmq的配置default_user
- default_pass:rabbitmq的配置default_pass
- user:rabbitmq的配置user
- password:rabbitmq的配置password
- route_table:配置FATE连接其他party的rabbitmq信息
- <party_id>: 其他party的id
- host:其他party的rabbitmq的入口ip
- port:其他party的rabbitmq的入口port
- <party_id>: 其他party的id
FATE-Serving的部署与上边一样,相同的配置可以参考双方共同部分。
如果要部署FATE-Serving需要三个模块[servingProxy, servingRedis, servingServer]。
使用cluster-serving.yaml,默认会部署一个FATE-Serving的集群。
默认的部署实现,体现在Kubernetes上的资源有以下这些:
kubernetes组件 | 资源实例 |
---|---|
Service | serving-proxy, serving-redis, serving-server |
Deployment | serving-proxy, serving-redis, serving-server |
Ingress | serving-proxy |
ConfigMap | serving-proxy-config, serving-redis-config, serving-server-config |
下面是FATE-Serving的集群的组件配置
-
servingProxy:servingProxy组件的一些配置
- nodePort:servingProxy端口的暴露方式,供其他party的serving集群连接
- ingerssHost:servingProxy的ingress host配置
- partyList:连接其他party的配置,其他party 组件servingProxy的ip和port
- nodeSelector:将 Pod 分配给某一节点
-
servingServer:servingServer组件的一些配置
- type:servingServer端口的暴露方式,对应Kubernetes的service的type
- nodePort:servingProxy端口的暴露方式,供自己的FATE(Training)集群的python模块连接
- fateflow:自己的FATE(Training)集群的fateflow httpNodePort的入口
- subPath:servingServer持久化的路径
- storageClass:持久化的storageClass
- existingClaim:是否使用已有PVC
- accessMode:访问模式
- size:所需PV的大小
- nodeSelector: 将 Pod 分配给某一节点
-
servingRedis:servingRedis组件的一些配置(就是普通redis)
- password:redis的密码
- nodeSelector: 将 Pod 分配给某一节点
- subPath:redis持久化的路径
- storageClass:持久化的storageClass
- existingClaim:是否使用已有PVC
- accessMode:访问模式
- size:所需PV的大小
如果只部署一个rollsite,则可以作为exchange 。
$ cat <<EOF | sudo tee cluster-exchange.yaml
name: fate-exchange
namespace: fate-exchange
chartName: fate
chartVersion: v1.5.0
partyId: exchange
modules:
- rollsite
rollsite:
type: NodePort
nodePort: 30001
partyList:
- partyId: 9999
partyIp: 192.168.9.1
partyPort: 30091
- partyId: 10000
partyIp: 192.168.10.1
partyPort: 30101
EOF
如果只部署一个servingProxy,则可以作为serving-exchange 。
$ cat <<EOF | sudo tee serving-exchange.yaml
name: fate-serving-exchange
namespace: fate-serving-exchange
chartName: fate-serving
chartVersion: v2.0.0
partyId: exchange
modules:
- servingProxy
servingProxy:
type: NodePort
nodePort: 30006
partyList:
- partyId: 9999
partyIp: 192.168.9.1
partyPort: 30091
- partyId: 10000
partyIp: 192.168.10.1
partyPort: 30101
EOF
当前版本v1.5.0,FATE on Spark不支持exchange模式.
如果你对KubeFATE有什么建议或者想法,可以在GitHubKubeFATE上提issue和PR
- KubeFATE:https://github.com/FederatedAI/KubeFATE
- FATE:https://github.com/FederatedAI/FATE
- Kubernetes官网:https://kubernetes.io/
- YAML:https://yaml.org/
Welcome to KubeFATE's wiki page.