【AICon】探索RAG 技术在实际应用中遇到的挑战及应对策略!AICon精华内容已上线73%>>> 了解详情
写点什么

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


公众号推荐:

2024 年 1 月,InfoQ 研究中心重磅发布《大语言模型综合能力测评报告 2024》,揭示了 10 个大模型在语义理解、文学创作、知识问答等领域的卓越表现。ChatGPT-4、文心一言等领先模型在编程、逻辑推理等方面展现出惊人的进步,预示着大模型将在 2024 年迎来更广泛的应用和创新。关注公众号「AI 前线」,回复「大模型报告」免费获取电子版研究报告。

AI 前线公众号
2020-05-09 10:562682

评论

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

linux环境下实现银行间算法

乌龟哥哥

6月月更

前端之uni-app研究学习day_1

恒山其若陋兮

6月月更

M_8:设计消息队列存储消息数据的 MySQL 表格

Jadedev

架构训练营

等个有“源”人|OpenHarmony 成长计划学生挑战赛报名启动

OpenHarmony开发者

OpenHarmony

设计消息队列存储消息数据的 MySQL 表格

踩着太阳看日出

架构训练营

MySql索引

工程师日月

6月月更

【Java Web系列】Cookie工作流程及基本使用

倔强的牛角

Java javaWeb Cookie 6月月更

FFmpeg原理

Loken

ffmpeg 音视频课程

【Python技能树共建】selenium入手篇

梦想橡皮擦

Python 6月月更

细数攻防演练中十大关键防守点

穿过生命散发芬芳

6月月更 攻防演练

InfoQ 极客传媒 15 周年庆征文|简述构建微服务架构的四大挑战

阿泽🧸

微服务 6月月更 InfoQ极客传媒15周年庆

数组

Jason199

数组 js 数组操作 6月月更

设计消息队列存储信息数据的MySQL表结构

danny_xian

深入剖析 | 应用层Protocol的标准设计

九叔(高翔龙)

架构 协议 TCP/IP dubbo源码 粘包/拆包

InfoQ 极客传媒 15 周年庆征文|ZooKeeper进阶(一):Zookeeper简介

No Silver Bullet

zookeeper 运维 6月月更 InfoQ极客传媒15周年庆

vivo大规模 Kubernetes 集群自动化运维实践

vivo互联网技术

Kubernetes operator ansible kubeadm Kubevirt

中国SaaS产业全景图谱

小炮

【建议收藏】通俗易懂图解网络知识-第一篇

利志分享

C#入门系列(十三) -- 初识结构体

陈言必行

C# 6月月更

Springboot 升级到 2.6.1 的坑

Damon

微服务 微服务架构 Spring Cloud 6月月更

『Three.js』场景 Scene

德育处主任

canvas three.js 6月月更

【愚公系列】2022年06月 面向对象设计原则(七)-迪米特法则

愚公搬代码

6月月更

在 Golang 中构建 CRUD 应用程序

宇宙之一粟

6月月更

实战模拟│企业微信机器人实时报错预警

机器人 企业微信 监控告警 预警 6月月更

iShot

IT蜗壳-Tango

6月日更 6月月更

转:基于Springcloud的服务治理落地实践

小江

Spring Cloud 微服务治理

龙蜥社区 5 月技术委员会会议顺利召开,新一代操作系统研发路线图发布

OpenAnolis小助手

开源 操作系统 龙蜥社区 技术委员会 新版本

JavaScrip模块模式

大熊G

JavaScript 前端 6月月更

spring4.1.8扩展实战之二:Aware接口揭秘

程序员欣宸

Java spring Spring Framework 6月月更

Linux开发_介绍BMP图片上下翻转、添加水印

DS小龙哥

6月月更

应用最广泛的动态路由协议:OSPF

wljslmz

OSPF 动态路由 6月月更

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