LEAF的PyTorch版本#
FedLab将TensorFlow版本的LEAF数据集迁移到了PyTorch框架下,并提供了相应数据集的dataloader的实现脚本,统一的接口在 fedlab_benchmarks/leaf/dataloader.py
。
本文介绍在FedLab中leaf数据集的使用流程。
LEAF数据集说明#
LEAF benchmark 包含了celeba, femnist, reddit, sent140, shakespeare, synthetic 六类数据集的联邦设置。参考 leaf-readme.md ,以下给出六类数据集的简介、总用户数和对应任务类别。
FEMNIST
概述: 图像数据集。
详情: 共有62个不同类别(10个数字,26个小写字母,26个大写字母); 每张图像是 \(28 imes 28\) 像素(可选择全部处理为 \(128 imes 128\) 像素); 共有3500位用户。
任务: 图像分类
Sentiment140
概述: 推特推文文本数据集
详情: 共660120位用户
任务: 情感分析
Shakespeare
概述: 莎士比亚作品集对白文本数据集。
详情: 共1129位用户(后续根据序列长度减少到660位,详情查看 bug 。 )
任务: 下一字符预测
Celeba
概述: 基于大规模名人面孔属性数据集的图像数据集: Large-scale CelebFacesAttributes Dataset 。
详情: 共9343位用户(排除了样本数小于等于5的名人)
任务: 图像识别(微笑检测)
合成数据集
概述: 提出了一个生成具有挑战性的合成联合数据集的过程,高级目标是创建真实模型依赖于各设备的设备。可参阅论文 LEAF: A Benchmark for Federated Settings 查看整个生成过程的描述。
详情: 用户可以自定义设备数量、类别数量和维度数量等
任务: 分类
Reddit
概述: 对 pushshift.io 发布的2017年12月的Reddit数据进行了预处理。
详情: 共1,660,820位用户,总评论56,587,343条。
任务: 下一单词预测
使用leaf下载数据集#
为方便用户使用leaf,fedlab将leaf六类数据集的下载、处理脚本整合到
fedlab_benchmarks/datasets/data
中,该文件夹存储各类数据集的下载脚本。
leaf数据集文件夹内的文件结构:
/FedLab/fedlab_benchmarks/datasets/{leaf_dataset_name}
├── {other_useful_preprocess_util}
├── prerpocess.sh
├── stats.sh
└── README.md
preprocess.sh
: 对数据集进行下载和处理。stats.sh
: 对preprocess.sh
处理后所有数据(存储于./data/all_data/all_data.json
)进行信息统计。README.md
: 对该数据集的下载和处理过程进行了详细说明,包含了参数说明和注意事项。用户可直接运行脚本
create_datasets_and_save.sh
来下载,处理和存储相关的数据集。划分的数据集会被pickle模块序列化并存储到文件中。这个.sh脚本是preprocess.sh的样例用法。用户可以修改create_datasets_and_save.sh
的源码从而自定义划分策略。
preprocess.sh 使用样例:
cd fedlab_benchmarks/datasets/data/femnist
bash preprocess.sh -s niid --sf 0.05 -k 0 -t sample
cd fedlab_benchmarks/datasets/data/shakespeare
bash preprocess.sh -s niid --sf 0.2 -k 0 -t sample -tf 0.8
cd fedlab_benchmarks/datasets/data/sent140
bash ./preprocess.sh -s niid --sf 0.05 -k 3 -t sample
cd fedlab_benchmarks/datasets/data/celeba
bash ./preprocess.sh -s niid --sf 0.05 -k 5 -t sample
cd fedlab_benchmarks/datasets/data/synthetic
bash ./preprocess.sh -s niid --sf 1.0 -k 5 -t sample --tf 0.6
# for reddit, see its README.md to download preprocessed dataset manually
通过对 preprocess.sh
设定参数,实现对原始数据的采样、划分等处理,各数据集文件夹下的README.md均提供了脚本参数示例和解释,常见参数有:
-s
表示采样方式,取值有iid和niid两种选择,表示是否使用i.i.d方式进行采样。--sf
表示采样数据比例,取值为小数,默认为0.1。-k
表示采样时所要求的用户最少样本数目,筛选掉拥有过少样本的用户,若取值为0表示不进行样本数目的筛选。-t
表示划分训练集测试集的方式,取值为’user’则划分用户到训练-测试集合,取值为’sample’则划分每个用户的数据到训练-测试集合中。--tf
表示训练集的数据占比,取值为小数,默认为0.9,表示训练集:测试集=9:1。
目前FedLab的Leaf实验需要提供训练数据和测试数据,因此需要对 preprocess.sh
提供相关的数据训练集-测试集划分参数,默认划分比例为0.9。
若需要重新获取数据或划分数据,需要先删除各数据集下的data文件夹再运行相关脚本进行数据下载和处理。
pickle序列化存储Dataset#
为加速用户读取数据,fedlab提供了将原始数据处理为DataSet并存储为pickle文件的方法。通过读取数据处理后的pickle文件可获得各客户端对应数据的Dataset。
设定参数并运行 create_pickle_dataset.py
,使用样例如下:
cd fedlab_benchmarks/leaf/process_data
python create_pickle_dataset.py --data_root "../../datasets" --save_root "./pickle_dataset" --dataset_name "shakespeare"
参数说明:
data_root
:存储leaf数据集的root路径,该路径包含leaf各数据集;若使用fedlab所提供的Fedlab_benchmarks/datasets/
下载leaf数据,则data_root可设置为该路径,示例给出了该路径的相对地址。save_root
:存储处理后DataSet的pickle文件地址,各数据集DataSet将另存为{save_root}/{dataset_name}/{train,test}
;示例则在当前路径下创建pickle_dataset
文件夹存储所有的pickle dataset文件。dataset_name
:指定要处理的leaf数据集名称,有{feminist, Shakespeare, celeba, sent140, synthetic, reddit}六种选择。
Dataloader加载数据集#
leaf数据集由 dataloader.py
加载(位于 fedlab_benchmarks/leaf/dataloader.py
),所有返回数据类型均为pytorch Dataloader 。
通过调用该接口并指明数据集名称,即可获得相应的Dataloader。
使用样例
from leaf.dataloader import get_LEAF_dataloader
def get_femnist_shakespeare_dataset(args):
if args.dataset == 'femnist' or args.dataset == 'shakespeare':
trainloader, testloader = get_LEAF_dataloader(dataset=args.dataset,
client_id=args.rank)
else:
raise ValueError("Invalid dataset:", args.dataset)
return trainloader, testloader
运行实验#
当前LEAF数据集所进行的实验为FedAvg的cross machine场景下的单机多进程设置。
通过运行fedlab_benchmarks/fedavg/cross_machine/LEAF_test.sh可快速执行LEAF数据集下FedAvg的模拟实验。