Skip to content

module_guide

desperadoccy edited this page Oct 10, 2024 · 5 revisions

本章节我们会介绍框架中各模块,包括模块内的各类作用介绍、配置文件使用到的参数作用介绍,以及如何扩展该模块的类。

框架内的模块都是基于接口开发,所以在扩展模块时,只需要实现接口,然后在配置文件中配置即可。

框架内的模块分为机器学习通用模块联邦学习特定模块,机器学习通用模块均支持加载第三方类,有: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类,用于存储全局变量。 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来进行服务器和客户端之间的数据交互。

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 = None

downlink中的key可以通过message_queue.put_into_downlink(client_id, key, value)进行存储,当key不存在时,会自动创建一个dict

mq装饰器

现在可以对MQ进行装饰器,以便自定义MQ的行为。

框架内提供对MQ的MQTT封装。

"message_queue": {
    "type": "mqtt",
    "mask_list": ["train_dataset", "test_dataset"]
},

ModuleFindTool

我们通过ModuleFindTool来实现动态加载类。

ModuleFindTool通过ModuleFindTool.find_class_by_path(path)来查找类,返回类。

类的参数传递默认为项目内的类直接传递config['params'],第三方类(如torch)传递**config['params']

Caller

如下几个类通过Caller和其父模块解耦,实现可变传参。

  • Update: UpdateCaller
  • Schedule: ScheduleCaller
  • Checker: CheckerCaller
  • Receiver: ReceiverCaller
  • Group: GroupCaller

如以上模块新增类时,需要传递更多参数,可通过更改Caller进行实现。

Clone this wiki locally