Utilice FATE para implementar la tarea de regresión logística del aprendizaje federado horizontal en dos máquinas

Tabla de contenido

1. Preparación ambiental

2. Aprendizaje federado horizontal

1.Procesamiento de datos

2.Carga de datos

3. Modifique el archivo de configuración del entrenamiento (en la máquina B)

4. Envíe la tarea para capacitación (en la máquina B)

 3. Evaluación del modelo

1. Modificar el archivo de configuración

2. Enviar tareas para capacitación.

3. Ver los resultados de la evaluación

 4. Eliminar implementación


1. Preparación ambiental

Para la configuración del entorno FATE, consulte la sección anterior "Uso de KubeFATE para implementar un entorno de aprendizaje federado de múltiples máquinas (2)".

https://blog.csdn.net/SAGIRIsagiri/article/details/124127258 https://blog.csdn.net/SAGIRIsagiri/article/details/124127258Proceso básico:

  1. procesamiento de datos
  2. Carga de datos
  3. Entrenamiento modelo
  4. Predicción del modelo

2. Aprendizaje federado horizontal

1.Procesamiento de datos

El conjunto de datos utiliza el conjunto de datos de tumores de cáncer de mama integrado en la biblioteca sklearn. Para simular el aprendizaje federado horizontal, el conjunto de datos se divide en formas federadas horizontales con las mismas características.

El conjunto de datos tiene un total de 569 datos, 30 números de características (en realidad, 10 atributos, que aparecen tres veces como media, desviación estándar estándar y peor valor, peor) y una etiqueta (1: tumor benigno, 0: comportamiento maligno). Tumor, 1:0=357:212).

Ahora los primeros 200 datos se usan como datos de la máquina A y se almacenan como breast_1_train.csv, los últimos 269 datos se usan como datos de la máquina B y se almacenan como breast_2_train.csv, y los últimos 100 datos se usan como datos de prueba y almacenado como breast_eval.csv.

Ejecute el siguiente código en un entorno con la biblioteca de tiempo de ejecución de Python requerida. Después de la ejecución, se generarán tres archivos, breast_1_train, breast_2_train y breast_evl, en la ruta actual. Son el conjunto de datos de entrenamiento y el conjunto de datos de verificación del anfitrión y el invitado respectivamente. .

from sklearn.datasets import load_breast_cancer
import pandas as pd 

breast_dataset = load_breast_cancer()
breast = pd.DataFrame(breast_dataset.data, columns=breast_dataset.feature_names)
breast = (breast-breast.mean())/(breast.std())           #z-score标准化
col_names = breast.columns.values.tolist()

columns = {}
for idx, n in enumerate(col_names):
	columns[n] = "x%d"%idx 
breast = breast.rename(columns=columns)	
breast['y'] = breast_dataset.target
breast['idx'] = range(breast.shape[0])
idx = breast['idx']

breast.drop(labels=['idx'], axis=1, inplace = True)
breast.insert(0, 'idx', idx)
breast = breast.sample(frac=1)                        #打乱数据
train = breast.iloc[:469]
eval = breast.iloc[469:]

breast_1_train = train.iloc[:200]
breast_1_train.to_csv('breast_1_train.csv', index=False, header=True)
breast_2_train = train.iloc[200:]
breast_2_train.to_csv('breast_2_train.csv', index=False, header=True)

eval.to_csv('breast_eval.csv', index=False, header=True)

2.Carga de datos

Primero cargue el archivo de datos en la máquina virtual. Después de ejecutar FATE, puede ver el archivo del clúster en /data/projects/fate e ingresar a la carpeta share_dir en el clúster (confs-10000). Esta carpeta es externa al contenedor de Docker. En la carpeta compartida en ejemplos, ingrese los ejemplos y cree la carpeta mydata en ella. Puede cargar los datos aquí. Utilice la herramienta de carga de archivos rz e ingrese el siguiente comando para instalar. Después de ejecutar, aparecerá el cuadro de selección de archivos. Simplemente seleccione el archivo a cargar y cárguelo en ambas máquinas.

# sudo apt-get install lrzsz
# rz -be

Luego ingresa al contenedor de Python.

# docker exec -it confs-10000_python_1 bash
# cd examples/mydata                //刚才上传的数据就在这里

