single_node.rst 4.0 KB
Newer Older
Y
yuyang18 已提交
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
########
单机训练
########

准备工作
########

要进行PaddlePaddle Fluid单机训练,需要先 :ref:`user_guide_prepare_data` 和
:ref:`user_guide_config_neural_network` 。当
:ref:`user_guide_config_neural_network` 完毕后,可以得到两个
:ref:`api_fluid_Program`, :code:`startup_program` 和 :code:`main_program`。
默认情况下,可以使用 :ref:`api_fluid_default_startup_program` 与 :ref:`api_fluid_default_main_program` 获得全局的 :ref:`api_fluid_Program`。

例如:

.. code-block:: python

   import paddle.fluid as fluid

   image = fluid.layers.data(name="image", shape=[784])
   label = fluid.layers.data(name="label", shape=[1])
   hidden = fluid.layers.fc(input=image, size=100, act='relu')
   prediction = fluid.layers.fc(input=hidden, size=10, act='softmax')
   loss = fluid.layers.mean(
       fluid.layers.cross_entropy(
           input=prediction,
           label=label
       )
   )

   sgd = fluid.optimizer.SGD(learning_rate=0.001)
   sgd.minimize(loss)

   # Here the fluid.default_startup_program() and fluid.default_main_program()
   # has been constructed.

在上述模型配置执行完毕后, :code:`fluid.default_startup_program()` 与
:code:`fluid.default_main_program()` 配置完毕了。

初始化参数
##########

参数随机初始化
==============

Y
yuyang18 已提交
46 47 48 49 50 51 52 53 54 55 56 57 58
用户配置完模型后,参数初始化操作会被写入到
:code:`fluid.default_startup_program()` 中。使用 :ref:`api_fluid_Executor` 运行
这一程序,即可在全局 :ref:`api_fluid_Scope` 中随机初始化参数。例如:

.. code-blocks:: python

   exe = fluid.Executor(fluid.CUDAPlace(0))
   exe.run(program=fluid.default_startup_program())

值得注意的是: 如果使用多GPU训练,参数需要先在GPU0上初始化,再经由
:ref:`api_fluid_ParallelExecutor` 分发到多张显卡上。


Y
yuyang18 已提交
59 60 61 62 63 64 65 66 67 68
载入预定义参数
==============

在神经网络训练过程中,经常会需要载入预定义模型,进而继续进行训练。
如何载入预定义参数,请参考 :ref:`user_guide_save_load_vars`。


单卡训练
########

Y
yuyang18 已提交
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
执行单卡训练可以使用 :ref:`api_fluid_Executor` 中的 :code:`run()` 方法,运行训练
:ref:`api_fluid_Program` 即可。在运行的时候,用户可以通过 :code:`run(feed=...)`
参数传入数据;用户可以通过 :code:`run(fetch=...)` 获取持久的数据。例如:

.. code-blocks:: python

   ...
   loss = fluid.layers.mean(...)

   exe = fluid.Executor(...)
   # the result is an numpy array
   result = exe.run(feed={"image": ..., "label": ...}, fetch_list=[loss])

这里有几点注意事项:

1. feed的数据格式,请参考文章 :ref:`user_guide_feed_data_to_executor`。
2. :code:`Executor.run` 的返回值是 :code:`fetch_list=[...]` 的variable值。被fetch
   的Variable必须是persistable的。 :code:`fetch_list` 可以传入Variable的列表,
   也可以传入Varialbe的名字列表。当只Fetch一个对象时,返回值是一个元素。否则,
   返回一个列表。
3. 如果需要取回的数据包含序列信息,可以设置
   :code:`exe.run(return_numpy=False, ...)` 直接返回 :ref:`api_guide_lod_tensor`
   。用户可以直接访问 :ref:`api_guide_lod_tensor` 中的信息。
Y
yuyang18 已提交
92 93 94 95

多卡训练
########

Y
yuyang18 已提交
96 97
执行多卡训练可以使用 :ref:`api_fluid_ParallelExecutor` 运行训练
:ref:`api_fluid_Program`。例如:
Y
yuyang18 已提交
98

Y
yuyang18 已提交
99
.. code-blocks:: python
Y
yuyang18 已提交
100

Y
yuyang18 已提交
101 102 103 104 105 106
   train_exe = fluid.ParallelExecutor(use_cuda=True, loss_name=loss.name,
                                main_program=fluid.default_main_program())
   train_exe.run(fetch_list=[loss.name], feed={...})

这里有几点注意事项:

Y
yuyang18 已提交
107 108
1. :code:`ParallelExecutor` 的构造函数需要指明要执行的 :ref:`api_fluid_Program` ,
   并在执行过程中不能修改。
Y
yuyang18 已提交
109
2. :code:`ParallelExecutor` 需要明确指定是否使用 CUDA 显卡进行训练。在显卡训练
Y
yuyang18 已提交
110 111
   模式下会占用全部显卡。用户可以配置 `CUDA_VISIBLE_DEVICES <http://www.acceleware.com/blog/cudavisibledevices-masking-gpus>`_ 来修改占用
   的显卡。
Y
yuyang18 已提交
112 113 114 115

进阶使用
########

Y
yuyang18 已提交
116 117 118 119 120
.. toctree::
   :maxdepth: 2

   test_while_training
   save_load_variables