use_case_cn.md 5.8 KB
Newer Older
L
lifu 已提交
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 27 28 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 71 72 73 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 100 101 102 103 104 105 106 107 108 109 110 111 112 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 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182
# 使用案例

## 本地训练

本地训练的实验,诸如图像分类,自然语言处理等,通常都会使用下面这些命令行参数。

```
paddle train \
  --use_gpu=1/0 \                        #1:GPU,0:CPU(默认为1)
  --config=network_config \
  --save_dir=output \
  --trainer_count=COUNT \                #(默认为1)
  --test_period=M \                      #(默认为0) 
  --num_passes=N \                       #(默认为100)
  --log_period=K \                       #(默认为100)
  --dot_period=1000 \                    #(默认为1)
  #[--show_parameter_stats_period=100] \ #(默认为0)
  #[--saving_period_by_batches=200] \    #(默认为0)
```
根据你的任务,可以选择是否使用参数`show_parameter_stats_period``saving_period_by_batches`

### 1) 将命令参数传给网络配置

`config_args`是一个很有用的参数,用于将参数传递给网络配置。

```
--config_args=generating=1,beam_size=5,layer_num=10 \
```
`get_config_arg`可用于在网络配置中解析这些参数,如下所示:

```
generating = get_config_arg('generating', bool, False)
beam_size = get_config_arg('beam_size', int, 3)
layer_num = get_config_arg('layer_num', int, 8)
```

`get_config_arg`:

```
get_config_arg(name, type, default_value)
```
- name: `--config_args`中指定的名字
- type: 值类型,包括bool, int, str, float等
- default_value: 默认值

### 2) 使用模型初始化网络

增加如下参数:

```
--init_model_path=model_path
--load_missing_parameter_strategy=rand
```

## 本地测试

方法一:

```
paddle train --job=test \
             --use_gpu=1/0 \ 
             --config=network_config \
             --trainer_count=COUNT \ 
             --init_model_path=model_path \
```
- 使用init\_model\_path指定测试的模型
- 只能测试单个模型

方法二:

```
paddle train --job=test \
             --use_gpu=1/0 \ 
             --config=network_config \
             --trainer_count=COUNT \ 
             --model_list=model.list \
```
- 使用model_list指定测试的模型列表
- 可以测试多个模型,文件model.list如下所示:

```
./alexnet_pass1
./alexnet_pass2
```

方法三:

```
paddle train --job=test \
             --use_gpu=1/0 \
             --config=network_config \
             --trainer_count=COUNT \
             --save_dir=model \
             --test_pass=M \
             --num_passes=N \
```
这种方式必须使用Paddle存储的模型路径格式,如:`model/pass-%5d`。测试的模型包括从第M轮到第N-1轮存储的所有模型。例如,M=12,N=14这种写法将会测试模型`model/pass-00012``model/pass-00013`

## 稀疏训练

当输入是维度很高的稀疏数据时,通常使用稀疏训练来加速计算过程。例如,输入数据的字典维数是1百万,但是每个样本仅包含几个词。在Paddle中,稀疏矩阵的乘积应用于前向传播过程,而稀疏更新在反向传播之后的权重更新时进行。

### 1) 本地训练

用户需要在网络配置中指定**sparse\_update=True**。请参照网络配置的文档了解更详细的信息。

### 2) 集群训练

在集群上训练一个稀疏模型需要加上下面的参数。同时用户需要在网络配置中指定**sparse\_remote\_update=True**。请参照网络配置的文档了解更详细的信息。

```
--ports_num_for_sparse=1    #(默认为0)
```

## parallel_nn
用户可以设置`parallel_nn`来混合使用GPU和CPU计算网络层的参数。也就是说,你可以将网络配置成某些层使用GPU计算,而其他层使用CPU计算。另一种方式是将网络层划分到不同的GPU上去计算,这样可以减小GPU内存,或者采用并行计算来加速某些层的更新。

如果你想使用这些特性,你需要在网络配置中指定设备的ID号(表示为deviceId),并且加上下面的命令行参数:

```
--parallel_nn=true
```
### 案例一:GPU和CPU混合使用
请看下面的例子:

```
#command line:
paddle train --use_gpu=true --parallel_nn=true trainer_count=COUNT

default_device(0)

fc1=fc_layer(...)
fc2=fc_layer(...)
fc3=fc_layer(...,layer_attr=ExtraAttr(device=-1))

```
- default_device(0): 设置默认设备号为0。这意味着除了指定device=-1的层之外,其他所有层都会使用GPU计算,每层使用的GPU号依赖于参数trainer\_count和gpu\_id(默认为0)。在此,fc1和fc2层在GPU上计算。

- device=-1: fc3层使用CPU计算。

- trainer_count:
  - trainer_count=1: 如果未设置gpu\_id,那么fc1和fc2层将会使用第1个GPU来计算。否则使用gpu\_id指定的GPU。

  - trainer_count>1: 在trainer\_count个GPU上使用数据并行来计算某一层。例如,trainer\_count=2意味着0号和1号GPU将会使用数据并行来计算fc1和fc2层。

### 案例二:在不同设备上指定层

```
#command line:
paddle train --use_gpu=true --parallel_nn=true --trainer_count=COUNT

#network:
fc2=fc_layer(input=l1, layer_attr=ExtraAttr(device=0), ...)
fc3=fc_layer(input=l1, layer_attr=ExtraAttr(device=1), ...)
fc4=fc_layer(input=fc2, layer_attr=ExtraAttr(device=-1), ...)
```
在本例中,我们假设一台机器上有4个GPU。

- trainer_count=1:
  - 使用0号GPU计算fc2层。
  - 使用1号GPU计算fc3层。
  - 使用CPU计算fc4层。

- trainer_count=2:
  - 使用0号和1号GPU计算fc2层。
  - 使用2号和3号GPU计算fc3层。
  - 使用CPU两线程计算fc4层。

- trainer_count=4:
  - 运行失败(注意到我们已经假设机器上有4个GPU),因为参数`allow_only_one_model_on_one_gpu`默认设置为真。

**当`device!=-1`时设备ID号的分配:**

```
(deviceId + gpu_id + threadId * numLogicalDevices_) % numDevices_

deviceId:             在层中指定
gpu_id:               默认为0
threadId:             线程ID号,范围: 0,1,..., trainer_count-1
numDevices_:          机器的设备(GPU)数目
numLogicalDevices_:   min(max(deviceId + 1), numDevices_)
```