FATE integra muchas referencias de modelos de aprendizaje automático de uso común. En los ejemplos federados ml-1.x en los ejemplos, esta vez se selecciona el modelo de regresión logística, es decir, homo_logistic_regression.

 Primero, en la máquina A, ingrese homo_logistic_regression, modifique upload_data_host.json y cargue los datos de entrenamiento 1 al sistema.

# vi upload_data_host.json

{
   //指定数据文件,使用绝对路径不容易出错
  "file": "/data/projects/fate/python/examples/mydata/breast_1_train.csv",
  "head": 1,
  "partition": 10,
  "work_mode": 1,
  "table_name": "homo_breast_1_train",                //指定表名
  "namespace": "homo_host_breast_train"               //指定命名空间
}

//使用fate_flow上传数据,注意自己的fate_flow的路径是否一致
# python ../../../fate_flow/fate_flow_client.py -f upload -c upload_data_host.json 

//返回输出,可以从board_url中的网址中看到执行结果
{
    "data": {
        "board_url": "http://fateboard:8080/index.html#/dashboard?job_id=202204200159215834845&role=local&party_id=0",
        "job_dsl_path": "/data/projects/fate/python/jobs/202204200159215834845/job_dsl.json",
        "job_runtime_conf_path": "/data/projects/fate/python/jobs/202204200159215834845/job_runtime_conf.json",
        "logs_directory": "/data/projects/fate/python/logs/202204200159215834845",
        "namespace": "homo_host_breast_train",
        "table_name": "homo_breast_1_train"
    },
    "jobId": "202204200159215834845",
    "retcode": 0,
    "retmsg": "success"
}

 Luego modifique el archivo upload_data_test.json para cargar los datos de prueba en el sistema.

# vi upload_data_test.json 

{
  "file": "/data/projects/fate/python/examples/mydata/breast_eval.csv",
  "head": 1,
  "partition": 10,
  "work_mode": 1,
  "table_name": "homo_breast_1_eval",
  "namespace": "homo_host_breast_eval"
}

# python ../../../fate_flow/fate_flow_client.py -f upload -c upload_data_test.json 

Luego, en la máquina B, ingrese homo_logistic_regression, modifique upload_data_guest.json y cargue los datos de entrenamiento 2 al sistema.

# vi upload_data_guest.json

{
  "file": "/data/projects/fate/python/examples/mydata/breast_2_train.csv",
  "head": 1,
  "partition": 10,
  "work_mode": 1,
  "table_name": "homo_breast_2_train",
  "namespace": "homo_guest_breast_train"
}

# python ../../../fate_flow/fate_flow_client.py -f upload -c upload_data_guest.json

 Luego modifique el archivo upload_data_test.json para cargar los datos de prueba en el sistema.

# vi upload_data_test.json 

{
  "file": "/data/projects/fate/python/examples/mydata/breast_eval.csv",
  "head": 1,
  "partition": 10,
  "work_mode": 1,
  "table_name": "homo_breast_2_eval",
  "namespace": "homo_guest_breast_eval"
}

# python ../../../fate_flow/fate_flow_client.py -f upload -c upload_data_test.json 

3. Modifique el archivo de configuración del entrenamiento (en la máquina B)

FATE requiere dos archivos de configuración, dsl y conf, para el aprendizaje federado.

dsl: se utiliza para describir módulos de tareas y combinar módulos de tareas en forma de un gráfico acíclico dirigido

conf: se utiliza para configurar los parámetros de cada componente, como el nombre de la tabla de datos del módulo de entrada, la tasa de aprendizaje del módulo de algoritmo, el tamaño del lote, el número de iteraciones, etc.

Hay muchos archivos predeterminados en homo_logistic_regression, seleccione dos de ellos para modificarlos, a saber, test_homolr_train_job_conf.json y test_homolr_train_job_dsl.json.

# vi test_homolr_train_job_dsl.json

//当前dsl中已经定义了三个组件模块,构成了最基本的横向联邦模型流水线,直接使用即可
{
    "components" : {
        "dataio_0": {
            "module": "DataIO",
            "input": {
                "data": {
                    "data": [
                        "args.train_data"
                    ]
                }
            },
            "output": {
                "data": ["train"],
                "model": ["dataio"]
            }
         },
        "homo_lr_0": {
            "module": "HomoLR",
            "input": {
                "data": {
                    "train_data": [
                        "dataio_0.train"
                    ]
                }
            },
            "output": {
                "data": ["train"],
                "model": ["homolr"]
            }
        },
        "evaluation_0": {
            "module": "Evaluation",
            "input": {
                "data": {
                    "data": [
                        "homo_lr_0.train"
                    ]
                }
            },
            "output": {
                "data": ["evaluate"]
            }
        }
    }
}
# vi test_homolr_train_job_conf.json 

