Skip to content

Yoda-wu/fed_leraning

Repository files navigation

联邦学习

实验

实验内容

分别使用 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

然后根据每个框架的安装指引即可配置环境。

fedml

模块介绍

  • 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的日志。

fedml服务端精度图

flower

模块介绍

  • client: client模块作为FedAvg算法的工作节点,所有训练,节点测评估都在client这里实现。
  • server: server模块也是一个启动模块,主要功能例如模型聚合,客户端选择分别是由strategyclient_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的日志。

flower服务端精度图

federatedScope

模块介绍

  • 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.yamlconf/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的日志。

fedscope服务端精度图

fedScale

模块介绍

  • 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的日志。

fedscale服务端精度图

About

联邦学习代码库

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages