Defining your server agentΒΆ
Note
We always welcome you to contribute your increments to APPFL
by creating a pull request.
When you need to have your server agent to have additional functionalities that is not provided by the current ServerAgent
, you can create your own server agent by inheriting the appfl.agent.ServerAgent
. To make the new functionalities available for the client to call, you need to modify appfl.comm.mpi.MPIServerCommunicator._invoke_custom_action
function (for MPI) or appfl.comm.grpc.GRPCServerCommunicator.InvokeCustomAction
, and make a call to your own functionalities with a corresponding action name.
For example, if I created a new server agent that has an additional functionality to do federated inference as below
class MyServerAgentWithFedInference(ServerAgent):
def fl_inference(*args, **kwargs):
pass
Then you can make this new function available for client by calling it in the custom action function in the corresponding communicators.
# For gRPC communicator
class GRPCServerCommunicator(GRPCCommunicatorServicer):
...
def InvokeCustomAction(self, request, context):
...
if action == 'set_sample_size':
...
elif action == 'fl_inference':
...
val = self.server_agent.fl_inference()
...
...
# For MPI communicator
class MPIServerCommunicator:
...
def _invoke_custom_action(
self,
client_id: int,
request: MPITaskRequest,
) -> Optional[MPITaskResponse]:
...
if action == "set_sample_size":
...
elif action == 'fl_inference':
...
val = self.server_agent.fl_inference()
...
...