Plugin Components
Open Federated Learning (OpenFL) is designed to be a flexible and extensible framework. Plugins are interchangeable parts of OpenFL components. Different plugins support varying usage scenarios. A plugin may be required or optional.
You can provide your implementations of OpenFL plugins to achieve a desired behavior. Technically, a plugin is just a class that implements some interface. You may enable a plugin by putting its import path and initialization parameters to the config file of a corresponding OpenFL component or to the frontend Python API. See openfl-tutorials for more details.
Framework Adapter
The Framework Adapter plugin enables OpenFL support for Deep Learning frameworks usage in FL experiments. It is a required plugin for the frontend API component and Envoy. All the framework-specific operations on model weights are isolated in this plugin so OpenFL can be framework-agnostic.
The Framework adapter plugin interface has two required methods to load and extract tensors from a model and an optimizer:
get_tensor_dict
set_tensor_dict
get_tensor_dict
method accepts a model and optionally an optimizer. It should return a dictionary {tensor_name : ndarray}
that maps tensor names to tensors in the NumPy representation.
@staticmethod def get_tensor_dict(model, optimizer=None) -> dict:
set_tensor_dict
method accepts a tensor dictionary, a model, and optionally an optimizer. It loads weights from the tensor dictionary
to the model in place. Tensor names in the dictionary match corresponding names set in get_tensor_dict
.
@staticmethod def set_tensor_dict(model, tensor_dict, optimizer=None, device='cpu') -> None:
If your new framework model cannot be directly serialized with pickle-type libraries, you can optionally
implement the serialization_setup
method to prepare the model object for serialization.
def serialization_setup():
Experiment Serializer
The Serializer plugin is used on the frontend Python API to serialize the Experiment components and then on Envoys to deserialize them. Currently, the default serializer plugin is based on pickling. It is a required plugin.
The serializer plugin must implement the serialize
method that creates a Python object representation on disk.
@staticmethod def serialize(object_, filename: str) -> None:
The plugin must also implement the restore_object
method that will load previously serialized object from disk.
@staticmethod def restore_object(filename: str):
CUDA Device Monitor
The CUDA Device Monitor plugin is an optional plugin for Envoys that can gather status information about GPU devices. This information may be used by Envoys and included in a healthcheck message that is sent to the Director. Therefore, you can query this Envoy Registry information from the Director to determine the status of CUDA devices.
CUDA Device Monitor plugin must implement the following interface:
class CUDADeviceMonitor: def get_driver_version(self) -> str: ... def get_device_memory_total(self, index: int) -> int: ... def get_device_memory_utilized(self, index: int) -> int: ... def get_device_utilization(self, index: int) -> str: """It is just a general method that returns a string that may be shown to the frontend user.""" ...