一、FLGo介绍
FLGo是一个轻量级联邦学习框架,允许数据保留在本地设备上训练模型来确保用户的隐私性,降低了数据泄露的风险。该框架支持多个客户端同时参与模型训练,提高了训练过程的效率,充分利用了边缘设备的计算能力。
原知乎教程链接 手把手实战联邦学习
FLGo的开发宗旨是让做联邦学习相关的研究变得更加简单。因此,FLGo中实现了以下功能:
- 帮助使用者很轻松地自己手写一个联邦学习算法,并与其他算法进行对比;
- 提供了数个主流地联邦数据集基准(图像、文本、图、表格等),支持各种常见地数据异构性划分,并提供接口辅助大家尝试在自己的数据集上进行联邦学习;
- 支持模拟常见的系统异构性,并提供接口支持用户自行定制系统异构性,来做相关方面的仿真研究;
- 提供了基础的实验记录、结果分析功能,方便做实验;支持自动调度GPU进行网格搜索;
- 支持纵向联邦、异步联邦等算法(对于异步联邦算法,使用了统一的虚拟时钟,使得其可以和同步联邦算法进行公平的比较)。
二、源码下载
安装:
- 通过pip安装,建议在安装此库之前自行安装pytorch。
pip install flgo
- 通过git安装
git clone https://github.com/WwZzz/easyFL.git
导入flgo包以及fedavg算法:
import flgo
import flgo.algorithm.fedavg as fedavg
import os
划分数据集并生成联邦任务:
import flgo.benchmark.mnist_classification as mnist
# task为任务路径,可自行定义,该路径将被视作一个联邦任务
task = './test_mnist'
# benchmark指定的是数据集,partitioner指定的是联邦学习数据集划分器
config = {
'benchmark': {'name': 'flgo.benchmark.mnist_classification'},
'partitioner': {'name': 'IIDPartitioner', 'para': {'num_clients': 100}}
}
# 生成任务
flgo.gen_task(config,task_path = task)
运行后,会出现数据集划分好后的可视化图片。
不同颜色表示不同标签的数据,横轴为样本数目,纵轴为用户,每一行表示相应用户的本地数据集分布。
三、项目结构
FLGo包下
├─ algorithm(算法)
│ ├─ fedavg.py // FedAvg算法
│ ├─ ...
│ ├─ fedasync.py // 异步分布式算法的基类
│ └─ fedbase.py // 分布式算法的基类
├─ benchmark(基准测试)
│ ├─ mnist_classification // 在MNIST数据集上的分类任务
│ │ ├─ model // 相应的模型
│ | └─ core.py // 数据集的核心支持,包含三个必要的类(例如 TaskGen、TaskReader、TaskCalculator)
│ ├─ ...
│ ├─ RAW_DATA // 存储下载的原始数据集
│ └─ toolkits // 用于生成分布式数据集的基本工具
│ ├─ cv // 常见的计算机视觉分布式任务
│ │ ├─ horizontal // 水平分布任务
│ │ │ └─ image_classification.py // 图像分类的基类
│ │ └─ ...
│ ├─ ...
│ ├─ base.py // 所有分布式任务的基类
│ ├─ partition.py // 用于数据集分割的分区类
│ └─ visualization.py // 数据集分割后的可视化工具
├─ experiment(实验)
│ ├─ logger(日志记录器)
│ │ ├─ basic_logger.py // 基本日志记录器类
│ | └─ simple_logger.py // 简单日志记录器类
│ ├─ analyzer.py // 用于分析和打印实验结果的类
│ ├─ res_config.yml // 分析器的超参数文件
│ ├─ run_config.yml // 运行配置的超参数文件
| └─ runner.py // 基于超参数组合生成实验命令的类,并处理实验的进程调度
├─ system_simulator(系统模拟器)
│ ├─ base.py // 模拟系统异构性的基类
│ ├─ default_simulator.py // 模拟系统异构性的默认类
| └─ ...
├─ utils(实用工具)
│ ├─ fflow.py // 选项读取、初始化等工具
│ └─ fmodule.py // 模型级别的操作符
└─ requirements.txt // 项目的依赖包清单