天道不一定酬所有勤
但是,天道只酬勤

开源联邦学习框架 FATE 部署指南及问题总结

GitHub 22k Star 的Java工程师成神之路,不来了解一下吗!

随着移动互联网、云计算、物联网等信息技术的蓬勃发展,世界进入了数据爆炸的”大数据时代”。在各行各业,数据都发挥着至关重要的作用,越来越多的场景需要多方数据的流通和共享。如我们所在的场景金融部门,则需要借助外部金融数据,结合我们的场景业务数据进行联合建模,实现联合风控、数字营销、智能反诈、精准获客等。

但与此同时,横亘在我们面前的仍然几个重要的问题需要解决:

1、“数据孤岛“现象普遍存在;数据流通安全性风险高;

2、数据合规监管日趋严格;隐私泄露导致信任鸿沟;

如何能够在数据价值挖掘的同时,有效的做到隐私保护,这是促进数字经济发展的共同理想和合作共赢的核心诉求。隐私保护计算在跨机构数据协同、数据的”可见不可用”等方面提供了行之有效的解决之道。

隐私保护计算经过很多年的发展,在具体的落地实现的技术上,主要有三个主流的方向:

1、基于密码学的多方安全计算(MPC)

2、基于可信硬件的可信执行环境(TEE)

3、基于混合技术方案的联邦学习(FL)

其中联邦学习因为其不依赖硬件、可以解决复杂的算法建模问题等优势,虽然相比其他方案存在着一定的效率问题,但是随着技术的发展,如何突破性能瓶颈,达到实用性、安全性的平衡,并进一步提升安全性,这些问题终将被解决。所以,这项技术被认为是”人工智能的最后一公里”、”下一代人工智能协同算法和协作网络的基础”。

市面上也有很多联邦学习框架,如微众银行开源的FATE、字节开源的FedLearner、百度开源的PaddleFL等。其中 FATE 被使用的最广泛,被认为是联邦学习的样板项目。

于是,我们基于 FATE 部署了一套测试环境,提供给算法同学用于验证。本次是采用了 Docker Compose部署的方式,部署版本是v1.5.0。其他部署方式见:FATE 官方文档

搭建过程

环境准备

首先我们在阿里云ECS 上申请了3台云服务器。配置为8核16G。三台机器其中两台作为工作机,一台作为部署机。

关闭3台机器的防火墙

# 关闭防火墙
sudo systemctl stop firewalld
# 查看防火墙状态
sudo systemctl status firewalld

在3台机器上都安装 Docker

# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# Step 3: 安装Docker
sudo yum install docker-ce docker-ce-cli containerd.io
# Step 4: 开启Docker服务
sudo service docker start
# 验证Docker是否正确安装。
sudo docker run hello-world

在3台机器上都安装 docker-compose

# step 1: 下载Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# step 2: 增加可执行权限
sudo chmod +x /usr/local/bin/docker-compose
# step 3: 创建指向/usr/bin的符号链接
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
# step 4: 测试安装结果
sudo docker-compose --version

在3台机器上都创建用户并设定密码

# 新增用户fate
sudo useradd -s /bin/bash -g docker -d /home/fate fate
# 设置用户密码
sudo passwd fate

在部署机生成私钥,并发送给两台工作机

# step 1: 生成公私钥
ssh-keygen
# step 2: 发送到partyA
ssh-copy-id -i ~/.ssh/id_rsa.pub fate@192.168.0.9
# step 3: 发送到partyB
ssh-copy-id -i ~/.ssh/id_rsa.pub fate@192.168.0.10

需要替换192.168.0.9和192.168.0.10两个 ip

安装 FATE

以下操作均在部署机执行:

下载安装包

# 下载
wget https://github.com/FederatedAI/KubeFATE/releases/download/v1.5.0/kubefate-docker-compose-v1.5.0.tar.gz
# 解压
tar -xvf kubefate-docker-compose-v1.5.0.tar.gz
# 进入安装安装目录
cd docker-deploy

修改配置文件

我们在partyA上部署9999,在partyB上部署10000,按顺序填写party_id和party_ip。

$ vi parties.conf
#!/bin/bash

user=fate                                       # 运行FATE的系统用户(对应上文的新增用户)
dir=/data/projects/fate                         # 运行FATE的文件目录
party_list=(10000 9999)                         # 部署的party_id
party_ip_list=(192.168.0.10 192.168.0.9)     # 部署FATE的party_ip
serving_ip_list=(192.168.0.10 192.168.0.9)   # 部署FATE-Serving的party_ip

# computing_backend could be eggroll or spark.
computing_backend=eggroll                       # FATE的计算引擎

# default
exchangeip=

# modify if you are going to use an external db
mysql_ip=mysql
mysql_user=fate
mysql_password=fate_dev
mysql_db=fate_flow

# modify if you are going to use an external redis
redis_ip=redis
redis_port=6379
redis_password=fate_dev

主要修改以下部分内容:

party_list=(10000 9999)                         # 部署的party_id
party_ip_list=(192.168.0.10 192.168.0.9)     # 部署FATE的party_ip
serving_ip_list=(192.168.0.10 192.168.0.9)   # 部署FATE-Serving的party_ip

设置 两个工作机的 id 和 ip: partyA的 id 为10000,ip 为192.168.0.10,设置 partyB的 id 为9999,ip 为192.168.0.9。

可以直接把对应的 IP 改了就行。

修改镜像仓库地址

国内用户经常不能链接docker hub,改用hub.c.163.com的镜像:

$ vi .env
RegistryURI=hub.c.163.com                      # 使用国内的镜像地址
TAG=1.5.0-release
SERVING_TAG=2.0.0-release

# PREFIX: namespace on the registry's server.
# RegistryURI: address of the local registry
# TAG: tag of module images.

生成安装包

bash generate_config.sh

这一步主要是在部署机上生成安装 FATE 的所有的 tar 包。

执行部署

bash docker_deploy.sh all

在部署机执行这个命令,部署机会连接两台工作机,执行 FATE 的部署。

检查是否部署成功

这一步骤,要在工作机操作:

# 进入work目录
cd /data/projects/fate/confs-<party_id>/
# 查看containers状态
docker-compose ps
# 检查fateflow是否成功运行
docker-compose logs python

所有的组件状态都是Up并且python容器中出现* Running on http://x.x.x.x:9380/ (Press CTRL+C to quit)的日志消息代表FATE已经成功启动。

FATE测试

测试主要有两种方式,第一种是直接在工作机上执行

登录到任意一台工作机上,然后执行以下命令,运行 toy_example 这个示例:

# 进入fateflow的container
docker-compose exec python bash
# 进入toy_example目录
cd ../examples/toy_example/
# 运行toy_example命令
python run_toy_example.py 9999 10000 1
# 如果是在partyB的机器,注意<party_id>的顺序
# python run_toy_example.py 10000 9999 1

显示job status is running代表任务已经开始运行,并且出现success to calculate secure_sum, it is 2000.0代表任务已经成功。

还有一种测试方式,就是使用notebook运行示例

打开任意一台工作机的 notebook:

partyA:http://192.168.0.9:20000
partyB:http://192.168.0.10:20000

step 1: 打开partyA的notebook里面的toy_example示例,
step 2:修改默认的party_id

step 3:运行toy_example

出现success,则表示使用notebook运行toy_example成功。

问题总结

部署过程报错

一、 ERROR: Couldn't connect to Docker daemon at http+docker://localhost - is it running?

那是因为 Docker未启动,需要把 Docker启动。

二、/data/projects/fate/ not exist

则手动到两台工作机上创建目录

三、mv: 无法将"/home/fate/confs-10000.tar" 移动至"/data/projects/fate/confs-10000.tar": 权限不够

需要给 fate 用户授权

测试过程报错

一、Federated schedule error, Please check if the fate flow server of the other party is started. rpc request error

则表示两台工作机之间通信失败了,需要把相关端口启动,主要是启8080、20000端口以及9370端口。

FATE 相关端口:

二、name 'Component' is not defined

这个一般出现在使用 notebook 运行示例,在notebook上运行示例时,需要从第一个输入开始逐一执行,不要在改完 party_id 后直接点执行,要选中第一个 import 相关的输入,从第一个开始逐一执行。

参考文档

https://github.com/FederatedAI/KubeFATE/wiki/%E4%BD%BF%E7%94%A8Docker-Compose-%E9%83%A8%E7%BD%B2FATE-v1.5.0

https://fate.readthedocs.io/en/latest/_build_temp/cluster-deploy/doc/Fate_cluster_install_guide_ansible.html

(全文完)

扫描二维码,关注作者微信公众号
赞(2)
如未加特殊说明,此网站文章均为原创,转载必须注明出处。HollisChuang's Blog » 开源联邦学习框架 FATE 部署指南及问题总结
分享到: 更多 (0)

相关推荐

  • 暂无文章

评论 1

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #1

    直接在工作机上执行

    hjk1个月前 (11-05)回复

HollisChuang's Blog

联系我关于我