train.md 5.7 KB
Newer Older
C
chengmo 已提交
1 2
# PaddleRec 启动训练

C
Chengmo 已提交
3 4


C
chengmo 已提交
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
## 启动方法

### 1. 启动内置模型的默认配置训练

在安装好`paddlepaddle``paddlerec`后,可以直接使用一行命令快速启动内置模型的默认配置训练,命令如下;

```shell
python -m paddlerec.run -m paddlerec.models.xxx.yyy
```

注意事项:
1. 请确保调用的是安装了paddlerec的`python`环境
2. `xxx`为paddlerec.models下有多个大类,如:`recall`/`rank`/`rerank`
3. `yyy`为每个类别下又有多个模型,如`recall`下有:`gnn`/`grup4rec`/`ncf`

例如启动`recall`下的`word2vec`模型的默认配置;

```shell
python -m paddlerec.run -m paddlerec.models.recall.word2vec
```

### 2. 启动内置模型的个性化配置训练

如果我们修改了默认模型的config.yaml文件,怎么运行修改后的模型呢?

- **没有改动模型组网**

C
Chengmo 已提交
32
  假如你将paddlerec代码库克隆在了`/home/PaddleRec`,并修改了`/home/PaddleRec/models/rank/dnn/config.yaml`,则如下启动训练
C
chengmo 已提交
33

C
Chengmo 已提交
34 35 36
  ```shell
  python -m paddlerec.run -m /home/PaddleRec/models/rank/dnn/config.yaml
  ```
C
chengmo 已提交
37

C
Chengmo 已提交
38
  paddlerec 运行的是在paddlerec库安装目录下的组网文件(model.py),但个性化配置`config.yaml`是用的是指定路径下的yaml文件。
C
chengmo 已提交
39 40 41

- **改动了模型组网**

C
Chengmo 已提交
42
  假如你将paddlerec代码库克隆在了`/home/PaddleRec`,并修改了`/home/PaddleRec/models/rank/dnn/model.py`, 以及`/home/PaddleRec/models/rank/dnn/config.yaml`,则首先需要更改`yaml`中的`workspace`的设置:
C
chengmo 已提交
43

C
Chengmo 已提交
44 45 46
  ```yaml
  workspace: /home/PaddleRec/models/rank/dnn/
  ```
C
chengmo 已提交
47

C
Chengmo 已提交
48
  再执行:
C
chengmo 已提交
49

C
Chengmo 已提交
50 51 52 53 54
  ```shell
  python -m paddlerec.run -m /home/PaddleRec/models/rank/dnn/config.yaml
  ```

  paddlerec 运行的是绝对路径下的组网文件(model.py)以及个性化配置文件(config.yaml)
C
chengmo 已提交
55

C
Chengmo 已提交
56 57 58 59



## yaml训练配置
C
chengmo 已提交
60 61 62 63 64 65 66 67

### yaml中训练相关的概念

`config.yaml`中训练流程相关有两个重要的逻辑概念,`runner``phase`

- **`runner`** : runner是训练的引擎,亦可称之为运行器,在runner中定义执行设备(cpu、gpu),执行的模式(训练、预测、单机、多机等),以及运行的超参,例如训练轮数,模型保存地址等。
- **`phase`** : phase是训练中的阶段的概念,是引擎具体执行的内容,该内容是指:具体运行哪个模型文件,使用哪个reader。

C
chengmo 已提交
68
PaddleRec每次运行时,会执行一个或多个运行器,通过`mode`指定`runner`的名字。每个运行器可以执行一个或多个`phase`,所以PaddleRec支持一键启动多阶段的训练。
C
chengmo 已提交
69

C
Chengmo 已提交
70
### 单机CPU训练
C
chengmo 已提交
71

C
Chengmo 已提交
72
下面我们开始定义一个单机CPU训练的`runner`:
C
chengmo 已提交
73 74

```yaml
C
Chengmo 已提交
75
mode: single_cpu_train # 执行名为 single_cpu_train 的运行器
C
chengmo 已提交
76
# mode 也支持多个runner的执行,此处可以改为 mode: [single_cpu_train, single_cpu_infer]
C
chengmo 已提交
77 78

runner:
C
Chengmo 已提交
79 80
- name: single_cpu_train # 定义 runner 名为 single_cpu_train
  class: train # 执行单机训练,亦可为 single_train
C
chengmo 已提交
81 82 83 84 85 86 87 88 89 90 91
  device: cpu # 执行在 cpu 上
  epochs: 10 # 训练轮数

  save_checkpoint_interval: 2 # 每隔2轮保存一次checkpoint
  save_inference_interval: 4 # 每个4轮保存依次inference model
  save_checkpoint_path: "increment" # checkpoint 的保存地址
  save_inference_path: "inference" # inference model 的保存地址
  save_inference_feed_varnames: [] # inference model 的feed参数的名字
  save_inference_fetch_varnames: [] # inference model 的fetch参数的名字
  init_model_path: "" # 如果是加载模型热启,则可以指定初始化模型的地址
  print_interval: 10 # 训练信息的打印间隔,以batch为单位
C
chengmo 已提交
92 93
  phases: phase_train # 若没有指定phases,则会默认运行所有phase
  # phase 也支持自定多个phase的执行,此处可以改为 phases: [phase_train, phase_infer]
C
chengmo 已提交
94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
```

再定义具体的执行内容:

```yaml
phase:
- name: phase_train # 该阶段名为 phase1 
  model: "{workspace}/model.py" # 模型文件为workspace下的model.py
  dataset_name: dataset_train # reader的名字

dataset:
- name: dataset_train
  type: DataLoader # 使用DataLoader的数据读取方式
  batch_size: 2
  data_path: "{workspace}/train_data" # 数据地址
  sparse_slots: "click 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26" # sparse 输入的位置定义
  dense_slots: "dense_var:13"  # dense参数的维度定义

```
C
Chengmo 已提交
113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157

### 单机单卡GPU训练

具体执行内容与reader与前述相同,下面介绍需要改动的地方

```yaml
mode: single_gpu_train # 执行名为 single_gpu_train 的运行器

runner:
- name: single_gpu_train # 定义 runner 名为 single_gpu_train
  class: train # 执行单机训练,亦可为 single_train
  device: gpu # 执行在 gpu 上
  selected_gpus: "0" # 默认选择在id=0的卡上执行训练
  epochs: 10 # 训练轮数
```

### 单机多卡GPU训练

具体执行内容与reader与前述相同,下面介绍需要改动的地方

```yaml
mode: single_multi_gpu_train # 执行名为 single_multi_gpu_train 的运行器

runner:
- name: single_multi_gpu_train # 定义 runner 名为 single_multi_gpu_train
  class: train # 执行单机训练,亦可为 single_train
  device: gpu # 执行在 gpu 上
  selected_gpus: "0,1,2,3" # 选择多卡执行训练
  epochs: 10 # 训练轮数
```

### 本地模拟参数服务器训练
具体执行内容与reader与前述相同,下面介绍需要改动的地方

```yaml
mode: local_cluster_cpu_train # 执行名为 local_cluster_cpu_train 的运行器

runner:
- name: local_cluster_cpu_train # 定义 runner 名为 runner_train
  class: local_cluster # 执行本地模拟分布式——参数服务器训练
  device: cpu # 执行在 cpu 上(paddle后续版本会支持PS-GPU)
  worker_num: 1 # (可选)worker进程数量,默认1
  server_num: 1 # (可选)server进程数量,默认1
  epochs: 10 # 训练轮数
```