一、开始
首先,在github找到官方的项目文档,然后同时对照官方文档和本文进行部署。在实际操作过程中会遇到很多由于运行环境不同导致的问题。本文档包含了部分在各个环节遇到过的问题作为参考。(官方github仓库)
二、部署方式
FATE框架的部署分为单机版本和集群版本,在单机版本中,参与训练的多方(即host和guest)将被安装在同一台服务器上,所以实际上并不适合作为实际工程使用的方式,一般用来学习框架内容和进行实验测试。
单机部署有三种方式:编译源码部署、使用已编译的安装包,以及Dokcer部署。在本文中,我们通过Docker的方式进行部署。
集群部署有四种方式:原生安装、Ansible集群安装、Kubernetes安装、以及Docker Compose安装。在本文中,我们通过Docker Compose的方式进行部署。
三、单机部署
单机部署较为简单。首先,看到官网的配置要求为8核16G内存,CentOS7以上系统。实际上通过测试发现Ubantu也是可以部署成功的,硬盘空间也无所谓,不要太小就好。此外,部署时需要root权限。
1.安装docker
ubantu使用以下命令安装:
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
centOS使用以下命令安装:
sudo yum -y install docker-ce
安装好后通过docker version命令查看版本,如果能正常显示内容则安装成功
2.安装python
这里不重复写了,请参考(Ubuntu安装python)(CentOS安装python)
3.拉取docker镜像
这里直接拉取最新版本,若需要特定版本则要在镜像名后加":{需要的版本号}",如果下载失败则尝试使用国内的镜像源。
docker pull federatedai/standalone_fate
4.启动
启动前先检查三个端口号是否被占用,一般刚安装好的系统是不会被占用的。
netstat -apln|grep 8080;
netstat -apln|grep 9360;
netstat -apln|grep 9380
检查无误后就可以通过docker run命令启动FATE镜像了:
docker run -d --name standalone_fate -p 8080:8080 federatedai/standalone_fate
实际上我们也可以不进行步骤3拉取镜像,直接输入这一行,docker会自行判断本地是否有对应镜像,若没有则从源进行拉取。
5.查看是否运行成功
docker ps
通过查看容器命令,若我们看到如下图的几个容器则说明运行成功
如果没有看到,先通过以下命令:
docker ps -a
查看所有历史存在的容器,如果出现了几个Status为Exit(..)的容器,请在检查服务器配置后通过该命令查看具体问题:
docker logs <容器id>
若无显示任何容器,则返回去查看刚才输入docker run后的控制台输出内容,是否在运行时发生了问题。
6.测试
部署成功后,通过网页访问 ‘本机ip’:8080 可以进入FATE Board页面,账号密码默认为:admin
返回终端,输入
docker exec -it standalone_fate bash
进入对应容器(若无此容器,使用docker ps看一下是不是名字不一样)使用命令
flow test toy -gid 10000 -hid 10000
之后进入FATE Broad,点击右上角JOBS,看到任务栏出现两项任务,并且状态为success则说明成功。
四、集群部署
部署集群需要较多前置步骤,并且对于不同系统可能会存在一些差别,本文只在centOS下搭建集群。你需要准备至少两台主机,且拥有16G或以上内存。
注意:对于初次接触的人来说可能会弄混多台主机之间的步骤,强烈建议先单独处理完一台主机后,将其镜像拷贝为不同的主机,这样可以避免因为粗心导致的难以查找的问题。
1.环境准备
1)首先通过前文步骤安装docker和python,如果你之前在安装docker时未更新yum源,则安装的docker18.x可能会在后续安装中出现‘python Health XXX invaild...’的错误,尽管官方文档中只要求docker版本为18+,请将其升级为最新的19+以上。
2)此外还需要安装Docker-Compose
pip install -U docker-compose
#如果你的服务器上找不到pip命令,可以使用以下命令安装pip
yum -y install python-pip
3)新安装的centOS可能是没配置网卡的,集群部署要求多个主机之间能相互连通,如果发现不能联网,请尝试以下命令:
cd /etc/sysconfig/network-scripts/
vi ifcfg-网卡名称
#将文件中的ONBOOT=no改为yes
#重启网卡
service network restart
4)禁用selinux,否则可能导致后续过程中mysql服务无法启动的问题。由于不同系统版本的selinux文件位置不同,可以根据网上对应的教程进行关闭,这里只做示范。
sudo vi /etc/sysconfig/selinux
#将SELINUX=enforcing改为SELINUX=disabled
2.下载部署脚本以及对应镜像
在官方发布页面下载对应的部署脚本(发布页面)找到kubefate-docker-compose-....那一项,在服务器根目录下建立名为kubeFATE的文件夹,将脚本下载并解压至该目录。
通过docker pull命令下载多个框架组件的镜像,镜像的下载是非必须的,因为在后续执行部署文件时也会自动检测是否需要下载。
docker pull federatedai/eggroll
docker pull federatedai/fateboarde
docker pull federatedai/python
docker pull federatedai/serving-server
docker pull federatedai/serving-proxy
docker pull federatedai/serving-admin
docker pull bitnami/zookeeper:3.7.0
docker pull mysql:8.0.28
3.配置部署机连接
如果之前的配置都是在一台服务器上进行的,此时已经可以将其镜像打包至其他服务器了。待所有机器全部启动完毕后,找到它们对应的ip地址。
选取任意一台作为部署机,部署机需要对其他所有机器能够进行无密码ssh连接,在其他所有主机执行以下命令:
ssh-keygen -t rsa 生成密钥
ssh-copy-id <部署机ip> 发送密钥
输入命令后会有很多参数要求设置,全部按回车即可。之后在部署机上使用 ssh <目标ip> 测试是否能直接连接。
4.配置部署脚本文件
vi kubeFATE\docker-deploy\parties.conf
打开文件后可以查看到以下配置:
#!/bin/bash
user=root
dir=/data/projects/fate
party_list=(10000 9999)
party_ip_list=(192.168.1.244 192.168.1.129)
serving_ip_list=(192.168.1.244 192.168.1.129)
# backend could be eggroll, spark_rabbitmq and spark_pulsar spark_local_pulsar
backend=eggroll
# true if you need python-nn else false, the default value will be false
enabled_nn=false
# 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
name_node=hdfs://namenode:9000
# Define fateboard login information
fateboard_username=admin
fateboard_password=admin
注意party_list、party_ip_list、serving_ip_list这三项,请将ip替换为对应的本机ip,party_list为部署后集群节点的编号,在使用FATE-flow时需要对应上,可以自行设置。若为第一次部署,建议其他的参数不要修改,以免出错。
5.执行部署脚本
在部署机上执行:
cd kubeFATE\docker-deploy
bash ./generate_config.sh
bash ./docker_deploy.sh all
若无报错,则可以在各个节点使用 docker ps 命令查看容器是否成功启动
6.在mysql内创建用户
如果在上步骤很久后,federatedai/python容器依然不停重启、退出,使用命令:
docker logs <federatedai/python容器对应ID>
查看日志,是否是因为mysql拒接连接。此时需要手动在mysql容器内创建fate用户和数据表(若无)
进入mysql容器并登陆,使用以下SQL语句创建一个名为fate的用户:
create user fate@'%' identified by 'fate_dev';
grant all privileges on *.* to fate@'%' with grant option;
FLUSH PRIVILEGES;
commit;
7.验证部署
若所有容器均已正常启动,使用以下命令进行验证服务是否正常:
$ docker exec -it confs-10000_client_1 bash #进入python组件容器内部
$ flow test toy --guest-party-id 10000 --host-party-id 9999 #验证
登陆各个节点的FATEBoard查看任务是否完成成功。
若为failed,选择任务,点击dashboard查看任务logs,根据日志返回之前步骤查看问题所在。