0


FATE联邦学习框架之KubeFATE部署(基于K8S)最详细过程

概述:FATE(Federated AI Technology Enabler)是一个联邦学习框架,能有效帮助多个机构在满足用户隐私保护、数据安全和政府法规的要求下,进行数据使用和建模。但由于其系统的分布式特性,导致使用存在一定门槛。鉴于此,微众银行联合VMware一起开发了KubeFATE项目,致力于降低FATE的使用门槛和系统运维成本。本文将首先分析FATE的整体架构,帮助读者理解各部件的作用;然后将展示如何从一台Linux机器开始,通过KubeFATE一步一步来搭建联邦学习的实验环境。(这些全部都是官方的介绍大家稍微看一下就好)

这篇博客详细记录了我如何按照官方文档在一台CentOS7的虚拟机上通过MinKube部署KubeFATE,包括踩过的所有坑以及解决方案。官方文档参考

KubeFATE/Build_Two_Parties_FATE_Cluster_in_One_Linux_Machine_with_MiniKube_zh.md at develop-1.8.0 · FederatedAI/KubeFATE (github.com)a

按照官方文档来几乎是一步一个坑,坑坑爬两天,(官方文档种并没有考虑到国内的网络因素)所以在配置过程种遇到了很多问题。

前置条件:

  1. 一台Linux的服务器,我们测试好的OS版本是CentOS Linux release 7.9.2009 (Core). 由于需要跑多方计算,服务器的推荐配置为:8核,16G内存以上;(如果不设置8核后续可能会报问题)
  2. 三个域名分别给KubeFATE服务,Jupyter Notebook和FATE-board使用。如果没有DNS解析条件,可以通过设置hosts方式,后面的介绍基于这种情况;(这个暂时不需要提前做,在后续的步骤会进行操作)
  3. Linux服务器需要预先安装好Docker环境,详情见(4条消息) 快速安装docker和docker-comopose_顿顿有鱼有虾的博客-CSDN博客
  4. 预先给image pull secrets设置好用户名和密码(这一步操作我并没有执行,在我的理解下这一步是为了在拉取镜像的时候进行加速,但我没看懂怎么操作所以没弄,我怀疑我遇到的那些问题可能是因为没有做这一步)
  5. 要保证安装机器可以正常访问Docker Hub或者网易云镜像仓库,以及Google gcr;(能联网)
  6. 预先创建一个目录,以便整个过程使用该目录作为工作目录,命令如下: export release_version=v1.8.0 && export kubefate_version=v1.4.4 && cd ~ && mkdir demo && cd demo## 接下来正式开始安装:(为了简单省事我使用的用户角色是root)

为了使用KubeFATE部署FATE,我们需要以下工具。以下版本是经过验证的版本。基于向前兼容原则,我们假设高于以下版本的Minikube和kubectl也能够正常工作。(这是官方给的版本)

  1. MiniKube: v1.19.0
  2. kubectl: v1.19.0

安装 kubectl

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

安装解压一条龙完成之后接下来进行验证

[root@control-plane demo]# kubectl version
Client Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.0", GitCommit:"e19964183377d0ec2052d1f1fa930c4d7575bd50", GitTreeState:"clean", BuildDate:"2020-08-26T14:30:33Z", GoVersion:"go1.15", Compiler:"gc", Platform:"linux/amd64"}
#大概率还会出现一个80端口的问题,如果这时候出现可以先不用管

接下来安装MiniKube

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

安装完成之后进行验证:

[root@control-plane demo]# minikube version
minikube version: v1.19.0   
commit: 15cede53bdc5fe242228853e737333b09d4336b5
 #这里实际上应该就是v1.19.0 官方那里给的下载连接就是v1.19.0显示出来并不是官方给的v1.21.0

使用MiniKube安装Kubernetes(开始进入折磨阶段)

先别急着复制接下来的代码,先看官方给出的教程以及接下来的分析

sudo minikube start --vm-driver=none --kubernetes-version v1.19.0

如果直接按照官方给的教程来弄的话,那么肯定会有一个问题就是拉不下来镜像会显示timeout超时,这是因为他默认去国外去拉镜像去了,因为某些众所周知的原因他还翻不过去,拉不下来。

这时候应该怎么办呢,如果你去百度会找到一堆复制粘贴但毫无用处的办法。一个办法是采用国内的源去拉。在此之前你需要安装conntrack,如果你不安装在执行这一步的过程同样会报错提示你安装

yum install -y conntrack

接下来按照下边的代码去下载启动minikube

sudo minikube start --vm-driver=none --kubernetes-version v1.19.0 --image-mirror-country='cn'

加入 --image-mirror-country='cn' 会自动使用国内的阿里云的镜像,执行这一步的时候并不会报错,但是会有个隐藏的问题,如果不解决后边会一直错。如果这时候你查看Pod会发现有一个pod并没有运行。storage-provisioner

[root@control-plane demo]# kubectl get pod -A      #查看Pod

NAMESPACE     NAME                               READY   STATUS             RESTARTS   AGE
kube-system   coredns-6c76c8bb89-qsvmm           1/1     Running            0          99s
kube-system   etcd-minikube                      1/1     Running            0          117s
kube-system   kube-apiserver-minikube            1/1     Running            0          117s
kube-system   kube-controller-manager-minikube   1/1     Running            0          117s
kube-system   kube-proxy-7fmdh                   1/1     Running            0          99s
kube-system   kube-scheduler-minikube            1/1     Running            0          117s
kube-system   storage-provisioner                0/1     ImagePullBackOff   0          115s

查看storage-provisioner找出问题,大概会出现以下情况,也可能并不完全类似

[root@control-plane demo]# kubectl -n kube-system describe pod storage-provisioner

Events:
  Type     Reason            Age                 From               Message
  ----     ------            ----                ----               -------
  Warning  FailedScheduling  2m12s               default-scheduler  0/1 nodes are available: 1 node(s) had taint {node.kubernetes.io/not-ready: }, that the pod didn't tolerate.
  Warning  FailedScheduling  2m12s               default-scheduler  0/1 nodes are available: 1 node(s) had taint {node.kubernetes.io/not-ready: }, that the pod didn't tolerate.
  Normal   Scheduled         115s                default-scheduler  Successfully assigned kube-system/storage-provisioner to minikube
  Normal   BackOff           33s (x6 over 114s)  kubelet            Back-off pulling image "registry.cn-hangzhou.aliyuncs.com/google_containers/k8s-minikube/storage-provisioner:v5"
  Normal   Pulling           19s (x4 over 115s)  kubelet            Pulling image "registry.cn-hangzhou.aliyuncs.com/google_containers/k8s-minikube/storage-provisioner:v5"
  Warning  Failed            18s (x4 over 115s)  kubelet            Failed to pull image "registry.cn-hangzhou.aliyuncs.com/google_containers/k8s-minikube/storage-provisioner:v5": rpc error: code = Unknown desc = Error response from daemon: pull access denied for registry.cn-hangzhou.aliyuncs.com/google_containers/k8s-minikube/storage-provisioner, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
  Warning  Failed            18s (x4 over 115s)  kubelet            Error: ErrImagePull
  Warning  Failed            5s (x7 over 114s)   kubelet            Error: ImagePullBackOff

从图中的信息我们可以发现一条关键错误信息

Failed to pull image "registry.cn-hangzhou.aliyuncs.com/google_containers/k8s-minikube/storage-provisioner:v5": rpc error: code = Unknown desc = Error response from daemon: pull access denied for registry.cn-hangzhou.aliyuncs.com/google_containers/k8s-minikube/storage-provisioner, repository does not exist or may require 'docker login': denied: requested access to the resource is denied

我们查看刚刚我们所下载的docker image

docker images

发现镜像名称
实际是

registry.cn-hangzhou.aliyuncs.com/google_containers/storage-provisioner(或者并没有这个镜像)

