def __init__(
self,
addr: str,
strategy: Union[str, StrategyServer],
num_clients: int,
strategy_params: Dict[str, Any] = {},
epochs: int = 0,
) -> None:
logger.add("log/server.log", backtrace=True, diagnose=True)
logger.info(
f"server address: {addr}, strategy: {strategy}, client number: {num_clients}, epochs: {epochs}, strategy params: {strategy_params}"
)
if isinstance(strategy, str):
if strategy == message_type.STRATEGY_FEDAVG:
self._strategy_server = fedavg_server.FedavgServer(
num_clients, epochs, False, **strategy_params
)
elif strategy == message_type.STRATEGY_SCAFFOLD:
self._strategy_server = fedavg_server.FedavgServer(
num_clients, epochs, True, **strategy_params
)
elif strategy == message_type.STRATEGY_FEDOPT:
if strategy_params.get("opt") is None:
raise Exception("expect 'opt' when you use fedopt sever")
else:
opt_type = strategy_params.pop("opt")
module = import_module(
f"iflearner.business.homo.strategy.opt.{opt_type.lower()}"
)
opt_class = getattr(module, f"{opt_type}")
opt = opt_class(**strategy_params)
self._strategy_server = fedopt_server.FedoptServer(
num_clients,
epochs,
opt=opt,
) # type: ignore
logger.info(
" ".join([f"{k}:{v}" for k, v in strategy_params.items()])
)
elif strategy == message_type.STRATEGY_qFEDAVG:
self._strategy_server = qfedavg_server.qFedavgServer(
num_clients, epochs, **strategy_params
) # type: ignore
elif strategy == message_type.STRATEGY_FEDNOVA:
self._strategy_server = fednova_server.FedNovaServer(
num_clients, epochs, **strategy_params
) # type: ignore
elif isinstance(strategy, StrategyServer):
self._strategy_server = strategy # type: ignore
self._addr = addr