single_node.rst 5.1 KB
Newer Older
Y
yuyang18 已提交
1 2 3 4 5 6 7 8
########
单机训练
########

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

要进行PaddlePaddle Fluid单机训练,需要先 :ref:`user_guide_prepare_data` 和
Y
yuyang18 已提交
9 10
:ref:`user_guide_configure_simple_model` 。当\
:ref:`user_guide_configure_simple_model` 完毕后,可以得到两个\
T
Tink_Y 已提交
11 12
:code:`fluid.Program`, :code:`startup_program` 和 :code:`main_program`。
默认情况下,可以使用 :code:`fluid.default_startup_program()` 与\ :code:`fluid.default_main_program()` 获得全局的 :code:`fluid.Program`。
Y
yuyang18 已提交
13 14 15 16 17 18 19

例如:

.. code-block:: python

   import paddle.fluid as fluid

Z
Zeng Jinle 已提交
20 21
   image = fluid.data(name="image", shape=[None, 784], dtype='float32')
   label = fluid.data(name="label", shape=[None, 1], dtype='int64')
Y
yuyang18 已提交
22 23
   hidden = fluid.layers.fc(input=image, size=100, act='relu')
   prediction = fluid.layers.fc(input=hidden, size=10, act='softmax')
C
chengduo 已提交
24 25
   loss = fluid.layers.cross_entropy(input=prediction, label=label)
   loss = fluid.layers.mean(loss)
Y
yuyang18 已提交
26 27 28 29 30 31 32

   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.

Y
yuyang18 已提交
33
在上述模型配置执行完毕后, :code:`fluid.default_startup_program()` 与\
Y
yuyang18 已提交
34 35 36 37 38 39 40 41
:code:`fluid.default_main_program()` 配置完毕了。

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

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

Y
yuyang18 已提交
42
用户配置完模型后,参数初始化操作会被写入到\
T
Tink_Y 已提交
43
:code:`fluid.default_startup_program()` 中。使用 :code:`fluid.Executor()` 运行
C
chengduo 已提交
44
这一程序,初始化之后的参数默认被放在全局scope中,即 :code:`fluid.global_scope()` 。例如:
Y
yuyang18 已提交
45

Y
yuyang18 已提交
46
.. code-block:: python
Y
yuyang18 已提交
47 48 49 50

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

Y
yuyang18 已提交
51 52 53
载入预定义参数
==============

Y
yuyang18 已提交
54
在神经网络训练过程中,经常会需要载入预定义模型,进而继续进行训练。\
Y
yuyang18 已提交
55 56 57 58 59 60
如何载入预定义参数,请参考 :ref:`user_guide_save_load_vars`。


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

T
Tink_Y 已提交
61 62
执行单卡训练可以使用 :code:`fluid.Executor()` 中的 :code:`run()` 方法,运行训练\
:code:`fluid.Program` 即可。在运行的时候,用户可以通过 :code:`run(feed=...)`\
63
参数传入数据;用户可以通过 :code:`run(fetch=...)` 获取输出数据。例如:\
Y
yuyang18 已提交
64

Y
yuyang18 已提交
65
.. code-block:: python
Y
yuyang18 已提交
66

C
chengduo 已提交
67 68 69 70 71 72
    import paddle.fluid as fluid
    import numpy

    train_program = fluid.Program()
    startup_program = fluid.Program()
    with fluid.program_guard(train_program, startup_program):
Z
Zeng Jinle 已提交
73
        data = fluid.data(name='X', shape=[None, 1], dtype='float32')
C
chengduo 已提交
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
        hidden = fluid.layers.fc(input=data, size=10)
        loss = fluid.layers.mean(hidden)
        sgd = fluid.optimizer.SGD(learning_rate=0.001)
        sgd.minimize(loss)

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

    # Run the startup program once and only once.
    # Not need to optimize/compile the startup program.
    startup_program.random_seed=1
    exe.run(startup_program)

    # Run the main program directly without compile.
    x = numpy.random.random(size=(10, 1)).astype('float32')
    loss_data, = exe.run(train_program,
                         feed={"X": x},
                         fetch_list=[loss.name])

    # Or use CompiledProgram:
Z
Zeng Jinle 已提交
95
    compiled_prog = fluid.CompiledProgram(train_program)
C
chengduo 已提交
96 97 98
    loss_data, = exe.run(compiled_prog,
                 feed={"X": x},
                 fetch_list=[loss.name])
Y
yuyang18 已提交
99

Y
yuyang18 已提交
100
多卡训练
A
acosta123 已提交
101
#######################
Z
Zeng Jinle 已提交
102
在多卡训练中,你可以使用 :code:`fluid.CompiledProgram` 来编译 :code:`fluid.Program` ,然后调用 :code:`with_data_parallel` 。例如:
Y
yuyang18 已提交
103

Y
yuyang18 已提交
104
.. code-block:: python
105

C
chengduo 已提交
106 107 108 109 110 111 112 113 114
    # NOTE: If you use CPU to run the program, you need
    # to specify the CPU_NUM, otherwise, fluid will use
    # all the number of the logic cores as the CPU_NUM,
    # in that case, the batch size of the input should be
    # greater than CPU_NUM, if not, the process will be
    # failed by an exception.
    if not use_cuda:
        os.environ['CPU_NUM'] = str(2)

Z
Zeng Jinle 已提交
115
    compiled_prog = fluid.CompiledProgram(
C
chengduo 已提交
116 117 118 119 120
        train_program).with_data_parallel(
        loss_name=loss.name)
    loss_data, = exe.run(compiled_prog,
                         feed={"X": x},
                         fetch_list=[loss.name])
A
acosta123 已提交
121 122 123

注释:

C
chengduo 已提交
124 125
1. :ref:`cn_api_fluid_CompiledProgram` 会将传入的 :code:`fluid.Program` 转为计算图,即Graph,因为 :code:`compiled_prog` 与传入的 :code:`train_program` 是完全不同的对象,目前还不能够对 :code:`compiled_prog` 进行保存。
2. 多卡训练也可以使用 :ref:`cn_api_fluid_ParallelExecutor` ,但是现在推荐使用 :ref:`cn_api_fluid_CompiledProgram` .
126
3. 如果 :code:`exe` 是用CUDAPlace来初始化的,模型会在GPU中运行。在显卡训练模式中,所有的显卡都将被占用。用户可以配置 `CUDA_VISIBLE_DEVICES以更改被占用的显卡。
C
chengduo 已提交
127
4. 如果 :code:`exe` 是用CPUPlace来初始化的,模型会在CPU中运行。在这种情况下,多线程用于运行模型,同时线程的数目和逻辑核的数目相等。用户可以配置 ``CPU_NUM`` 以更改使用中的线程数目。
Y
yuyang18 已提交
128 129

进阶使用
A
acosta123 已提交
130
###############
Y
yuyang18 已提交
131

Z
Zeng Jinle 已提交
132 133 134 135 136
.. toctree::
   :maxdepth: 2

   test_while_training.rst