{
    "initiator": {
        "role": "guest",
        "party_id": 9999                           //此处修改了guest的id
    },
    "job_parameters": {
        "work_mode": 1                             //将工作模式设为集群模式
    },
    "role": {
        "guest": [9999],                           //修改guest的id
        "host": [10000],
        "arbiter": [10000]
    },
    "role_parameters": {
        "guest": {
            "args": {
                "data": {           //修改此处的name和namespace和upload文件中的一致
                    "train_data": [{"name": "homo_breast_2_train", "namespace": "homo_guest_breast_train"}]
                }
            }
        },
        "host": {
            "args": {
                "data": {           //修改此处的name和namespace和upload文件中的一致
                    "train_data": [{"name": "homo_breast_1_train", "namespace": "homo_host_breast_train"}]
                }
            },
            "evaluation_0": {
                "need_run": [false]
            }
        }
    },
    "algorithm_parameters": {
        "dataio_0":{
            "with_label": true,
            "label_name": "y",
            "label_type": "int",
            "output_format": "dense"
        },
        "homo_lr_0": {
            "penalty": "L2",
            "optimizer": "sgd",
            "eps": 1e-5,
            "alpha": 0.01,
            "max_iter": 10,
            "converge_func": "diff",
            "batch_size": 500,
            "learning_rate": 0.15,
            "decay": 1,
            "decay_sqrt": true,
            "init_param": {
                                "init_method": "zeros"
            },
            "encrypt_param": {
                "method": "Paillier"
            },
            "cv_param": {
                "n_splits": 4,
                "shuffle": true,
                "random_seed": 33,
                "need_cv": false
            }
        }
    }
}

4. Envíe la tarea para capacitación (en la máquina B)

# python ../../../fate_flow/fate_flow_client.py -f submit_job -d test_homolr_train_job_dsl.json -c test_homolr_train_job_conf.json

//返回输出,可以从board_url中查看任务运行情况
{
    "data": {
        "board_url": "http://fateboard:8080/index.html#/dashboard?job_id=202204200254141918057&role=guest&party_id=9999",
        "job_dsl_path": "/data/projects/fate/python/jobs/202204200254141918057/job_dsl.json",
        "job_runtime_conf_path": "/data/projects/fate/python/jobs/202204200254141918057/job_runtime_conf.json",
        "logs_directory": "/data/projects/fate/python/logs/202204200254141918057",
        "model_info": {
            "model_id": "arbiter-10000#guest-9999#host-10000#model",
            "model_version": "202204200254141918057"
        }
    },
    "jobId": "202204200254141918057",
    "retcode": 0,
    "retmsg": "success"
}

Durante el entrenamiento, puede ver el estado de ejecución de la tarea desde el tablero de destino y hacer clic en ver los resultados de la evaluación para ver los resultados específicos del entrenamiento.

 3. Evaluación del modelo

 La evaluación de modelos es una parte importante del diseño de algoritmos de aprendizaje automático, y esto también es cierto en escenarios de aprendizaje federado. Los métodos de evaluación de modelos más utilizados incluyen el método de reserva y el método de validación cruzada.

  • Método de retención: divida los datos de acuerdo con una determinada proporción y reserve una parte de los datos como un conjunto de datos de evaluación para evaluar el efecto del modelo del aprendizaje federado.
  • Método de validación cruzada: corte el conjunto de datos D en k partes, D1, D2,..., Dk. Cada vez, los datos k-1 se seleccionan aleatoriamente como conjunto de entrenamiento y los datos restantes se utilizan como conjunto de evaluación. datos. De esta manera, se pueden obtener k conjuntos de diferentes conjuntos de datos de entrenamiento y conjuntos de datos de evaluación, se pueden obtener k resultados de evaluación y el valor promedio se toma como resultado final de la evaluación del modelo.

1. Modificar el archivo de configuración

El conjunto de datos se dividió en breast_eval.csv para realizar pruebas (es decir, utilizando el método de configuración) y se cargó en el sistema. Ahora modifique el archivo de configuración para evaluar el modelo.

# vi test_homolr_train_job_dsl.json                //编写dsl配置文件

