README_cn.md 11.2 KB
Newer Older
G
guru4elephant 已提交
1 2
# PaddleFL

D
Dong Daxiang 已提交
3
PaddleFL是一个基于PaddlePaddle的开源联邦学习框架。研究人员可以很轻松地用PaddleFL复制和比较不同的联邦学习算法。开发人员也可以从padderFL中获益,因为用PaddleFL在大规模分布式集群中部署联邦学习系统很容易。PaddleFL提供很多联邦学习策略及其在计算机视觉、自然语言处理、推荐算法等领域的应用。此外,PaddleFL还将提供传统机器学习训练策略的应用,例如多任务学习、联邦学习环境下的迁移学习。依靠着PaddlePaddle的大规模分布式训练和Kubernetes对训练任务的弹性调度能力,PaddleFL可以基于全栈开源软件轻松地部署。
G
guru4elephant 已提交
4 5 6 7 8

## 联邦学习

如今,数据变得越来越昂贵,而且跨组织共享原始数据非常困难。联合学习旨在解决组织间数据隔离和数据知识安全共享的问题。联邦学习的概念是由谷歌的研究人员提出的[1,2,3]。

J
jingqinghe 已提交
9 10
## 编译与安装

J
jingqinghe 已提交
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
### 使用docker安装

```sh
#Pull and run the docker
docker pull hub.baidubce.com/paddlefl/paddle_fl:latest
docker run --name <docker_name> --net=host -it -v $PWD:/root <image id> /bin/bash

#Install paddle_fl
pip install paddle_fl
```

### 从源码编译

#### 环境准备

* CentOS 6 or CentOS 7 (64 bit)
* Python 2.7.15+/3.5.1+/3.6/3.7 ( 64 bit) or above
* pip or pip3 9.0.1+ (64 bit)
* PaddlePaddle release 1.6.3
* Redis 5.0.8 (64 bit)
* GCC or G++ 4.8.3+
* cmake 3.15+

#### 克隆源代码并编译安装

获取源代码
```sh
git clone https://github.com/PaddlePaddle/PaddleFL
cd /path/to/PaddleFL

# Checkout stable release
mkdir build && cd build
```

J
jingqinghe 已提交
45
执行编译指令, `PYTHON_EXECUTABLE` 为安装了PaddlePaddle的可执行python路径, `PYTHON_INCLUDE_DIRS` 是相应的include路径,可以用如下指令获得。`CMAKE_CXX_COMPILER` 为指定的g++路径。
J
jingqinghe 已提交
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64

```sh
${PYTHON_EXECUTABLE} -c "from distutils.sysconfig import get_python_inc;print(get_python_inc())"
```
之后就可以执行编译和安装的指令
```sh
cmake ../ -DPYTHON_EXECUTABLE=${PYTHON_EXECUTABLE} -DPYTHON_INCLUDE_DIRS=${python_include_dir} -DCMAKE_CXX_COMPILER=${g++_path}
make -j$(nproc)
```

安装对应的安装包

```sh
make install
cd /path/to/PaddleFL/python
${PYTHON_EXECUTABLE} setup.py sdist bdist_wheel
pip or pip3 install dist/***.whl -U
```

G
guru4elephant 已提交
65 66
## PaddleFL概述

J
jingqinghe 已提交
67 68
### 横向联邦方案

D
Dong Daxiang 已提交
69
<img src='images/FL-framework-zh.png' width = "1300" height = "310" align="middle"/>
G
guru4elephant 已提交
70

D
Dong Daxiang 已提交
71
在PaddleFL中,横向和纵向联邦学习策略将根据[4]中给出的分类来实现。PaddleFL也将提供在自然语言处理,计算机视觉和推荐算法等领域的应用示例。
G
guru4elephant 已提交
72 73 74

#### 联邦学习策略

D
Dong Daxiang 已提交
75
- **纵向联邦学习**: 带privc的逻辑回归,带第三方privc的神经网络[5]
G
guru4elephant 已提交
76

J
jingqinghe 已提交
77
- **横向联邦学习**: 联邦平均 [2],差分隐私 [6],安全聚合
G
guru4elephant 已提交
78 79 80 81 82 83 84 85 86

#### 训练策略

- **多任务学习** [7]

- **迁移学习** [8]

- **主动学习**

J
jingqinghe 已提交
87 88 89 90 91 92 93
### Paddle Encrypted

Paddle Encrypted 是一个基于PaddlePaddle的隐私保护深度学习框架。Paddle Encrypted基于多方计算(MPC)实现安全训练及预测,拥有与PaddlePaddle相同的运行机制及编程范式。

Paddle Encrypted 设计与PaddlePaddle相似,没有密码学相关背景的用户亦可简单的对加密的数据进行训练和预测。同时,PaddlePaddle中丰富的模型和算法可以轻易地迁移到Paddle Encrypted中。

作为PaddleFL的一个重要组成部分,Paddle Encrypted可以很好滴支持联邦学习,包括横向、纵向及联邦迁移学习等多个场景。既提供了可靠的安全性,也拥有可观的性能。
G
guru4elephant 已提交
94 95 96

## PaddleFL框架设计

J
jingqinghe 已提交
97 98
### 横向联邦方案

Q
qjing666 已提交
99
<img src='images/FL-training.png' width = "1300" height = "450" align="middle"/>
G
guru4elephant 已提交
100

D
Dong Daxiang 已提交
101
在PaddeFL中,用于定义联邦学习任务和联邦学习训练工作的组件如下:
G
guru4elephant 已提交
102 103 104

#### 编译时

J
jingqinghe 已提交
105
- **FL-Strategy**: 用户可以使用FL-Strategy定义联邦学习策略,例如Fed-Avg[2]。
G
guru4elephant 已提交
106 107 108

- **User-Defined-Program**: PaddlePaddle的程序定义了机器学习模型结构和训练策略,如多任务学习。

D
Dong Daxiang 已提交
109
- **Distributed-Config**: 在联邦学习中,系统会部署在分布式环境中。分布式训练配置定义分布式训练节点信息。
G
guru4elephant 已提交
110

D
Dong Daxiang 已提交
111
- **FL-Job-Generator**: 给定FL-Strategy, User-Defined Program 和 Distributed Training Config,联邦参数的Server端和Worker端的FL-Job将通过FL Job Generator生成。FL-Jobs 被发送到组织和联邦参数服务器以进行联合训练。
G
guru4elephant 已提交
112 113 114 115 116

#### 运行时

- **FL-Server**: 在云或第三方集群中运行的联邦参数服务器。

D
Dong Daxiang 已提交
117
- **FL-Worker**: 参与联合学习的每个组织都将有一个或多个与联合参数服务器通信的Worker。
G
guru4elephant 已提交
118

Q
qjing666 已提交
119 120
- **FL-Scheduler**: 训练过程中起到调度Worker的作用,在每个更新周期前,决定哪些Worker可以参与训练。

J
jingqinghe 已提交
121
请参考更多的[例子](./python/paddle_fl/paddle_fl/examples), 获取更多的信息。
J
jingqinghe 已提交
122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
### Paddle Encrypted

Paddle Encrypted 中的安全训练和推理任务是基于底层的ABY3多方计算协议实现的。在ABY3中,参与方可分为:输入方、计算方和结果方。

输入方为训练数据及模型的持有方,负责加密数据和模型,并将其发送到计算方。计算方为训练的执行方,基于特定的多方安全计算协议完成训练任务。计算方只能得到加密后的数据及模型,以保证数据隐>私。计算结束后,结果方会拿到计算结果并恢复出明文数据。每个参与方可充当多个角色,如一个数据拥有方也可以作为计算方参与训练。

Paddle Encrypted的整个训练及推理过程主要由三个部分组成:数据准备,训练/推理,结果解析。

#### 数据准备

##### 私有数据对齐