并非是

registry.cn-hangzhou.aliyuncs.com/google_containers/k8s-minikube/storage-provisioner

接下来我们解决这个问题。

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/storage-provisioner:v5

docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/storage-provisioner:v5 
registry.cn-hangzhou.aliyuncs.com/google_containers/k8s-minikube/storage-provisioner:v5

minikube image load registry.cn-hangzhou.aliyuncs.com/google_containers/k8s-minikube/storage-provisioner:v5

这三步分别代表拉取镜像、修改镜像名字、重新加载镜像。

执行完这三步再查看Pod应该就已经是在运行了。

如果还不行就关了

minikube stop

再重新启动

sudo minikube start --vm-driver=none --kubernetes-version v1.19.0 --image-mirror-country='cn'

成功后进行验证,出现如下内容则说明安装成功。

[root@control-plane demo]# minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured

启动Ingress模块

这一步同样是个坑,先看官方给的方法

sudo minikube addons enable ingress

如果按照官方给的办法,大概率这一步骤会死在verification这一步,原因还是在启动的时候会去下载镜像,但是默认是从国外下载,所以还是下载不下来,所以会发生timeout。

解决办法:通过下载yaml配置文件(此方法可能已经失效,部署nginx可以参考k8s部署nginx服务_顿顿有鱼有虾的博客-CSDN博客)

wget https://cdn.jsdelivr.net/gh/jasonkayzk/kubernetes-learn@book-learn/chapter5/ingress-nginx/deploy.yaml

执行上述命令会下载一个deploy.yaml配置文件。在这个文件里可以配置对外暴露Ingress服务的时候,需要固定node上的端口(也可以不配置,在这里我没有进行更改)

下载完成之后可以使用以下命令进行部署

kubectl apply -f deploy.yaml

之后系统会自动进行安装配置,可以通过如下命令检查是否安装成功:

kubectl get pods -n ingress-nginx \
  -l app.kubernetes.io/name=ingress-nginx

如果出现以下情况则说明安装成功

NAME                                        READY   STATUS      RESTARTS   AGE
ingress-nginx-admission-create-btdp7        0/1     Completed   0          147m
ingress-nginx-admission-patch-f5z22         0/1     Completed   1          147m
ingress-nginx-controller-69df8c9c8d-f7dv9   1/1     Running     0          147m

输入如下命令,检查配置是否生效:

[root@control-plane demo]# kubectl -n ingress-nginx get svc
NAME                                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             NodePort    10.100.227.20   <none>        80:31476/TCP,443:32344/TCP   23h
ingress-nginx-controller-admission   ClusterIP   10.111.26.99    <none>        443/TCP                      23h

注意:我这里80端口对应的是31476,在配置的时候要注意你自己的对应端口,后面会用到。

下载KubeFATE命令行工具

我们从Github上 KubeFATE Release页面找到Kuberetes部署的下载包,并下载对应版本,如前面环境变量设置

v1.8.0(你也可以下载其他的版本,建议根据官方版本来)
curl -LO https://github.com/FederatedAI/KubeFATE/releases/download/v1.8.0/kubefate-k8s-v1.8.0.tar.gz && tar -xzf ./kubefate-k8s-v1.8.0.tar.gz

完成上述解压下载一条龙之后,我们可以查看下载解压的安装包内容,

cd kubefate

kubefate ls

会看到以下内容

cluster-serving.yaml cluster-spark-rabbitmq.yaml cluster.yaml examples rbac-config.yaml
cluster-spark-pulsar.yaml cluster-spark-slim.yaml config.yaml kubefate.yaml

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

chmod +x ./kubefate && sudo mv ./kubefate /usr/bin

测试下kubefate命令是否可用,

kubefate@machine:~/kubefate$ kubefate version
* kubefate commandLine version=v1.4.4
* kubefate service connection error, resp.StatusCode=404, error: <?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
        <head>
                <title>404 - Not Found</title>
        </head>
        <body>
                <h1>404 - Not Found</h1>
                <script type="text/javascript" src="//wpc.75674.betacdn.net/0075674/www/ec_tpm_bcon.js"></script>
        </body>
