-
Notifications
You must be signed in to change notification settings - Fork 21
module_guide
本章节我们会介绍框架中各模块,包括模块内的各类作用介绍、配置文件使用到的参数作用介绍,以及如何扩展该模块的类。
框架内的模块都是基于接口开发,所以在扩展模块时,只需要实现接口,然后在配置文件中配置即可。
框架内的模块分为机器学习通用模块和联邦学习特定模块,机器学习通用模块均支持加载第三方类,有:loss, optimizer, model,联邦学习特定模块仅支持加载自定义类,如:client, server等。
dataset模块较为特殊,在其对应小节我们会详细介绍
模块加载的通用方式如下:
"module_name": {
"path": "module_path",
"params": {
"param1": "value1",
"param2": "value2"
}
}框架在读取到该配置后,会读取path的类并进而创建对象,调用__init__函数,通过**params的方式传入params中的参数。
在开发模块前,我们需要了解框架中的几个重要工具类,这些工具类可以帮助我们更好的开发模块,剩余的一些请查看工具类。
我们为开发者在模块中提供了基类Base_xxx或者抽象类Abstract_xxx(其中client模块的基类为Client),开发者可以通过继承这两者来实现自己的模块。具体细节可查看模块的具体文档。
我们同时提供了globalvar类,用于存储全局变量。
globalvar是一个单例类,可以通过GlobalVarGetter.get()获取全局变量。
globalvar会先后存储如下变量:
-
config: 读取的配置文件 -
global_config: 读取的全局配置文件 -
server_config: 读取的服务器配置文件 -
client_config: 读取的客户端配置文件 -
client_manager_config: 读取的客户端管理器配置文件 -
queue_manager_config: 读取的队列管理器配置文件 -
client_staleness_list: 客户端延迟列表 -
client_index_list: 客户端数据集分布列表 -
server: 服务器对象 -
server_network: 服务器模型 -
current_t: 当前聚合迭代轮数 -
schedule_t: 当前调度次数 -
T: 全局迭代总次数 -
queue_manager: 队列管理器对象 -
scheduler: 调度器对象 -
updater: 聚合器对象
请注意不要在client中使用该类,因为原则上client和server属于独立个体,不应共享数据,我们推荐使用message_queue进行服务器和客户端之间的数据交互。
我们通过message_queue来进行服务器和客户端之间的数据交互。
message_queue通过MessageQueueFactory.create_message_queue()创建,message_queue只是一个接口,所有message_queue对象内部存储是共享的。
message_queue内部存储了如下变量:
train_dataset = None
test_dataset = None
uplink = {'update': Queue()}
downlink = {'received_weights': {}, 'received_time_stamp': {}, 'time_stamp_buffer': {}, 'weights_buffer': {}, 'schedule_time_stamp_buffer': {}, 'group_id': {}}
training_status = {}
training_params = {}
config = {}
latest_model = None
current_t = Nonedownlink中的key可以通过message_queue.put_into_downlink(client_id, key, value)进行存储,当key不存在时,会自动创建一个dict。
现在可以对MQ进行装饰器,以便自定义MQ的行为。
框架内提供对MQ的MQTT封装。
"message_queue": {
"type": "mqtt",
"mask_list": ["train_dataset", "test_dataset"]
},我们通过ModuleFindTool来实现动态加载类。
ModuleFindTool通过ModuleFindTool.find_class_by_path(path)来查找类,返回类。
类的参数传递默认为项目内的类直接传递config['params'],第三方类(如torch)传递**config['params']。
如下几个类通过Caller和其父模块解耦,实现可变传参。
-
Update:UpdateCaller -
Schedule:ScheduleCaller -
Checker:CheckerCaller -
Receiver:ReceiverCaller -
Group:GroupCaller
如以上模块新增类时,需要传递更多参数,可通过更改Caller进行实现。
Getting Started - 整体流程 - Module Guide - 现有算法 - Contact Us