Fate部署实战——从零开始实现Fate cluster部署

Posted AI浩

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Fate部署实战——从零开始实现Fate cluster部署相关的知识,希望对你有一定的参考价值。

摘要

这篇文章是我对Fate cluster部署方式的总结。从零开始,一步一步实现Fate cluster的部署,如果有不对的地方请给我留言。PDF版本我上传到CSDN了,有需要的可以下载,地址:
https://download.csdn.net/download/hhhhhhhhhhwwwwwwwwww/21314477

1 总体介绍

1.1.系统介绍

1)FATE

FATE (Federated AI Technology Enabler) 是微众银行AI部门发起的开源项目,
提供了一种基于数据隐私保护的安全计算框架,为机器学习、深度学习、迁移学习算法提供强有力的安全计算支持。
安全底层支持同态加密、秘密共享、哈希散列等多种多方安全计算机制,算法层支持多方安全计算模式下的逻辑回归、Boosting、联邦迁移学习等。

2)EggRoll

Eggroll 是一个适用于机器学习和深度学习的大规模分布式架构,包括了计算、存储和通信等模块。为FATE框架提供底层支撑。

3)FATE官方网站:https://fate.fedai.org/

本文将介绍使用ansible部署脚本进行FATE集群的部署。

1.2.组件说明

软件产品组件端口说明
fatefate_flow9360;9380联合学习任务流水线管理模块
fatefateboard8080联合学习过程可视化模块
fateFederatedML算法代码包
eggrollclustermanager4670cluster manager管理集群
eggrollnodemanger4671node manager管理每台机器资源
eggrollrollsite9370跨站点或者跨party通讯组件
mysqlmysql3306数据存储,clustermanager和fateflow依赖

1.3.系统架构

2 详细设计

2.1.部署规划

本示例是每端只有一台主机,每端可以多台主机,目前只支持nodemanager多节点部署,其他组件都是单节点。

rolepartyidIP地址操作系统主机配置存储部署模块
host10000192.168.65.161 (有外网)CentOS 7.2/Ubuntu 18.048C16G500Gfate_flow,fateboard,clustermanager,nodemanger,rollsite,mysql
guest9999192.168.65.162CentOS 7.2/Ubuntu 18.048C16G500Gfate_flow,fateboard,clustermanager,nodemanger,rollsite,mysql

2.2.主机资源和操作系统要求

类别说明
主机配置不低于8C16G500G,千兆网卡
操作系统CentOS linux 7.2及以上同时低于8/Ubuntu 18.04
依赖包需要安装如下依赖包:
#centos
gcc gcc-c++ make openssl-devel gmp-devel mpfr-devel libmpc-devel libaio
numactl autoconf automake libtool libffi-devel ansible
#ubuntu
gcc g++ make openssl ansible libgmp-dev libmpfr-dev libmpc-dev
libaio1 libaio-dev numactl autoconf automake libtool libffi-dev
cd /usr/lib/x86_64-linux-gnu
if [ ! -f “libssl.so.10” ];then
ln -s libssl.so.1.0.0 libssl.so.10
ln -s libcrypto.so.1.0.0 libcrypto.so.10
fi
用户用户:app,属主:apps(app用户需可以sudo su root而无需密码)
文件系统1、数据盘挂载在/data目录下。
2、创建/data/projects目录,目录属主为:app:apps。
3、根目录空闲空间不低于20G。
虚拟内存不低于128G
系统参数1、文件句柄数不低于65535。
2、用户进程数不低于65535。

2.3.网络要求

类别说明
防火墙策略1、如果通过公网互通,两端rollsite所部署主机需互相开通出和入防火墙策略。
2、防火墙设备需要支持长连接和需要对连接数无限制。
外网带宽入通过公网互通,公网带宽不低于20Mb
负载均衡设备1、如果出或入口有负载均衡设备则此设备需要支持grpc或者支持透明转发。
2、fate为双向通讯,需支持出和入方向主动请求。

3 搭建虚拟环境

3.1 硬件要求

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

3.2 软件

Xshell 、VMware Workstation 16 Pro,这两款软件的下载地址: https://pan.baidu.com/s/1j6j4n4TMlxxvtSFb-r_G5A 提取码:52bv

Centos,下载地址:http://vault.centos.org/7.5.1804/isos/x86_64/CentOS-7-x86_64-DVD-1804.iso

3.3 安装 VMWare虚拟机安装

从我给的网盘地址将VMWare软件下载下来安装即可,自行激活,如果有问题问度娘。

安装完成后,点击“编辑→虚拟网络编辑器”,如下图:


查找网关

选择VMnet8,然后点击NAT设置。

在这里找到网关:192.168.65.2 记住这个网关,后面配置网络的时候要用到。

3.4 CentOS安装

打开vwmare软件,点击创建新的虚拟机

选择“典型(推荐)“,然后选择”下一步“。

选择“下一步“

如下图,选择“Linux“、”Centos7 64位“、然后选择”下一步“

给虚拟机命名,第一台命名为“fate01”,第二台虚拟机命名为“fate02”。

然后选择安装路径,安装在空间较大的盘符。然后选择“下一步”

最大磁盘大小设置为“500G”,选择“将磁盘拆分成多个文件”,然后选择“下一步”.

选择“自定义硬件”,如下图:

然后设置内存为8G,处理器数量设置为1,每个处理器的内核数量设置为4,在“新CD/DCD(IDE)”选项中设置“CentOS-7-x86_64-DVD-1804.iso”文件的路径,完成上面的设置后选择关闭。

然后我们就能看到虚拟机的配置,如果没有问题,则选择”完成”,等待虚拟机安装结束。

出现下图则说明安装完成,选择“开启此虚拟机”,你就可以看到Centos7的安装页面。

选择“Install CentOS 7”,然后按“Enter”键。

出下面如下画面,选择“中文”,在右侧选择“简体中文(中国)”,然后选择“继续”。

选择“键盘”,点击“+”,选择“英语(英国)”,然后点击“添加”,再选择“完成”。

接下来,点击“软件选择”。在左侧选择“最小安装”,在右侧选择“调试工具”和”系统管理工具”。然后选择“完成”。


设置“安装位置”,然后选择“我要配置分区”,选择“完成”。


然后出现如下画面,选择“点这里自动创建他们”

选择“home”,设置期望容量为100GiB,然后点击“+”

添加新的挂载点“/data”,容量为“341.12GiB”,然后点击“添加挂载点”。

然后点击“完成”,选择“接受更改”

点击“网路和主机名”


以太网,选择“打开”,设置主机名为“fate01”,点击“应用”,然后选择“配置”。


点击“IPv4设置”,方法设置为“手动”,点击“Add”,增加IP地址,如下图,ip地址为“192.168.65.161”,另一台的ip地址设置为192.168.65.162,子网掩码和网关相同都,分别设置为“24”和“192.168.65.2”(这个网关我们在前面提到过)。DNS服务器设置为“192.168.65.2”,勾选“需要IPv4地址完成这个连接”。

点击”IPv6设置”,方法选择“忽略”。然后选择“保存”。

然后观察IP设置是否正确,如果没有问题则选择“完成”。


完成上面的设置后,选择“开始安装”。然后设置root密码。


将密码设置为“123456”,然后点击“完成”,等待安装完成。


安装完成后,点击“重启”。

重启之后,出现如下画面,输入“root”,密码“123456”登录root账户。

另一台虚拟机的安装步骤和第一台一样只是名字是“fate02”,IP地址为“192.168.65.162”。

安装完成后,安装Xshell,用Xshell登录。个人认为用xshell执行命令方便一些。

4 虚拟环境配置

4.1 hostname配置

1)修改主机名

在192.168.65.161 root用户下执行:

hostnamectl set-hostname VM_0_1_centos

在192.168.65.162 root用户下执行:

hostnamectl set-hostname VM_0_2_centos

2)加入主机映射

在目标服务器(192.168.65.161 192.168.65.162)root用户下执行:

vi /etc/hosts

添加内容

192.168.0.1 VM_0_1_centos
192.168.0.2 VM_0_2_centos


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

4.2 关闭selinux

在目标服务器(192.168.65.161 192.168.65.162)root用户下执行:

确认是否已安装selinux

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

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

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

4.3 配置yum仓库

在目标服务器(192.168.65.161 192.168.65.162)root用户下执行:

1)备份CentOS-Base.repo文件

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak

2)修改yum仓库配置

vi /etc/yum.repos.d/CentOS-Base.repo

添加内容:

# CentOS-Base.repo
#
# The mirror system uses the connecting IP address of the client and the
# update status of each mirror to pick mirrors that are updated to and
# geographically close to the client.  You should use this for CentOS updates
# unless you are manually picking other mirrors.
#
# If the mirrorlist= does not work for you, as a fall back you can try the
# remarked out baseurl= line instead.
#
#

[base]
name=CentOS-$releasever - Base
baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/os/$basearch/
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#released updates
[updates]
name=CentOS-$releasever - Updates
baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/updates/$basearch/
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/extras/$basearch/
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus
baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/centosplus/$basearch/
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

3)使新仓库配置生效

yum clean all
yum makecache

4.4 修改Linux系统参数

在目标服务器(192.168.65.161 192.168.65.162)root用户下执行:

1)清理20-nproc.conf文件

cd /etc/security/limits.d
ls -lrt 20-nproc.conf

存在则:

mv 20-nproc.conf 20-nproc.conf_bak

2)修改limits.conf文件

vi /etc/security/limits.conf

添加下面的信息:

* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535


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

4.5 修改系统mysql配置

mv /etc/my.cnf /etc/my.cnf_bak

4.6 关闭防火墙(可选)

在目标服务器(192.168.65.161 192.168.65.162)root用户下执行

systemctl disable firewalld.service
systemctl stop firewalld.service
systemctl status firewalld.service

4.7 创建APP用户

在目标服务器(192.168.65.161 192.168.65.162)root用户下执行

groupadd -g 6000 apps
useradd -s /bin/bash -g apps -d /home/app app
passwd app

app初识密码设置为123456

4.8 给APP用户配置sudo

在目标服务器(192.168.65.161 192.168.65.162)root用户下执行

vi /etc/sudoers.d/app

添加内容:

app ALL=(ALL) ALL
app ALL=(ALL) NOPASSWD: ALL
Defaults !env_reset

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

chmod u+w /etc/sudoers

编辑 sudoers文件

vi /etc/sudoers

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

root    ALL=(ALL)       NOPASSWD: ALL
app     ALL=(ALL)       ALL
app     ALL=(ALL)       NOPASSWD: ALL

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

chmod u-w /etc/sudoers

4.9 增加虚拟内存

在目标服务器(192.168.65.161 192.168.65.162)root用户下执行

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

手工创建,root用户执行:

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.10 安装依赖包

目标服务器(192.168.65.161 192.168.65.162)root用户执行

#安装基础依赖包
#centos
yum install -y gcc gcc-c++ make openssl-devel gmp-devel mpfr-devel libmpc-devel libaio numactl autoconf automake
#ubuntu
apt-get install -y gcc g++ make openssl libgmp-dev libmpfr-dev libmpc-dev libaio1 libaio-dev numactl autoconf automake libtool libffi-dev
#如果有报错,需要解决依赖安装源问题。

#安装ansible和进程管理依赖包
#centos
yum install -y ansible
#ubuntu
apt-get install -y ansible

#如果安装有报错同时服务器有外网,没有外网的需要解决yum源不全的问题,执行:
#centos
yum install -y epel-release
#增加一个更全面的第三方的源,然后再重新安装ansible

4.11 设置projects目录

在目标服务器(192.168.65.161 192.168.65.162)root用户下执行

cd /data
mkdir projects
chown app:apps projects
ls -l
chown -R app /data

4.12 配置ssh无密登录

1)配置自身免密

在目标服务器(192.168.65.161 192.168.65.162)app用户下执行

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

su app
ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub >>/home/app/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

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

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

2)配置VM_0_1_centos 免密登录VM_0_2_centos

VM_0_1_centos app用户下执行

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

输入VM_0_2_centos的app密码

VM_0_2_centos app用户下执行

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

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

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

VM_0_1_centos app用户下执行

ssh 192.168.65.162

应不需要密码即可登录fate02机。到这里我们已经完成环境的配置了。

5 项目部署

5.1 系统检查

在目标服务器(192.168.65.161 192.168.65.162)app用户下执行

#虚拟内存,size不低于128G,如不满足需参考3.6章节重新设置
cat /proc/swaps
Filename                                Type            Size    Used    Priority
/data/swapfile128G                      file            134217724       384     -1

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

#用户进程数,不低于64000,如不满足需参考3.3章节重新设置
ulimit -u
65535

#检查进程是否有fate进程残留,如有则需要停止服务
ps -ef| grep -i fate

netstat -tlnp | grep 4670
netstat -tlnp | grep 4671
netstat -tlnp | grep 9370
netstat -tlnp | grep 9371
netstat -tlnp | grep 9360
netstat -tlnp | grep 8080
netstat -tlnp | grep 3306

#检查部署目录,如有需先进行mv
ls -ld /data/projects/fate
ls -ld /data/projects/data
ls -ld /data/projects/snmp

#检查supervisord配置文件,如有则需要mv或者删除掉
ls -lrt /data/projects/common/supervisord/supervisord.d/fate-*.conf

5.2 获取项目

在目标服务器(192.168.65.161 具备外网环境)app用户下执行

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

#注意:URL链接有换行,拷贝的时候注意整理成一行
cd /data/projects/
wget https://webank-ai-1251170195.cos.ap-guangzhou.myqcloud.com/ansible_nfate_1.6.0_release-1.0.0.tar.gz
tar xzf ansible_nfate_1.6.0_release-1.0.0.tar.gz

5.3 配置文件修改和示例

5.3.1 初始化配置文件

cd ansible-nfate-*
#init.sh文件不需要修改,主要是辅助生成一些配置文件
 
#生产环境加prod参数执行
 sh ./tools/init.sh prod
 
>sh ./tools/init.sh prod
clean old config
init environments/prod
init var_files/prod
init project_prod.yml

5.3.2 证书制作配置(可选)(这一步我没有做,官方给的有)

1)证书制作

vi /data/projects/ansible-nfate-1.*/tools/make.sh

#1、自定义安全证书需同时部署两端,只部署一端需要手工处理证书,手工处理部分暂不介绍。
#2、安全证书支持如下部署方式:
    1)部署host+guest,host和guest使用安全证书通讯。
    2)部署host+exchange+guest,其中host和exchange使用安全证书通讯,guest和exchange普通通讯。
    3)部署host+exchange+guest,其中guest和exchange使用安全证书通讯,host和exchange普通通讯。

guest_host="192.168.65.161" ---根据实际IP修改
host_host="192.168.65.162" ---根据实际IP修改
exchange_host="192.168.65.160" ---根据实际IP修改,本示例不部署无需修改

2)执行脚本制作证书

cd tools
sh ./make.sh

在keys/host,guest目录下会产生证书文件。

3)拷贝证书到部署目录

sh cp-keys.sh host guest

证书文件会拷贝到roles/eggroll/files/keys目录

特别说明:
1、目前脚本部署只支持2方设置证书认证。(host&guest、host&exchange、guest&exchange)

5.3.3 修改配置文件

1)修改初始化主机IP

vi /data/projects/ansible-nfate-1.*/environments/prod/hosts

#ansible格式配置文件
[fate]   ---把需要部署的主机IP填入fate组
192.168.65.161  
192.168.65.162

[deploy_check] ---把执行ansible的本机IP填入deploy_check组
192.168.65.161 

[all:vars]
ansible_connection=ssh
ansible_ssh_port=22   ---根据实际情况修改
ansible_ssh_user=app
#ansible_ssh_pass=test   ---如果未做免密登陆需提供密码
##method: sudo or su
ansible_become_method=sudo
ansible_become_user=root
ansible_become_pass=   ---各个主机未做免密sudo需填写root密码

2)修改host方参数

注意:默认是不启用安全证书的配置,如果启用安全证书通讯需把server_secure,client_secure,is_secure设置为true,以及is_secure对应的port设置为9371

#不部署host方则不用修改
#除了nodemanger可以设置多个IP外,其他都是单个IP
vi /data/projects/ansible-nfate-1.*/var_files/prod/fate_host

host:
    partyid: 10000 ---host端partyid,根据实际规划修改
    rollsite:
      enable: True
      ips: ---IP列表,目前rollsite只支持部署到一台服务器
      - 192.168.65.161  
      port: 9370 ---grpc端口
      secure_port: 9371 ---grpcs端口
      pool_size: 600 ---线程池大小,推荐设为:min(1000 + len(party_ids) * 200, 5000)
      max_memory:    ---rollsite进程JVM内存参数,默认是物理内存的1/4,可根据实际情况设置,如12G,如果是rollsite专用的机器,配置成物理内存的75%。
      server_secure: False ---作为服务端,开启安全证书验证,不使用安全证书默认即可
      client_secure: False ---作为客户端,使用证书发起安全请求,不使用安全证书默认即可
      polling: ---是否使用单向模式,本示例不支持,默认false即可
        enable: False
      default_rules: ---本party指向exchange或者其他party的IP、端口路由配置
      - name: default
        ip: 192.168.65.162 ---exchange或者对端party rollsite IP
        port: 9370 ---exchange或者对端party rollsite 端口,一般默认9370,即无安全证书部署;如需开启安全证书通信,应设置为9371;
        is_secure: False ---是否使用安全认证通讯;需要结合server_secure或者client_secure使用,当三者都为true时,表示和下一跳rollsite使用安全认证通讯,同时上一个参数port需设置为9371;不使用安全证书默认即可。
      rules: ---本party自身路由配置
      - name: default
        ip: 192.168.65.161
        port: 9370
      - name: fateflow
        ip: 192.168.65.161
        port: 9360
    clustermanager:
      enable: True
      ips:
      - 192.168.65.161 ---只支持部署一台主机
      port: 4670
      cores_per_node: 16 ---nodemanager节点cpu核数,多个nodemanager节点按照CPU核数最小的设置
    nodemanager:
      enable: True
      ips: ---支持部署多台
      - 192.168.65.161
      port: 4671
    eggroll: 
      dbname: "eggroll_meta"
      egg: 2
    fate_flow:
      enable: True
      ips:
      - 192.168.65.161  ---只支持部署一台主机
      grpcPort: 9360
      httpPort: 9380
      dbname: "fate_flow"
      proxy: rollsite ---fate_flow通讯服务的前置代理是rollsite还是nginx,默认即可
    fateboard:
      enable: True
      ips:
      - 192.168.65.161  ---只支持部署一台主机
      port: 8080
      dbname: "fate_flow"
    mysql:
      enable: True
      ips:
      - 192.168.0.1  ---只支持部署一台主机
      port: 3306
      dbuser: "fate"
      dbpasswd: "fate_deV2999"
    zk:
      enable: False
      lists:
      - ip: 192.168.65.161
        port: 2181
      use_acl: false
      user: "fate"
      passwd: "fate"
    servings:
     ip: 192.168.65.161
     port: 8000

将默认的192.168.0.1替换为192.168.65.161,将192.168.0.2替换为192.168.65.162 其他的不要改动!

4)修改guest参数

注意:默认是不启用安全证书的配置,如果启用安全证书通讯需把server_secure,client_secure,is_secure设置为true,以及is_secure对应的port设置为9371

#不部署guest方则不用修改
#除了nodemanger可以设置多个IP外,其他都是单个IP
vi /data/projects/ansible-nfate-1.*/var_files/prod/fate_guest

guest:
    partyid: 9999 ---根据实际规划修改
    rollsite:
      enable: True
      ips: ---IP列表,目前rollsite只支持部署到一台服务器
      - 192.168.65.162
      port: 9370 ---grpc端口
      secure_port: 9371 ---grpcs端口
      pool_size: 600 ---线程池大小,推荐设为:min(1000 + len(party_ids) * 200, 5000)
      max_memory:    ---rollsite进程JVM内存参数,默认是物理内存的1/4,可根据实际情况设置,如12G,如果是rollsite专用的机器,配置成物理内存的75%。
      server_secure: False ---作为服务端,开启安全证书验证,不使用安全证书默认即可
      client_secure: False ---作为客户端,使用证书发起安全请求,不使用安全证书默认即可
      polling: ---是否使用单向模式,本示例不支持,默认false即可
        enable: False
      default_rules:  ---本party指向exchange或者其他party的IP、端口路由配置
      - name: default
        ip: 192.168.65.161 ---exchange或者对端party rollsite IP
        port: 9370 ---exchange或者对端party rollsite 端口,一般默认9370,即无安全证书部署;如需开启安全证书通信,应设置为9371;
        is_secure: False ---server_secure或者client_secure为true,指向的下一跳rollsite也开启了安全认证,此参数需要设置为true,上一个参数port需设置为9371,不使用安全证书默认即可
      rules:  ---本party自身路由配置
      - name: default
        ip: 192.168.65.162
        port: 9370
      - name: fateflow
        ip: 192.168.65.162
        port: 9360
    clustermanager:
      enable: True
      ips:   ---只支持部署一台主机
      - 192.168.65.162
      port: 4670
      cores_per_node: 16 ---nodemanager节点cpu核数,多个nodemanager节点按照CPU核数最小的设置
    nodemanager:
      enable: True
      ips:  ---支持部署多台主机
      - 192.168.65.162
      port: 4671
    eggroll:
      dbname: "eggroll_meta"
      egg: 2
    fate_flow:
      enable: True 
      ips:  ---只支持部署一台主机
      - 192.168.65.162
      grpcPort: 9360
      httpPort: 9380
      dbname: "fate_flow"
      proxy: rollsite  ---fate_flow通讯服务的前置代理是rollsite还是nginx,默认即可
    fateboard:
      enable: True
      ips:  ---只支持部署一台主机
      - 192.168.65.162
      port: 8080
      dbname: "fate_flow"
    mysql:
      enable: True
      ips:  ---只支持部署一台主机
      - 192.168.65.162
      port: 3306
      dbuser: "fate"
      dbpasswd: "fate_deV2999"
    zk:
      enable: False
      lists:
      - ip: 192.168.65.162
        port: 2181
      use_acl: false
      user: "fate"
      passwd: "fate"
   servings:
     ip: 192.168.65.162
     port: 8000

5)修改exchange参数(不用exchange,这里不用配置)

注意:默认是不启用安全证书的配置,如果启用安全证书通讯需把server_secure,client_secure,is_secure设置为true,以及is_secure对应的port设置为9371

#不部署exchange则不需要修改
vi /data/projects/ansible-nfate-1.*/var_files/prod/fate_exchange

exchange:
  enable: False --部署exchange需修改为True
  rollsite: 
    ips:
    - 192.168.0.88
    port: 9370
    secure_port: 9371 ---grpcs端口
    pool_size: 600,推荐设为:min(1000 + len(party_ids) * 200, 5000)
    max_memory:    ---rollsite进程JVM内存参数,默认是物理内存的1/4,可根据实际情况设置,如12G,如果是rollsite专用的机器,配置成物理内存的75%。
    server_secure: False ---作为服务端,开启安全证书验证,不使用安全证书默认即可
    client_secure: False ---作为客户端,使用证书发起安全请求,不使用安全证书默认即可
    polling:  ---是否使用单向模式,本示例不支持,默认false即可
      enable: False
      id: 10000
  partys:  ---指向各party的路由配置
  - id: 10000
    rules:
    - name: default
      ip: 192.168.0.1
      port: 9370  ---对应party rollsite 端口,一般默认9370,即无安全证书通讯;如需开启安全证书通信,应设置为9371;
      is_secure: False ---server_secure或者client_secure为true,指向的下一跳rollsite也开启了安全认证,此参数需要设置为true,上一个参数port需设置为9371,不使用安全证书默认即可
  - id: 9999
    rules:
    - name: default
      ip: 192.168.0.2
      port: 9370 ---对应party rollsite 端口,一般默认9370,即无安全证书通讯;如需开启安全证书通信,应设置为9371;
      is_secure: False ---server_secure或者client_secure为true,指向的下一跳rollsite也开启了安全认证,此参数需要设置为true,上一个参数port需设置为9371,不使用安全证书默认即可

