fate联邦学习部署


一、准备

1硬件

准备一台至少12核CPU、24G内存、1T硬盘(最好SSD)和一个不低于10MB能上互联网的网络。(最好能满足上面的条件,要不然即使安装的没有问题,也可能跑不起来)。

2. 软件

Ubuntu 18.04,CentOS 7

二、Fate Cluster部署

1. 集群规划

参与者 角色 主机名 IP地址 操作系统 安装软件 服务
1 移动,Guest 有标签方 fate_test_01 172.22.88.116 Ubuntu18.04 Fate Fate_flow,fate_board, clustermanager,nodemanager, rollsite,mysql
2 银行,host 持有丰富字段方 fate_test_02 172.22.124.3 Ubuntu18.04 Fate Fate_flow,fate_board, clustermanager,nodemanager, rollsite,mysql

2. 架构图

image-20230626113237063

3.组件说明

image-20230626113247803

4、环境配置

4.1 hostname配置

1)修改主机名

Host在172.22.124.3 root用户下执行:

1
hostnamectl set-hostname fate_test_02

Guest在172.22.88.116 root用户下执行:

1
hostnamectl set-hostname fate_test_01

2)加入主机映射

在目标服务器(172.22.124.3 172.22.88.116)root用户下执行:

1
vi /etc/hosts

添加内容

1
2
3
192.168.17.146 fate_test_01

192.168.17.147 fate_test_02

添加完成后,执行”su root”命令重新登录。

4.2 关闭selinux

在目标服务器(172.22.124.3 172.22.88.116)root用户下执行:

确认是否已安装selinux

centos系统执行:rpm -qa | grep selinux

ubuntu系统执行:apt list --installed | grep selinux

如果已安装了selinux就执行:setenforce 0

4.3 修改Linux系统参数

在目标服务器(172.22.124.3 172.22.88.116)root用户下执行:

1)清理20-nproc.conf文件

1
2
3
cd /etc/security/limits.d

ls -lrt 20-nproc.conf

存在则:

1
mv 20-nproc.conf 20-nproc.conf_bak

2)修改limits.conf文件

1
vi /etc/security/limits.conf

添加下面的信息:

1
2
3
4
5
6
7
* soft nofile 65535

* hard nofile 65535

* soft nproc 65535

* hard nproc 65535

重新登陆,ulimit -a查看是否生效

4.4 关闭防火墙(可选)

在目标服务器(172.22.124.3 172.22.88.116)root用户下执行

1
2
3
4
5
1.systemctl disable firewalld.service

2.systemctl stop firewalld.service

3.systemctl status firewalld.service
4.5 创建APP用户

在目标服务器(172.22.124.3 172.22.88.116)root用户下执行

1
2
3
4
5
groupadd -g 6000 apps

useradd -s /bin/bash -g apps -d /home/app app

passwd app

如果存在app用户

1
2
3
usermod -s /bin/bash -g apps -d /home/app app

passwd app

app初始密码设置为123456

4.6 给APP用户配置sudo

在目标服务器(172.22.124.3 172.22.88.116)root用户下执行

1
vi /etc/sudoers.d/app

添加内容:

1
2
3
4
5
app ALL=(ALL) ALL

app ALL=(ALL) NOPASSWD: ALL

Defaults !env_reset

给文件sudoers文件增加写入权限

1
chmod u+w /etc/sudoers

编辑 sudoers文件

1
vi /etc/sudoers

在root ALL=(ALL) ALL下面追加:

1
2
3
4
5
root  ALL=(ALL)    NOPASSWD: ALL

app ALL=(ALL) ALL

app ALL=(ALL) NOPASSWD: ALL

给文件sudoers文件删除写入权限

1
chmod u-w /etc/sudoers
4.7 增加虚拟内存

在目标服务器(172.22.124.3 172.22.88.116)root用户下执行

生产环境使用时,因内存计算需要增加128G虚拟内存,执行前需检查存储空间是否足够。

手工创建,root用户执行:

1
2
3
4
5
6
7
8
9
10
11
cd /data

dd if=/dev/zero of=/data/swapfile128G bs=1024 count=134217728

mkswap /data/swapfile128G

swapon /data/swapfile128G

cat /proc/swaps

echo '/data/swapfile128G swap swap defaults 0 0' >> /etc/fstab
4.8 设置projects目录

在目标服务器(172.22.124.3 172.22.88.116)root用户下执行

1
2
3
4
5
cd /data
mkdir projects
chown app:apps projects
ls -l
chown -R app /data
4.9 配置两台服务器ssh无密登录(Fate部署的前提)

1)配置自身免密

在目标服务器(172.22.124.3 172.22.88.116)app用户下执行

在虚拟机fate_test_01 上以app用户身份在home目录下执行

1
2
3
4
5
6
7
su app

ssh-keygen -t rsa

cat ~/.ssh/id_rsa.pub >>/home/app/.ssh/authorized_keys

chmod 600 ~/.ssh/authorized_keys

使用ssh 172.22.88.116命令测试,第一次需要确认yes ,之后应可以不需密码登录为成功。

在fate_test_02 上执行相同步骤配置fate_test_02 的自身免密登录。

2)配置fate_test_01 免密登录fate_test_02

在fate_test_01 app用户下执行

1
scp ~/.ssh/authorized_keys app@ 172.22.124.3:/home/app/.ssh

输入fate_test_02的app密码

在fate_test_02 app用户下执行

1
2
3
cat ~/.ssh/id_rsa.pub >> /home/app/.ssh/authorized_keys

scp ~/.ssh/authorized_keys app@172.22.88.116:/home/app/.ssh

输入fate_test_01 的app密码完成文件传输。

在fate_test_01 app用户下执行

*ssh 172.22.88.116*

应不需要密码即可登录fate_test_02机。

到这里我们已经完成环境的配置了。

5.项目部署

5.1 获取项目

在host服务器(172.22.124.3 具备外网环境)app用户下执行

进入执行节点的/data/projects/目录,执行:

1
2
3
4
5
cd /data/projects/

wget https://webank-ai-1251170195.cos.ap-guangzhou.myqcloud.com/fate_cluster_install_1.6.0_release-c7-u18.tar.gz

tar xzf fate_cluster_install_1.6.0_release-c7-u18.tar.gz
5.2 部署前检查

在目标服务器(172.22.124.3 172.22.88.116)app用户下执行

把检查脚本fate-cluster-install/tools-install/check.sh从172.22.124.3拷贝到172.22.88.116

#在host 172.88.124.3和guest 172.22.88.116服务器上分别执行检查脚本

1
sh ./check.sh

#确认app用户已配置sudo

#虚拟内存,size不低于128G,如不满足需参考4.6章节重新设置

#文件句柄数,不低于65535,如不满足需参考4.3章节重新设置

#用户进程数,不低于64000,如不满足需参考4.3章节重新设置

#确认部署前没有fate进程和端口冲突

#确认/etc/my.cnf是否存在,存在需要mv;确认是否存在/data/projects/fate目录,存在需把fate目录mv备份。

5.3 配置文件修改和示例

注:拉取源码后只需要配置部署文件setup.conf

在银行即host服务器(172.22.124.3)app用户下执行

修改配置文件fate-cluster-install/allInone/conf/setup.conf.

1
vi fate-cluster-install/allInone/conf/setup.conf

配置文件setup.conf说明:

image-20230626113135298 image-20230626113128221 image-20230626113118893

1) 两台主机partyA+partyB同时部署

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#to install role
roles=( "host" "guest" )
version="1.6.0"
#project base
pbase="/data/projects"
#log directory
lbase="/data/logs"
#user who connects dest machine by ssh
ssh_user="app"
ssh_group="apps"
#ssh port
ssh_port=22
#eggroll_db name
eggroll_dbname="eggroll_meta"
#fate_flow_db name
fate_flow_dbname="fate_flow"
#mysql init root password
mysql_admin_pass="fate_dev"
#redis passwd
redis_pass=""
#mysql user
mysql_user="fate"
#mysql port
mysql_port="3306"
#host party id
host_id="10000"
#host ip
host_ip="172.22.124.3"
#host mysql ip
host_mysql_ip="${host_ip}"
host_mysql_pass="fate_deV2999"
#guest party id
guest_id="9999"
#guest ip
guest_ip="172.22.88.116"
#guest mysql ip
guest_mysql_ip="${guest_ip}"
guest_mysql_pass="fate_deV2999"
#db module lists
dbmodules=( "mysql" )
#base module lists
basemodules=( "tools" "base" "java" "python" "eggroll" "fate" )
fateflow_grpc_port=9360
fateflow_http_port=9380
fateboard_port=8080
rollsite_port=9370
clustermanager_port=4670
nodemanager_port=4671

配置数据upload参数(修改本地训练数据存储路径)

1
vi fate_flow/examples/upload_guest.json

image-20230703095714410

银行(合作企业,无标签,但拥有更多特征字段)作为host方,也只需修改host_ip,guest_ip以及file路径即可完成配置

5.4 部署

银行即host主机按照上述配置含义修改setup.conf文件对应的配置项后,然后在fate-cluster-install/allInone目录下执行部署脚本:

1
2
3
cd fate-cluster-install/allInone

nohup sh ./deploy.sh > logs/boot.log 2>&1 &
image-20230626113012587

部署日志输出在fate-cluster-install/allInone/logs目录下,实时查看是否有报错:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
tail -f ./logs/deploy.log (部署结束,查看一下即可)
tail -f ./logs/deploy-guest.log (实时打印GUEST端的部署情况)
tail -f ./logs/deploy-mysql-guest.log (实时打印GUEST端mysql的部署情况)
tail -f ./logs/deploy-host.log (实时打印HOST端的部署情况)
tail -f ./logs/deploy-mysql-host.log (实时打印HOST端mysql的部署情况)

deploy.log出现以下内容说明安装完成

init over
deploy guest mysql 172.22.124.3 over
deploy guest 172.22.124.3 over
deploy host mysql 172.22.88.116 over
deploy host 172.22.88.116 over

tail -f ./logs/deploy.log (部署结束,查看一下即可)
tail -f ./logs/deploy-guest.log (实时打印GUEST端的部署情况)
tail -f ./logs/deploy-mysql-guest.log (实时打印GUEST端mysql的部署情况)
tail -f ./logs/deploy-host.log (实时打印HOST端的部署情况)
tail -f ./logs/deploy-mysql-host.log (实时打印HOST端mysql的部署情况)

deploy.log出现以下内容说明安装完成
init over
deploy guest mysql 172.22.124.3 over
deploy guest 172.22.124.3 over
deploy host mysql 172.22.88.116 over
deploy host 172.22.88.116 over
5.5 问题定位
1
2
3
4
5
6
7
8
9
10
11
# 1)eggroll日志
/data/projects/fate/eggroll/logs/eggroll/bootstrap.clustermanager.err
/data/projects/fate/eggroll/logs/eggroll/clustermanager.jvm.err.log
/data/projects/fate/eggroll/logs/eggroll/nodemanager.jvm.err.log
/data/projects/fate/eggroll/logs/eggroll/bootstrap.nodemanager.err
/data/projects/fate/eggroll/logs/eggroll/bootstrap.rollsite.err
/data/projects/fate/eggroll/logs/eggroll/rollsite.jvm.err.log
# 2)fateflow日志
/data/projects/fate/python/logs/fate_flow/
# 3)fateboard日志
/data/projects/fate/fateboard/logs

6. 测试

任务背景

举例:移动与银行联合建模,移动有用于机器学习训练的标签Y(用户信誉等级),期望优化移动自己的模型。

背景:对新入网用户,如何快速判定信誉等级,传统方法是根据用户历史行为信息进行判断,但对新入网且实际信誉良好的用户,由于初始数据较少,在用户入网初期系统认定的信誉等级可能较低,从而使得新入网且实际信誉良好的用户享受不到匹配的权益,造成客户流失;

数据来源:

训练数据均为模拟数据集

设定:

只有移动有数据标签用户电话号ID,信用积分X4,每月消费X5,Y=用户信誉等级

银行无法暴露含有隐私的字段x1,x2,x3(考虑到隐私保护,训练时字段名称对对方不可见)

image-20230626112927216

传统建模方法的问题:

移动在给新入网用户判断信誉等级时,只利用移动目前拥有的字段建模效果还不够理想,需要借助拥有共同用户的银行的更丰富字段;

银行考虑到隐私保护不能将字段x1,x2,x3全部传输给移动;

期望结果:

保护隐私条件下,联合训练模型

联合训练模型效果优于单边训练模型

训练角色:

移动为guest方(持有标签),银行为host方

6.1 部署测试