{
    "components" : {
        "dataio_0": {
            "module": "DataIO",
            "input": {
                "data": {
                    "data": ["args.train_data"]
                }
            },
            "output": {
                "data": ["train"],
                "model": ["dataio"]
            }
         },
        "dataio_1": {                        //此处添加dataio_1模块,用于读取测试数据
                "module": "DataIO",
                "input": {
                        "data": {
                                "data": ["args.eval_data"]
                        },
                        "model": ["dataio_0.dataio"]
                },
                "output":{
                        "data":["eval_data"]
                }
        },
        "homo_lr_0": {
            "module": "HomoLR",
            "input": {
                "data": {
                    "train_data": [
                        "dataio_0.train"
                    ]
                }
            },
            "output": {
                "data": ["train"],
                "model": ["homolr"]
            }
        },
        "homo_lr_1": {                     //此处添加homo_lr_1模块,用于对测试数据进行训练
            "module": "HomoLR",
            "input": {
                "data": {
                    "eval_data": ["dataio_1.eval_data"]
                },
                "model": ["homo_lr_0.homolr"]
            },
            "output": {
                "data": ["eval_data"],
                "model": ["homolr"]
            }
        },
        "evaluation_0": {
            "module": "Evaluation",
            "input": {
                "data": {
                    "data": [
                        "homo_lr_0.train"
                    ]
                }
            },
            "output": {
                "data": ["evaluate"]
            }
        },
        "evaluation_1": {               //此处添加evaluation_1模块,用于对测试数据进行评估
            "module": "Evaluation",
            "input": {
                "data": {
                    "data": ["homo_lr_1.eval_data"]
                }
            },
            "output": {
                "data": ["evaluate"]
            }
        }
    }
}
# vi test_homolr_train_job_conf.json             //编写conf配置文件

{
    "initiator": {
        "role": "guest",
        "party_id": 9999
    },
    "job_parameters": {
        "work_mode": 1
    },
    "role": {
        "guest": [9999],
        "host": [10000],
        "arbiter": [10000]
    },
    "role_parameters": {
        "guest": {                        //此处添加guest的测试数据
            "args": {
                "data": {
                    "train_data": [{"name": "homo_breast_2_train", "namespace": "homo_guest_breast_train"}]
                    "eval_data": [{"name": "homo_breast_2_eval", "namespace": "homo_guest_breast_eval"}]
                }
            }
        },
        "host": {                        //此处添加host的测试数据
            "args": {
                "data": {
                    "train_data": [{"name": "homo_breast_1_train", "namespace": "homo_host_breast_train"}]
                    "eval_data": [{"name": "homo_breast_1_eval", "namespace": "homo_host_breast_eval"}]
                }
            },
            "evaluation_0": {
                "need_run": [false]
            },
            "evaluation_1": {            //此处添加evaluation_1
                "need_run": [false]
            }
        }
    },
    "algorithm_parameters": {
        "dataio_0":{
            "with_label": true,
            "label_name": "y",
            "label_type": "int",
            "output_format": "dense"
        },
        "homo_lr_0": {
            "penalty": "L2",
            "optimizer": "sgd",
            "eps": 1e-5,
            "alpha": 0.01,
            "max_iter": 10,
            "converge_func": "diff",
            "batch_size": 500,
            "learning_rate": 0.15,
            "decay": 1,
            "decay_sqrt": true,
            "init_param": {
                                "init_method": "zeros"
            },
            "encrypt_param": {
                "method": "Paillier"
            },
            "cv_param": {
                "n_splits": 4,
                "shuffle": true,
                "random_seed": 33,
                "need_cv": false
            }
        }
    }
}

2. Enviar tareas para capacitación.

# python ../../../fate_flow/fate_flow_client.py -f submit_job -d test_homolr_train_job_dsl.json -c test_homolr_train_job_conf.json

3. Ver los resultados de la evaluación

 4. Eliminar implementación

Si es necesario eliminar la implementación, todos los clústeres FATE se pueden detener ejecutando el siguiente comando en la máquina de implementación:

# bash docker_deploy.sh --delete all

Si desea eliminar por completo FATE implementado en la máquina en ejecución, puede iniciar sesión en los nodos por separado y luego ejecutar el comando:

# cd /data/projects/fate/confs-<id>/                //此处的ID就是集群的ID
# docker-compose down
# rm -rf ../confs-<id>/

Supongo que te gusta

Origin blog.csdn.net/SAGIRIsagiri/article/details/124189930
Recomendado
Clasificación