Adding new schedulersΒΆ
Note
We always welcome you to contribute your increments to APPFL
by creating a pull request.
To add new schedulers to APPFL
, you can create you own scheduler class by inheriting the appfl.algorithm.scheduler.BaseScheduler
and defining the following functions:
schedule
: Take oneclient_id
and onelocal_model
from the certain client, and schedule a global aggregation with the aggregator for the client model. Return either the global model if the aggregation happens immediately, or aFuture
object otherwise.get_num_global_epochs
: Return the total number of global epochs (global updates) for the server to know when to stop the FL process.
class YourOwnScheduler(BaseScheduler):
def __init__(
self,
scheduler_configs: DictConfig,
aggregator: BaseAggregator,
logger: Any
):
self.scheduler_configs = scheduler_configs
self.aggregator = aggregator
self.logger = logger
...
def schedule(self, client_id: Union[int, str], local_model: Union[Dict, OrderedDict], **kwargs) -> Union[Future, Dict, OrderedDict, Tuple[Union[Dict, OrderedDict], Dict]]:
"""
Schedule the global aggregation for the local model from a client.
:param local_model: the local model from a client
:param client_idx: the index of the client
:param kwargs: additional keyword arguments for the scheduler
:return: the aggregated model or a future object for the aggregated model
"""
pass
def get_num_global_epochs(self) -> int:
"""Return the total number of global epochs for federated learning."""
pass
You may add any configuration parameters into your scheduler and access them using self.scheduler_configs.your_config_param
. When you start the FL experiment, you can specify the scheduler configuration parameter values in the server configuration file in the following way:
server_configs:
...
scheduler: "YourOwnScheduler"
scheduler_kwargs:
num_clients: 2
your_config_param_1: ...
your_config_param_2: ...
...