结合上述例子,设置三个参数,guest_partyid为移动方,host_partyid为银行方,work_mode为1表示集群训练方式

此测试您需要设置3个参数:guest_partyid,host_partyid,work_mode。

6.1.1 集群联通性测试

1)移动方部署的主机172.22.88.116 将测试脚本中guest_partyid(移动)和host_partyid(银行)都设置9999

1
2
3
source /data/projects/fate/bin/init_env.sh
cd /data/projects/fate/examples/toy_example/
python run_toy_example.py 9999 9999 1

image-20230703100139514

1
2
3
source /data/projects/fate/bin/init_env.sh
cd /data/projects/fate/examples/toy_example/
python run_toy_example.py 9999 9999 1

toy_example是模拟上述场景集群连通性的例子,运行出现如下结果表示集群中各主机可以联通:

“2020-04-28 18:26:20,789 - secure_add_guest.py[line:126] - INFO: success to calculate secure_sum, it is 1999.9999999999998”

image-20230703100207320

6.1.2 双边测试

在集群联通性良好的前提下,以上述例子为例,下图给出移动和银行的联合字段,以下表格中的数据将fate-9999节点的数据单独在本地PC训练,以及双方纵向联邦训练所得模型分别在测试集上的数据结果:

image-20230626111231534

下表所示结果是模拟上述例子中的业务数据联合训练出的模拟结果,综上所述,纵向联邦学习的模型结果明显要好一些。

image-20230626111252540
6.2 FateBoard查看训练结果

移动和银行都可在自己服务器的http://localhost:8080查看训练结果

注意:在host方只能看到当前节点由guest方的特征选择,无法看到字段对应的阈值

image-20230626111504312 image-20230626111513658

**7.**系统运维

7.1 服务管理

在目标服务器(172.22.124.3 172.22.88.116)app用户下执行

7.1.1 Eggroll服务管理

1
2
source /data/projects/fate/bin/init_env.sh
cd /data/projects/fate/eggroll

启动/关闭/查看/重启所有:

1
sh ./bin/eggroll.sh all start/stop/status/restart

启动/关闭/查看/重启单个模块(可选:clustermanager,nodemanager,rollsite):

1
sh ./bin/eggroll.sh clustermanager start/stop/status/restart

7.1.2 Mysql服务管理

启动/关闭/查看/重启mysql服务

1
2
cd /data/projects/fate/common/mysql/mysql-8.0.13
sh ./service.sh start|stop|status|restart

7.1.3 Fate服务管理

  1. 启动/关闭/查看/重启fate_flow服务
1
2
3
source /data/projects/fate/bin/init_env.sh
cd /data/projects/fate/python/fate_flow
sh service.sh start|stop|status|restart

如果逐个模块启动,需要先启动eggroll和mysql再启动fateflow,fateflow依赖eggroll的启动。

  1. 启动/关闭/重启fateboard服务
1
2
cd /data/projects/fate/fateboard
sh service.sh start|stop|status|restart
7.2 查看进程和端口

在目标服务器(172.22.124.3 172.22.88.116 )app用户下执行

7.2.1 查看进程

#根据部署规划查看进程是否启动

1
2
3
4
5
ps -ef | grep -i clustermanager
ps -ef | grep -i nodemanager
ps -ef | grep -i rollsite
ps -ef | grep -i fate_flow_server.py
ps -ef | grep -i fateboard

7.2.2 查看进程端口

#根据部署规划查看进程端口是否存在

1
2
3
4
5
6
7
8
9
10
#clustermanager
netstat -tlnp | grep 4670
#nodemanager
netstat -tlnp | grep 4671
#rollsite
netstat -tlnp | grep 9370
#fate_flow_server
netstat -tlnp | grep 9360
#fateboard
netstat -tlnp | grep 8080
7.3 服务日志

服务日志路径

1
2
3
4
eggroll	/data/projects/fate/eggroll/logs
fate_flow&任务日志 /data/projects/fate/python/logs
fateboard /data/projects/fate/fateboard/logs
mysql /data/logs/mysql/
7.4 查看训练参数
1
2
3
4
5
6
#输出模型在数据集上的预测结果用
-f component_metric_all;
#输出训练好的模型用
-f component_output_model;
#输出中间结果的数据用
-f component_output_data;

文章作者: Grail Lee
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Grail Lee !
  目录