写点什么

使用 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:563007

评论

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

到底什么是Event Loop?那就来了解一下JavaScript分别在浏览器和Node环境下的运行机制吧

零一

JavaScript 大前端

想学IT的必看!漫谈MySQL权限安全,分享一点面试小经验

欢喜学安卓

android 程序员 面试 移动开发

阿里一战封神,百万人跪求的Java面试手册终于开源;

Java架构师迁哥

使用Redis,你必须知道的21个注意要点

Java 数据库 redis 架构 面试

万众瞩目的EGG Network,备受期待的New-DeFi自治共识论坛在海口闭幕

币圈那点事

区块链

FlinkSQL 平台

shengjk1

flink flink sql flink sql 平台

一文搞懂Flink SQL执行过程

shengjk1

flink flink源码 flink sql flink sql 执行过程

SDK介绍及相关功能测试

行者AI

测试 sdk

图解TCP的通信机制

零一

TCP 网络

4层板到12层板叠层经典设计方案

不脱发的程序猿

28天写作 电路设计 3月日更 PCB PCB布局

Swift 5创建和使用Framework, XCFramework 从入门到精通 John 易筋 ARTS 打卡 Week 42

John(易筋)

ARTS 打卡计划 Framework XCFramework

SQLServer性能调优方法小结

嘉为蓝鲸

数据库 sql 运维 SqlServer MAXDOP

Python OpenCV 图像处理二值化,取经之旅第 7 天

梦想橡皮擦

3月日更

Flink 计算 TopN

shengjk1

flink flink 实战 flink topN

JVM G1GC的算法与实现

Yano

Java JVM GC G1GC

已拿到蚂蚁金服Offer!阿里内部二十三万字Java面试题总结

Java架构追梦

Java 阿里巴巴 架构 面试 金三银四

【LeetCode】扁平化嵌套列表迭代器Java题解

Albert

算法 LeetCode 3月日更

快速使用Vue3最新的15个常用API(1W5+字详解,建议收藏)

零一

vue.js 大前端 Vue3

硬件工程师必备,常用元器件封装速查表

不脱发的程序猿

28天写作 电路设计 3月日更 元器件封装速查表 电子设计

寻找被遗忘的勇气(二十三)

Changing Lin

3月日更

Flink 计算 PV UV

shengjk1

flink flink 实战

如何在3分钟内实现音频变声和趣味音效?

拍乐云Pano

音视频 RTC 出海社交 社交泛娱乐

一文搞懂 FlinkSQL函数 LAST_VALUE 的原理

shengjk1

flink flink sql flink 源码

Flink 提交作业运行的各种模式总结

shengjk1

flink flink 执行

一文搞懂 Flink 中的锁

shengjk1

flink flink 锁

Dubbo的设计理念原来就藏在这三张图中

中间件兴趣圈

dubbo RPC

Python-计算机视觉-OpenCV-调色板

Aldeo

Python OpenCV

Redis新版本开始引入多线程,谈谈你的看法?

Java架构师迁哥

超全Android中高级面试复习大纲,在线面试指南

欢喜学安卓

android 程序员 面试 移动开发

java deep vs shallow copies

shengjk1

Java deep copy shallow cop

一文搞懂 FlinkSQL 的 KafkaSource

shengjk1

flink flink源码 flink sql

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