5.4 部署

按照上述配置含义修改对应的配置项后,然后执行部署脚本:

#相对ansible-nfate-*目录
cd /data/projects/ansible-nfate-1.*
 
#生产环境加prod参数执行
nohup  sh ./boot.sh prod -D > logs/boot.log 2>&1 &

在这里需要等待一段时间,大约十几分钟,部署日志输出在logs目录下,实时查看是否有报错:

#相对ansible-nfate-*目录
cd logs
tail -f ansible.log (实时查看部署情况,如果没有这个日志文件,需要查看是否有安装ansible)

检查项不通过提示列表:
1、"Warning: now swap is 0, need to turn up" 
    ---没有设置虚拟内存,请参考前面章节进行设置,不低于128G。
2、"Warning: key fate process exists, please has a check and clean"
    ---环境没有清理干净,需要把以前部署的fate进程停掉。
3、"Warning: these ports: 4670 4671 9360 9370 9380 have been used"
    ---环境没有清理干净,需要把以前部署的fate进程停掉。
4、"Warning: if reinstall mysql, please stop mysql, and rename /etc/my.cnf"
    ---mysql没有停止,需要停止。如果有/etc/my.cnf文件,需要mv改名。
5、"Waring: please rename /data/projects/fate"
    ---fate目录存在,需要先mv。
6、"Warning: please rename /data/projects/data/fate/mysql"
    ---/data/projects/data存在,需要mv。
7、"Warning: supervisor_fate_conf exists, please remove ls /data/projects/common/supervisord/supervisord.d/fate-*.conf"
  ---/data/projects/common目录存在,需要mv。

fateflow部署完重启:

#因为fate_flow依赖的组件比较多,可能启动会有异常,处理如下:
netstat -tlnp | grep 9360
如果没有端口则重起fateflow:
sh service.sh stop fate-fateflow
sh service.sh start fate-fateflow

5.5 问题定位

1)eggroll日志

/data/logs/fate/eggroll/bootstrap.clustermanager.err

/data/logs/fate/eggroll/logs/eggroll/clustermanager.jvm.err.log

/data/logs/fate/eggroll/logs/eggroll/nodemanager.jvm.err.log

/data/logs/fate/eggroll/logs/eggroll/bootstrap.nodemanager.err

/data/logs/fate/eggroll/logs/eggroll/bootstrap.rollsite.err

/data/logs/fate/eggroll/logs/eggroll/rollsite.jvm.err.log

2)fateflow日志

/data/logs/fate/python/logs/fate_flow/

3)fateboard日志

/data/logs/fate/fate/fateboard/logs

6 测试

6.1 Toy_example部署验证

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

6.1.1 单边测试

1)192.16865.161上执行,guest_partyid和host_partyid都设为10000:

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

注意:如果超过1分钟没输出,表示部署有问题,需要看日志进行问题定位。

类似如下结果表示成功:

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

提示:如出现max cores per job is 1, please modify job parameters报错提示,需要修改当前目录下文件toy_example_conf.json中参数task_cores为1.

2)192.168.65.162 上执行,guest_partyid和host_partyid都设为9999:

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

注意:如果超过1分钟没输出,表示部署有问题,需要看日志进行问题定位。

类似如下结果表示成功:

“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 双边测试

选定9999为guest方,在192.168.65.162上执行:

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

类似如下结果表示成功:

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

6.2 最小化测试

6.2.1 上传预设数据:

分别在192.168.65.161和192.168.65.162上执行:

