高品质的音视频能力是怎样的? | Qcon 全球软件开发大会·上海站邀请函 了解详情
写点什么

使用 KubeFATE 快速部署联邦学习实验开发环境(一)

  • 2020-05-08
  • 本文字数:5246 字

    阅读完需:约 17 分钟

使用KubeFATE快速部署联邦学习实验开发环境(一)

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


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 的工作流程主要分成两部分,分别是


根据用户定义的配置文件生成 FATE 集群的启动文件。


拷贝启动文件到指定机器上,并使用 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


文章接下来的部分将跟大家分享单节点的联邦学习平台如何部署。


目标

部署一套 FATE 集群,集群内拥有“FATE 整体架构”中描述的所有部件。具体部署架构如下所示:



准备工作

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


在目标机上安装 Docker


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


验证安装


# 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 - CommunityEngine: 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
复制代码


在目标机上安装 Docker-Compose


# 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
复制代码


验证安装


# docker-compose version
docker-compose version 1.25.4, build unknowndocker-py version: 4.2.0CPython version: 2.7.17OpenSSL version: OpenSSL 1.1.1 11 Sep 2018
复制代码


在目标机上下载 Docker 镜像(可选)


对于国内用户来说从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
复制代码


验证下载镜像


# docker imagesREPOSITORY                         TAG federatedai/egg                    1.3.0-releasefederatedai/fateboard              1.3.0-releasefederatedai/meta-service           1.3.0-releasefederatedai/python                 1.3.0-releasefederatedai/roll                   1.3.0-releasefederatedai/proxy                  1.3.0-releasefederatedai/federation             1.3.0-releasefederatedai/serving-server         1.2.2-releasefederatedai/serving-proxy          1.2.2-releaseredis                              5mysql                              8
复制代码


在部署机上下载并解压 Kubefate1.3 的 kubefate-docker-compose.tar.gz 资源包


# curl -OL https://github.com/FederatedAI/KubeFATE/releases/download/v1.3.0/kubefate-docker-compose.tar.gz
# tar -xzf kubefate-docker-compose.tar.gz
复制代码


在部署机上定义需要部署的实例数目


进入docker-deploy目录
# cd docker-deploy/
编辑parties.conf如下
# vi parties.conf
user=root dir=/data/projects/fate partylist=(10000) partyiplist=(192.168.1.1) #此处替换为目标机的IPservingiplist=(192.168.1.1) #此处替换为目标机的IPexchangeip=
复制代码


在部署机上执行生成集群启动文件脚本


# bash generate_config.sh          # 生成部署文件
复制代码


在部署机上执行启动集群脚本


# bash docker_deploy.sh all
命令输入后需要用户输入两次目标机的root用户的密码
复制代码


在目标机上验证集群状态


# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESf8ae11a882ba 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_1d72995355962 fatetest/python:1.3.0-release "/bin/bash -c 'sourc…" 5 days ago Up 5 days 9360/tcp, 9380/tcp confs-10000_python_1dffc70fc68ac 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_1dc23d75692b0 fatetest/roll:1.3.0-release "/bin/sh -c 'cd roll…" 7 days ago Up 7 days 8011/tcp confs-10000_roll_17e52b1b06d1a fatetest/meta-service:1.3.0-release "/bin/sh -c 'java -c…" 7 days ago Up 7 days 8590/tcp confs-10000_meta-service_150a6323f5cb8 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_14526f8e57004 redis:5 "docker-entrypoint.s…" 7 days ago Up 7 days 6379/tcp confs-10000_redis_1586f3f2fe191 fatetest/federation:1.3.0-release "/bin/sh -c 'cd /dat…" 7 days ago Up 7 days 9394/tcp confs-10000_federation_1ec434dcbbff1 mysql:8 "docker-entrypoint.s…" 7 days ago Up 7 days 3306/tcp, 33060/tcp confs-10000_mysql_168b1d6c68b6c 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_17937ecf2974e redis:5 "docker-entrypoint.s…" 32 hours ago Up 32 hours 6379/tcp serving-10000_redis_100a8d98021a6 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
复制代码


在目标机上验证集群是否正确安装


# 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 的实例(单方)部署完成,后续文章将介绍如何部署多方互联进行联邦学习的训练。


常见问题

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


进入egg容器
# docker exec -it confs-xxxx_egg_1 bash
查看storage-service日志
# cat storage-service-cxx/logs/error.log
复制代码


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


KubeFATE 开源项目:


https://github.com/FederatedAI/KubeFATE


FATE 开源项目:


https://github.com/FederatedAI/FATE


作者介绍:


陈家豪,VMware 云原生实验室工程师,FATE/KubeFATE 项目贡献者。


相关文章:


《使用 KubeFATE 快速部署联邦学习实验开发环境(二)》


《用 FATE 进行图片识别的联邦学习实践》


2020-05-08 10:592271

评论

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

Enhanced Github:一个 GitHub 专用的好插件

非著名程序员

GitHub 程序员 效率工具

职场“潜”规则

俊毅

个人成长 职场 新人 人才培养 能力模型

回“疫”录(22):我以为结束了,其实才开始

小天同学

疫情 回忆录 现实纪录 纪实

一个产品最不重要的东西

Neco.W

产品 外包 产品经理

Redis6.0 多线程源码分析

代码诗人

redis 源码 技术 线程模型

SQLite是什么

山楂大卷

sqlite 数据库 RDBMS 存储

Android | Tangram动态页面之路(五)Tangram原理

哈利迪

android

万字长文带你看懂Mybatis缓存机制

程序员小岑

Java 源码 技术 mybatis

往日之歌

彭宏豪95

kotlin 200行代码开发一个简化版Guice

陈吉米

Java kotlin guice ioc mynlp

一个前端工程师与死神的较量

陈辰

大前端 压力 医院 生活质量 工程师

ARTS_20200520

凌轩

Java ARTS 打卡计划

深入剖析ThreadLocal原理

JFound

Java

Java 25周年:MovedByJava之观点

范学雷

Java 架构 编程语言

分布式系统选主怎么玩

奈学教育

分布式系统

程序员的修行之路-人生是一场修行

牧马人

程序员

nginx 概念及上手

HelloZyjS

Spring Security+Spring Data Jpa 强强联手,安全管理只有更简单!

江南一点雨

Java spring Spring Boot spring security

Java开发架构篇:DDD模型领域层决策规则树服务设计

小傅哥

领域驱动设计 DDD 小傅哥 重构

企业数字化转型:用 SpreadJS 打造互通互链的电力系统物联网

葡萄城技术团队

数字化转型 SpreadJS 电力

程序员需要了解的硬核知识大全

cxuan

Java c 计算机基础

Django的ListView超详细用法(含分页paginate功能)

BigYoung

Python django ListView 分页

我的编程之路-4(进阶)

顿晓

进阶 看书 编程之路

Elastic Stack 系列专辑

Yezhiwei

elasticsearch Logstash Kibana ELK Elastic Stack

Spring Security 如何将用户数据存入数据库?

江南一点雨

Java spring Spring Cloud Spring Boot spring security

敏捷为什么会失败之「PA-SA-WAKA-DA」理论

Worktile

Scrum 敏捷开发 Agile

为提升网点业务员效率,我们做的事情。

黄大路

商业

SpringBoot瘦身

JFound

Spring Boot sprnig

竟然有人想看我的「日记」,满足一下大家

非著名程序员

学习 程序人生 提升认知

Redis 命令执行过程(下)

程序员历小冰

redis 源码分析

游戏夜读 | 写游戏用什么语言?

game1night

使用KubeFATE快速部署联邦学习实验开发环境(一)_AI_陈家豪_InfoQ精选文章