Getting Started

Installation

To install the latest version of the package, run the following command:

pip install golf_federated

Alternatively, you can clone the repository and install the package manually:

git clone git://github.com//golf_federated.git
cd golf_federated
python setup.py install

Quick Start

Here’s a quick example of how to use the package. For more details, see the Configuration section.

Configure your model

You have two ways to configure your model, either by a yaml file or by a python file.

Here is how to configure your model by a python file:

import tensorflow as tf


def create_cnn_for_mnist():
    return tf.keras.Sequential(
        [
            tf.keras.layers.Conv2D(
                32, kernel_size=(5, 5),
                activation='relu',
                input_shape=(28, 28, 1),
            ),
            tf.keras.layers.Conv2D(64, (5, 5), activation='relu'),
            tf.keras.layers.MaxPooling2D(pool_size=(2, 2)),
            tf.keras.layers.Dropout(0.25),
            tf.keras.layers.Flatten(),
            tf.keras.layers.Dense(256, activation="relu"),
            tf.keras.layers.Dropout(0.5),
            tf.keras.layers.Dense(10, activation='softmax'),
        ]
    )


model = 'create_cnn_for_mnist'
optimizer = tf.keras.optimizers.SGD(learning_rate=0.03)
loss = tf.keras.losses.CategoricalCrossentropy()
batch_size = 128
train_epoch = 1
library = 'tensorflow'
metrics = ["accuracy"]

Server code

Configure and set up your server.

import warnings

warnings.filterwarnings("ignore", category=Warning)

import os

os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'

from golf_federated.server.process.strategy.evaluation.classification import Accuracy

from golf_federated.server.process.strategy.aggregation.synchronous import FedAVG
from golf_federated.server.process.strategy.selection.nonprobbased import AllSelect

import sys

sys.path.append('../../../../module/MNIST/')

import tfmodule as module
from golf_federated.utils.data import CustomFederatedDataset
from golf_federated.server.process.config.task.synchronous import SyncTask
from golf_federated.server.process.config.model.tfmodel import TensorflowModel as TFMserver
from golf_federated.server.process.config.device.multidevice import MultiDeviceServer
import threading


def start_task():
    while True:
        if len(server.client_pool) >= 2:
            server.start_task(
                task=task,
            )
            break


if __name__ == '__main__':
    data_dir = '../../../../data/non_iid_data_mnist_range5_label_client3/'
    x_test = [data_dir + 'x_test_%s.npy' % (str(i + 1)) for i in range(3)]
    y_test = [data_dir + 'y_test_%s.npy' % (str(i + 1)) for i in range(3)]
    mnist_fl_data = CustomFederatedDataset(
        test_data=x_test,
        test_label=y_test,
    )
    server = MultiDeviceServer(
        server_name='server1',
        api_host='127.0.0.1',
        api_port='7788',
        sse_host='127.0.0.1',
        sse_port='6379',
        sse_db=6,
    )
    task = SyncTask(
        task_name='task1',
        maxround=5,
        aggregation=FedAVG(min_to_start=1),
        evaluation=Accuracy(target=0.9),
        model=TFMserver(
            module=module,
            test_data=mnist_fl_data.test_data,
            test_label=mnist_fl_data.test_label,
            process_unit='/cpu:0'
        ),
        select=AllSelect(
            client_list=[],
            select_num=2
        ),
        module_path='../../../../module/MNIST/tfmodule.py',
        isdocker=False,
    )

    start_thread = threading.Thread(target=start_task)
    start_thread.start()

    server.start_server()

Client code

Configure and set up your client.

import warnings

warnings.filterwarnings("ignore", category=Warning)

import os

os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'

from golf_federated.utils.data import CustomFederatedDataset
from golf_federated.client.process.config.device.multidevice import MultiDeviceClient

if __name__ == '__main__':
    data_dir = '../../../../data/non_iid_data_mnist_range5_label_client3/'
    x_train = [data_dir + 'x_train_1.npy']
    y_train = [data_dir + 'y_train_1.npy']
    x_test = [data_dir + 'x_test_1.npy']
    y_test = [data_dir + 'y_test_1.npy']
    client_id = ['Client1']
    mnist_fl_data = CustomFederatedDataset(
        train_data=x_train,
        train_label=y_train,
        test_data=x_test,
        test_label=y_test,
        part_num=1,
        part_id=client_id,
        split_data=True,
    )
    data_client_n = mnist_fl_data.get_part_train(client_id[0])
    client_1 = MultiDeviceClient(
        client_name=client_id[0],
        api_host='127.0.0.1',
        api_port='7788',
        train_data=data_client_n[0],
        train_label=data_client_n[1],
    )