README.md 3.9 KB
Newer Older
M
mapingshuo 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14

## 联邦算法模拟器 (fl-mobile simulator)

FL-mobile是一个集移动端算法模拟调研、训练和部署为一体的框架。算法模拟器 (simulator) 是FL-mobile的一部分。

该模拟器的设计目的,是为了模拟实际线上多个移动端设备配合训练的场景。框架的设计思想在服务器上模拟数个端上设备,快速验证算法效果。模拟器的优势为:

- 支持单机和分布式训练
- 支持常见开源数据集的训练
- 支持模型中的私有参数和共享参数,私有参数不参与全局更新

## 准备工作

- 安装mpirun
B
barrierye 已提交
15

M
mapingshuo 已提交
16 17 18 19
- python安装grpc
    ```shell
    pip install grpcio==1.28.1
    ```
B
barrierye 已提交
20
    
M
mapingshuo 已提交
21 22
- 安装Paddle

B
barrierye 已提交
23 24 25 26 27 28
    ```shell
    pip install paddlepaddle==1.8.0
    ```

    

M
mapingshuo 已提交
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
## 快速开始

我们以Leaf数据集中的[reddit数据](https://github.com/TalwalkarLab/leaf/tree/master/data/reddit)为例,用LSTM建模,在simulator
中给出一个单机训练的例子,通过这个例子,您能了解simulator的基础用法。

### 准备数据

```
wget https://paddle-serving.bj.bcebos.com/temporary_files_for_docker/reddit_subsampled.zip --no-check-certificate
unzip reddit_subsampled.zip
```
在模拟器中,我们假设用户的数据都是天级别的,因此我们将下载的数据重新归置如下

```
tree lm_data
lm_data
|-- 20200101
|   `-- train_data.json
|-- 20200102
|   `-- test_data.json
`-- vocab.json
```
可以看到,我们将训练数据作为20200101的数据,测试数据作为20200102的数据。

### 生成server代码

```
cd protos
python run_codegen.py
cd ..
```

### 开始训练

```shell
export PYTHONPATH=$PWD:$PYTHONPATH
mpirun -np 2 python application.py lm_data
```

### 训练结果

```shell
B
barrierye 已提交
71
framework.py : INFO  infer results: 0.116334
M
mapingshuo 已提交
72 73
```

B
barrierye 已提交
74
即:在测试集上的,测试Top1为 11.6% 
M
mapingshuo 已提交
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99

## 添加自己的数据集和Trainer

如果您想要训练自己的联邦模型,您需要做四件事:

1. 创建reader,参考`reader/leaf_reddit_reader.py`
2. 创建trainer,参考`trainer/language_model_trainer.py`
3. 创建model,即组网,参考`model/language_model.py`
4. 创建application,参考`application.py`

## 模拟器(simulator) 介绍

框架主要由scheduler和simulator构成;其中scheduler负责统筹规划数据和全局参数;simulator负责做实际的训练和私有参数更新。

- scheduler
在一次训练流程中,只会有一个global scheduler, 而每个机器上都会有一个scheduler client,负责和global scheduler做参数、数据的通信。

- simulator
每个机器上都会有1个Simulator,每个Simulator又会有多个shard,shard是用于本机并行训练的。

作为一个分布式框架,FL-mobile simulator 也是包含模型初始化、模型分发、模型训练、模型更新四部分,下面通过一次实际的训练流程,来了解一下各个模型的工作吧:

- Step1 模型初始化

    1. 全局参数初始化:由编号为0的simulator来做模型初始化工作,初始化之后,它会通过UpdateGlobalParams()接口将参数传递给Scheduler;
B
barrierye 已提交
100
    
M
mapingshuo 已提交
101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117
    2. 个性化参数初始化

- Step2 模型分发

    1. 全局参数分发:每个simulator开始训练之前,都需要先找SchedulerServer拿全局参数,即通过scheduler_client.get_global_params()获得全局参数;

    2. 个性化参数分发:个性化参数由每个local trainer训练前,向data server获取,获取接口为:get_param_by_uid;

- Step3 模型训练

    模型训练是整个流程的核心,多个trainer并行训练,训练中参数不做同步;每个trainer的训练步数由这个用户的数据量决定。

- Step4 模型更新

    1. 全局参数更新:在所有trainer训练结束后,会做一次同步,并且通过FedAvg算法计算参数梯度;之后上传梯度至scheduler,再拉取新的全局参数,回到第二步;
    
    2. 个性化参数更新:个性化参数更新简单一些,每个trainer调用set_param_by_uid就可完成自己的个性化参数更新;