分别使用 FedML、Flower、FedScale、FederatedScope,实现联邦平均(FedAvg)算法
实现的算法应包括以下功能
- 在服务端使用随机客户端选择策略
- 对各客户端模型采取加权平均的聚合方式,权重与客户端的数据量成正比
- 支持按比例(例如0.1)或者按数量(例如10个)配置单轮客户端选择规模(支持在联邦学习启动时进行一次性配置即可;如同时指定两种配置,忽略其中一种)
- 支持在每轮当中单独配置各个客户端的本地epoch次数(例如每个客户端前2次被选中时每次执行2个epoch,后续每次被选中时执行1个epoch)
- 每轮结束后在服务端测试全局模型,并报告测试集上的精度(print或写日志等均可,可利用框架内提供的相关API)
注意事项
- 只需实现一个包含上述功能的最小系统(能够在各自框架上运行),不要添加其他功能,以免影响后续比较
- 尽量保持联邦学习流程的逻辑和模型训练的逻辑的解耦
- 不要使用其提供的现成算法实现,请假定FedAvg未被这些框架支持(例如在Flower中封装了FedAvg这一Strategy,请修改该实现以包含所需功能并剔除多余功能,或者使用Strategy接口自己实现一遍)
- 可以使用任何模型和数据集,但尽量简单,能运行即可,并适当兼顾可配置性
- 使用面向边缘环境的API,不要使用仅面向模拟的API;但运行时可以只在本地开多个节点模拟
交付物
- 每个框架的FedAvg实现代码及相应的启动脚本(最好简要说明用法;不要提交整个仓库)
- 每个框架的FedAvg运行结果(请确保功能正确实现)
我这里使用的是conda创建虚拟环境下面是简要环境的信息
conda create -n fed python==3.10
然后根据每个框架的安装指引即可配置环境。
- Client:client模块作为FedAvg算法的工作节点。 这个模块在fedml里主要是启动模块。主要的工作内容由两个模块完成,
一个是
Trainer
, 一个是ClientManager
。 前者负责训练相关功能,后者负责通信相关功能。 - ClientManager: 这个模块主要负责与server之间的通信。发送模型参数和接受模型参数,响应server的请求。它拥有trainer,训练时就调用trainer的api,进行训练。
- Trainer: 这个模块就是负责模型训练与测试的功能。对ClientManager提供训练和测试的api。
- Server:与client模块类似, 作为FedAvg算法的聚合节点。在fedml里也是一个启动模块。主要工作内容由两个模块完成,
一个是
Aggregator
,一个是ServerManager
。前者负责聚合相关功能,后者负责通信相关功能。 - ServerManager: 这个模块主要负责与client之间的通信。收发模型参数,以及训练配置。聚合功能以及选取客户端的功能由aggregator提供。
- Aggregator: 这个模块主要负责聚合,客户端选取算法的实现都是由这个模块提供。
方式一 client/server分别启动
首先配置文件在conf
目录下, 配置conf/fedml.yaml
然后在fml/server
目录下先启动server
python server.py --cf ../../conf/fedml.yaml --rank 0 --role server
然后在fml/client
目录下再启动client
python client.py --cf ../../conf/fedml.yaml --rank 1 --role client
python client.py --cf ../../conf/fedml.yaml --rank 2 --role client
就可以了。
方式二 脚本启动
本仓库提供driver脚本启动方式,与方式一不同的是需要配置两个文件,一个是conf
目录下,配置conf/fedml.yaml
, 另一个是conf/fedml_conf.yaml
前者是fedml的固定配置文件,后者是启动配置文件。
接着运行
python driver.py start ./conf/fedml_conf.yaml
如果是方式二的运行结果,可以在log/fedml
下查看server和client的日志。
- client: client模块作为FedAvg算法的工作节点,所有训练,节点测评估都在client这里实现。
- server: server模块也是一个启动模块,主要功能例如模型聚合,客户端选择分别是由
strategy
和client_manager
这两个模块实现 - strategy: strategy模块是FedAvg算法主要实现的模块,聚合功能,server侧的评估功能都在这部分实现。
- client_manager: client_manager模块主要是实现客户端选择算法,如随机选择。
本仓库提供driver脚本启动方式,与fedml不同的是,只需要一个配置文件conf/flwr_conf.yaml
, 然后启动driver脚本即可
python driver.py start ./conf/flwr_conf.yaml
如果是方式二的运行结果,可以在log/flwr
下查看server和client的日志。
- client: client模块作为FedAvg算法的工作节点,负责响应server请求以及发送模型参数到server处。训练由trainer模块实现
- server: server模块也是一个启动模块,负责响应client请求以及发送请求给client,聚合功能由aggregator实现,客户端选择由sampler实现。
- trainer: trainer模块负责模型的训练和评估过程,这部分我选择了框架自带的,而不是自己实现。因为如果要重写这部分的功能太负责,fedscope采用的是hook方式进行训练。 模型训练过程比较统一,主要和采用的框架有关,因此fedscope提供了两种trainer:TorchTrainer和TensorflowTrainer。
- aggregator: aggregator负责模型的聚合过程。
- sampler: sampler模块主要是实现客户端选择算法,如随机选择。
以上是fedscope的主要模块。除此之外如果要自定义模型和数据集,需要自己写好模型定义,并通过register
注册到fedscope里。
方式一 分别启动
方式一可以参考FederatedScope官网的example。
首先需要为server和client配置对应的配置文件, 这里可以参考conf/fedscope_server.yaml
和conf/fedscope_client.yaml
然后先启动server端
python main.py --cfg ../conf/fedscope_server.yaml
然后再启动配置文件中client_number
对应数目的client进程即可
python main.py --cfg ../conf/fedscope_client.yaml distribute.data_idx 2 distribute.client_port 50052
python main.py --cfg ../conf/fedscope_client.yaml distribute.data_idx 3 distribute.client_port 50053
python main.py --cfg ../conf/fedscope_client.yaml distribute.data_idx 4 distribute.client_port 50054
方式二 脚本启动
本仓库提供了另一种启动方式,driver脚本启动, 除了上述两个配置文件之外,需要再配置一个启动文件: conf/fedscope_conf.yaml
当然如果对FederatedScope运行进程的配置还是要在上述两个配置文件里面进行修改
启动方法:
python driver.py start conf/fedscope_conf.yaml
如果是方式二的运行结果,可以在log/fedscope
下查看server和client的日志。
- aggregator: 这个模块负责FedAvg算法服务端的一切功能, 聚合,评估的所有功能。
- executor: executor它不是一个client工作节点,它更像是启动client的执行器,类比edgeTB的emulator。这个模块负责客户端选择(由client_manager实现),模型训练与评估(由trainer实现)。
- trainer: trainer模块负责模型的训练和评估过程。
- client_manager: client_manager模块主要是实现客户端选择算法,如随机选择。
fedScale只有脚本启动的方式, 本仓库的启动方式都是参考fedscale的启动方式。
首先还是准备一个配置文件,可以参考conf/fedscale.yaml
接着运行下面的脚本即可
python driver.py start conf/fedscale.yaml
如果是方式二的运行结果,可以在log/fedscale
下查看server和client的日志。