Fate单机版部署以及新增自定义算法组件的运行和修改

Fate单机版部署以及新增自定义算法组件的运行

本文实现目标:

  1. Fate单机版部署(网盘上(提取码:akai)有FateV1.7.0的源码,以及所需的各种资源包,相比去github下载省事很多)
  2. 自定义算法在Fate上的运行;
  3. 自定义算法在Fate上运行后,修改代码在Fate上的实时结果查看。

1 虚拟机配置

  • 内存:8G,处理器:4核,硬盘:100G(硬盘没这么大估计也不影响)
  • 操作系统:centos 7
  • 网络:可用状态

2 部署前环境检测

检查:本地8080、9360、9380端口是否被占用

netstat -apln|grep 8080
netstat -apln|grep 9360
netstat -apln|grep 9380

3 获取源代码

3.1 源代码

​ 源代码放在此链接(提取码:akai,压缩包名:Fate_DeployAndDevelop_Resource.zip),名叫FATE.zip的压缩包(这是Fate v1.7.0版本的)

3.2 配置源代码路径

3.2.1 创建Fate文件夹并解压

mkdir Fate
cd Fate

在这里插入图片描述

# 将压缩文件 FATE.zip 上传并解压在此( yum install unzip 下载unzip命令)

mkdir FATE
unzip FATE.zip -d  FATE
cd FATE

3.2.2 设置后面所需环境变量

# pwd的结果如下所示
pwd 

在这里插入图片描述

cd /Fate/FATE
export FATE_PROJECT_BASE=$PWD
export version=`grep "FATE=" ${FATE_PROJECT_BASE}/fate.env | awk -F "=" '{print $2}'`

注意:

  1. 这些环境变量只在当前终端内生效,关闭终端则失效;
  2. 下次开启终端如果需要用到这些环境变量(包括后面 步骤所设置的环境变量),请再次设置

4 安装并配置Python环境

4.1 安装Python环境

​ 请安装或者使用已有的Python 3.6 或者 3.7 版本,最好使用3.6.5,其为FATE团队官方大量测试版本

4.1.1 解压 Python-3.6.5.tgz

​ 压缩包放在此链接中(提取码:akai,压缩包名:Fate_DeployAndDevelop_Resource.zip),和上方Fate源码放在同一个目录,名叫Python-3.6.5.tgz的压缩包。

# 将压缩包放入/Python下

mkdir /Python
cd /Python

在这里插入图片描述

# 安装Python3.6可能使用的依赖(中途提示输入 :y)

yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel gcc gcc-c++

在这里插入图片描述

在这里插入图片描述

# 解压**python**压缩包

tar -zxvf Python-3.6.5.tgz

在这里插入图片描述

4.1.2 编译安装

4.1.2.1 创建安装目录
mkdir -p /usr/local/python3
4.1.2.2 跳转到解压的Python安装目录
cd Python-3.6.5
4.1.2.3 指定安装目录
./configure --prefix=/usr/local/python3

在这里插入图片描述

4.1.2.4 编译安装

​ 把源码包里面的代码编译成linux服务器可以识别的代码.(先进行make,执行完成之后,才开始执行make install)

make 
make install

​ 可能需要两、三分钟。

在这里插入图片描述

4.1.3 配置环境变量

vim ~/.bash_profile

​ 在此文件中填入以下两行

export PYTHON_HOME=/usr/local/python3/bin
PATH=$PATH:$PYTHON_HOME

​ 保存文件: ESC + :wq 进行保存文件

在这里插入图片描述

4.1.4 生效环境变量

source ~/.bash_profile

4.1.5 测试是否安装成功

python3

在这里插入图片描述

exit()进行退出

4.2 安装virtualenv,并创建虚拟环境

4.2.1 安装virtualenv

pip3 install virtualenv

在这里插入图片描述

4.2.2 创建虚拟环境

4.2.2.1 查看virtualenv 版本
virtualenv --version

在这里插入图片描述

4.2.2.2 创建虚拟环境
cd /Python
virtualenv venv

在这里插入图片描述

4.2.3 配置Fate所需环境变量

export FATE_VENV_BASE=/Python/venv
# 进入虚拟环境

source ${FATE_VENV_BASE}/bin/activate

在这里插入图片描述

5 安装Fate所需要的Python依赖包

cd ${FATE_PROJECT_BASE};
bash bin/install_os_dependencies.sh;

在这里插入图片描述

source ${FATE_VENV_BASE}/bin/activate;
# 可以使用我准备好的 python依赖包 :site-packages.zip,使用后便可不执行此命令,
# 注意:如果使用我的 依赖包,最好是处于一个新的python环境,不然会影响你原来已有的依赖
pip3 install -r python/requirements.txt

由于安装 Fate所需的Python依赖包太慢,我提前准备到了上文链接(提取码:akai,压缩包名:Fate_DeployAndDevelop_Resource.zip),文件名称为:site-packages.zip

