文章目录
前言:用Python从零实现横向联邦图像分类
联邦学习是一种新型的、基于数据隐私保护技术实现的分布式训练范式,自提出以来,就受到学术界和工业界的广泛的关注。近年来,随着联邦学习的飞速发展,使得其成为解决数据孤岛和用户隐私问题的首选方案,但当前市面上这方面的实战书籍却尚不多见。本书是第一本权威的联邦学习实战书籍,结合联邦学习案例,有助于读者更深入的理解联邦学习这一新兴的学科。本专栏通过对《联邦学习实战》一书中的代码重现加深对联邦学习概念的理解。本专栏实战内容主要是针对包含可信第三方的联邦学习框架,针对去中心化的联邦学习模型也亟待研究,包括且不限于与区块链、秘密共享技术的融合,在保证通信开销在可承受范围内做到安全系数更高模型更加简化的联邦学习是下一步的研究趋势。
下面简单介绍一下联邦学习。杨强教授给出一个形象的比喻,我们把数据比作“草”,把机器学习模型或者深度学习模型比作“羊”。在联合学习的过程中,传统的集中式学习模型是将从各方收集到的数据集中到一起,从而feed我们的机器学习模型从而得到更准确的模型,按照我们上面的比喻就是把所有的草都集中到羊圈中,一步步地把羊喂肥。这个集中式的过程,草是离开生长地的,而羊是不动的,即“羊不动草动”。
但随着个人和国家对数据隐私的高度重视,包括欧盟出台的GDPR还有我国刚出台的《网络空间安全法》都体现了国家对于个人数据隐私的保护,“草动”变得不再合法,也危害了个人数据安全。这个时候急需一种既能够保证数据隐私又能联合各方数据训练的联合模型。这个时候联邦学习应运而生。
2017年由谷歌率先提出了联邦学习的概念,并给出了经典的FedAvg算法。联邦学习按照我们上面的比喻,就是我们把羊迁到长草的地方去吃草,即“草不动羊动”,也就是“数据不动模型动”。当我们保证了用户的数据不离开本地时,用户的数据安全也得到了最可靠的保护,这实际上也打破了“数据孤岛”的难题。
联邦学习因为其实用性和安全性在金融、医疗、风控等领域都存在大量应用。虽然在模型参数的通信过程中,有研究已经指明攻击者可以根据模型参数反推出数据的统计信息从而达到窃取数据信息的目的,但模型攻击和防御本来就是一种博弈。在攻击者的不断攻击下,安全可靠且高效的联邦学习模型的研究也必然成为热点。
杨强教授给出了联邦学习的三个分类:横向联邦学习、纵向联邦学习、联邦迁移学习。
横向联邦学习(Horizontal FL)是参与方数据具有重叠的数据特征,即在不同参与方之间数据特种是对齐的,不同的是我们的样本。例如两家银行,他们的数据特征是有重叠的,但是他们的用户很少重叠。横向联邦学习又称为样本划分的联邦学习,行代表样本ID,列代表数据特征,横向联邦学习其实就是数据特征对齐的联邦学习:
纵向联邦学习(Vertical FL)是参与方数据具有重叠的样本,即样本对齐,不同的是数据特征。比如说同地区的一家银行和一家电商平台,他们具有重叠的用户样本,但是在银行和电商平台办理的业务是不同的。比如银行和超市可以联合描绘出用户更具体的消费画像,根据用户的支出能力为其推荐商品。所以纵向联邦学习又称为特征划分的联邦学习:
联邦迁移学习的数据样本和数据特征都很少重叠,适合异构数据的联邦问题。联邦迁移学习研究进展缓慢,也将成为今后的热点:
本文使用Python实现了一个简单的横向联邦学习模型。使用的联邦算法是经典的FedAvg算法:
在该文实现的横向联邦学习中主要有两个角色:客户端和服务器端。服务端的主要功能是将被选择的客户端上传的本地模型进行模型聚合。客户端主要功能是接收服务端的下发指令和全局模型,利用本地数据进行局部模型训练。机构图如下:
注意本文只是在本地模拟了客户端和服务器端的通信过程,并未在真实的网络环境中实现服务器端和客户端的通信,因此本地模拟的通信时延无实际意义,本实验的目的在于证明联邦学习的有效性以及与集中式学习的性能对比。实际的网络部署,以及通信参数的隐私保护都需要进一步的探索,FATE中实现了单机部署和集群部署也对隐私保护的方法进行了挖掘,感兴趣的读者可以自行在FATE官网学习。
一、环境配置
本章的代码运行需要首先安装Python、Pytorch环境,并下载Cifar10数据集放置到data文件夹下面。
1. 下载Anaconda
2. 下载显卡对应的CUDA
我电脑的配置如下:
系统 | CPU | GPU | CUDA | cuDNN |
---|---|---|---|---|
win10 | intel i5 10210U | MX350 | 10.2 | 7.6.5 |
首先查看显卡支持的CUDA版本号:打开英伟达控制面板→帮助→系统信息→组件,查看CUDA版本:
到英伟达官网下载对应的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 pytorch torchvision torchaudio cudatoolkit=10.2
测试安装是否成功,可以正常打印出版本号则没问题。测试能否用GPU加速,返回True。
二、用Python从零实现横向联邦图像分类
运行代码
在本章项目地址下载代码到本地。
本项目的代码结构如下:
示例代码使用横向联邦来实现了对cifar10
图像数据集的分类,模型使用的是ResNet-18
.
进入上述创建的pytorch_pgu
环境,在本地代码目录下在命令行运行命令: