写点什么

使用 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 快速部署联邦学习实验开发环境(二)》


2020-05-09 10:562936

评论

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

基于DMS的数仓智能运维服务,知多少?

华为云开发者联盟

数据库 后端 监控 智能运维

浅谈Service Mesh对业务系统的价值

HelloGeek

微服务 云原生 server mesh 微服务治理

酷开科技 × StarRocks:统一 OLAP 分析引擎,全面打造数字化的 OTT 模式

StarRocks

GaussDB(for Redis)安全性相关设置体验【华为云至简致远】

科技怪咖

面试不再被吊打!这才是Redis分布式锁的七种方案的正确打开方式

程序员小毕

Java 架构 面试 分布式 分布式锁

华为ECS云服务器上安装Docker及部署Redis详细教程【华为云至简致远】

科技怪咖

开源一夏 | 十分钟 教你IDEA 远程debugger SpringBoot项目

Geek_32c728

开源 8月月更

云图说丨初识华为云微服务引擎CSE

华为云开发者联盟

微服务 云服务 华为云

中小微企业如何简单便捷、低成本实现数字化?360视觉云有妙招

ToB行业头条

如何避免无效的沟通

观测云

视频人脸识别和图片人脸识别的关系

夏夜许游

人脸识别 视频人脸识别

【技术白皮书】第一章:OCR智能文字识别新发展——深度学习的文本信息抽取

合合技术团队

自然语言处理 深度学习 AI OCR 信息抽取

【技术白皮书】第二章:OCR智能文字识别回顾——自然语言文本发展历程

合合技术团队

深度学习 AI OCR 自然语言 信息抽取

国内首发可视化智能调优平台,小龙带你玩转KeenTune UI

OpenAnolis小助手

开源 龙蜥社区 sig KeenTune 一键式性能调优

完整的搭建内网穿透ngrok详细教程(有图有真相)

Geek_32c728

签约计划第三季

关于 Intel 在 micro-vm 快速启动的探索及实例演示 | 第 36-38 期

OpenAnolis小助手

云原生 cpu 开源社区 sig 龙蜥大讲堂

基于云ModelArts的PPO算法玩“超级马里奥兄弟”【华为云至简致远】

科技怪咖

绝无此例!用实例演示如何使用Spring搭建微服务框架

Java永远的神

spring 面试 微服务 springboot SpringCloud

企业如何选择低代码开发平台

力软低代码开发平台

「一篇终结JVM」:Java面试必问十个JVM核心知识点梳理

Java全栈架构师

Java 程序员 面试 程序人生 JVM

从零开始搭建MySQL主从复制架构

杨杰灵

Java MySQL 主从复制

高效的组织信息共享知识库是一种宝贵的资源

Geek_da0866

基于Java的插件化集成项目实践

阿提说说

微服务 插件化

为何微博又双叒叕崩溃了?

华仔

秀到飞起!Alibaba全新出品JDK源码学习指南(终极版)限时开源

Java全栈架构师

程序员 程序人生 jdk源码 Java 面试 架构师

一键进入华为云会议,长期免费值得所有开发团队有一套【华为云至简致远】

科技怪咖

可复现、开放科研、跨学科合作:数据驱动下的科研趋势及应用方案

ModelWhale

数据分析 代码复现 开放生态 协同软件 科研成果

ICDAR比赛技术分享

之家技术

算法 人工只能 竞赛 ICDAR

CC2530_ZigBee+华为云IOT:设计一套属于自己的冷链采集系统

华为云开发者联盟

IoT 华为云 冷链

如何面向对象编程?程序员:我也要先有"对象"啊

华为云开发者联盟

Python 编程 后端 开发

融云「音视频架构实践」技术专场【内含完整PPT】

融云 RongCloud

音视频技术

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