PaddleFL是百度开发的一个基于飞桨(PaddlePaddle)的开源联邦学习框架,让研发人员可以很轻松地使用不同的联邦学习算法,同时也让开发人员比较容易在大规模分布式集群中部署PaddleFL联邦学习系统。PaddleFL可以算是最早的联邦学习框架之一。本节将首先介绍一下PaddlePaddle飞桨深度学习框架、PaddleFL框架结构,以及简单的实战示例。
PaddleFL提供了很多种联邦学习策略(横向联邦学习、纵向联邦学习)及其在计算机视觉、自然语言处理、推荐算法等领域的应用。此外,PaddleFL还将提供传统机器学习训练策略的应用,例如多任务学习、联邦学习环境下的迁移学习。依靠着PaddlePaddle的大规模分布式训练和Kubernetes对训练任务的弹性调度能力,PaddleFL可以基于全栈开源软件轻松地部署。PaddleFL联邦学习框架如图2-1所示。
PaddleFL以飞桨作为其深度学习框架,提供编程语言、模型参数训练、边缘计算,以及弹性调度等底层服务。它支持目前主流的两类联邦学习策略:横向联邦学习策略和纵向联邦学习策略。对于横向联邦学习策略,它主要通过联邦平均(FedAvg)算法、差分隐私-随机梯度下降法(DP-SGD),以及安全聚合(SecAgg)算法保障用户数据隐私和深度学习训练过程的安全。对于纵向联邦学习策略,它提供了基于PrivC的两方安全计算训练方式和基于ABY3的三方安全计算训练方式。
PaddleFL主要提供了两种解决方案:数据并行(Data Parallel)和基于安全多方计算的联邦学习(PaddleFL with MPC, PFM)。通过数据并行的方式,各数据方可以基于经典的横向联邦学习策略(如FedAvg、DP-SGD等)完成模型训练。PFM是基于安全多方计算(MPC)实现的联邦学习方案。PFM可以很好地支持联邦学习,包括横向、纵向及联邦迁移学习等多个场景,既提供了可靠的安全性,也拥有可观的性能。
● 图2-1 PaddleFL联邦学习框架示意图
1.数据并行机制
在数据并行模式中,模型训练的整个过程分为两个阶段:编译阶段(Compile Time)和运行阶段(Run Time)。编译阶段主要定义联邦学习任务,运行阶段主要进行联邦学习训练工作,具体的组件如图2-2所示。
● 图2-2 PaddleFL基于数据并行的联邦学习内部服务
编译阶段的任务如下。
● 联邦学习策略(FL-Strategy):用户可以使用FL-Strategy定义联邦学习策略,例如Fed-Avg等。
● 自定义模型(User-Defined-Program):定义了机器学习模型的结构和训练策略,例如多任务学习等。
● 分布式配置(Distributed-Config):定义联邦学习系统的分布式环境部署,例如分布式训练配置定义训练节点信息。
● 联邦任务生成器(FL-Job-Generator):给定FL-Strategy、User-Defined-Program和Dis-tributed-Config,联邦参数的Server端和Client端的FL-Job将通过FL-Job-Generator生成。FL-Job被发送到组织和联邦参数服务器,以进行联合训练。
运行阶段的任务如下。
● 服务器(FL-Server):通常在云或第三方集群中运行的参数服务器。
● 训练端(FL-Worker):每个参与联邦学习的组织都将拥有一个或多个FL-Worker,它们将与联邦学习参数服务器进行通信。
● 调度器(FL-Scheduler):训练过程中起到调度Worker的作用,在每个更新周期前,决定哪些Worker参与训练。
2.基于安全多方计算的PFM运行机制
PaddleFL的PFM是基于ABY3和PrivC等底层MPC协议来实现安全训练和推理任务的,是一种高效的多方计算模型。基于PrivC的两方联邦学习主要支持线性/逻辑回归、DNN模型。基于ABY3的三方联邦学习则支持线性/逻辑回归、DNN、CNN、FM等。
在PaddleFL的PFM中,参与者可以分为不同的角色,包括输入方(Input Party)、计算方(Computing Party)和结果方(Result Party)。输入方,包括训练数据所有者和模型所有者,将数据或模型加密并分发给计算方(ABY3协议中存在三个计算方,而PrivC协议中存在两个计算方)。计算方(例如云上的虚拟机)基于特定的MPC协议进行训练或推理任务,被限制只能看到加密的数据或模型,从而保证数据的隐私。当完成运算任务后,计算方将加密结果发送给一个或多个结果方(例如数据所有者或指定的第三方),使结果通过第三方解密重构,如图2-3所示。
● 图2-3 PaddleFL基于安全多方计算的联邦学习内部服务
PFM中的完整训练或推理过程主要包括三个阶段:数据准备、训练/推理和结果重构。在数据准备阶段,PFM需要进行私有数据对齐、加密与分发。私有数据对齐:PFM使所有的数据所有者能够找出具有相同密钥(如UUID)的记录,而不会相互泄露私有数据。这在纵向联邦学习案例中是非常关键的一个步骤。目前常用的方法是私有集合交集(Private Set Intersection)、隐私保护记录链接(Privacy-Preserving Record Linkage)和布隆过滤器(Bloom Filter)等。加密和分发:PFM提供在线、离线数据加密和分发解决方案。在离线数据共享解决方案中,来自输入方的数据和模型将使用秘密分享(Secret-Sharing)进行加密,然后通过直接传输或HDFS等分布式存储发送到计算方。而在在线数据共享解决方案中,输入方在训练阶段开始时,在线加密和分发数据、模型,每个计算方只能获得一份数据,因此在半诚实攻击模型中,攻击方无法恢复原始值。PFM拥有与PaddlePaddle相同的运行模式。在训练、推理阶段,用户首先需要选择MPC协议,定义机器学习模型及其训练策略。paddle_fl.mpc中提供了可以操作加密数据的算法,在运行时算法的实例会被创建并被执行器依次运行。在训练过程中,密文的通信支持gloo和grpc两种网络通信模式。安全训练和推理运算完成后,结果将由计算方以加密形式发送给结果方。结果方可以收集加密的结果,使用PFM中的工具对其进行解密,并将明文结果传递给用户。目前数据分享和重构支持离线和在线两种模式。
PaddleFL提供了Docker、安装包、编译源代码,以及Kubernetes这几种安装和部署方式。接下来将简单介绍这三种形式的安装过程。
1.通过Docker安装PaddleFL
通过Docker安装PaddleFL是官方推荐的安装方式。只需要通过简单的两行命令即可安装部署,前提是已经安装了Docker环境:
2.通过安装包安装PaddleFL
官方已经提供了编译好的PaddlePaddle飞桨和PaddleFL安装包,可以直接下载安装。
因为PaddleFL使用PaddlePaddle飞桨作为它的底层深度学习框架,所以首先需要下载并安装PaddlePaddle飞桨。
其中,需要将“**”替换为安装环境中的Python版本。如果使用的是Python 3.8,则使用的安装命令如下:
接下来通过pip安装PaddleFL(假设用户已经安装了Python和pip环境):
以上命令会自动安装Python 3.8对应的PaddleFL。对于其他Python 3环境,则需要下载对应的安装包https://pypi.org/project/paddle-fl/1.1.2/#files并且手动安装。
3.通过编译源代码安装PaddleFL
首先,准备安装环境的搭建,PaddleFL有如下系统和软件要求:
● CentOS 7(64位)或者Ubuntu 16.04。
● Python 3.5/3.6/3.7(64位)或者更高版本。
● pip3 9.0.1+(64位)。
● PaddlePaddle 1.8.5(或者使用PaddlePaddle-GPU 1.8.5来编译GPU版本)。
● Redis 5.0.8(64位)。
● GCC或G++ 8.2.0+。
● cmake 3.15+。
通过以下方式来编译代码:
接着执行编译命令,其中CMAKE_C_COMPILER是gcc的路径,CMAKE_CXX_COMPILER是g++的路径,PYTHON_EXECUTABLE是安装PaddlePaddle的Python二进制文件的路径,PYTHON_INCLUDE_DIRS是文件Python.h的路径,此外,也可以通过设置-D WITH_GPU选择编译GPU版本或CPU版本,比如:
值得注意的是,GPU版本仅在CUDAPlace中运行。如果已经提前安装了PaddlePaddle,只想编译PaddleFL,那么把上面命令中的“-D BUILD_PADDLE_FROM_SOURCE=ON”改成“-D BUILD_PADDLE_FROM_SOURCE=OFF”。
最后安装编译好的安装包。
CPU版本:
GPU版本:
接下来通过一个简单的横向联邦学习的示例进一步了解PaddleFL的使用。本小节将使用LEAF中的FEMNIST 作为训练数据集,以一个简单的卷积神经网络作为训练模型,FedAvg作为联邦学习策略,最后通过Docker的方式模拟和运行分布式环境。示例的源代码来自于PaddleFL的官方GitHub仓库 。
首先在fl_master.py(见代码2-1)中定义了联邦学习训练策略(FL-Strategy)、用户定义程序(User-Defined-Program),比如模型、损失函数、训练的超参数等,以及分布式系统配置(Distributed-Config)。然后FL-Job-Generator为服务器(FL-Server)和训练端(FL-Worker)生成任务(FL-Job)。
代码2-1 FL Master示例代码(定义模型、损失函数和训练策略等)
在fl_scheduler.py(见代码2-2)中,注册一个联邦学习服务器(FL-Server)和联邦学习训练端(FL-Worker)。
代码2-2 FL Scheduler示例代码
在fl_server.py(见代码2-3)中,加载并运行联邦学习服务器(FL-Server)的任务。
代码2-3 FL Server示例代码
在fl_trainer.py(见代码2-4)中,加载并运行联邦学习的训练任务。
代码2-4 FL Trainer示例代码