Paddle Encrypted允许数据拥有方(数据方)在不泄露自己数据的情况下,找出多方共有的样本集合。此功能在纵向联邦学习中非常必要,因为其要求多个数据方在训练前进行数据对齐,并且保护用户的数>据隐私。凭借PSI算法,Paddle Encrypted可以在一秒内完成6万条数据的对齐。

##### 数据加密及分发

在Paddle Encrypted中,数据方将数据和模型用秘密共享的方法加密,然后用直接传输或者数据库存储的方式传到计算方。每个计算方只会拿到数据的一部分,因此计算方无法还原真实数据。

#### 训练及推理

J
jingqinghe 已提交
142
像PaddlePaddle一样,训练和推理任务可以分为编译阶段和运行阶段。
J
jingqinghe 已提交
143 144 145

##### 编译时

J
jingqinghe 已提交
146 147
* **确定MPC环境**:用户需要指定用到的MPC协议,并配置网络环境。现有版本的Paddle Encrypted只支持"ABY3"协议。更多的协议将在后续版本中支持。
* **用户定义训练任务**:用户可以根据Paddle Encrypted提供的安全接口,定义集齐学习网络以及训练策略。
J
jingqinghe 已提交
148 149
##### 运行时

J
jingqinghe 已提交
150 151 152
一个Paddle Encrypted程序实际上就是一个PaddlePaddle程序。在运行时,Paddle Encrypted的程序将会转变为PaddlePaddle中的ProgramDesc,并交给Executor运行。以下是运行阶段的主要概念:
* **运算节点**:计算节点是与计算方相对应的实体。在实际部署中,它可以是裸机、云虚拟机、docker甚至进程。Paddle Encrypted在每次运行中只需要三个计算节点,这由底层ABY3协议决定。Paddle Encrypted程序将在所有三个计算节点上并行部署和运行。
* **基于MPC的算子**:Paddle Encrypted 为操作加密数据提供了特殊的算子,这些算子在PaddlePaddle框架中实现,基于像ABY3一样的MPC协议。像PaddlePaddle中一样,在运行时Paddle Encrypted的算子将被创建并按照顺序执行。
J
jingqinghe 已提交
153
#### 结果重构
G
guru4elephant 已提交
154

J
jingqinghe 已提交
155
安全训练和推理工作完成后,模型(或预测结果)将由计算方以加密形式输出。结果方可以收集加密的结果,使用Paddle Encrypted中的工具对其进行解密,并将明文结果传递给用户。
J
jingqinghe 已提交
156 157

请参考[MPC的例子](./python/paddle_fl/mpc/examples),以获取更多的信息。
Q
qjing666 已提交
158
## Kubernetes简单部署
Q
qjing666 已提交
159

J
jingqinghe 已提交
160
### 横向联邦方案
Q
qjing666 已提交
161 162
```sh
 
J
jingqinghe 已提交
163
kubectl apply -f ./python/paddle_fl/paddle_fl/examples/k8s_deployment/master.yaml
Q
qjing666 已提交
164 165

```
J
jingqinghe 已提交
166 167 168
请参考[K8S部署实例](./python/paddle_fl/paddle_fl/examples/k8s_deployment/README.md)

也可以参考[K8S集群申请及kubectl安装](./python/paddle_fl/paddle_fl/examples/k8s_deployment/deploy_instruction.md) 配置自己的K8S集群
J
jingqinghe 已提交
169

J
jingqinghe 已提交
170 171 172
### Paddle Encrypted

会在后续版本中发布。
G
guru4elephant 已提交
173 174
## 性能测试

J
jingqinghe 已提交
175
### 横向联邦方案
D
Dong Daxiang 已提交
176 177
Gru4Rec [9] 在基于会话的推荐中引入了递归神经网络模型。PaddlePaddle的GRU4RC实现代码在 https://github.com/PaddlePaddle/models/tree/develop/PaddleRec/gru4rec. 一个基于联邦学习训练Gru4Rec模型的示例请参考[Gru4Rec in Federated Learning](https://paddlefl.readthedocs.io/en/latest/examples/gru4rec_examples.html)

