一、准备
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. 架构图
3.组件说明
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 | 192.168.17.146 fate_test_01 |
添加完成后,执行”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 | cd /etc/security/limits.d |
存在则:
1 | mv 20-nproc.conf 20-nproc.conf_bak |
2)修改limits.conf文件
1 | vi /etc/security/limits.conf |
添加下面的信息:
1 | * soft nofile 65535 |
重新登陆,ulimit -a
查看是否生效
4.4 关闭防火墙(可选)
在目标服务器(172.22.124.3 172.22.88.116)root用户下执行
1 | 1.systemctl disable firewalld.service |
4.5 创建APP用户
在目标服务器(172.22.124.3 172.22.88.116)root用户下执行
1 | groupadd -g 6000 apps |
如果存在app用户
1 | usermod -s /bin/bash -g apps -d /home/app app |
app初始密码设置为123456
4.6 给APP用户配置sudo
在目标服务器(172.22.124.3 172.22.88.116)root用户下执行
1 | vi /etc/sudoers.d/app |
添加内容:
1 | app ALL=(ALL) ALL |
给文件sudoers文件增加写入权限
1 | chmod u+w /etc/sudoers |
编辑 sudoers文件
1 | vi /etc/sudoers |
在root ALL=(ALL) ALL下面追加:
1 | root 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 | cd /data |
4.8 设置projects目录
在目标服务器(172.22.124.3 172.22.88.116)root用户下执行
1 | cd /data |
4.9 配置两台服务器ssh无密登录(Fate部署的前提)
1)配置自身免密
在目标服务器(172.22.124.3 172.22.88.116)app用户下执行
在虚拟机fate_test_01 上以app用户身份在home目录下执行
1 | su app |
使用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 | cat ~/.ssh/id_rsa.pub >> /home/app/.ssh/authorized_keys |
输入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 | cd /data/projects/ |
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说明:
1) 两台主机partyA+partyB同时部署
1 | #to install role |
配置数据upload参数(修改本地训练数据存储路径)
1 | vi fate_flow/examples/upload_guest.json |
银行(合作企业,无标签,但拥有更多特征字段)作为host方,也只需修改host_ip,guest_ip以及file路径即可完成配置
5.4 部署
银行即host主机按照上述配置含义修改setup.conf文件对应的配置项后,然后在fate-cluster-install/allInone目录下执行部署脚本:
1 | cd fate-cluster-install/allInone |
部署日志输出在fate-cluster-install/allInone/logs目录下,实时查看是否有报错:
1 | tail -f ./logs/deploy.log (部署结束,查看一下即可) |
5.5 问题定位
1 | # 1)eggroll日志 |
6. 测试
任务背景
举例:移动与银行联合建模,移动有用于机器学习训练的标签Y(用户信誉等级),期望优化移动自己的模型。
背景:对新入网用户,如何快速判定信誉等级,传统方法是根据用户历史行为信息进行判断,但对新入网且实际信誉良好的用户,由于初始数据较少,在用户入网初期系统认定的信誉等级可能较低,从而使得新入网且实际信誉良好的用户享受不到匹配的权益,造成客户流失;
数据来源:
训练数据均为模拟数据集
设定:
只有移动有数据标签用户电话号ID,信用积分X4,每月消费X5,Y=用户信誉等级
银行无法暴露含有隐私的字段x1,x2,x3(考虑到隐私保护,训练时字段名称对对方不可见)
传统建模方法的问题:
移动在给新入网用户判断信誉等级时,只利用移动目前拥有的字段建模效果还不够理想,需要借助拥有共同用户的银行的更丰富字段;
银行考虑到隐私保护不能将字段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 | source /data/projects/fate/bin/init_env.sh |
1 | source /data/projects/fate/bin/init_env.sh |
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”
6.1.2 双边测试
在集群联通性良好的前提下,以上述例子为例,下图给出移动和银行的联合字段,以下表格中的数据将fate-9999节点的数据单独在本地PC训练,以及双方纵向联邦训练所得模型分别在测试集上的数据结果:
下表所示结果是模拟上述例子中的业务数据联合训练出的模拟结果,综上所述,纵向联邦学习的模型结果明显要好一些。
6.2 FateBoard查看训练结果
移动和银行都可在自己服务器的http://localhost:8080查看训练结果
注意:在host方只能看到当前节点由guest方的特征选择,无法看到字段对应的阈值
**7.**系统运维
7.1 服务管理
在目标服务器(172.22.124.3 172.22.88.116)app用户下执行
7.1.1 Eggroll服务管理
1 | source /data/projects/fate/bin/init_env.sh |
启动/关闭/查看/重启所有:
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 | cd /data/projects/fate/common/mysql/mysql-8.0.13 |
7.1.3 Fate服务管理
- 启动/关闭/查看/重启fate_flow服务
1 | source /data/projects/fate/bin/init_env.sh |
如果逐个模块启动,需要先启动eggroll和mysql再启动fateflow,fateflow依赖eggroll的启动。
- 启动/关闭/重启fateboard服务
1 | cd /data/projects/fate/fateboard |
7.2 查看进程和端口
在目标服务器(172.22.124.3 172.22.88.116 )app用户下执行
7.2.1 查看进程
#根据部署规划查看进程是否启动
1 | ps -ef | grep -i clustermanager |
7.2.2 查看进程端口
#根据部署规划查看进程端口是否存在
1 | #clustermanager |
7.3 服务日志
服务日志路径
1 | eggroll /data/projects/fate/eggroll/logs |
7.4 查看训练参数
1 | #输出模型在数据集上的预测结果用 |