</html>

404not found是正常的

部署Kubefate服务

1.载入Kubefate服务镜像

接着,我们下载KubeFATE服务镜像v1.4.4:

curl -LO https://github.com/FederatedAI/KubeFATE/releases/download/v1.8.0/kubefate-v1.4.4.docker

注意:前边是v1.8.0后边是v1.4.4

然后读入本地Docker环境

docker load < kubefate-v1.4.4.docker

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

在我们的安装包里已经包含了相关的yaml文件

rbac-config.yaml

,并且前面的准备工作已解压这个文件到你的工作目录。我们只需要直接执行,

kubefate@machine:~/kubefate kubectl apply -f ./rbac-config.yaml

因为近期Dockerhub调整了下载限制服务条例 Dockerhub latest limitation, 我建议使用国内网易云的镜像仓库代替官方Dockerhub

sed 's/mariadb:10/hub.c.163.com\/federatedai\/mariadb:10/g' kubefate.yaml > kubefate_163.yaml
sed 's/registry: ""/registry: "hub.c.163.com\/federatedai"/g' cluster.yaml > cluster_163.yaml

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

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

kubectl apply

kubectl apply -f ./kubefate_163.yaml

稍等一会,大概10几秒后用下面命令看下KubeFATE服务是否部署好

kubectl get all,ingress -n kube-fate

。如果返回类似下面的信息(特别是pod的STATUS显示的是Running状态),则KubeFATE的服务就已经部署好并正常运行:


kubefate@machine:~/demo$ kubectl get all,ingress -n kube-fate
NAME                            READY   STATUS    RESTARTS   AGE
pod/kubefate-5d97d65947-7hb2q   1/1     Running   0          51s
pod/mariadb-69484f8465-44dlw    1/1     Running   0          51s

NAME               TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
service/kubefate   ClusterIP   192.168.0.111   <none>        8080/TCP   50s
service/mariadb    ClusterIP   192.168.0.112   <none>        3306/TCP   50s

NAME                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/kubefate   1/1     1            1           51s
deployment.apps/mariadb    1/1     1            1           51s

NAME                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/kubefate-5d97d65947   1         1         1       51s
replicaset.apps/mariadb-69484f8465    1         1         1       51s

NAME                          HOSTS          ADDRESS          PORTS   AGE
ingress.extensions/kubefate   example.com   192.168.100.123   80      50s

这个要等一会再查看,如果第一次查看不对的话,在等一会再执行一次看看对不对。

.添加example.com到hosts文件

因为我们要用 example.com 域名来访问KubeFATE服务(该域名在ingress中定义,有需要可自行修改),需要在运行kubefate命令行所在的机器配置hosts文件(注意不一定是Kubernetes所在的机器)。 另外下文中部署的FATE集群默认也是使用

example.com

作为默认域名,在部署的时候可以参考:FATE cluster configuration部分进行修改。 如果网络环境有域名解析服务,可配置example.com域名指向MiniKube机器的IP地址,这样就不用配置hosts文件。注意:下面地址192.168.100.123 要替换为你的MiniKube机器地址。(IP地址一定要换成你自己的)

sudo -- sh -c "echo \"192.168.100.123 example.com\"  >> /etc/hosts"

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

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

--- example.com 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服务

这一步有新的坑。先看官方文档给的内容

kubefate@machine:~/kubefate$ kubefate version
* kubefate service version=v1.4.4
* kubefate commandLine version=v1.4.4

实际情况是在你执行的时候会发现只显示

 kubefate commandLine version=v1.4.4

然后还会给你报个错,80端口连接失败。

解决办法:

