在本教程中,我们将向您介绍聚合器的基类。我们将向您解释如何利用基础聚合器的通信功能在不同方之间交换数据。
聚合器基础
聚合器的基类可以在FATE中的federatedml.framework.homo.aggregator模块中找到。在本模块中,您将找到AggregatorBaseClient和Aggregator BaseServer类。AggregatorBaseClient负责在客户端方(客户机和主机)发送和接收数据,而Aggregator BaseServer负责从所有客户端收集数据并将其广播给服务器方(仲裁器)。使用这些类,您可以使用基础聚合器的通信功能在不同的方之间轻松地交换数据。
关于后缀
在FATE系统中,发送方和接收方之间的每个通信都使用唯一的字符串令牌(运行组件时是唯一的)对齐,以确保发送和接收正确的数据。因此,在介绍通信接口时,您会注意到每个接口都有一个“后缀”参数。该后缀是令牌中影响双方通信的部分。为了更好地说明这一点,让我们使用一个示例。如果客户端希望发送一个模型并使用“model_epoch_0”后缀,则服务器希望接收此模型并调用“collect”函数,它必须与客户端的“send”函数(也是“model_epoch_0“)使用的后缀匹配,以确保接收到该模型。
聚合器基本客户端
AggregatorBaseClient是一个提供三个主要函数的类:init、send和get。
init函数接受一个参数communicate_match_suffix,它允许您在实例化多个聚合器时为聚合器实例指定唯一的名称。这有助于防止重复使用通信令牌。
send函数允许您在每次调用函数时使用唯一的字符串后缀将任意Python对象传输到服务器。
get函数从服务器检索Python对象,对象的内容由使用的后缀决定。例如,如果服务器发送一个带有后缀B的对象A,并且使用带有前缀B的get函数,则可以接收对象A。
class AggregatorBaseClient(object):
def __init__(self, communicate_match_suffix: str = None):
...
def send(self, obj, suffix):
self.communicator.send_obj(obj, suffix=suffix)
def get(self, suffix):
return self.communicator.get_obj(suffix=suffix)
聚合器基本服务器
AggregatorBaseServer是一个提供三个主要功能的类:init、broadcast和collect。
init函数接受一个参数communicate_match_suffix,它允许您在实例化多个聚合器时为聚合器实例指定唯一的名称。这有助于防止重复使用通信令牌。
broadcast函数允许您将任意Python对象传输到所有客户端或特定客户端。
obj参数指定要广播的对象,后缀参数确定要传输的对象的内容。
party_idx参数允许您指定哪些客户端应接收广播对象。例如,值-1表示对象将广播到所有客户端,单个整数值指定单个客户端,整数值列表指定一组客户端。例如,如果您有客户端A、B和C,值-1表示对象将广播给所有客户端A、C和B,值1表示对象将仅发送给客户端B,值[0,2]表示对象将只发送给客户端A和C。
collect函数从客户端检索Python对象,对象的内容由使用的后缀确定。例如,如果所有客户机发送的对象都带有后缀B,而您使用的是带有后缀B的collect函数,那么您将能够收到其对象的列表。
class AggregatorBaseServer(object):
def __init__(self, communicate_match_suffix=None):
...
def broadcast(self, obj, suffix, party_idx=-1):
self.communicator.broadcast_obj(obj, suffix=suffix, party_idx=party_idx)
def collect(self, suffix, party_idx=-1):
objs = self.communicator.get_obj(suffix=suffix, party_idx=party_idx)
return objs
实例
federatedml.framework.homo.aggregator.secure_aggregator模块中的SecureAgregatorClient和SecureAgregregatorServer分别是AggregatorBaseClient和aggregator BaseServer类的实现。这些类是FATE homo框架中的标准聚合器实现,并使用上述函数进行完整的模型/损失聚合。如果您正在开发一个新的聚合器,并且需要一个参考实现,我们建议您使用secure_aggregator模块作为指南。