解压到: /Python/venv/lib/python3.6/,命令如下

# site-packages.zip放入此目录
cd /Python/venv/lib/python3.6
rm -rf site-packages
unzip site-packages.zip -d site-packages

在这里插入图片描述

6 配置FATE

6.1 编辑bin/init_env.sh环境变量文件

cd ${FATE_PROJECT_BASE}

sed -i.bak "s#PYTHONPATH=.*#PYTHONPATH=$PWD/python:$PWD/fateflow/python#g" bin/init_env.sh;

sed -i.bak "s#venv=.*#venv=${FATE_VENV_BASE}#g" bin/init_env.sh

在这里插入图片描述

6.2 检查`conf/service_conf.yaml

​ 检查conf/service_conf.yaml全局配置文件中是否将基础引擎配置为单机版, 若default_engines显示如下,则为单机版

cat conf/service_conf.yaml

default_engines配置和下图显示一样表示为单机版。

在这里插入图片描述

7 启动fate flow server

cd ${FATE_PROJECT_BASE}
source bin/init_env.sh
cd fateflow

7.1 显示当前fate flow状态

bash bin/service.sh status

在这里插入图片描述

7.2 启动fate flow

bash bin/service.sh start

在这里插入图片描述

8 安装Fate client

cd ${FATE_PROJECT_BASE}
source bin/init_env.sh
cd python/fate_client/
python setup.py install

在这里插入图片描述

8.1 初始化 fate flow client

cd ../../;
flow init -c conf/service_conf.yaml

显示如下类似则为初始化成功,否则请依据提示查看日志

在这里插入图片描述

9 测试

9.1 Toy测试

flow test toy -gid 10000 -hid 10000

在这里插入图片描述

9.2 单元测试

cd ${FATE_PROJECT_BASE};
bash ./python/federatedml/test/run_test.sh

在这里插入图片描述

10 编译包安装fateboard

  1. 由于 FATE.zip 里面我已经搭好了Java环境和fateboard的编译安装包

  2. 如果你前面装的 FATE地址我装的地址 相同的话,直接略过此章节到 11 即可,例如:我的FATE地址:/Fate/FATE,和我的一样就直接可以看 11 章节

     echo ${FATE_PROJECT_BASE}
    

在这里插入图片描述

  1. 如果你前面装的 FATE地址我装的地址 不同的话就需要去修改一些文件。

    cd ${FATE_PROJECT_BASE};
    
    sed -i.bak "s#JAVA_HOME=.*#JAVA_HOME=$PWD/env/jdk/jdk-8u192/#g" bin/init_env.sh
    
    sed -i.bak "s#fateboard.datasource.jdbc-url=.*#fateboard.datasource.jdbc-url=jdbc:sqlite:$PWD/fate_sqlite.db#g" $PWD/fateboard/conf/application.properties;
    
    sed -i.bak "s#fateflow.url=.*#fateflow.url=http://localhost:9380#g" $PWD/fateboard/conf/application.properties
    

11 启动FateBoard

11.1 查看状态并给java设置可执行权限

cd fateboard;
bash service.sh status;
# 防止java命令执行时权限不够,而导致无法启动
chmod +x  ${JAVA_HOME}bin/java

在这里插入图片描述

11.2 启动FateBoard

bash service.sh start

在这里插入图片描述

11.3 关闭防火墙

systemctl stop firewalld

**注意:**此操作最好是在本机虚拟机上执行,切勿执行在可能会有外部访问的环境中。

请求: IP:8080 即可看到FateBoard

在这里插入图片描述

12 编写自定义算法

12.1 编写算法

​ 具体的算法编写规范见:Develop Guide - FATE

12.2 编写组件,用来让Fate flow读取自定义算法

/Fate/FATE/python/federatedml/components添加一个组件:my_data_split.py 组件名称为:myDataSplit

cd /Fate/FATE/python/federatedml/components
cat > my_data_split.py <<EOF
...(下方py文件)
EOF

from .components import ComponentMeta
from federatedml.util import LOGGER

# 组件名称
homo_data_split_cpn_meta = ComponentMeta("myDataSplit")

# 算子入参的实体对象,
@homo_data_split_cpn_meta.bind_param
def homo_data_split_param():
    # 调用的地址
    from federatedml.param.data_split_param import DataSplitParam
    # 只是添加了日志,并未修改算子
    LOGGER.debug("my_data_split   my_data_split    my_data_split  my_data_split  -----------------!")
    LOGGER.debug("Data_split1 parameter into -----------------!")
    return DataSplitParam

# guest方执行的算子
@homo_data_split_cpn_meta.bind_runner.on_guest
def homo_data_split_guest_runner():
    # 调用的地址
    from federatedml.model_selection.data_split.homo_data_split import (
        HomoDataSplitGuest,
    )
    # 只是添加了日志,并未修改算子
    LOGGER.debug("my_data_split   my_data_split    my_data_split  my_data_split  -----------------!")
    LOGGER.debug("Data_split1 guest into -----------------!")

    return HomoDataSplitGuest

# host方执行的算子
@homo_data_split_cpn_meta.bind_runner.on_host
def homo_data_split_host_runner():
    from federatedml.model_selection.data_split.homo_data_split import HomoDataSplitHost
    # 只是添加了日志,并未修改算子
    LOGGER.debug("my_data_split   my_data_split    my_data_split  my_data_split  -----------------!")
    LOGGER.debug("Data_split1 host into -----------------!")
    return HomoDataSplitHost

在这里插入图片描述

12.3 如何训练模型

官方文档:Develop Guide - FATE

12.3.1 上传数据集

由于是单机部署,所以同时上传guest和host方数据。

guest:

cat > my_guest.json <<EOF
...(下方json文件)
EOF
{
      "file": "examples/data/breast_homo_guest.csv",
      "head": 1,
      "partition": 16,
      "table_name": "breast_homo_guest",
      "namespace": "experiment",
      "count": 227
    }

在这里插入图片描述

host:

cat > my_host.json <<EOF
...(下方json文件)
EOF
{
      "file": "examples/data/breast_homo_host.csv",
      "head": 1,
      "partition": 16,
      "table_name": "breast_homo_host",
      "namespace": "experiment",
      "count": 228
    }

在这里插入图片描述

上传数据集:(先上传guest方数据集)

mv my_guest.json /Fate/FATE
mv my_host.json /Fate/FATE
flow data upload -c my_guest.json

在这里插入图片描述

flow data upload -c my_host.json

在这里插入图片描述

12.3.2 开始建模任务

12.3.2.1 编写dsl.json
cd /Fate/FATE/examples/dsl/v2/data_split
# 将homo_data_split_0的module对应的值改为自定义的组件名称:
cat > my_dsl.json <<EOF
...(下方json文件)
EOF
{
    "components": {
        "reader_0": {
            "module": "Reader",
            "output": {
                "data": [
                    "data"
                ]
            }
        },
        "data_transform_0": {
            "module": "DataTransform",
            "input": {
                "data": {
                    "data": [
                        "reader_0.data"
                    ]
                }
            },
            "output": {
                "data": [
                    "data"
                ],
                "model": [
                    "model"
                ]
            }
        },
        "homo_data_split_0": {
            "module": "myDataSplit",
            "input": {
                "data": {
                    "data": [
                        "data_transform_0.data"
                    ]
                }
            },
            "output": {
                "data": [
                    "train_data",
                    "validate_data",
                    "test_data"
                ]
            }
        }
    }
}

在这里插入图片描述在这里插入图片描述

12.3.2.2 编写conf.json
cat > my_conf.json <<EOF
...(下方json文件)
EOF
{
    "dsl_version": 2,
    "initiator": {
        "role": "guest",
        "party_id": 10000
    },
    "role": {
        "host": [
            10000
        ],
        "guest": [
            10000
        ]
    },
    "component_parameters": {
        "common": {
            "homo_data_split_0": {
                "test_size": 0.3,
                "validate_size": 0.2,
                "stratified": true
            }
        },
        "role": {
            "host": {
                "0": {
                    "reader_0": {
                        "table": {
                            "name": "breast_homo_host",
                            "namespace": "experiment"
                        }
                    },
                    "data_transform_0": {
                        "with_label": true
                    }
                }
            },
            "guest": {
                "0": {
                    "reader_0": {
                        "table": {
                            "name": "breast_homo_guest",
                            "namespace": "experiment"
                        }
                    },
                    "data_transform_0": {
                        "with_label": true,
                        "label_name": "y",
                        "label_type": "int",
                        "output_format": "dense"
                    }
                }
            }
        }
    }
}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

12.3.2.3 提交任务
flow job submit -d my_dsl.json -c my_conf.json

**此时会报错:**myDataSplit组件不存在

在这里插入图片描述

12.3.2.4 重启Fate flow 服务
cd /Fate/FATE/fateflow/bin
bash service.sh stop
# 以debug模式启动,则原有的算法和组件修改后,仍可直接运行
bash service.sh start --debug

在这里插入图片描述

12.3.2.5 回到dsl和conf文件目录
cd /Fate/FATE/examples/dsl/v2/data_split
flow job submit -d my_dsl.json -c my_conf.json

在这里插入图片描述

12.4 查看结果

在FateBoard看到了我自定义组件打印的日志

在这里插入图片描述

12.5 修改自定义算法

12.5.1 进入组件目录

cd /Fate/FATE/python/federatedml/components

修改组件日志 如下图

在这里插入图片描述

12.5.2 重新执行任务

cd /Fate/FATE/examples/dsl/v2/data_split
flow job submit -d my_dsl.json -c my_conf.json

在这里插入图片描述

12.5.3 查看Fate Board debug日志

在这里插入图片描述

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值