Skip to main content

FedAVG, MNIST, Logistic Regression, and Defenses

This example demonstrates how to activate an attack using local data from multiple clients. The source code locates at https://github.com/FedML-AI/FedML/tree/master/python/examples/federate/security/mqtt_s3_fedavg_defense_mnist_lr_example. We provide sample configurations for different defense mechanisms at https://github.com/FedML-AI/FedML/tree/master/python/examples/federate/security/mqtt_s3_fedavg_defense_mnist_lr_example/config, including cclip defense, foolsgold, geometric median, krum (and m-krum), crfl, rfa, etc. As an example, We utilize byzantine attack of random mode as an example.

If you have multiple nodes, you should run the client script on each node

APIs​

The highly encapsulated server and client API calls are shown as below. Note that we set the path of the configuration file in the two bash scripts to be config/byzantine/fedml_config.yaml to load the configuration for byzantine attack.

run_server.sh is as follows:

#!/usr/bin/env bash
RUN_ID=$1
python3 torch_server.py --cf config/krum/fedml_config.yaml --rank 0 --role server --run_id $RUN_ID

torch_server.py

import fedml
from fedml import FedMLRunner

if __name__ == "__main__":
args = fedml.init()

# init device
device = fedml.device.get_device(args)

# load data
dataset, output_dim = fedml.data.load(args)

# load model
model = fedml.model.create(args, output_dim)

# start training
fedml_runner = FedMLRunner(args, device, dataset, model)
fedml_runner.run()

run_client.sh

#!/usr/bin/env bash
RANK=$1
RUN_ID=$2
python3 torch_client.py --cf config/krum/fedml_config.yaml --rank $RANK --role client --run_id $RUN_ID

torch_client.py

import fedml
from fedml import FedMLRunner

if __name__ == "__main__":
args = fedml.init()

# init device
device = fedml.device.get_device(args)

# load data
dataset, output_dim = fedml.data.load(args)

# load model
model = fedml.model.create(args, output_dim)

# start training
fedml_runner = FedMLRunner(args, device, dataset, model)
fedml_runner.run()

At the client side, the client ID (a.k.a rank) starts from 1. Please also modify fedml_config.yaml, changing the client_num_in_total the as the number of clients you plan to run.

At the server side, run the following script:

bash run_server.sh a

For client 1, run the following script:

bash run_client.sh 1 a

For client 2, run the following script:

bash run_client.sh 2 a

For client 3, run the following script:

bash run_client.sh 3 a

For client 4, run the following script:

bash run_client.sh 4 a

For client 5, run the following script:

bash run_client.sh 5 a

fedml_config.yaml is shown below.

common_args:
training_type: "cross_silo"
scenario: "horizontal"
using_mlops: false
random_seed: 0
config_version: release

environment_args:
bootstrap: config/bootstrap.sh

data_args:
dataset: "mnist"
data_cache_dir: ~/fedml_data
partition_method: "hetero"
partition_alpha: 0.5

model_args:
model: "lr"
model_file_cache_folder: "./model_file_cache" # will be filled by the server automatically
global_model_file_path: "./model_file_cache/global_model.pt"

train_args:
federated_optimizer: "FedAvg"
client_id_list:
client_num_in_total: 5
client_num_per_round: 5
comm_round: 10
epochs: 1
batch_size: 10
client_optimizer: sgd
learning_rate: 0.03
weight_decay: 0.001

validation_args:
frequency_of_the_test: 1

device_args:
worker_num: 5
using_gpu: false
gpu_mapping_file: config/gpu_mapping.yaml
gpu_mapping_key: mapping_config3_11

comm_args:
backend: "MQTT_S3"
mqtt_config_path:
s3_config_path:
grpc_ipconfig_path: ./config/grpc_ipconfig.csv

tracking_args:
enable_wandb: false

attack_args:
enable_attack: false
attack_type: None

defense_args:
enable_defense: true
defense_type: krum
byzantine_client_num: 1

Training Results​

At the end of the training, the server window will display the following log:

[FedML-Server @device-id-0] [Thu, 02 Nov 2023 07:52:58] [INFO] [mqtt_s3_multi_clients_comm_manager.py:203:_on_message_impl] mqtt_s3 receive msg deviceType 
[FedML-Server @device-id-0] [Thu, 02 Nov 2023 07:52:58] [INFO] [mqtt_s3_multi_clients_comm_manager.py:238:_on_message_impl] mqtt_s3.on_message: not use s3 pack
[FedML-Server @device-id-0] [Thu, 02 Nov 2023 07:52:58] [INFO] [mqtt_s3_multi_clients_comm_manager.py:188:_notify] mqtt_s3.notify: msg type = 5
[FedML-Server @device-id-0] [Thu, 02 Nov 2023 07:52:58] [INFO] [fedml_comm_manager.py:39:receive_message] receive_message. msg_type = 5, sender_id = 5, receiver_id = 0
[FedML-Server @device-id-0] [Thu, 02 Nov 2023 07:52:58] [INFO] [fedml_server_manager.py:163:handle_message_client_status_update] received client status FINISHED
[FedML-Server @device-id-0] [Thu, 02 Nov 2023 07:52:58] [INFO] [fedml_server_manager.py:150:process_finished_status] sender_id = 5, all_client_is_finished = True
[FedML-Server @device-id-0] [Thu, 02 Nov 2023 07:53:03] [INFO] [fedml_comm_manager.py:67:finish] __finish
[FedML-Server @device-id-0] [Thu, 02 Nov 2023 07:53:03] [INFO] [mqtt_s3_multi_clients_comm_manager.py:332:stop_receive_message] mqtt_s3.stop_receive_message: stopping...
[FedML-Server @device-id-0] [Thu, 02 Nov 2023 07:53:03] [INFO] [fedml_comm_manager.py:29:run] finished...

At the end of the training, the client 1 window will display the following log:

[FedML-Client @device-id-1] [Thu, 02 Nov 2023 07:52:58] [INFO] [mqtt_s3_multi_clients_comm_manager.py:188:_notify] mqtt_s3.notify: msg type = 2
[FedML-Client @device-id-1] [Thu, 02 Nov 2023 07:52:58] [INFO] [fedml_comm_manager.py:39:receive_message] receive_message. msg_type = 2, sender_id = 0, receiver_id = 1
[FedML-Client @device-id-1] [Thu, 02 Nov 2023 07:52:58] [INFO] [fedml_client_master_manager.py:124:handle_message_receive_model_from_server] handle_message_receive_model_from_server.
[FedML-Client @device-id-1] [Thu, 02 Nov 2023 07:52:58] [INFO] [fedml_client_master_manager.py:135:handle_message_receive_model_from_server] current round index 10, total rounds 10
[FedML-Client @device-id-1] [Thu, 02 Nov 2023 07:52:58] [INFO] [fedml_client_master_manager.py:175:send_client_status] send_client_status
[FedML-Client @device-id-1] [Thu, 02 Nov 2023 07:52:58] [INFO] [fedml_client_master_manager.py:176:send_client_status] self.client_real_id = 1
[FedML-Client @device-id-1] [Thu, 02 Nov 2023 07:52:58] [INFO] [mqtt_s3_multi_clients_comm_manager.py:317:send_message] mqtt_s3.send_message: MQTT msg sent
[FedML-Client @device-id-1] [Thu, 02 Nov 2023 07:52:58] [INFO] [fedml_comm_manager.py:67:finish] __finish
[FedML-Client @device-id-1] [Thu, 02 Nov 2023 07:52:58] [INFO] [mqtt_s3_multi_clients_comm_manager.py:332:stop_receive_message] mqtt_s3.stop_receive_message: stopping...
[FedML-Client @device-id-1] [Thu, 02 Nov 2023 07:52:58] [INFO] [fedml_comm_manager.py:29:run] finished...

At the end of the training, the client 2 window will display the following log:

[FedML-Client @device-id-2] [Thu, 02 Nov 2023 07:52:58] [INFO] [mqtt_s3_multi_clients_comm_manager.py:188:_notify] mqtt_s3.notify: msg type = 2
[FedML-Client @device-id-2] [Thu, 02 Nov 2023 07:52:58] [INFO] [fedml_comm_manager.py:39:receive_message] receive_message. msg_type = 2, sender_id = 0, receiver_id = 2
[FedML-Client @device-id-2] [Thu, 02 Nov 2023 07:52:58] [INFO] [fedml_client_master_manager.py:124:handle_message_receive_model_from_server] handle_message_receive_model_from_server.
[FedML-Client @device-id-2] [Thu, 02 Nov 2023 07:52:58] [INFO] [fedml_client_master_manager.py:135:handle_message_receive_model_from_server] current round index 10, total rounds 10
[FedML-Client @device-id-2] [Thu, 02 Nov 2023 07:52:58] [INFO] [fedml_client_master_manager.py:175:send_client_status] send_client_status
[FedML-Client @device-id-2] [Thu, 02 Nov 2023 07:52:58] [INFO] [fedml_client_master_manager.py:176:send_client_status] self.client_real_id = 2
[FedML-Client @device-id-2] [Thu, 02 Nov 2023 07:52:58] [INFO] [mqtt_s3_multi_clients_comm_manager.py:317:send_message] mqtt_s3.send_message: MQTT msg sent
[FedML-Client @device-id-2] [Thu, 02 Nov 2023 07:52:58] [INFO] [fedml_comm_manager.py:67:finish] __finish
[FedML-Client @device-id-2] [Thu, 02 Nov 2023 07:52:58] [INFO] [mqtt_s3_multi_clients_comm_manager.py:332:stop_receive_message] mqtt_s3.stop_receive_message: stopping...
[FedML-Client @device-id-2] [Thu, 02 Nov 2023 07:52:58] [INFO] [fedml_comm_manager.py:29:run] finished...

At the end of the training, the client 3 window will display the following log:

[FedML-Client @device-id-3] [Thu, 02 Nov 2023 07:52:58] [INFO] [mqtt_s3_multi_clients_comm_manager.py:188:_notify] mqtt_s3.notify: msg type = 2
[FedML-Client @device-id-3] [Thu, 02 Nov 2023 07:52:58] [INFO] [fedml_comm_manager.py:39:receive_message] receive_message. msg_type = 2, sender_id = 0, receiver_id = 3
[FedML-Client @device-id-3] [Thu, 02 Nov 2023 07:52:58] [INFO] [fedml_client_master_manager.py:124:handle_message_receive_model_from_server] handle_message_receive_model_from_server.
[FedML-Client @device-id-3] [Thu, 02 Nov 2023 07:52:58] [INFO] [fedml_client_master_manager.py:135:handle_message_receive_model_from_server] current round index 10, total rounds 10
[FedML-Client @device-id-3] [Thu, 02 Nov 2023 07:52:58] [INFO] [fedml_client_master_manager.py:175:send_client_status] send_client_status
[FedML-Client @device-id-3] [Thu, 02 Nov 2023 07:52:58] [INFO] [fedml_client_master_manager.py:176:send_client_status] self.client_real_id = 3
[FedML-Client @device-id-3] [Thu, 02 Nov 2023 07:52:58] [INFO] [mqtt_s3_multi_clients_comm_manager.py:317:send_message] mqtt_s3.send_message: MQTT msg sent
[FedML-Client @device-id-3] [Thu, 02 Nov 2023 07:52:58] [INFO] [fedml_comm_manager.py:67:finish] __finish
[FedML-Client @device-id-3] [Thu, 02 Nov 2023 07:52:58] [INFO] [mqtt_s3_multi_clients_comm_manager.py:332:stop_receive_message] mqtt_s3.stop_receive_message: stopping...
[FedML-Client @device-id-3] [Thu, 02 Nov 2023 07:52:58] [INFO] [fedml_comm_manager.py:29:run] finished...

At the end of the training, the client 4 window will display the following log:

[FedML-Client @device-id-4] [Thu, 02 Nov 2023 07:52:58] [INFO] [mqtt_s3_multi_clients_comm_manager.py:188:_notify] mqtt_s3.notify: msg type = 2
[FedML-Client @device-id-4] [Thu, 02 Nov 2023 07:52:58] [INFO] [fedml_comm_manager.py:39:receive_message] receive_message. msg_type = 2, sender_id = 0, receiver_id = 4
[FedML-Client @device-id-4] [Thu, 02 Nov 2023 07:52:58] [INFO] [fedml_client_master_manager.py:124:handle_message_receive_model_from_server] handle_message_receive_model_from_server.
[FedML-Client @device-id-4] [Thu, 02 Nov 2023 07:52:58] [INFO] [fedml_client_master_manager.py:135:handle_message_receive_model_from_server] current round index 10, total rounds 10
[FedML-Client @device-id-4] [Thu, 02 Nov 2023 07:52:58] [INFO] [fedml_client_master_manager.py:175:send_client_status] send_client_status
[FedML-Client @device-id-4] [Thu, 02 Nov 2023 07:52:58] [INFO] [fedml_client_master_manager.py:176:send_client_status] self.client_real_id = 4
[FedML-Client @device-id-4] [Thu, 02 Nov 2023 07:52:58] [INFO] [mqtt_s3_multi_clients_comm_manager.py:317:send_message] mqtt_s3.send_message: MQTT msg sent
[FedML-Client @device-id-4] [Thu, 02 Nov 2023 07:52:58] [INFO] [fedml_comm_manager.py:67:finish] __finish
[FedML-Client @device-id-4] [Thu, 02 Nov 2023 07:52:58] [INFO] [mqtt_s3_multi_clients_comm_manager.py:332:stop_receive_message] mqtt_s3.stop_receive_message: stopping...
[FedML-Client @device-id-4] [Thu, 02 Nov 2023 07:52:58] [INFO] [fedml_comm_manager.py:29:run] finished...

At the end of the training, the client 5 window will display the following log:

[FedML-Client @device-id-5] [Thu, 02 Nov 2023 07:52:58] [INFO] [mqtt_s3_multi_clients_comm_manager.py:188:_notify] mqtt_s3.notify: msg type = 2
[FedML-Client @device-id-5] [Thu, 02 Nov 2023 07:52:58] [INFO] [fedml_comm_manager.py:39:receive_message] receive_message. msg_type = 2, sender_id = 0, receiver_id = 5
[FedML-Client @device-id-5] [Thu, 02 Nov 2023 07:52:58] [INFO] [fedml_client_master_manager.py:124:handle_message_receive_model_from_server] handle_message_receive_model_from_server.
[FedML-Client @device-id-5] [Thu, 02 Nov 2023 07:52:58] [INFO] [fedml_client_master_manager.py:135:handle_message_receive_model_from_server] current round index 10, total rounds 10
[FedML-Client @device-id-5] [Thu, 02 Nov 2023 07:52:58] [INFO] [fedml_client_master_manager.py:175:send_client_status] send_client_status
[FedML-Client @device-id-5] [Thu, 02 Nov 2023 07:52:58] [INFO] [fedml_client_master_manager.py:176:send_client_status] self.client_real_id = 5
[FedML-Client @device-id-5] [Thu, 02 Nov 2023 07:52:58] [INFO] [mqtt_s3_multi_clients_comm_manager.py:317:send_message] mqtt_s3.send_message: MQTT msg sent
[FedML-Client @device-id-5] [Thu, 02 Nov 2023 07:52:58] [INFO] [fedml_comm_manager.py:67:finish] __finish
[FedML-Client @device-id-5] [Thu, 02 Nov 2023 07:52:58] [INFO] [mqtt_s3_multi_clients_comm_manager.py:332:stop_receive_message] mqtt_s3.stop_receive_message: stopping...
[FedML-Client @device-id-5] [Thu, 02 Nov 2023 07:52:58] [INFO] [fedml_comm_manager.py:29:run] finished...