[root@control-plane kubefate]# ls
cluster_163.yaml           cluster-spark-rabbitmq.yaml  config.yaml  kubefate_163.yaml       minikube-linux-amd64
cluster-serving.yaml       cluster-spark-slim.yaml      dashboard    kubefate-v1.4.4.docker  rbac-config.yaml
cluster-spark-pulsar.yaml  cluster.yaml                 examples     kubefate.yaml

在这里你可以看到一个config.yaml文件

使用vi修改config.yaml的内容。只需要修改serviceurl: example.com:31476加上映射的端口,这个在前面有说过,如果忘记了重新查看一下80端口对应的映射端口

[root@control-plane demo]# kubectl -n ingress-nginx get svc
NAME                                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             NodePort    10.100.227.20   <none>        80:31476/TCP,443:32344/TCP   23h
ingress-nginx-controller-admission   ClusterIP   10.111.26.99    <none>        443/TCP                      23h

修改完成查看一下,显示如下:

[root@control-plane kubefate]# more config.yaml 
# TODO
# persistent layer

log:
  level: info
user:
  username: admin
  password: admin

serviceurl: example.com:31476

完成上述修改之后再此执行发现就没问题了。

[root@control-plane kubefate]# kubefate version
* kubefate commandLine version=v1.4.4
* kubefate service version=v1.4.4

到此,所有准备工作完毕,下面我们可以开始安装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

在exmaple目录下,我们已经预先设置了两个例子:**

/kubefate/examples/party-9999/

/kubefate/examples/party-10000

对于

/kubefate/examples/party-9999/cluster.yaml

**,我们可以将其修改如下:

name: fate-9999
namespace: fate-9999
chartName: fate
chartVersion: v1.8.0
partyId: 9999
registry: "hub.c.163.com/federatedai"   #换成国内镜像仓库
imageTag: "1.8.0-release"
pullPolicy:
imagePullSecrets:
- name: myregistrykey
persistence: false
istio:
  enabled: false
podSecurityPolicy:
  enabled: false
ingressClassName: nginx
modules:
  - rollsite
  - clustermanager
  - nodemanager
  - mysql
  - python
  - fateboard
  - client

backend: eggroll

ingress:
  fateboard:
    hosts:
    - name: party9999.fateboard.example.com
  client:  
    hosts:
    - name: party9999.notebook.example.com

rollsite:
  type: NodePort
  nodePort: 30091
  partyList:
  - partyId: 10000
    partyIp: 192.168.100.123    #换成自己的IP
    partyPort: 30101

python:
  type: NodePort
  httpNodePort: 30097
  grpcNodePort: 30092
  logLevel: INFO

servingIp: 192.168.100.123     #换成自己的IP
servingPort: 30095

对于**

/kubefate/examples/party-10000/cluster.yaml

**,我们可以将其修改如下:

name: fate-10000
namespace: fate-10000
chartName: fate
chartVersion: v1.8.0
partyId: 10000
registry: "hub.c.163.com/federatedai"   #换成国内镜像仓库
imageTag: "1.8.0-release"
pullPolicy:
imagePullSecrets:
- name: myregistrykey
persistence: false
istio:
  enabled: false
podSecurityPolicy:
  enabled: false
ingressClassName: nginx
modules:
  - rollsite
  - clustermanager
  - nodemanager
  - mysql
  - python
  - fateboard
  - client

backend: eggroll

ingress:
  fateboard:
    hosts:
    - name: party10000.fateboard.example.com
  client:  
    hosts:
    - name: party10000.notebook.example.com

rollsite:
  type: NodePort
  nodePort: 30101
  partyList:
  - partyId: 9999
    partyIp: 192.168.100.123    #换成自己的IP地址
    partyPort: 30091

python:
  type: NodePort
  httpNodePort: 30107
  grpcNodePort: 30102
  logLevel: INFO

servingIp: 192.168.100.123   #换成自己的IP地址
servingPort: 30105

注意: 我们强烈建议阅读以下文档

cluster.yaml

中具体配置的含义,请参考: KubeFATE/FATE_cluster_configuration.md at master · FederatedAI/KubeFATE · GitHub

(官方给的文档,可以好好看看)

安装FATE集群

如果一切没有问题,那就可以使用

kubefate cluster install

来部署两个fate集群了,(没遇到坑的步骤按照官方的执行就可以)

kubefate@machine:~/kubefate$ kubefate cluster install -f examples/party-9999/cluster.yaml
create job success, job id=2c1d926c-bb57-43d3-9127-8cf3fc6deb4b
kubefate@machine:~/kubefate$ kubefate cluster install -f examples/party-10000/cluster.yaml
create job success, job id=7752db70-e368-41fa-8827-d39411728d1b

这时候,KubeFATE会创建两个任务去分别部署两个FATE集群。我们可以通过

kubefate job ls

来查看任务,或者直接

watch

KubeFATE中集群的状态,直至变成

Running
kubefate@machine:~/kubefate$ watch kubefate cluster ls
UUID                                    NAME            NAMESPACE       REVISION        STATUS  CHART   ChartVERSION    AGE
51476469-b473-4d41-b2d5-ea7241d5eac7    fate-9999       fate-9999       1               Running fate    v1.8.0          88s
dacc0549-b9fc-463f-837a-4e7316db2537    fate-10000      fate-10000      1               Running fate    v1.8.0          69s

因为这个步骤需要到网易云镜像仓库去下载约10G的镜像,所以第一次执行视乎你的网络情况需要一定时间(耐心等待上述下载过程,直至状态变成Running)。 检查下载的进度可以用

kubectl get po -n fate-9999
kubectl get po -n fate-10000

全部的镜像下载完成后,结果会呈现如下样子,

NAME                             READY   STATUS    RESTARTS   AGE
clustermanager-bcfc6866d-nfs6c   1/1     Running   0          12m
mysql-c77b7b94b-zblt5            1/1     Running   0          12m
nodemanager-0-5599db57f4-2khcg   2/2     Running   0          12m
nodemanager-1-7c986f9454-qcscd   2/2     Running   0          12m
python-57b66d96bd-vj8kq          3/3     Running   0          12m
rollsite-7846898d6d-j2gb9        1/1     Running   0          12m

验证FATE的部署

通过以上的

kubefate cluster ls

命令, 我们得到

fate-9999

的集群ID是

51476469-b473-4d41-b2d5-ea7241d5eac7

, 而

fate-10000

的集群ID是

dacc0549-b9fc-463f-837a-4e7316db2537

. 我们可以通过

kubefate cluster describe

查询集群的具体访问信息,

kubefate@machine:~/demo$ kubefate cluster describe 51476469-b473-4d41-b2d5-ea7241d5eac7
UUID            51476469-b473-4d41-b2d5-ea7241d5eac7
Name            fate-9999                                  
NameSpace       fate-9999                                  
ChartName       fate                                       
ChartVersion    v1.8.0                                     
Revision        1                                          
Age             15h                                        
Status          Running                                    
Spec            backend: eggroll                           
                chartName: fate                            
                chartVersion: v1.8.0                       
                imagePullSecrets:                          
                - name: myregistrykey                      
                imageTag: 1.8.0-release                    
                ingress:                                   
                  client:                                  
                    annotations:                           
                      kubernetes.io/ingress.class: nginx   
                    hosts:                                 
                    - name: party9999.notebook.example.com 
                  fateboard:                               
                    annotations:                           
                      kubernetes.io/ingress.class: nginx   
                    hosts:                                 
                    - name: party9999.fateboard.example.com
                istio:                                     
                  enabled: false                           
                modules:                                   
                - rollsite                                 
                - clustermanager                           
                - nodemanager                              
                - mysql                                    
                - python                                   
                - fateboard                                
                - client                                   
                name: fate-9999                            
                namespace: fate-9999                       
                partyId: 9999                              
                persistence: false                         
                podSecurityPolicy:                         
                  enabled: false                           
                pullPolicy: null                           
                python:                                    
                  grpcNodePort: 30092                      
                  httpNodePort: 30097                      
                  type: NodePort                           
                registry: ""                               
                rollsite:                                  
                  nodePort: 30091                          
                  partyList:                               
                  - partyId: 10000                         
                    partyIp: 10.192.173.64                 
                    partyPort: 30101                       
                  type: NodePort                           
                servingIp: 10.192.173.64                   
                servingPort: 30095                         
                                                           
Info            dashboard:                                 
                - party9999.notebook.example.com           
                - party9999.fateboard.example.com          
                ip: 10.192.173.64                          
                port: 30091                                
                status:                                    
                  containers:                              
                    client: Running                        
                    clustermanager: Running                
                    fateboard: Running                     
                    mysql: Running                         
                    nodemanager-0: Running                 
                    nodemanager-0-eggrollpair: Running     
                    nodemanager-1: Running                 
                    nodemanager-1-eggrollpair: Running     
                    python: Running                        
                    rollsite: Running                      
                  deployments:                             
                    client: Available                      
                    clustermanager: Available              
                    mysql: Available                       
                    nodemanager-0: Available               
                    nodemanager-1: Available               
                    python: Available                      
                    rollsite: Available          

从返回的内容中,我们看到

Info->dashboard

里包含了:

  • Jupyter Notebook的访问地址: party9999.notebook.example.com。这个是我们准备让数据科学家进行建模分析的平台。已经集成了FATE-Clients;
  • FATEBoard的访问地址: party9999.fateboard.example.com。我们可以通过FATEBoard来查询当前训练的状态。

类似的命令我们得到,

fate-10000

的Jupyter Notebook和FATEBoard地址分别是:

party10000.notebook.example.com

以及

party10000.fateboard.example.com

在浏览器访问FATE集群的机器上配置相关的Host信息

注意: 如果DNS已经配置了相关的解析,这步可以跳过

在准备打开浏览器的Linux或MacOS机器通过以下命令配置,(你想用哪台电脑打开,就需要在哪台电脑进行配置)

sudo -- sh -c "echo \"192.168.100.123 party9999.notebook.example.com\"  >> /etc/hosts"
sudo -- sh -c "echo \"192.168.100.123 party9999.fateboard.example.com\"  >> /etc/hosts"
sudo -- sh -c "echo \"192.168.100.123 party10000.notebook.example.com\"  >> /etc/hosts"
sudo -- sh -c "echo \"192.168.100.123 party10000.fateboard.example.com\"  >> /etc/hosts"

注意:IP地址换成自己的IP

如果是Windows机器,我们需要把相关域名解析配置到

C:\WINDOWS\system32\drivers\etc\hosts

,请查阅KubeFATE/Windows_add_host_tutorial.md at master · ChrisChenSQ/KubeFATE (github.com)

执行例子进行验证

访问

party9999.notebook.example.com:31476
party9999.fateboard.example.com:31476
party10000.notebook.example.com:31476
party10000.fateboard.example.com:31476
注意31476换成自己的端口。

通过以上4个网址可以通过浏览器访问

fate-9999

fate-10000

各自的Jupyter Notebook与FATEBoard,共4个Dashboards,

打开

pipeline/pipeline_tutorial_upload.ipynb

并执行这个脚本来上传数据。我们需要在

9999

10000

两方的

然后打开

pipeline/pipeline_tutorial_hetero_sbt.ipynb

并执行训练和预测任务。具体信息可以参考脚本上的注释。

这里收录了更多的Jupyter notebook脚本:FATE/doc/tutorial/pipeline at master · FederatedAI/FATE · GitHub

notebook截图:

当训练任务结束是,我们可以在fateboard上查看训练任务的流程图和结果:

到此所有配置结束。如有问题留言讨论。


本文转载自: https://blog.csdn.net/qq_32202885/article/details/125998028
版权归原作者 顿顿有鱼有虾 所有, 如有侵权,请联系我们删除。

“FATE联邦学习框架之KubeFATE部署(基于K8S)最详细过程”的评论:

还没有评论