source /data/projects/fate/bin/init_env.sh
cd /data/projects/fate/examples/scripts/
python upload_default_data.py -m 1

更多细节信息,敬请参考脚本README

6.2.2 快速模式:

请确保guest和host两方均已分别通过给定脚本上传了预设数据。

快速模式下,最小化测试脚本将使用一个相对较小的数据集,即包含了569条数据的breast数据集。

选定9999为guest方,在192.168.65.162上执行:

source /data/projects/fate/bin/init_env.sh
cd /data/projects/fate/examples/min_test_task/
#单边测试
python run_task.py -m 1 -gid 9999 -hid 9999 -aid 9999 -f fast
#两边测试
python run_task.py -m 1 -gid 9999 -hid 10000 -aid 10000 -f fast

其他一些可能有用的参数包括:

  1. -f: 使用的文件类型. “fast” 代表 breast数据集, “normal” 代表 default credit 数据集.
  2. –add_sbt: 如果被设置为1, 将在运行完lr以后,启动secureboost任务,设置为0则不启动secureboost任务,不设置此参数系统默认为1。

若数分钟后在结果中显示了“success”字样则表明该操作已经运行成功了。若出现“FAILED”或者程序卡住,则意味着测试失败。

6.2.3 正常模式

只需在命令中将“fast”替换为“normal”,其余部分与快速模式相同。

6.3 Fateboard testing

Fateboard是一项Web服务。如果成功启动了fateboard服务,则可以通过访问 http://192.168.65.161:8080 和 http://192.168.65.162:8080 来查看任务信息,如果本地办公电脑和服务器之间有防火墙则需开通。

7 系统运维

7.1 服务管理

在目标服务器(192.168.0.1 192.168.0.2)app用户下执行

7.1.1 服务管理

cd /data/projects/common/supervisord

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

#注意:因mysql是基础组件,启动较慢,建议重启操作是先停止所有组件,然后先启动mysql,再启动其他组件
sh service.sh start/stop/restart/status all 

#说明:因为fateflow依赖的组件比较多,重启所有的操作可能会导致fateflow启动异常,处理如下:
netstat -tlnp | grep 9360
如果没有端口则重起fateflow:
sh service.sh stop fate-fateflow
sh service.sh start fate-fateflow

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

sh service.sh start/stop/restart/status fate-clustermanager

7.2 查看进程和端口

在目标服务器(192.168.0.1 192.168.0.2 )app用户下执行

7.2.1 查看进程

#根据部署规划查看进程是否启动
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 查看进程端口

#根据部署规划查看进程端口是否存在
#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.2.3 服务日志

服务日志路径
eggroll/data/logs/fate/eggroll/logs
fate_flow&任务日志(fateflow节点)/data/logs/fate/python/logs
fateboard/data/logs/fate/fateboard/logs
mysql/data/logs/fate/mysql/

7.2.4 文件目录说明

文件路径说明
/data/projects/fate软件部署路径
/data/projects/datamysql数据存放路径
/data/logs日志路径
/data/projects/common/supervisord进程管理工具supervisor安装路径

8. 卸载

8.1 概述

支持所有服务服务的卸载以及单个服务的卸载。

8.2 执行卸载

cd /data/projects/ansible-nfate-1.*
sh ./uninstall.sh prod all

#卸载命令说明
sh ./uninstall.sh $arg1 $arg2
- $arg1参数同4.4.1步骤init执行的参数,为test|prod。
- $arg2参数为选择的服务,可选参数为(all|mysql|eggroll|fate_flow|fateboard),all代表卸载所有服务。

以上是关于Fate部署实战——从零开始实现Fate cluster部署的主要内容,如果未能解决你的问题,请参考以下文章

Fate实战——实现集群横向逻辑回归

联邦学习实战-2-用FATE从零实现横向逻辑回归

阅读笔记联邦学习实战——用FATE从零实现纵向线性回归

Fate Serving安装部署

隐私计算FATE-模型训练

联邦学习实战基于FATE框架的MNIST手写数字识别——全连接神经网络