BuildStrategy_cn.rst 6.7 KB
Newer Older
H
Hao Wang 已提交
1 2 3 4 5
.. _cn_api_fluid_BuildStrategy:

BuildStrategy
-------------------------------

6 7
**注意:该API仅支持【静态图】模式**

F
flame 已提交
8
.. py:class:: paddle.fluid.BuildStrategy
H
Hao Wang 已提交
9

10
``BuildStrategy`` 使用户更方便地控制 :ref:`cn_api_fluid_ParallelExecutor` 中计算图的建造方法,可通过设置 ``ParallelExecutor`` 中的 ``BuildStrategy`` 成员来实现此功能。
H
Hao Wang 已提交
11 12 13 14 15

**代码示例**

.. code-block:: python
    
F
flame 已提交
16 17
    import os
    import numpy as np
H
Hao Wang 已提交
18
    import paddle.fluid as fluid
F
flame 已提交
19 20 21 22 23 24 25 26 27

    os.environ["CPU_NUM"] = '2'
    places = fluid.cpu_places()

    data = fluid.layers.data(name="x", shape=[1], dtype="float32")
    hidden = fluid.layers.fc(input=data, size=10)
    loss = fluid.layers.mean(hidden)
    fluid.optimizer.SGD(learning_rate=0.01).minimize(loss)

H
Hao Wang 已提交
28
    build_strategy = fluid.BuildStrategy()
F
flame 已提交
29 30
    build_strategy.enable_inplace = True
    build_strategy.memory_optimize = True
H
Hao Wang 已提交
31
    build_strategy.reduce_strategy = fluid.BuildStrategy.ReduceStrategy.Reduce
F
flame 已提交
32 33 34 35
    program = fluid.compiler.CompiledProgram(fluid.default_main_program())
    program = program.with_data_parallel(loss_name=loss.name,
                                         build_strategy=build_strategy,
                                         places=places)
H
Hao Wang 已提交
36 37 38 39


.. py:attribute:: debug_graphviz_path

F
flame 已提交
40
str类型。表示以graphviz格式向文件中写入计算图的路径,有利于调试。默认值为空字符串。
H
Hao Wang 已提交
41 42 43 44 45 46 47

**代码示例**

.. code-block:: python

    import paddle.fluid as fluid
    build_strategy = fluid.BuildStrategy()
Z
zq19 已提交
48
    build_strategy.debug_graphviz_path = "./graph"
H
Hao Wang 已提交
49 50 51 52


.. py:attribute:: enable_sequential_execution

F
flame 已提交
53
bool类型。如果设置为True,则算子的执行顺序将与算子定义的执行顺序相同。默认为False。
H
Hao Wang 已提交
54 55 56 57 58 59 60 61 62 63 64 65

**代码示例**

.. code-block:: python

    import paddle.fluid as fluid
    build_strategy = fluid.BuildStrategy()
    build_strategy.enable_sequential_execution = True


.. py:attribute:: fuse_broadcast_ops
     
F
flame 已提交
66 67 68 69 70
bool类型。表明是否融合(fuse) broadcast ops。该选项指在Reduce模式下有效,使程序运行更快。默认为False。

**代码示例**

.. code-block:: python
71

F
flame 已提交
72 73 74 75
    import paddle.fluid as fluid
    build_strategy = fluid.BuildStrategy()
    build_strategy.fuse_broadcast_ops = True

H
Hao Wang 已提交
76 77 78
     
.. py:attribute:: fuse_elewise_add_act_ops

F
flame 已提交
79
bool类型。表明是否融合(fuse) elementwise_add_op和activation_op。这会使整体执行过程更快。默认为False。
H
Hao Wang 已提交
80 81 82 83 84 85 86 87 88 89 90 91

**代码示例**

.. code-block:: python

    import paddle.fluid as fluid
    build_strategy = fluid.BuildStrategy()
    build_strategy.fuse_elewise_add_act_ops = True


.. py:attribute:: fuse_relu_depthwise_conv

F
flame 已提交
92
bool类型。表明是否融合(fuse) relu和depthwise_conv2d,节省GPU内存并可能加速执行过程。此选项仅适用于GPU设备。默认为False。
H
Hao Wang 已提交
93 94 95 96 97 98 99 100 101 102 103

**代码示例**

.. code-block:: python

    import paddle.fluid as fluid
    build_strategy = fluid.BuildStrategy()
    build_strategy.fuse_relu_depthwise_conv = True

.. py:attribute:: gradient_scale_strategy

F
flame 已提交
104
``fluid.BuildStrategy.GradientScaleStrategy`` 类型。在 ``ParallelExecutor`` 中,存在三种定义loss对应梯度( *loss@grad* )的方式,分别为 ``CoeffNumDevice``, ``One`` 与 ``Customized``。默认情况下, ``ParallelExecutor`` 根据设备数目来设置 *loss@grad* 。如果用户需要自定义 *loss@grad* ,可以选择 ``Customized`` 方法。默认为 ``CoeffNumDevice`` 。
H
Hao Wang 已提交
105 106 107 108 109

**代码示例**

.. code-block:: python

Z
zq19 已提交
110
    import os
F
flame 已提交
111
    import numpy as np
112
    import paddle.fluid as fluid
F
flame 已提交
113
    import paddle.fluid.compiler as compiler
Z
zq19 已提交
114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136

    use_cuda = True
    place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace()
    exe = fluid.Executor(place)

    # NOTE: 如果你使用CPU计算,需要指定CPU_NUM, 否则,fluid
    # 将使用所有的核的数目作为CPU_NUM,
    # 这种情况下,输入的batch size应该大于CPU_NUM, 否则, 
    # 进程将会因为异常而失败。
    if not use_cuda:
        os.environ['CPU_NUM'] = str(2)
        places = fluid.cpu_places()
    else:
        places = places = fluid.cuda_places()

    data = fluid.layers.data(name='X', shape=[1], dtype='float32')
    hidden = fluid.layers.fc(input=data, size=10)
    loss = fluid.layers.mean(hidden)
    fluid.optimizer.SGD(learning_rate=0.01).minimize(loss)

    fluid.default_startup_program().random_seed=1
    exe.run(fluid.default_startup_program())

H
Hao Wang 已提交
137
    build_strategy = fluid.BuildStrategy()
Z
zq19 已提交
138 139 140 141 142 143 144 145
    build_strategy.gradient_scale_strategy = \
         fluid.BuildStrategy.GradientScaleStrategy.Customized
    compiled_prog = compiler.CompiledProgram(
         fluid.default_main_program()).with_data_parallel(
                  loss_name=loss.name, build_strategy=build_strategy,
                  places = places)

    dev_count =  len(places)
F
flame 已提交
146 147
    x = np.random.random(size=(10, 1)).astype('float32')
    loss_grad = np.ones((dev_count)).astype("float32") * 0.01
Z
zq19 已提交
148 149 150 151
    loss_grad_name = loss.name+"@GRAD"
    loss_data = exe.run(compiled_prog,
                     feed={"X": x, loss_grad_name : loss_grad},
                     fetch_list=[loss.name, loss_grad_name])
H
Hao Wang 已提交
152 153 154

.. py:attribute:: memory_optimize

F
flame 已提交
155
bool类型或None。设为True时可用于减少总内存消耗,False表示不使用,None表示框架会自动选择使用或者不使用优化策略。当前,None意味着当GC不能使用时,优化策略将被使用。默认为None。
H
Hao Wang 已提交
156 157 158

.. py:attribute:: reduce_strategy

F
flame 已提交
159
``fluid.BuildStrategy.ReduceStrategy`` 类型。在 ``ParallelExecutor`` 中,存在两种参数梯度聚合策略,即 ``AllReduce`` 和 ``Reduce`` 。如果用户需要在所有执行设备上独立地进行参数更新,可以使用 ``AllReduce`` 。如果使用 ``Reduce`` 策略,所有参数的优化将均匀地分配给不同的执行设备,随之将优化后的参数广播给其他执行设备。
Z
zq19 已提交
160
默认值为 ``AllReduce`` 。
H
Hao Wang 已提交
161 162 163 164 165 166 167 168 169 170 171

**代码示例**

.. code-block:: python

    import paddle.fluid as fluid
    build_strategy = fluid.BuildStrategy()
    build_strategy.reduce_strategy = fluid.BuildStrategy.ReduceStrategy.Reduce

.. py:attribute:: remove_unnecessary_lock

F
flame 已提交
172
bool类型。设置True会去除GPU操作中的一些锁操作, ``ParallelExecutor`` 将运行得更快,默认为True。
H
Hao Wang 已提交
173 174 175 176 177 178 179 180 181 182 183 184

**代码示例**

.. code-block:: python

    import paddle.fluid as fluid
    build_strategy = fluid.BuildStrategy()
    build_strategy.remove_unnecessary_lock = True


.. py:attribute:: sync_batch_norm

F
flame 已提交
185
bool类型。表示是否使用同步的批正则化,即在训练阶段通过多个设备同步均值和方差。当前的实现不支持FP16训练和CPU。并且目前**仅支持**仅在一台机器上进行同步式批正则。默认为 False。
H
Hao Wang 已提交
186 187 188 189 190 191 192 193 194 195

**代码示例**

.. code-block:: python

    import paddle.fluid as fluid
    build_strategy = fluid.BuildStrategy()
    build_strategy.sync_batch_norm = True