本章是《联邦学习实战》的第十章,我们将介绍在联邦学习场景下,利用分散在各摄像头的数据,构建一个联邦视觉系统,如下图所示:
有关联邦视觉相关的一些文献,读者可以参考下面的链接:
目前联邦视觉系统已经有下面的两种实现方式:
- 采用flask_socketio来作为服务端和客户端的通信方式实现。
- 基于PaddleFL的实现,详细的实现过程,读者可以参考FedVision_PaddleFL。
本章我们我们flask_socketio来作为服务端和客户端的通信方式,服务端与客户端的通信过程如下所示:
-
使用外部的公开数据集直接使用外部常见的目标检测数据集,来自行运行代码(可能由于数据集的不同,需要自行修改深度学习模型)。常见的目标检测数据集包括:
获取数据集后,将其放在data目录下,读者可根据实际需要自行切分数据集。
要执行的本章的代码,首先需要读者准备好以下的环境:
- 安装带GPU版本的PyTorch,本章的代码只能在GPU环境下运行。
- 安装flask_socketio,本章我们使用flask_socketio来作为服务端和客户端之间进行通信的框架。
- 其他的安装环境,可以查看requirements.txt文件,并执行下面代码进行安装:
pip install -r requirements.txt
当下载了数据集和安装了必要的运行环境后,我们便可以按照下面的步骤来执行代码:
-
首先执行下面的命令来启动服务端:
sh ./run_server.sh dataset model port
这里包含三个输入参数:
-
dataset: 数据集名称,可选项包括“street_5“、”street_20”。
-
model:模型参数,可选项包括”faster“、”yolo“。
-
port:端口号,由用户自行设置。
-
-
然后执行下面命令来启动客户端:
sh ./run.sh dataset gpu_id model port
客户端的启动包含了四个输入参数:
-
dataset: 数据集名称,与服务端一样,可选项包括“street_5“、”street_20”。
-
gpu_id:如果是在本地环境中模拟多个客户端场景,由于每一个客户端进行本地训练都需要单独的GPU资源,因此,为了防止客户端都绑定在同一个GPU核中执行,导致显存不足程序中断。我们可以将每一个客户端指定到不同的GPU核中执行;如果是分布式环境下执行,即每一个客户端在单独的设备中运行,那么这个参数随意设置即可。
-
model:模型参数,与服务端一样,可选项包括”faster“、”yolo“。
-
port:端口号,由用户自行设置。
-
在运行过程中,如果要强行终止,我们也可以执行下面的命令来强制终止代码的运行:
bash sh ./stop.sh street_5 yolo
我们分别使用YOLOv3和Faster R-CNN两个模型,在联邦学习场景下,测试对街道数据集进行联合建模的结果比较。
我们分别测试了在不同数量的客户参与方(C),以及不同的本地训练迭代次数(E)配置下,其中mAP的结果如下图所示:
其损失值随迭代次数的变化的变化结果如下所示: