NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

使用 KubeFATE 在 Kubernetes 上部署联邦学习集群

  • 2020-05-09
  • 本文字数:7771 字

    阅读完需:约 25 分钟

使用KubeFATE在Kubernetes上部署联邦学习集群

FATE(Federated AI Technology Enabler)是联邦机器学习技术的一个框架,其旨在提供安全的计算框架来支持联邦 AI 生态。在本专题,我们将介绍如何基于 FATE 架构从 0 到 1 部署联邦学习集群,本文是该系列的第四篇文章,旨在解决在 Kubernetes 部署运维 FATE 的问题。


背景及 KubeFATE 架构

在之前的文章中,我们介绍了如何使用 KubeFATE 部署一个基于 Docker Compose 的 FATE 联邦学习集群,以便于快速尝试体验联邦学习。但随着联邦学习的正式投入使用,训练集、模型都会逐渐变大。在生产环境里,我们会遇到以下问题:


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


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


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


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


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


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


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



KubeFATE 的 Kubernetes 部署两大模块:


1、KubeFATE 命令行工具:KubeFATE 的命令行是一个可执行的二进制文件,用户可以用它快速初始化、部署、管理 FATE 集群。KubeFATE 的命令行可以运行在 Kubernetes 外,与 KubeFATE 服务交互。中间使用 https 协议,可以进行 SSL 加密,并适配企业的防火墙规则。它的功能模块如下图所示:



2、KubeFATE 服务:KubeFATE 服务作为应用部署在 Kubernetes 上,对外提供 Restful APIs,可以容易与企业已有的网管运维等系统进行整合。

快速使用 KubeFATE 在一台 Linux 服务器上基于 MiniKube 部署两方联邦学习

为了更好的体验 KubeFATE 的功能,下面我们会一步一步演示如何使用 KubeFATE 部署一个两方的联邦学习集群并进行验证。最终的部署结构如下图:



本文共出现两台机器:


1、用来做 Demo 的机器,是一台 Linux 机器,参照如下前置条件第一点;


2、使用浏览器访问 FATE-Board 的机器,要求可以访问用来执行 Demo 的机器。

前置条件

1、一台 Linux 的服务器,我们测试好的 OS 版本是 Ubuntu 18.04 LTS,由于需要跑多方计算,服务器的推荐配置为:8 核,16G 内存以上;


2、两个域名分别给 KubeFATE 服务和 FATE-board 使用。如果没有 DNS 解析条件,可以通过设置 hosts 方式,后面的介绍基于这种情况;


3、Linux 服务器需要预先安装好 Docker 环境,具体参考 Install Docker in Ubuntu;


4、要保证安装机器可以正常访问 Docker Hub,以及 Google 存储;


5、预先创建一个目录,以便整个过程使用该目录作为工作目录,命令如下:


cd ~ && mkdir demo && cd demo
复制代码


注意:下文介绍的 MiniKube 机器 IP 地址是 10.160.112.145。请修改为你准备的实验机器 IP 地址!

安装需要工具

为了使用 KubeFATE 部署 FATE,我们需要以下工具:


1、MiniKube v1.7.3,如果我们已经有 Kubernetes 环境,可以直接跳转到部署 KubeFATE 服务;


2、kubectl v1.17.3:Kubernetes 的命令行,需要与具体 Kubernetes 版本对应,这里的版本是对应 MiniKube v1.7.3;


3、KubeFATE:


   - Release: v1.3.1-a   - 服务版本:v1.0.2   - 命令行版本:v1.0.2
复制代码

安装 kubectl

curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.17.3/bin/linux/amd64/kubectl && chmod +x ./kubectl && sudo mv ./kubectl /usr/bin
复制代码


执行完,可以验证是否成功:


layne@machine:~/demo$ kubectl version
Client Version: version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.3", GitCommit:"06ad960bfd03b39c8310aaf92d1e7c12ce618213", GitTreeState:"clean", BuildDate:"2020-02-11T18:14:22Z", GoVersion:"go1.13.6", Compiler:"gc", Platform:"linux/amd64"}
The connection to the server localhost:8080 was refused - did you specify the right host or port?
复制代码

安装 MiniKube

curl -LO https://github.com/kubernetes/minikube/releases/download/v1.7.3/minikube-linux-amd64 && mv minikube-linux-amd64 minikube && chmod +x minikube && sudo mv ./minikube /usr/bin
复制代码


验证安装结果:


layne@machine:~/demo$ minikube version
minikube version: v1.7.3
commit: 436667c819c324e35d7e839f8116b968a2d0a3ff
复制代码

下载 KubeFATE 的发布包并安装 KubeFATE 的命令行

我们从 Github 上 KubeFATE Release 页面找到 Kuberetes 部署的下载包,并下载。


curl -LO https://github.com/FederatedAI/KubeFATE/releases/download/v1.3.0-a/kubefate-k8s-v1.3.0-a.tar.gz && tar -xzf ./kubefate-k8s-v1.3.0-a.tar.gz
复制代码


然后我们可以查看下载解压的安装包内容:


layne@machine:~/demo$ ls
cluster.yaml config.yaml kubefate kubefate-k8s-v1.3.0-a.tar.gz kubefate.yaml rbac-config.yaml
复制代码


由于 KubeFATE 命令行是可执行二进制文件,可以直接移动到 path 目录方便使用。


chmod +x ./kubefate && sudo mv ./kubefate /usr/bin
复制代码


然后,我们测试下 kubefate 命令是否可用。


layne@machine:~/demo$ kubefate version
* kubefate service connection error, Get http://kubefate.net/v1/version: dial tcp: lookup kubefate.net: no such host
* kubefate commandLine version=v1.0.2
复制代码


我们发现获取 KubeFATE 服务版本报了个错,这是因为我们还没部署 KubeFATE 的服务;而命令行的版本已经正常显示出来了。


至此,我们需要的工具已经安装完成。

使用 MiniKube 安装 Kubernetes

MiniKube 支持使用不同的虚拟机来部署 Kubernetes,但是在 Linux 环境下,我们建议直接使用 Docker 方式。这个方式非常简单,只需要设置–vm-driver=none 即可。更多的说明参考:Install MiniKube - Install a Hypervisor。


sudo minikube start --vm-driver=none
复制代码


根据屏幕指引,稍等一小会。待到命令没有错误返回,我们可以验证下:


layne@machine:~/demo$ sudo minikube status
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured
复制代码


如果你的显示和上面一样,那恭喜你,一个单节点的 Kubernetes 已经部署好在你的服务器里了!但是,还有一个小步骤要做,因为我们 KubeFATE 通过 Ingress 向外提供服务,而 MiniKube 默认并没有启动 Ingress 模块,所以需要手动启动。


sudo minikube addons enable ingress
复制代码


到此,我们的 Kubernetes 也准备好了。

部署 KubeFATE 服务

创建 kube-fate 的命名空间以及账号


在我们的安装包里已经包含了相关的 yaml 文件 rbac-config.yaml,并且前面的准备工作已解压这个文件到你的工作目录。我们只需要直接执行。


kubectl apply -f ./rbac-config.yaml
复制代码


在 kube-fate 命名空间里部署 KubeFATE 服务


相关的 yaml 文件也已经准备在工作目录,直接使用 kubectl apply。


kubectl apply -f ./kubefate.yaml
复制代码


稍等一会,大概 10 几秒后用下面命令看下 KubeFATE 服务是否部署好 kubectl get all,ingress -n kube-fate。如果返回类似下面的信息(特别是 pod 的 STATUS 显示的是 Running 状态),则 KubeFATE 的服务就已经部署好并正常运行:


layne@machine:~/demo$ kubectl get all,ingress -n kube-fate
NAME READY STATUS RESTARTS AGE
pod/kubefate-6d576d6c88-mz6ds 1/1 Running 0 16s
pod/mongo-56684d6c86-4ff5m 1/1 Running 0 16s


NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubefate ClusterIP 10.111.165.189 <none> 8080/TCP 16s
service/mongo ClusterIP 10.98.194.57 <none> 27017/TCP 16s


NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/kubefate 1/1 1 1 16s
deployment.apps/mongo 1/1 1 1 16s


NAME DESIRED CURRENT READY AGE
replicaset.apps/kubefate-6d576d6c88 1 1 1 16s
replicaset.apps/mongo-56684d6c86 1 1 1 16s


NAME HOSTS ADDRESS PORTS AGE
ingress.extensions/kubefate kubefate.net 10.160.112.145 80 16s
复制代码

添加 kubefate.net 到 hosts 文件

因为我们要用 kubefate.net 域名来访问 KubeFATE 服务(该域名在 ingress 中定义,有需要可自行修改),需要在运行 kubefate 命令行所在的机器配置 hosts 文件(注意不一定是 Kubernetes 所在的机器)。如果网络环境有域名解析服务,可配置 kubefate.net 域名指向 MiniKube 机器的 IP 地址,这样就不用配置 hosts 文件。注意:下面地址 10.160.112.145 要替换为你的 MiniKube 机器地址。


sudo -- sh -c "echo \"10.160.112.145 kubefate.net\"  >> /etc/hosts"
复制代码


添加完毕后,可以验证是否生效:


layne@machine:~/demo$ ping -c 2 kubefate.net
PING kubefate.net (10.160.112.145) 56(84) bytes of data.
64 bytes from kubefate.net (10.160.112.145): icmp_seq=1 ttl=64 time=0.080 ms
64 bytes from kubefate.net (10.160.112.145): icmp_seq=2 ttl=64 time=0.054 ms


--- kubefate.net ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1006ms
rtt min/avg/max/mdev = 0.054/0.067/0.080/0.013 ms
复制代码


同时,如果我们重新执行 kubefate version,显示就会一切正常。


layne@machine:~/demo$ kubefate version
* kubefate service version=v1.0.2
* kubefate commandLine version=v1.0.2
复制代码


到此,所有准备工作完毕,下面我们可以开始安装 FATE 了。需要注意的是,上面的工作只需要做一次,后面如果添加、删除、更新 FATE 集群,上面的不需要重新执行。

使用 KubeFATE 安装 FATE

按照前面的计划,我们需要安装两联盟方,ID 分别 9999 与 10000。现实情况,这两方应该是完全独立、隔绝的组织,为了模拟现实情况,所以我们需要先为他们在 Kubernetes 上创建各自独立的命名空间(namespace)。


创建命名空间


我们创建命名空间 fate-9999 用来部署 9999,fate-10000 部署 10000


kubectl create namespace fate-9999
kubectl create namespace fate-10000
复制代码


准备各自的集群配置文件


KubeFATE 安装包包含了集群配置的简要配置参考文件 cluster.yaml,我们可以给每个参与方复制一份来修改配置。如果前面的步骤正确,这个文件已经在工作目录里。运行下面命令复制文件:


cp ./cluster.yaml fate-9999.yaml && cp ./cluster.yaml fate-10000.yaml
复制代码


按下面的配置修改 fate-9999.yaml


name: fate-9999
namespace: fate-9999
version: v1.3.0-a
partyId: 9999
modules:
- proxy
- egg
- fateboard
- fateflow
- federation
- metaService
- mysql
- redis
- roll
- python
proxy:
type: NodePort
nodePort: 30009
partyList:
- partyId: 10000
partyIp: 10.160.112.145
partyPort: 30010
egg: count: 1
复制代码


主要修改内容有:


1、删除 exchange 部分,为了简化配置,这里使用点对点连接的方式;


2、更改 proxy 模块的配置,设置监听的端口为 30009;


3、更改 partyList 部分,配置另外一端 10000 的 proxy 的 IP 与监听端口。注意,这里的 10.160.112.145 需要替换成你的服务器 IP 地址!端口需要与后面 fate-10000.yaml 里的 proxy 所设置的监听端口一致;


4、把 egg 的 count 由 3 改为 1。egg 是 FATE 的计算模块,由于我们用一台服务器模拟,为了节省资源,避免由于资源不够产生的报错,这里建议修改为 1。


fate-10000.yaml 的配置按照以下修改:


name: fate-10000
namespace: fate-10000
version: v1.3.0-a
partyId: 10000
modules:
- proxy
- egg
- fateboard
- fateflow
- federation
- metaService
- mysql
- redis
- roll
- python


proxy:
type: NodePort
nodePort: 30010
partyList:
- partyId: 9999
partyIp: 10.160.112.145
partyPort: 30009


egg:
count: 1
复制代码


与 fate-9999.yaml 的修改类似,


1、修改 name 为 fate-10000;


2、namespace 使用前面为 10000 方创建的 fate-10000;


3、partyId 设置为 10000;


4、删除 exchange 部分;


5、proxy 的 nodePort 修改为 30010,这个需要与 fate-9999.yaml 的 partyList 信息对应;


6、修改 partyList,使其指向 fate-9999.yaml 里的 proxy 配置;


7、同样修改 egg 模块的 count 为 1。


如果一切没有问题,那就可以使用 kubefate cluster install 来部署两个 fate 集群。


layne@machine:~/demo$ kubefate cluster install -f ./fate-9999.yaml
create job success, job id=a3dd184f-084f-4d98-9841-29927bdbf627
layne@machine:~/demo$ kubefate cluster install -f ./fate-10000.yaml
create job success, job id=370ed79f-637e-482c-bc6a-7bf042b64e67
复制代码


这个步骤需要去 Docker Hub 下载相关镜像,所以具体速度与服务器的网速有很大关系,如果网速快,或者镜像已经准备好在服务器上的话,大概 2、3 分钟可以部署完成。我们可以使用 kubefate job ls 命令观察部署情况。


layne@machine:~/demo$ kubefate job ls
UUID CREATOR METHOD STATUS STARTTIME CLUSTERID
a3dd184f-084f-4d98-9841-29927bdbf627 admin ClusterInstall Success 2020-03-10 12:26:39 2a15d783-67cd-4723-8a5c-50eb6355b6b0
370ed79f-637e-482c-bc6a-7bf042b64e67 admin ClusterInstall Success 2020-03-10 12:27:06 16270e8a-20b1-43c7-9c6c-385977d8dfc8
复制代码


如果发现 STATUS 如上面那样变成了 Success,证明部署成功完成。

验证 FATE 的部署

执行 FATE 自带的 toy_example 进行测试


toy_example 是 FATE 提供的快速测试集群连通性的用例。测试脚本设定 10000 为 host 端,9999 是 guest 端。我们采用集群模式执行。这个例子的具体说明可以参见:toy_example 的 README


FATE 规定由 guest 端发起训练,所以我们需要进入 fate-10000 的 python 容器。


layne@machine:~/demo$ kubectl get pod -n fate-10000|grep python*
python-dc94c9786-8jsgh 2/2 Running 0 3m13s
复制代码


其中,python-dc94c9786-8jsgh 是 python 这个 pod 的 ID(注意,下面命令的这个 ID 需要替换成你执行以上命令返回的具体 ID 值),我们用 kubectl exec 命令进入该容器。


kubectl exec -it python-dc94c9786-8jsgh -n fate-10000 -- /bin/bash
复制代码


并在容器内运行 toy_example。


(venv) [root@python-dc94c9786-8jsgh python]# cd examples/toy_example/ && python run_toy_example.py 10000 9999 1
stdout:{
"data": {
"board_url": "http://fateboard:8080/index.html#/dashboard?job_id=202003110905332206371&role=guest&party_id=10000",
"job_dsl_path": "/data/projects/fate/python/jobs/202003110905332206371/job_dsl.json",
"job_runtime_conf_path": "/data/projects/fate/python/jobs/202003110905332206371/job_runtime_conf.json",
"logs_directory": "/data/projects/fate/python/logs/202003110905332206371",
"model_info": {
"model_id": "guest-10000#host-9999#model",
"model_version": "202003110905332206371"
}
},
"jobId": "202003110905332206371",
"retcode": 0,
"retmsg": "success"
}
job status is running
job status is running
job status is running
job status is running
job status is running
job status is running
job status is running
"2020-03-11 09:05:39,911 - secure_add_guest.py[line:101] - INFO: begin to init parameters of secure add example guest"
"2020-03-11 09:05:39,911 - secure_add_guest.py[line:104] - INFO: begin to make guest data"
"2020-03-11 09:05:42,576 - secure_add_guest.py[line:107] - INFO: split data into two random parts"
"2020-03-11 09:05:51,661 - secure_add_guest.py[line:110] - INFO: share one random part data to host"
"2020-03-11 09:05:52,444 - secure_add_guest.py[line:113] - INFO: get share of one random part data from host"
"2020-03-11 09:05:57,566 - secure_add_guest.py[line:116] - INFO: begin to get sum of guest and host"
"2020-03-11 09:05:58,571 - secure_add_guest.py[line:119] - INFO: receive host sum from guest"
"2020-03-11 09:05:58,643 - secure_add_guest.py[line:126] - INFO: success to calculate secure_sum, it is 2000.0"
(venv) [root@python-dc94c9786-8jsgh toy_example]#
复制代码


如果你的输出与上面相似,最后返回 INFO: success to calculate secure_sum, it is xxxx,即表明训练成功,换言之,也就是 FATE-Cluster 顺利安装。


查看 FATE-Board


KubeFATE 会配置 FATE-Board 以格式 http://{serviceurl}服务。所以:


FATE-9999 的 FATE-Board 的 URL 为:http://9999.fateboard.kubefate.net/


FATE-10000 的 FATE-Board 的 URL 为:http://10000.fateboard.kubefate.net/


如果我们没有相关的 DNS 服务,我们需要在访问以上域名的机器,也就是浏览器所在的机器配上相关的 hosts,使上面域名指向部署 FATE 的服务器。在本例子里,就是 10.160.112.145,这个需要根据你实际的 IP 地址来配置。如果是 MacOS 或者 Linux 可以使用以下命令配置:


sudo -- sh -c "echo \"10.160.112.145 9999.fateboard.kubefate.net\"  >> /etc/hosts"
sudo -- sh -c "echo \"10.160.112.145 10000.fateboard.kubefate.net\" >> /etc/hosts"
复制代码


如果是 Windows,我们需要:


10.160.112.145 9999.fateboard.kubefate.net
10.160.112.145 10000.fateboard.kubefate.net
复制代码


添加到 C:\WINDOWS\system32\drivers\etc\hosts,具体方法也可以参考相关资料。然后我们就可以用浏览器访问 Party-9999 和 Party-10000 的 FATE-Board。


Party-9999 会显示为 host 端任务完成



Party-10000 会显示为 guest 端任务完成



KubeFATE 开源项目:


https://github.com/FederatedAI/KubeFATE


FATE 开源项目:


https://github.com/FederatedAI/FATE


作者介绍:


彭麟,VMware 云原生实验室工程师,FATE/KubeFATE 项目贡献者。


相关文章:


《用 FATE 进行图片识别的联邦学习实践》


《使用 KubeFATE 快速部署联邦学习实验开发环境(一)》


《使用 KubeFATE 快速部署联邦学习实验开发环境(二)》


公众号推荐:

跳进 AI 的奇妙世界,一起探索未来工作的新风貌!想要深入了解 AI 如何成为产业创新的新引擎?好奇哪些城市正成为 AI 人才的新磁场?《中国生成式 AI 开发者洞察 2024》由 InfoQ 研究中心精心打造,为你深度解锁生成式 AI 领域的最新开发者动态。无论你是资深研发者,还是对生成式 AI 充满好奇的新手,这份报告都是你不可错过的知识宝典。欢迎大家扫码关注「AI前线」公众号,回复「开发者洞察」领取。

2020-05-09 10:562699

评论

发布
暂无评论
发现更多内容

快速掌握并发编程---Semaphore原理和实战

田维常

并发编程

央行数字货币亮相 吹皱一池春水

CECBC

数字货币 银行

快速掌握并发编程---ArrayBlockingQueue 底层原理和实战

田维常

并发编程

快速掌握并发编程---深入学习Condition

田维常

并发编程

元模型驱动(三):构建我们自己的元模型-KAYA

KaYa

DDD Kaya MDA MDD 元建模

快速掌握并发编程---synchronized篇(上)

田维常

并发编程

CICD实战——服务自动测试

TARS基金会

微服务 单元测试 CI/CD

TarsCpp 组件之 MySQL 操作

TARS基金会

c++ MySQL 数据库 微服务 TARS

快速掌握并发编程---synchronized篇(下)

田维常

并发编程

真爽!蚂蚁金服大牛整理SpringBoot+Cloud离线版

996小迁

架构 面试 springboot SpringCloud

架构师训练营第六周作业

邓昀垚

极客大学架构师训练营

积极参与数字货币等国际规则制定,塑造新的竞争优势

CECBC

疫情 经济

2020年区块链行业十大趋势

CECBC

区块链 技术人才

架构师训练营第二周作业

lakers

极客大学架构师训练营

OPPO安全重磅出击 剑指安全与隐私保护

OPPO安全

安全 隐私保护 个人隐私安全 OPPO安全

架构师训练营第六周总结

邓昀垚

极客大学架构师训练营

架构师训练营第二周

M.

TarsCpp 组件 之 智能指针详解

TARS基金会

c++ 微服务 智能指针 TARS

架构师训练营第二周总结

lakers

极客大学架构师训练营

嵌入式面试之《Linux系统编程100问》

哒宰的自我修养

Linux 线程 网络编程 进程

快速掌握并发编程---基础篇

田维常

并发编程

容器、Docker、虚拟机,别再傻傻分不清

华为云开发者联盟

容器 虚拟化

2020年9月公有云性能评测:UCloud、腾讯云屈居二三名,冠军竟然是它?

博睿数据

云计算 公有云 评测 排行榜

架构师训练营第 1 期 第 6 周作业

李循律

极客大学架构师训练营

甲方日常42

句子

工作 随笔杂谈 日常

架构师训练营第 1 期 -- 第六周作业

发酵的死神

极客大学架构师训练营

十八般武艺玩转GaussDB(DWS)性能调优(三):好味道表定义

华为云开发者联盟

数据 分布式存储

快速掌握并发编程---CountDownLatch原理和实战

田维常

并发编程

大企程序员亲身经历告诉你,CRM系统,自己的才是最好的

Philips

敏捷开发

LeetCode题解:90. 子集 II,递归+for循环+回溯,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

科大讯飞翻译系统变身“随身翻译官” 助力粤港澳大湾区一体化建设

Talk A.I.

使用KubeFATE在Kubernetes上部署联邦学习集群_AI&大模型_彭麟_InfoQ精选文章