cmd_argument_en.md 5.5 KB
Newer Older
1
## Command-line arguments
Z
zhangjinchao01 已提交
2

3 4
We'll take `doc/howto/cluster/src/word2vec` as an example to introduce distributed training using PaddlePaddle v2 API.

5
### Starting parameter server
Z
zhangjinchao01 已提交
6

武毅 已提交
7
Type the below command to start a parameter server which will wait for trainers to connect:
Z
zhangjinchao01 已提交
8

武毅 已提交
9 10 11
```bash
$ paddle pserver --port=7164 --ports_num=1 --ports_num_for_sparse=1 --num_gradient_servers=1
```
Z
zhangjinchao01 已提交
12

武毅 已提交
13 14 15 16
If you wish to run parameter servers in background, and save a log file, you can type:
```bash
$ stdbuf -oL /usr/bin/nohup paddle pserver --port=7164 --ports_num=1 --ports_num_for_sparse=1 --num_gradient_servers=1 &> pserver.log
```
Z
zhangjinchao01 已提交
17

T
typhoonzero 已提交
18 19 20 21
Parameter Description

- port: **required, default 7164**, port which parameter server will listen on. If ports_num greater than 1, parameter server will listen on multiple ports for more network throughput.
- ports_num: **required, default 1**, total number of ports will listen on.
22
- ports_num_for_sparse: **required, default 0**, number of ports which serves sparse parameter update.
T
typhoonzero 已提交
23
- num_gradient_servers: **required, default 1**, total number of gradient servers.
Z
zhangjinchao01 已提交
24

25
### Starting trainer
武毅 已提交
26
Type the command below to start the trainer(name the file whatever you want, like "train.py")
Z
zhangjinchao01 已提交
27

武毅 已提交
28 29 30
```bash
$ python train.py
```
Z
zhangjinchao01 已提交
31

武毅 已提交
32
Trainers' network need to be connected with parameter servers' network to finish the job. Trainers need to know port and IPs to locate parameter servers. You can pass arguments to trainers through [environment variables](https://en.wikipedia.org/wiki/Environment_variable) or pass to `paddle.init()` function. Arguments passed to the `paddle.init()` function will overwrite environment variables.
Z
zhangjinchao01 已提交
33

武毅 已提交
34
Use environment viriables:
Z
zhangjinchao01 已提交
35

武毅 已提交
36 37 38 39 40 41 42 43 44 45 46
```bash
export PADDLE_INIT_USE_GPU=False
export PADDLE_INIT_TRAINER_COUNT=1
export PADDLE_INIT_PORT=7164
export PADDLE_INIT_PORTS_NUM=1
export PADDLE_INIT_PORTS_NUM_FOR_SPARSE=1
export PADDLE_INIT_NUM_GRADIENT_SERVERS=1
export PADDLE_INIT_TRAINER_ID=0
export PADDLE_INIT_PSERVERS=127.0.0.1
python train.py
```
Z
zhangjinchao01 已提交
47

武毅 已提交
48
Pass arguments:
Z
zhangjinchao01 已提交
49

武毅 已提交
50 51 52 53 54 55 56 57 58 59
```python
paddle.init(
        use_gpu=False,
        trainer_count=1,
        port=7164,
        ports_num=1,
        ports_num_for_sparse=1,
        num_gradient_servers=1,
        trainer_id=0,
        pservers="127.0.0.1")
Z
zhangjinchao01 已提交
60
```
武毅 已提交
61

T
typhoonzero 已提交
62 63 64
Parameter Description

- use_gpu: **optional, default False**, set to "True" to enable GPU training.
G
gongweibao 已提交
65
- trainer_count: **required, default 1**, number of threads in current trainer.
T
typhoonzero 已提交
66 67
- port: **required, default 7164**, port to connect to parameter server.
- ports_num: **required, default 1**, number of ports for communication.
68
- ports_num_for_sparse: **required, default 0**, number of ports for sparse type caculation.
G
gongweibao 已提交
69
- num_gradient_servers: **required, default 1**, number of trainers in current job.
T
typhoonzero 已提交
70 71
- trainer_id: **required, default 0**, ID for every trainer, start from 0.
- pservers: **required, default 127.0.0.1**, list of IPs of parameter servers, separated by ",".
武毅 已提交
72

73
### Prepare Training Dataset
武毅 已提交
74 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

Here's some example code [prepare.py](https://github.com/PaddlePaddle/Paddle/tree/develop/doc/howto/usage/cluster/src/word2vec/prepare.py), it will download public `imikolov` dataset and split it into multiple files according to job parallelism(trainers count). Modify `SPLIT_COUNT` at the begining of `prepare.py` to change the count of output files.

In the real world, we often use `MapReduce` job's output as training data, so there will be lots of files. You can use `mod` to assign training file to trainers:

```python
import os
train_list = []
flist = os.listdir("/train_data/")
for f in flist:
  suffix = int(f.split("-")[1])
  if suffix % TRAINER_COUNT == TRAINER_ID:
    train_list.append(f)
```

Example code `prepare.py` will split training data and testing data into 3 files with digital suffix like `-00000`, `-00001` and`-00002`:

```
train.txt
train.txt-00000
train.txt-00001
train.txt-00002
test.txt
test.txt-00000
test.txt-00001
test.txt-00002
Z
zhangjinchao01 已提交
100 101
```

武毅 已提交
102
When job started, every trainer needs to get it's own part of data. In some distributed systems a storage service will be provided, so the date under that path can be accessed by all the trainer nodes. Without the storage service, you must copy the training data to each trainer node.
Z
zhangjinchao01 已提交
103

武毅 已提交
104
Different training jobs may have different data format and `reader()` function, developers may need to write different data prepare scripts and `reader()` functions for their job.
Z
zhangjinchao01 已提交
105

106
### Prepare Training program
107

武毅 已提交
108
We'll create a *workspace* directory on each node, storing your training program, dependencies, mounted or downloaded dataset directory.
Z
zhangjinchao01 已提交
109 110


武毅 已提交
111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
Your workspace may looks like:
```
.
|-- my_lib.py
|-- word_dict.pickle
|-- train.py
|-- train_data_dir/
|   |-- train.txt-00000
|   |-- train.txt-00001
|   |-- train.txt-00002
`-- test_data_dir/
    |-- test.txt-00000
    |-- test.txt-00001
    `-- test.txt-00002
```
Z
zhangjinchao01 已提交
126

武毅 已提交
127 128
- `my_lib.py`: user defined libraries, like PIL libs. This is optional.
- `word_dict.pickle`: dict file for training word embeding.
T
typhoonzero 已提交
129
- `train.py`: training program. Sample code: [api_train_v2_cluster.py](https://github.com/PaddlePaddle/Paddle/tree/develop/doc/howto/usage/cluster/src/word2vec/api_train_v2_cluster.py). ***NOTE:*** You may need to modify the head part of `train.py` when using different cluster platform to retrive configuration environment variables:
Z
zhangjinchao01 已提交
130

武毅 已提交
131 132 133 134 135 136 137
  ```python
  cluster_train_file = "./train_data_dir/train/train.txt"
  cluster_test_file = "./test_data_dir/test/test.txt"
  node_id = os.getenv("OMPI_COMM_WORLD_RANK")
  if not node_id:
      raise EnvironmentError("must provied OMPI_COMM_WORLD_RANK")
  ```
Z
zhangjinchao01 已提交
138

武毅 已提交
139 140
- `train_data_dir`: containing training data. Mount from storage service or copy trainning data to here.
- `test_data_dir`: containing testing data.