当前位置: 首页 > 工具软件 > FATE > 使用案例 >

FATE | 集群版fate-模型训练-测试步骤

易祖鹤
2023-12-01

整理自:github-fate


0. 总体流程

(1)数据准备(如果用默认的数据,就不需要准备了);
(2)把数据的路径,写到upload_host.json或者upload_guest.json的里,然后用fate_flow把数据upload到指定的namescope和table_name(json里设置);
(3)配置计算图的流程和模块:dsl.json文件;配置计算图中的数据、算法超参数等:conf.json文件;
(4)提交job进行训练:把前述信息给fate_flow,开始训练;
(5)提交job进行测试:upload测试数据,根据训练好的模型信息,修改测试配置文件,开始测试。

1. 进入并测试docker环境

进入fate-docker环境

docker exec -it confs-10000_python_1 bash

测试系统是否正常

#需要说明的是,如果是FATE 1.5,下述路径中没有python这一层
cd /data/projects/fate/python/examples/toy_example/
python run_toy_example.py 10000 9999 1

若正常可以进行下一步;遇到不正常的情况我一般都是重新部署,参考
FATE | ubuntu用KuteFATE在多台机器部署联合学习框架FATE——要点


2. 训练过程-纵向LR为例

2.1 Host机器上的操作

(1)登陆服务器:

ssh ubuntu@x.x.x.x

(2)进入docker-fate 的python容器:

docker exec -it confs-10000_python_1 bash

(3)配置数据upload参数

vi fate_flow/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"
}

(4)Upload数据(下述的 -c 路径需要根据情况修改路径)

python fate_flow/fate_flow_client.py -f upload -c fate_flow/examples/upload_host.json 

2.2 Guest机器上的操作

(1)登陆服务器:

ssh ubuntu@x.x.x.x

(2)进入docker-fate的python容器:

docker exec -it confs-9999_python_1 bash

(3)配置数据upload参数

vi fate_flow/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"
}

(5)Upload数据(下述的 -c 路径需要根据情况修改路径)

python fate_flow/fate_flow_client.py -f upload -c fate_flow/examples/upload_guest.json 

(6)配置计算图文件 dsl

dsl主要是计算图的组建,可以用默认的(或者在这个基础之上修改)

vi /data/projects/fate/python/fate_flow/examples/test_hetero_lr_job_dsl.json

(7)配置纵向LR的算法参数

vi fate_flow/examples/test_hetero_lr_job_conf.json

配置如下:
【需要注意的是,这里面的host和guest的name和namescope两个参数是让系统知道用哪个数据,这个需要和前面的upload数据那里相匹配】

{
    "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"]
            }
        }
    },
    "algorithm_parameters": {
        "hetero_lr_0": {
            "penalty": "L2",
            "optimizer": "rmsprop",
            "eps": 1e-5,
            "alpha": 0.01,
            "max_iter": 3,
            "converge_func": "diff",
            "batch_size": 320,
            "learning_rate": 0.15,
            "init_param": {
                                "init_method": "random_uniform"
            }
        }
    }
}

(7)提交job(-c -d 参数路径都可以酌情修改)

python fate_flow/fate_flow_client.py -f submit_job -d fate_flow/examples/test_hetero_lr_job_dsl.json -c fate_flow/examples/test_hetero_lr_job_conf.json

输出结果如下(比较重要的是model_id,model_version,jobId):

{
    "data": {
        "board_url": "http://fateboard:8080/index.html#/dashboard?job_id=202011020319360006512&role=guest&party_id=9999",
        "job_dsl_path": "/data/projects/fate/python/jobs/202011020319360006512/job_dsl.json",
        "job_runtime_conf_path": "/data/projects/fate/python/jobs/202011020319360006512/job_runtime_conf.json",
        "logs_directory": "/data/projects/fate/python/logs/202011020319360006512",
        "model_info": {
            "model_id": "arbiter-10000#guest-9999#host-10000#model",
            "model_version": "202011020319360006512"
        }
    },
    "jobId": "202011020319360006512",
    "retcode": 0,
    "retmsg": "success"
}

(8)检查训练job的状态:

python fate_flow/fate_flow_client.py -f query_task -j 202011020319360006512 | grep f_status

输出如下:

"f_status": "success",
"f_status": "success",

(9)登陆guest fateboard查看job训练信息:

http://服务器的IP:8080

3. 测试过程-纵向LR为例


host方要upload数据,以备guest传来的数据查询用;
上传数据方法同前面所述;
注意区分测试的tabel name和前面训练时tabel name;


3.1 测试方法一:提交测试job

这种可以批量测试,可以在fateboard查看结果。

配置文件:主要修改model id和要预测的数据的name scope和table name;

vi fate_flow/examples/test_predict_conf.json

提交测试job:

python fate_flow/fate_flow_client.py -f submit_job -c fate_flow/examples/test_predict_conf.json

3.2 测试方法二:curl命令或者request.post请求服务

请参考FATE | 在线推理服务的使用和问题处理


4.获取中间结果

4.1 统一的方法

一般,在fateboard上能看到的,都可以通过fate_flow API获取,具体的方法和前述的有些类似,总的格式如下:

python fate_flow/fate_flow_client.py -f API名称

其中的API名称,可以在fate_flow_client.py文件中找到,如果不明白什么意思,可以挨个试试,每个API后面的参数不一样,写错了会有提示。或者多按几下tab,也会出来提示。

例如:
停止job用 -f stopjob;
输出模型在数据集上的预测结果用 -f component_metric_all;
输出训练好的模型用 -f component_output_model;
输出中间结果的数据用 -f component_output_data;
等等。

4.2 获得模型中间处理之后数据(csv)

有时候需要获取job运行中间的一些结果,比如feature binning的输出结果,这个在fateboard上可以看,如果需要获取fate boared上展示的那个csv文件,可以用以下命令:

python fate_flow/fate_flow_client.py -f component_output_data -j 2020110609211442631015 -r guest -p 215 -cpn hetero_feature_binning_0 --o ./zhongjianjieguo

上面的参数都比较直白,其中 --cpn指的是计算图中的“组件”,组件的名称可以在fateboard里查看。

返回的结果:

{
    "retcode": 0,
    "directory": "/data/projects/fate/python/zhongjianjieguo/job_2020110609211442631015_hetero_feature_binning_0_guest_215_output_data",
    "retmsg": "download successfully, please check /data/projects/fate/python/zhongjianjieguo/job_2020110609211442631015_hetero_feature_binning_0_guest_215_output_data directory"
}

我们想要的那个csv就存在上述的directory里面。

 类似资料: