KubeFATE1.7在Ubuntu18.04环境搭建
Ubuntu18.04修改静态IP
首先关闭networkManager
sudo service network-manager stop (关闭NM)
sudo rm /var/lib/NetworkManager/NetworkManager.state (删除NM)
###方法1:
Ubuntu18.04采用的是netplan来管理network。所以可以在/etc/netplan/目录下创建一个以yaml结尾的文件。在/etc/netplan/目录下有一个缺省文件:01-network-manager-all.yaml,我们可以自己为网卡再建一个文件,也可直接修改这个文件。
-如,我的网卡是ens33, vim 02-network-manager-ens33.yaml
# Let manual manage ens33 devices on this system network: version: 2 renderer: networkd ethernets: ens33: dhcp4: no addresses: [192.168.31.129/24] gateway4: 192.168.31.2 nameservers: addresses: [192.168.31.129, 114.114.114.114]
这里把DNS和ipv4地址配置在一个文件里了,不用再修改/etc/resolv.conf 文件。
-**保存后,执行 **
sudo netplan apply
ip addr list
###方法2:
编辑:/etc/network/interfaces
# interfaces(5) file used by ifup(8) and ifdown(8) auto lo iface lo inet loopback auto ens33 iface ens33 inet static address 192.168.31.129 netmask 255.255.255.0 gateway 192.168.18.2
sudo netplan apply
ip addr list
DNS配置
修改:/etc/systemd/resolved.conf 在【resolve】中加入DNS地址即可。
[Resolve] DNS=192.168.31.2 #FallbackDNS= #Domains= #LLMNR=no #MulticastDNS=no #DNSSEC=no #Cache=yes #DNSStubListener=yes
————————————————
原文链接:https://blog.csdn.net/qq_42975842/article/details/81705244
准备工作
- 两个主机(物理机或者虚拟机,Ubuntu或Centos7系统,允许以root用户登录);
- 所有主机安装Docker 版本 : 18+;
- 所有主机安装Docker-Compose 版本: 1.24+;
- 部署机可以联网,所以主机相互之间可以网络互通;
- 运行机已经下载FATE 的各组镜
我用的是ubuntu18.4,且是是root用户下
第一步:
可以先安装vim
apt-get install vim
修改两台机器的源均为阿里云的源(建议在修改之前做一下原文件的备份)。
cp /etc/apt/sources.list /etc/apt/sources.list1(首先备份)
vim /etc/apt/sources.list (编辑假如阿里云的源)
阿里云源:(ubuntu 18.04)
deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
然后执行命令:
apt-get update
在运行完这段代码之后,再运行
apt-get upgrade
会从阿里云的镜像库进行安装,速度比国外的要快很多
第二步
克隆一个虚拟机,修改IP。然后我是将第一台node01、第二台node02命名
两台机器要网络互通,也需要可以进行ssh登录root用户,那么你就需要知道root用户的密码,因为在部署过程中,会登录两台机器进行文件的创建,移动等操作,如果不是root用户将会很麻烦!
node01、node02两台都要做
安装ssh服务:
apt-get install openssh-server
安装完成之后继续在命令行输入
ps -e | grep ssh
如果显示如下,则ssh已经启动了
root@node01:~# ps -e | grep ssh 760 ? 00:00:00 sshd 1734 ? 00:00:00 ssh-agent root@node01:~#
如果未显示相关的ssh,可以通过启动命令,启动ssh服务
启动命令
/etc/init.d/ssh start
重启命令
/etc/init.d/ssh restart 或者 service sshd restart 关闭命令 /etc/init.d/ssh stop 或者 service sshd stop
通过如下命令,进行ssh登录
ssh nde02
此处的root指的是你需要远程登录的用户名,后面跟着的是主机IP地址
运行命令之后,你很可能遭遇:
root@ubuntu:~# ssh root@192.168.29.132 root@192.168.29.132's password: Permission denied, please try again. root@192.168.29.132's password:
不用担心,接下来我们去配置一些文件就可以进行远程连接了。输入命令:
vim /etc/ssh/sshd_config
输入完成之后,你会打开一个文件修改其中如下几项:
PermitRootLogin yes
PasswordAuthentication yes
ChallengeResponseAuthentication yes
保证这几行取消了注释,并且为yes
OK,保存文件,重启ssh服务,再次输入远程登录命令,回车即可远程登录。
当然,你也可以选择选择无密登录,需要你互相将两台机器的秘钥文件复制给对方。生成秘钥的命令:
ssh-keygen -t rsa (四连回车) 如下(类似)即成功: +---[RSA 2048]----+ |+o .+oo.... o | |B= +.ooo... = | |=oX oo. o .= | |.B.+. .. oo . | |*o. o S . | |*. +. | |o.+ . | |o. | |E | +----[SHA256]-----+ 然后 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys 然后授权 chmod 600 ~/.ssh/authorized_keys 此时你可以尝试免密登录自己的机器,刷~,就成功了
但是此时你还是只能登录自己的机器,如果需要双向登录,那么就开始传输你们的秘钥吧。
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.31.130
另一台机器也执行相同的操作
分别在两台机器上执行,然后你再尝试ssh登录,应该就不需要输入密码了。
ssh服务安装完,并且已经完成了有密或者无密登录,再安装一个git吧。
apt-get install git
原文链接:https://blog.csdn.net/soumnswpz/article/details/105141624
第三步
安装docker与docker-compose。
本步操作内容参考:
https://blog.csdn.net/ziwuzhulin/article/details/97139423
https://www.jianshu.com/p/482d1eb4d9a2
这里我将会用全代码形式,不再进行赘述。
更新系统源 sudo apt-get update 安装允许apt使用基于https的仓库安装软件 sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ gnupg-agent \ software-properties-common 添加GPG密钥(注意最后还有一个 - ) curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add - 然后验证密钥是否添加成功,输入指令 sudo apt-key fingerprint 0EBFCD88
出现如下图片,则添加成功
继续执行代码:
写入docker stable版本的阿里云镜像软件源 sudo add-apt-repository \ "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu \ $(lsb_release -cs) \ stable" 更新软件源 sudo apt-get update 安装最新版的docker ce sudo apt-get install docker-ce docker-ce-cli containerd.io 运行,验证 docker run hello-world
出现如下即为成功:
OK,继续安装docker-compose
安装国内的,国外的太慢 sudo curl -L "https://get.daocloud.io/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose 这里面的1.24.1可以替换为最新版本的,移步至 https://docs.docker.com/compose/install/ 查看最新版本 对二进制文件应用可执行权限: chmod +x /usr/local/bin/docker-compose 运行 docker --version docker-compose --version
原文链接:https://blog.csdn.net/soumnswpz/article/details/105141624
在部署机下载 FATE 的 docker-compose 安装包
我是将node01作为部署机
以下是部署机的操作,目标机不用动,
cd /usr/local 下载并解压Kubefate1.3的kubefate-docker-compose.tar.gz资源包 # wget https://github.com/FederatedAI/KubeFATE/releases/download/v1.6.1/kubefate-docker-compose-v1.6.1.tar.gz # tar -xzf kubefate-docker-compose-v1.6.1.tar.gz 进入安装目录 cd docker-deploy
FATE的各个版本的安装包都可以在这里找到
https://github.com/FederatedAI/KubeFATE/releases
修改配置
主要修改party_ip_list
和serving_ip_list(第一个node01的ip,第二个node02)
,其他的可以默认不变。 如果想要使用spark计算引擎,修改computing_backend=spark
即可。
user改成root
第一次部署的时候镜像需要从docker hub下载,由于国内用户经常不能链接docker hub,可以使用hub.c.163.com
的镜像,只需要配置RegistryURI就可以。
生成安装包
根据上文的配置生成相对应的安装文件包
bash generate_config.sh
这一步会生成部署FATE的两方的所有tar包。如果修改了配置文件parties.conf
或者.env
,那么就需要重新生成安装包。
部署
部署双方的FATE和FATE-Serving
bash docker_deploy.sh all (启动集群)
执行时间超长,请保持良好网络,耐心等待
这一步会通过scp和ssh的方式将tar包拷贝到目标主机的对应目录,然后启动FATE集群。
验证集群基本功能
# docker exec -it confs-10000_python_1 bash # cd /data/projects/fate/python/examples/toy_example # python run_toy_example.py 10000 9999 1
如果测试通过,屏幕将显示类似如下消息:
"2019-08-29 07:21:25,353 - secure_add_guest.py[line:96] - INFO: begin to init parameters of secure add example guest" "2019-08-29 07:21:25,354 - secure_add_guest.py[line:99] - INFO: begin to make guest data" "2019-08-29 07:21:26,225 - secure_add_guest.py[line:102] - INFO: split data into two random parts" "2019-08-29 07:21:29,140 - secure_add_guest.py[line:105] - INFO: share one random part data to host" "2019-08-29 07:21:29,237 - secure_add_guest.py[line:108] - INFO: get share of one random part data from host" "2019-08-29 07:21:33,073 - secure_add_guest.py[line:111] - INFO: begin to get sum of guest and host" "2019-08-29 07:21:33,920 - secure_add_guest.py[line:114] - INFO: receive host sum from guest" "2019-08-29 07:21:34,118 - secure_add_guest.py[line:121] - INFO: success to calculate secure_sum, it is 2000.0000000000002"
验证Serving-Service功能
以下内容将会对部署好的两个FATE集群进行简单的训练和推理测试。训练所用到的数据集是”breast”(https://www.kaggle.com/yuqing01/breast-cancer),其中”breast”按列分为”breast_a”和”breast_b”两部分,参与训练的host方持有”breast_a”,而guest方则持有”breast_b”。guest和host将联合起来对数据集进行一个异构的逻辑回归训练。最后当训练完成后还会将得到的模型推送到FATE Serving作在线推理。
以下操作在workspace1上进行
进入python容器
# docker exec -it confs-10000_python_1 bash
进入fate_flow目录
# cd fate_flow
修改examples/upload_host.json
# vi examples/upload_host.json
{
"file": "examples/data/breast_a.csv",
"head": 1,
"partition": 10,
"work_mode": 1,
"namespace": "fate_flow_test_breast",
"table_name": "breast"
}
把“breast_a.csv”上传到系统中
# python fate_flow_client.py -f upload -c examples/upload_host.json
以下操作在workspace2上进行
进入python容器
# docker exec -it confs-9999_python_1 bash
进入fate_flow目录
# cd fate_flow
修改examples/upload_guest.json
# vi examples/upload_guest.json
{
"file": "examples/data/breast_b.csv",
"head": 1,
"partition": 10,
"work_mode": 1,
"namespace": "fate_flow_test_breast",
"table_name": "breast"
}
把“breast_b.csv”上传到系统中
# python fate_flow_client.py -f upload -c examples/upload_guest.json
修改examples/test_hetero_lr_job_conf.json
# vi examples/test_hetero_lr_job_conf.json
{
"initiator": {
"role": "guest",
"party_id": 9999
},
"job_parameters": {
"work_mode": 1
},
"role": {
"guest": [9999],
"host": [10000],
"arbiter": [10000]
},
"role_parameters": {
"guest": {
"args": {
"data": {
"train_data": [{"name": "breast", "namespace": "fate_flow_test_breast"}]
}
},
"dataio_0":{
"with_label": [true],
"label_name": ["y"],
"label_type": ["int"],
"output_format": ["dense"]
}
},
"host": {
"args": {
"data": {
"train_data": [{"name": "breast", "namespace": "fate_flow_test_breast"}]
}
},
"dataio_0":{
"with_label": [false],
"output_format": ["dense"]
}
}
},
....
}
提交任务对上传的数据集进行训练
# python fate_flow_client.py -f submit_job -d examples/test_hetero_lr_job_dsl.json -c examples/test_hetero_lr_job_conf.json
输出结果:
{
"data": {
"board_url": "http://fateboard:8080/index.html#/dashboard?job_id=202003060553168191842&role=guest&party_id=9999",
"job_dsl_path": "/data/projects/fate/python/jobs/202003060553168191842/job_dsl.json",
"job_runtime_conf_path": "/data/projects/fate/python/jobs/202003060553168191842/job_runtime_conf.json",
"logs_directory": "/data/projects/fate/python/logs/202003060553168191842",
"model_info": {
"model_id": "arbiter-10000#guest-9999#host-10000#model",
"model_version": "202003060553168191842"
}
},
"jobId": "202003060553168191842",
"retcode": 0,
"retmsg": "success"
}
训练好的模型会存储在EGG节点中,模型可通过在上述输出中的“model_id” 和 “model_version” 来定位。FATE Serving的加载和绑定模型操作都需要用户提供这两个值。
查看任务状态直到”f_status”为success,把上一步中输出的“jobId”方在“-j”后面。
# python fate_flow_client.py -f query_task -j 202003060553168191842 | grep f_status
output:
"f_status": "success",
"f_status": "success",
修改加载模型的配置,把上一步中输出的“model_id”和“model_version”与文件中的进行替换。
# vi examples/publish_load_model.json
{
"initiator": {
"party_id": "9999",
"role": "guest"
},
"role": {
"guest": ["9999"],
"host": ["10000"],
"arbiter": ["10000"]
},
"job_parameters": {
"work_mode": 1,
"model_id": "arbiter-10000#guest-9999#host-10000#model",
"model_version": "202003060553168191842"
}
}
加载模型
# python fate_flow_client.py -f load -c examples/publish_load_model.json
修改绑定模型的配置, 替换“model_id”和“model_version”,并给“service_id”赋值“test”。其中“service_id”是推理服务的标识,该标识与一个模型关联。用户向FATE Serving发送请求时需要带上“service_id”,这样FATE Serving才会知道用哪个模型处理用户的推理请求。
# vi examples/bind_model_service.json
{
"service_id": "test",
"initiator": {
"party_id": "9999",
"role": "guest"
},
"role": {
"guest": ["9999"],
"host": ["10000"],
"arbiter": ["10000"]
},
"job_parameters": {
"work_mode": 1,
"model_id": "arbiter-10000#guest-9999#host-10000#model",
"model_version": "202003060553168191842"
}
}
绑定模型
# python fate_flow_client.py -f bind -c examples/bind_model_service.json
在线测试,通过curl发送以下信息到192.168.7.2:8059/federation/v1/inference
curl -X POST -H 'Content-Type: application/json' -d ' {"head":{"serviceId":"test"},"body":{"featureData": {"x0": 0.254879,"x1": -1.046633,"x2": 0.209656,"x3": 0.074214,"x4": -0.441366,"x5": -0.377645,"x6": -0.485934,"x7": 0.347072,"x8": -0.287570,"x9": -0.733474}}' 'http://192.168.7.2:8059/federation/v1/inference'
输出结果:
{"flag":0,"data":{"prob":0.30684422824464636,"retmsg":"success","retcode":0}
若输出结果如上所示,则验证了serving-service的功能是正常的。上述结果说明有以上特征的人确诊概率为30%左右。
删除部署
如果需要删除部署,则在部署机器上运行以下命令可以停止所有FATE集群:
# bash docker_deploy.sh --delete all
如果想要彻底删除在运行机器上部署的FATE,可以分别登录节点,然后运行命令:
# cd /data/projects/fate/confs-<id>/ # the id of party
# docker-compose down
# rm -rf ../confs-<id>/