前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >KubeFATE: 用云原生技术赋能联邦学习(一)

KubeFATE: 用云原生技术赋能联邦学习(一)

作者头像
Henry Zhang
发布2023-04-18 16:11:12
3320
发布2023-04-18 16:11:12
举报
文章被收录于专栏:亨利笔记

题图摄于北海公园

联邦学习是AI领域一个新兴的方向,被认为是 AI 领域最重要的研究和应用趋势之一。联邦学习可在用户之间进行联合建模,构造精确的人工智能模型,同时数据不用离开机构,可以保证双方数据的隐私安全性,应用前景广阔,因此,联邦学习已经得到越来越广泛的关注。 我们 VMware 云原生实验室的团队参与了联邦学习开源项目 FATE 和 KubeFATE 的开发,文后附有作者相关课程的视频。

(本文作者系VMware云原生实验室工程师陈家豪,FATE / KubeFATE开源联邦学习项目的贡献者。)

概述

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

FATE 整体架构

一个正常工作的 FATE 集群里面包含了若干组件,其中有些负责任务调度、有些负责存储,各个组件各司其职,联合起来一起完成任务。一个 FATE 集群所包含的组件如下图所示。

 FATE整体架构图

各个服务的功能描述如下:

  • FATE Flow:该服务分为 Client 和Server两部分,其中Client部分由用户使用,用于向FATE集群提交联邦学习任务;FATE Flow Server是FATE集群对外提供服务的入口,同时它也负责调度、执行用户提交的任务请求和协调任务参与方。
  • MySQL:与任务相关的一些元数据,如创建时间,状态都会存在MySQL中。
  • EGG/ROLL:向训练任务提供了分布式计算和存储能力。
  • Meta Service:一组数据或一个文件,可以被切片并分布在不同的Egg上,Meta service负责管理和定位文件的切片信息。
  • Federation:由于联邦学习的特殊性质,在训练中,各个参与方之间往往会进行若干次数据互换。该服务为训练任务提供发送和接受数据的功能。
  • Proxy:该服务是一个反向代理,是FATE集群对外(训练其他参与方)的唯一入口。
  • FATE Board:向用户提供训练任务的可视化。
  • FATE Serving:在线推理服务,用户可以把训练好模型推送到该服务后作在线推理。

KubeFATE简介

由于FATE集群包含了众多服务,并且每一个服务的启动都需要不同的配置和依赖,以至于使用存在一定门槛。此外由于多个服务之间有相互依赖,一个服务的失败可能导致整个集群的不可用,这给系统的运维也带来了一定的挑战。基于这个出发点,VMware和微众联合开发了KubeFATE项目,致力于解决联邦学习的使用门槛和降低运维的成本。目前,KubeFATE和FATE最新的版本为1.3.0,本文后续所有与它们相关的操作都将基于此版本。

由于KubeFATE使用了容器技术对FATE进行了封装,因此相对于传统的安装部署,使用KubeFATE有以下优点:

1. 使用简单,免除缺失依赖软件包的烦恼。

2. 配置方便,一个配置文件就能部署多套集群。

3. 管理灵活,可按需增减集群规模。

4. 适用于云环境。

目前KubeFATE支持使用Docker-Compose和Kubernetes两种方式来部署和管理FATE集群,分别面向了测试开发和生产这两种使用场景。本文主要关注于测试开发的部署,因此在接下来的部署中会使用Docker-Compose这种方式。Kubernetes的方式将另文叙述。

KubeFATE的工作流程主要分成两部分,分别是

  1. 根据用户定义的配置文件生成FATE集群的启动文件。
  2. 拷贝启动文件到指定机器上,并使用docker-compose命令启动容器。

通常,负责生成启动文件的服务器称为部署机,而负责运行容器的服务器称为目标机,部署机和目标机是在逻辑上的划分。在本文中,部署机和目标机为同一台机器。

部署机与目标机关系图

使用KubeFATE和Docker-Compose来部署单节点联邦学习平台

由于KubeFATE使用了容器作为其底层工具,因此在开始使用KubeFATE之前,这里也简单介绍下容器、Docker等相关的概念。

容器也称Linux Container(简称LXC),它是与系统其他部分隔离开的一系列进程,主要由Namespace和Cgroup两大机制来保证实现。其优点是:

1. 高资源利用与隔离

2. 轻量级

3. 跨Linux发行

Docker属于 LXC的一种封装,提供简单易用的容器使用接口。它可以将应用程序与依赖,打包在一个文件里面,而当程序要运行的时候,Docker就为这个程进行一些配置,使得该进程与系统中的其他进程隔离。总体来说,Docker向用户提供了一套简单易用的接口,以至于用户可以很方便使用容器。而Docker-Compose 是对Docker 容器进行编排的工具,通过它用户可以很方便的配置和管理多个容器。至于更多关于Docker的详细资料,请大家参考Docker 官网:https://www.docker.com

代码语言:javascript
复制
代码语言:javascript
复制
文章接下来的部分将跟大家分享单节点的联邦学习平台如何部署。
代码语言:javascript
复制
代码语言:javascript
复制
目标
代码语言:javascript
复制
部署一套FATE集群,集群内拥有“FATE整体架构”中描述的所有部件。具体部署架构如下所示:
代码语言:javascript
复制

部署架构图

代码语言:javascript
复制
代码语言:javascript
复制
准备工作

一台机器,虚拟机或者物理机,推荐2CPU,8GB内存,Linux操作系统并且能联网,并以root用户登录。下文中部署机器和目标机器为同一台,IP地址为192.168.1.1 。

在目标机上安装Docker

代码语言:javascript
复制
# curl -fsSL https://get.docker.com -o get-docker.sh
# sh get-docker.sh
# usermod -aG docker $(whoami)
# exec $SHELL
代码语言:javascript
复制

验证安装

代码语言:javascript
复制
# docker version

Client: Docker Engine - Community
 Version:           19.03.7
 API version:       1.40
 Go version:        go1.12.17
 Git commit:        7141c199a2
 Built:             Wed Mar  4 01:22:36 2020
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
Engine:
  Version:          19.03.7
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.17
  Git commit:       7141c199a2
  Built:            Wed Mar  4 01:21:08 2020
代码语言:javascript
复制
代码语言:javascript
复制
在目标机上安装Docker-Compose
代码语言:javascript
复制
代码语言:javascript
复制
# curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-#(uname -s)-#(uname -m)" -o /usr/local/bin/docker-compose

# chmod +x /usr/local/bin/docker-compose
代码语言:javascript
复制
代码语言:javascript
复制
验证安装
代码语言:javascript
复制
# docker-compose version

docker-compose version 1.25.4, build unknown
docker-py version: 4.2.0
CPython version: 2.7.17
OpenSSL version: OpenSSL 1.1.1  11 Sep 2018
代码语言:javascript
复制
代码语言:javascript
复制
在目标机上下载Docker 镜像(可选)
代码语言:javascript
复制
代码语言:javascript
复制
对于国内用户来说从Dockerhub上下载镜像可能会比较慢,可用以下方式代替:
# wget https://webank-ai-1251170195.cos.ap-guangzhou.myqcloud.com/fate_1.3.0-images.tar.gz 

# docker load -i fate_1.3.0-images.tar.gz 
代码语言:javascript
复制
代码语言:javascript
复制
验证下载镜像
代码语言:javascript
复制
# docker images
REPOSITORY                         TAG 
federatedai/egg                    1.3.0-release
federatedai/fateboard              1.3.0-release
federatedai/meta-service           1.3.0-release
federatedai/python                 1.3.0-release
federatedai/roll                   1.3.0-release
federatedai/proxy                  1.3.0-release
federatedai/federation             1.3.0-release
federatedai/serving-server         1.2.2-release
federatedai/serving-proxy          1.2.2-release
redis                              5
mysql                              8
代码语言:javascript
复制
在部署机上下载并解压Kubefate1.3的kubefate-docker-compose.tar.gz资源包
代码语言:javascript
复制
代码语言:javascript
复制
# curl -OL https://github.com/FederatedAI/KubeFATE/releases/download/v1.3.0/kubefate-docker-compose.tar.gz

# tar -xzf kubefate-docker-compose.tar.gz
代码语言:javascript
复制
在部署机上定义需要部署的实例数目
代码语言:javascript
复制
进入docker-deploy目录

# cd docker-deploy/

编辑parties.conf如下

# vi parties.conf 

user=root                                   
dir=/data/projects/fate                     
partylist=(10000)                      
partyiplist=(192.168.1.1)       #此处替换为目标机的IP
servingiplist=(192.168.1.1)     #此处替换为目标机的IP
exchangeip=
代码语言:javascript
复制
代码语言:javascript
复制
在部署机上执行生成集群启动文件脚本
代码语言:javascript
复制
代码语言:javascript
复制
# bash generate_config.sh          # 生成部署文件
代码语言:javascript
复制
代码语言:javascript
复制
在部署机上执行启动集群脚本
代码语言:javascript
复制
代码语言:javascript
复制
# bash docker_deploy.sh all

命令输入后需要用户输入两次目标机的root用户的密码
代码语言:javascript
复制
代码语言:javascript
复制
在目标机上验证集群状态
代码语言:javascript
复制
代码语言:javascript
复制
# docker ps

CONTAINER ID        IMAGE                                     COMMAND                  CREATED             STATUS              PORTS                                 NAMES
f8ae11a882ba        fatetest/fateboard:1.3.0-release      "/bin/sh -c 'cd /dat…"   5 days ago          Up 5 days           0.0.0.0:8080->8080/tcp                confs-10000_fateboard_1
d72995355962        fatetest/python:1.3.0-release         "/bin/bash -c 'sourc…"   5 days ago          Up 5 days           9360/tcp, 9380/tcp                    confs-10000_python_1
dffc70fc68ac        fatetest/egg:1.3.0-release            "/bin/sh -c 'cd /dat…"   7 days ago          Up 7 days           7778/tcp, 7888/tcp, 50001-50004/tcp   confs-10000_egg_1
dc23d75692b0        fatetest/roll:1.3.0-release           "/bin/sh -c 'cd roll…"   7 days ago          Up 7 days           8011/tcp                              confs-10000_roll_1
7e52b1b06d1a        fatetest/meta-service:1.3.0-release   "/bin/sh -c 'java -c…"   7 days ago          Up 7 days           8590/tcp                              confs-10000_meta-service_1
50a6323f5cb8        fatetest/proxy:1.3.0-release          "/bin/sh -c 'cd /dat…"   7 days ago          Up 7 days           0.0.0.0:9370->9370/tcp                confs-10000_proxy_1
4526f8e57004        redis:5                                   "docker-entrypoint.s…"   7 days ago          Up 7 days           6379/tcp                              confs-10000_redis_1
586f3f2fe191        fatetest/federation:1.3.0-release     "/bin/sh -c 'cd /dat…"   7 days ago          Up 7 days           9394/tcp                              confs-10000_federation_1
ec434dcbbff1        mysql:8                                   "docker-entrypoint.s…"   7 days ago          Up 7 days           3306/tcp, 33060/tcp                   confs-10000_mysql_1
68b1d6c68b6c        federatedai/serving-proxy:1.2.2-release    "/bin/sh -c 'java -D…"   32 hours ago        Up 32 hours         0.0.0.0:8059->8059/tcp, 0.0.0.0:8869->8869/tcp, 8879/tcp   serving-10000_serving-proxy_1
7937ecf2974e        redis:5                                    "docker-entrypoint.s…"   32 hours ago        Up 32 hours         6379/tcp                                                   serving-10000_redis_1
00a8d98021a6        federatedai/serving-server:1.2.2-release   "/bin/sh -c 'java -c…"   32 hours ago        Up 32 hours         0.0.0.0:8000->8000/tcp                                     serving-10000_serving-server_1
代码语言:javascript
复制
代码语言:javascript
复制
在目标机上验证集群是否正确安装
代码语言:javascript
复制
代码语言:javascript
复制
# docker exec -it confs-10000_python_1 bash

# cd /data/projects/fate/python/examples/toy_example

# python run_toy_example.py 10000 10000 1

如果测试通过,屏幕将显示类似如下消息:

"2019-08-29 07:21:25,353 - secure_add_guest.py[line:96] - INFO: begin to init parameters of secure add example guest"
"2019-08-29 07:21:25,354 - secure_add_guest.py[line:99] - INFO: begin to make guest data"
"2019-08-29 07:21:26,225 - secure_add_guest.py[line:102] - INFO: split data into two random parts"
"2019-08-29 07:21:29,140 - secure_add_guest.py[line:105] - INFO: share one random part data to host"
"2019-08-29 07:21:29,237 - secure_add_guest.py[line:108] - INFO: get share of one random part data from host"
"2019-08-29 07:21:33,073 - secure_add_guest.py[line:111] - INFO: begin to get sum of guest and host"
"2019-08-29 07:21:33,920 - secure_add_guest.py[line:114] - INFO: receive host sum from guest"
"2019-08-29 07:21:34,118 - secure_add_guest.py[line:121] - INFO: success to calculate secure_sum, it is 2000.0000000000002"

通过上述步骤,一个FATE的实例(单方)部署完成,后续文章将介绍如何部署多方互联进行联邦学习的训练。

代码语言:javascript
复制
常见问题

如果前文的“toy_example”尝试数次后仍没有跑过,可以考虑是否因CPU版本太旧以至于指令集不支持的问题。具体操作如下:

代码语言:javascript
复制
1.    进入egg容器

# docker exec -it confs-xxxx_egg_1 bash

2.    查看storage-service日志

# cat storage-service-cxx/logs/error.log

如果日志出现“Illegal instruction (core dumped)”则考虑使用CPU更新点的服务器重新部署。如果该日志没有输出则可以通过docker log的方式逐个查看服务日志以定位具体问题。

(未完待续)

日前,本文作者陈家豪为大家分享的联邦学习直播课程视频回顾:

相关文章:

联邦学习:人工智能的最后一公里


如果你对联邦学习感兴趣,可申请加入“KubeFATE开源社区群”交流,入群需要真实身份,并改昵称:姓名@单位。请先关注“亨利笔记”公众号,在公众号后台发送"FATE"信息即可。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 亨利笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
联邦学习
联邦学习(Federated Learning,FELE)是一种打破数据孤岛、释放 AI 应用潜能的分布式机器学习技术,能够让联邦学习各参与方在不披露底层数据和底层数据加密(混淆)形态的前提下,通过交换加密的机器学习中间结果实现联合建模。该产品兼顾AI应用与隐私保护,开放合作,协同性高,充分释放大数据生产力,广泛适用于金融、消费互联网等行业的业务创新场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档