前言:用Python从零实现横向联邦图像分类

联邦学习是一种新型的、基于数据隐私保护技术实现的分布式训练范式,自提出以来,就受到学术界和工业界的广泛的关注。近年来,随着联邦学习的飞速发展,使得其成为解决数据孤岛和用户隐私问题的首选方案,但当前市面上这方面的实战书籍却尚不多见。本书是第一本权威的联邦学习实战书籍,结合联邦学习案例,有助于读者更深入的理解联邦学习这一新兴的学科。本专栏通过对《联邦学习实战》一书中的代码重现加深对联邦学习概念的理解。 本专栏实战内容主要是针对包含可信第三方的联邦学习框架,针对去中心化的联邦学习模型也亟待研究,包括且不限于与区块链、秘密共享技术的融合,在保证通信开销在可承受范围内做到安全系数更高模型更加简化的联邦学习是下一步的研究趋势。

下面简单介绍一下联邦学习。杨强教授给出一个形象的比喻,我们把数据比作“草”,把机器学习模型或者深度学习模型比作“羊”。在联合学习的过程中, 传统的集中式学习模型 是将从各方收集到的数据集中到一起,从而feed我们的机器学习模型从而得到更准确的模型,按照我们上面的比喻就是把所有的草都集中到羊圈中,一步步地把羊喂肥。这个集中式的过程,草是离开生长地的,而羊是不动的,即“ 羊不动草动 ”。

但随着个人和国家对数据隐私的高度重视,包括欧盟出台的GDPR还有我国刚出台的《网络空间安全法》都体现了国家对于个人数据隐私的保护,“草动”变得不再合法,也危害了个人数据安全。这个时候急需一种既能够保证数据隐私又能联合各方数据训练的联合模型。这个时候联邦学习应运而生。

2017年由谷歌率先提出了联邦学习的概念,并给出了经典的 FedAvg算法 联邦学习 按照我们上面的比喻,就是我们把羊迁到长草的地方去吃草,即“ 草不动羊动 ”,也就是“ 数据不动模型动 ”。当我们保证了 用户的数据不离开本地 时,用户的数据安全也得到了最可靠的保护,这实际上也打破了“数据孤岛”的难题。

联邦学习因为其实用性和安全性在金融、医疗、风控等领域都存在大量应用。虽然在模型参数的通信过程中,有研究已经指明攻击者可以根据模型参数反推出数据的统计信息从而达到窃取数据信息的目的,但模型攻击和防御本来就是一种博弈。在攻击者的不断攻击下,安全可靠且高效的联邦学习模型的研究也必然成为热点。

杨强教授给出了联邦学习的三个分类: 横向联邦学习、纵向联邦学习、联邦迁移学习

横向联邦学习 (Horizontal FL)是参与方数据具有重叠的数据特征,即在不同参与方之间数据特种是对齐的,不同的是我们的样本。例如两家银行,他们的数据特征是有重叠的,但是他们的用户很少重叠。横向联邦学习又称为 样本划分的联邦学习 ,行代表样本ID,列代表数据特征,横向联邦学习其实就是数据特征对齐的联邦学习: 在这里插入图片描述
纵向联邦学习 (Vertical FL)是参与方数据具有重叠的样本,即样本对齐,不同的是数据特征。比如说同地区的一家银行和一家电商平台,他们具有重叠的用户样本,但是在银行和电商平台办理的业务是不同的。比如银行和超市可以联合描绘出用户更具体的消费画像,根据用户的支出能力为其推荐商品。所以纵向联邦学习又称为 特征划分的联邦学习
在这里插入图片描述
联邦迁移学习的数据样本和数据特征都很少重叠,适合异构数据的联邦问题。联邦迁移学习研究进展缓慢,也将成为今后的热点:
在这里插入图片描述

本文使用Python实现了一个简单的横向联邦学习模型。使用的联邦算法是经典的 FedAvg算法

在这里插入图片描述
在该文实现的横向联邦学习中主要有两个角色: 客户端和服务器端 服务端 的主要功能是将被选择的客户端上传的本地模型进行模型聚合。 客户端 主要功能是接收服务端的下发指令和全局模型,利用本地数据进行局部模型训练。机构图如下:

注意本文只是在本地模拟了客户端和服务器端的通信过程,并未在真实的网络环境中实现服务器端和客户端的通信,因此本地模拟的通信时延无实际意义,本实验的目的在于证明联邦学习的有效性以及与集中式学习的性能对比 。实际的网络部署,以及通信参数的隐私保护都需要进一步的探索,FATE中实现了单机部署和集群部署也对隐私保护的方法进行了挖掘,感兴趣的读者可以自行在 FATE官网 学习。

一、环境配置

本章的代码运行需要首先安装 Python Pytorch 环境,并下载 Cifar10 数据集放置到data文件夹下面。

1. 下载Anaconda

Anaconda 的下载直接在 官网 下载即可,不再赘述。

2. 下载显卡对应的CUDA

我电脑的配置如下:

cuDNN

英伟达官网 下载对应的CUDA版本。我下载的版本是CUDA10.2。

这里提醒一下最好选择离线安装,在线安装版本安装过程巨慢。我用IDM将离线版本下载下来在电脑上进行了本地安装。注意选择自定义安装并取消勾选 Visual Studio Integration。安装路径默认即可。
安装完成后配置CUDA的环境变量:

在Path中手动添加如下路径:

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\lib\x64
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\include
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\extras\CUPTI\lib64
C:\ProgramData\NVIDIA Corporation\CUDA Samples\v10.2\bin\win64
C:\ProgramData\NVIDIA Corporation\CUDA Samples\v10.2\common\lib\x64

环境变量
验证CUDA是否安装成功:

3. 安装cuDNN

官网下载与CUDA对应的cuDNN,我下载的是 cuDNN v7.6.5。需要登录账号下载,没有账号注册即可。
下载之后,解压缩,将CUDNN文件夹里面的bin、include、lib文件直接复制到CUDA的安装目录(默认路径:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2)下,直接覆盖安装即可。

4. 配置pytorch-gpu环境

打开Anaconda prompt命令行。
常用环境管理的conda命令有:

conda env -h	#查看环境管理的全部命令帮助
conda info --envs
conda env list	#列举当前所有环境
conda create --name your_env_name	#创建环境
conda create --name your_env_name python=3.5	#创建指定python版本的环境
conda activate your_env_name	#进入某个环境
conda deactivate	#退出某个环境
conda create --name new_env_name --clone old_env_name	#复制某个环境
conda remove --name your_env_name --all	#删除某个环境

常用包管理命令:

conda list	#列举当前环境已安装的抱
conda install -n env_name package_name	#安装包
conda remove package_name	#删除包

conda源安装十分缓慢,建议换成清华源,主要操作:

#查看当前conda配置
conda config --show channels
#设置通道
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
#设置搜索是显示通道地址
conda config --set show_channel_urls yes
# conda install pytorch torchvision cudatoolkit=10.0  # 删除安装命令最后的 -c pytorch,才会采用清华源安装。

不建议在base环境中直接安装pytorch,建议新建虚拟环境再安装pytorch,有gpu就下载gpu版本没有则下载cpu版本。

# 创建pytorch_gpu环境
conda create --name pytorch_gpu python=3.7
conda activate pytorch_gpu
conda install pandas
conda install pytorch torchvision torchaudio cudatoolkit=10.2 -c pytorch
# 注意要去掉后面的-c pytorch,否则是从pytorch源下载,过程缓慢;去掉之后从清华源下载
conda install py
一、常见的配置概念 联邦学习在开发过程中会涉及大量的参数配置,其中比较常用的参数设置包括以下几个: ● 训练的客户端数量:每一轮的迭代,服务端会首先从所有的客户端中挑选部分客户端进行本地训练,挑出部分不仅不会影响全局收敛的效果,而且能够提升训练的效率。 ● 全局迭代次数:即服务端和客户端的通信次数。通常会设置一个最大的全局迭代次数,但在训练过程中,只要模型满足收敛的条件,那么训练也可以提前终止。 ● 本地模型的迭代次数:即每一个客户端在进行本地模型训练时的迭代次数。每一个客户端的本地模型的迭代次数可以相同, 什么是联邦学习? 简单来说就是在一个多方的环境中,数据集是散的(在各个不同的客户端中),那么怎样实现机器学习算法呢? 首先想到的就是将多个数据集合并合并起来,然后统一的使用传统的机器学习或者深度学习算法进行计算,但是如果有一方因为数据隐私问题不愿意提交自己的数据呢? 那么就出现了联邦学习,核心就是“数据不动模型动,数据可用不可见” 多个客户端不提交数据而是提交训练时的参数/梯度给中心服务器,中心服务器进行计算后再将参数/梯度返回多个客户端再学习的过程 整个过程数据的所有权依然在用户手中,这就是联邦学习 我们以前给大家介绍过杨强教授团队所著的业界首本联邦学习的书籍,现在这本书的实战版来了,5月刚刚出版,本次给大家赠送3本新书,即《联邦学习实战》。这是一本什么样的书所谓联邦学习技术,是一种新... x.add_(y) # add_为就地加法,即直接加载x张量上,执行操作以后x为tensor([5, 7, 9])x.device # 初始时,张量x的数据默认存放在CPU上x.device # 如果系统有GPU设备,张量x的数据将存放在GPU上y = x + 2x.grad #求取x的梯度值为(4.5,4.5,4.5,4.5) 参考书目《联邦学习实战》 杨强 在阅读本书的过程中,我尝试根据书中的代码,自己实现横向联邦学习中的图像分类任务,这里是我对代码和逻辑的理解还有出现的问题,希望对大家的学习有所帮助。 下面的表格是一些实验基本信息: 目录手写数字识别模型(非并行训练)概述图导入基本包创建客户机设置训练参数初始化数据集搭建神经网络模型定义训练与测试函数定义主函数训练效果手写数字识别模型(并行训练)概述图 经过前面几篇笔记的学习,基本上已经知道了联邦学习的基本代码框架。联邦学习也有两种实现方式,一种是C/S架构,服务器整合模型,一种是P2P架构,不需要第三方。现在先实现C/S架构下的横向联邦学习模型。 大概处理过程如下: 1.数据预处理,得到data_loader 2.建立虚拟机,分配数据集 3.初始化模型 4.将模型发送给虚拟机 联邦学习实战——用Python实现横向联邦图像分类前言1. 配置信息2. 训练数据集3. 服务端 本篇学习笔记记录的内容是杨强教授编写的《联邦学习实战》这本书的第三内容,本来是准备记录在ipad上,但是用博客形式写下来可以跟更多人分享并讨论,这不失为更好的选择。前两内容为理论基础,简单介绍了联邦学习(想要深入了解的朋友可以阅读杨强教授的《联邦学习》这本书)以及联邦学习的安全机制(同态加密、差分隐私、安全多方计算),这些内容我在之前的博客中有所涉及,就不再此赘述了。 第三开始部分是配置运行环境 1 optimizer = optim.Adam(model.parameters()) 2 fot epoch in range(num_epoches): 3 train_loss=0 4 for step,(seq, label) in enumerate(data_loader): 5 # 损失函数 6 loss = criterion(model(seq), label.to(device)