• 单机训练
    • 准备工作
    • 初始化参数
      • 参数随机初始化
      • 载入预定义参数
    • 单卡训练
    • 多卡训练
    • 进阶使用

    单机训练

    准备工作

    要进行PaddlePaddle Fluid单机训练,需要先 准备数据 和配置简单的网络 。当配置简单的网络 完毕后,可以得到两个fluid.Programstartup_programmain_program。默认情况下,可以使用 fluid.default_startup_program()fluid.default_main_program() 获得全局的 fluid.Program

    例如:

    1. import paddle.fluid as fluid
    2.  
    3. image = fluid.layers.data(name="image", shape=[784])
    4. label = fluid.layers.data(name="label", shape=[1])
    5. hidden = fluid.layers.fc(input=image, size=100, act='relu')
    6. prediction = fluid.layers.fc(input=hidden, size=10, act='softmax')
    7. loss = fluid.layers.cross_entropy(input=prediction, label=label)
    8. loss = fluid.layers.mean(loss)
    9.  
    10. sgd = fluid.optimizer.SGD(learning_rate=0.001)
    11. sgd.minimize(loss)
    12.  
    13. # Here the fluid.default_startup_program() and fluid.default_main_program()
    14. # has been constructed.

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

    初始化参数

    参数随机初始化

    用户配置完模型后,参数初始化操作会被写入到fluid.default_startup_program() 中。使用 fluid.Executor() 运行这一程序,初始化之后的参数默认被放在全局scope中,即 fluid.global_scope() 。例如:

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

    载入预定义参数

    在神经网络训练过程中,经常会需要载入预定义模型,进而继续进行训练。如何载入预定义参数,请参考 模型/变量的保存、载入与增量训练。

    单卡训练

    执行单卡训练可以使用 fluid.Executor() 中的 run() 方法,运行训练fluid.Program 即可。在运行的时候,用户可以通过 run(feed=…)参数传入数据;用户可以通过 run(fetch=…) 获取持久的数据。例如:

    1. import paddle.fluid as fluid
    2. import numpy
    3.  
    4. train_program = fluid.Program()
    5. startup_program = fluid.Program()
    6. with fluid.program_guard(train_program, startup_program):
    7. data = fluid.layers.data(name='X', shape=[1], dtype='float32')
    8. hidden = fluid.layers.fc(input=data, size=10)
    9. loss = fluid.layers.mean(hidden)
    10. sgd = fluid.optimizer.SGD(learning_rate=0.001)
    11. sgd.minimize(loss)
    12.  
    13. use_cuda = True
    14. place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace()
    15. exe = fluid.Executor(place)
    16.  
    17. # Run the startup program once and only once.
    18. # Not need to optimize/compile the startup program.
    19. startup_program.random_seed=1
    20. exe.run(startup_program)
    21.  
    22. # Run the main program directly without compile.
    23. x = numpy.random.random(size=(10, 1)).astype('float32')
    24. loss_data, = exe.run(train_program,
    25. feed={"X": x},
    26. fetch_list=[loss.name])
    27.  
    28. # Or use CompiledProgram:
    29. compiled_prog = compiler.CompiledProgram(train_program)
    30. loss_data, = exe.run(compiled_prog,
    31. feed={"X": x},
    32. fetch_list=[loss.name])

    多卡训练

    在多卡训练中,你可以使用 fluid.compiler.CompiledProgram 来编译 fluid.Program ,然后调用 with_data_parallel 。例如:

    1. # NOTE: If you use CPU to run the program, you need
    2. # to specify the CPU_NUM, otherwise, fluid will use
    3. # all the number of the logic cores as the CPU_NUM,
    4. # in that case, the batch size of the input should be
    5. # greater than CPU_NUM, if not, the process will be
    6. # failed by an exception.
    7. if not use_cuda:
    8. os.environ['CPU_NUM'] = str(2)
    9.  
    10. compiled_prog = compiler.CompiledProgram(
    11. train_program).with_data_parallel(
    12. loss_name=loss.name)
    13. loss_data, = exe.run(compiled_prog,
    14. feed={"X": x},
    15. fetch_list=[loss.name])

    注释:

    • CompiledProgram 会将传入的 fluid.Program 转为计算图,即Graph,因为 compiled_prog 与传入的 train_program 是完全不同的对象,目前还不能够对 compiled_prog 进行保存。
    • 多卡训练也可以使用 ParallelExecutor ,但是现在推荐使用 CompiledProgram .
    • 如果 exe 是用CUDAPlace来初始化的,模型会在GPU中运行。在显卡训练模式中,所有的显卡都将被占用。用户可以配置 CUDA_VISIBLE_DEVICES 以更改被占用的显卡。
    • 如果 exe 是用CPUPlace来初始化的,模型会在CPU中运行。在这种情况下,多线程用于运行模型,同时线程的数目和逻辑核的数目相等。用户可以配置 CPU_NUM 以更改使用中的线程数目。

    进阶使用

    • 训练过程中评测模型
      • 生成测试 fluid.Program
      • 执行测试 fluid.Program