J
jingqinghe 已提交
178 179
### Paddle Encrypted

J
jingqinghe 已提交
180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212
#### 精度测试

##### 训练参数

- 数据集:波士顿房价预测。
- 训练轮数: 20
- Batch Size:10

#####实验结果

| Epoch/Step | paddle_fl.mpc | Paddle |
| ---------- | ------------- | ------ |
| Epoch=0, Step=0  | 738.39491 | 738.46204 |
| Epoch=1, Step=0  | 630.68834 | 629.9071 |
| Epoch=2, Step=0  | 539.54683 | 538.1757 |
| Epoch=3, Step=0  | 462.41159 | 460.64722 |
| Epoch=4, Step=0  | 397.11516 | 395.11017 |
| Epoch=5, Step=0  | 341.83102 | 339.69815 |
| Epoch=6, Step=0  | 295.01114 | 292.83597 |
| Epoch=7, Step=0  | 255.35141 | 253.19429 |
| Epoch=8, Step=0  | 221.74739 | 219.65132 |
| Epoch=9, Step=0  | 193.26459 | 191.25981 |
| Epoch=10, Step=0  | 169.11423 | 167.2204 |
| Epoch=11, Step=0  | 148.63138 | 146.85835 |
| Epoch=12, Step=0  | 131.25081 | 129.60391 |
| Epoch=13, Step=0  | 116.49708 | 114.97599 |
| Epoch=14, Step=0  | 103.96669 | 102.56854 |
| Epoch=15, Step=0  | 93.31706 | 92.03858 |
| Epoch=16, Step=0  | 84.26219 | 83.09653 |
| Epoch=17, Step=0  | 76.55664 | 75.49785 |
| Epoch=18, Step=0  | 69.99673 | 69.03561 |
| Epoch=19, Step=0  | 64.40562 | 63.53539 |

D
Dong Daxiang 已提交
213
## 正在进行的工作
G
guru4elephant 已提交
214

J
jingqinghe 已提交
215 216
- 纵向联合学习支持更多的模型。
- 发布纵向联邦学习K8S部署方案。
G
guru4elephant 已提交
217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235

## 参考文献

[1]. Jakub Konečný, H. Brendan McMahan, Daniel Ramage, Peter Richtárik. **Federated Optimization: Distributed Machine Learning for On-Device Intelligence.** 2016

[2]. H. Brendan McMahan, Eider Moore, Daniel Ramage, Blaise Agüera y Arcas. **Federated Learning of Deep Networks using Model Averaging.** 2017

[3]. Jakub Konečný, H. Brendan McMahan, Felix X. Yu, Peter Richtárik, Ananda Theertha Suresh, Dave Bacon. **Federated Learning: Strategies for Improving Communication Efficiency.** 2016

[4]. Qiang Yang, Yang Liu, Tianjian Chen, Yongxin Tong. **Federated Machine Learning: Concept and Applications.** 2019

[5]. Kai He, Liu Yang, Jue Hong, Jinghua Jiang, Jieming Wu, Xu Dong et al. **PrivC  - A framework for efficient Secure Two-Party Computation. In Proceedings of 15th EAI International Conference on Security and Privacy in Communication Networks.** SecureComm 2019

[6]. Martín Abadi, Andy Chu, Ian Goodfellow, H. Brendan McMahan, Ilya Mironov, Kunal Talwar, Li Zhang. **Deep Learning with Differential Privacy.** 2016

[7]. Virginia Smith, Chao-Kai Chiang, Maziar Sanjabi, Ameet Talwalkar. **Federated Multi-Task Learning** 2016

[8]. Yang Liu, Tianjian Chen, Qiang Yang. **Secure Federated Transfer Learning.** 2018

D
Dong Daxiang 已提交
236
[9]. Balázs Hidasi, Alexandros Karatzoglou, Linas Baltrunas, Domonkos Tikk. **Session-based Recommendations with Recurrent Neural Networks.** 2016