单机训练
准备工作
要进行PaddlePaddle Fluid单机训练,需要先 准备数据 和配置简单的网络 。当配置简单的网络 完毕后,可以得到两个fluid.Program
, startup_program
和 main_program
。默认情况下,可以使用 fluid.default_startup_program()
与fluid.default_main_program()
获得全局的 fluid.Program
。
例如:
- 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.
在上述模型配置执行完毕后, fluid.default_startup_program()
与fluid.default_main_program()
配置完毕了。
初始化参数
参数随机初始化
用户配置完模型后,参数初始化操作会被写入到fluid.default_startup_program()
中。使用 fluid.Executor()
运行这一程序,即可在全局 fluid.global_scope()
中随机初始化参数。例如:
- exe = fluid.Executor(fluid.CUDAPlace(0))
- exe.run(program=fluid.default_startup_program())
值得注意的是: 如果使用多GPU训练,参数需要先在GPU0上初始化,再经由fluid.ParallelExecutor
分发到多张显卡上。
载入预定义参数
在神经网络训练过程中,经常会需要载入预定义模型,进而继续进行训练。如何载入预定义参数,请参考 模型/变量的保存、载入与增量训练。
单卡训练
执行单卡训练可以使用 fluid.Executor()
中的 run()
方法,运行训练fluid.Program
即可。在运行的时候,用户可以通过 run(feed=…)
参数传入数据;用户可以通过 run(fetch=…)
获取持久的数据。例如:
- ...
- loss = fluid.layers.mean(...)
多卡训练
在多卡训练中,你可以使用 fluid.compiler.CompiledProgram
来编译 fluid.Program
,然后调用 with_data_parallel
。例如:
- exe = fluid.Executor(...)
- compiled_prog = fluid.compiler.CompiledProgram(
- fluid.default_main_program()).with_data_parallel(
- loss_name=loss.name)
- result = exe.run(program=compiled_prog,
- fetch_list=[loss.name],
- feed={"image": ..., "label": ...})
注释:
- CompiledProgram 的构造函数需要经过
fluid.Program
设置后运行,这在运行时内无法被修改。 - 如果
exe
是用CUDAPlace来初始化的,模型会在GPU中运行。在显卡训练模式中,所有的显卡都将被占用。用户可以配置 CUDA_VISIBLE_DEVICES 以更改被占用的显卡。 - 如果
exe
是用CPUPlace来初始化的,模型会在CPU中运行。在这种情况下,多线程用于运行模型,同时线程的数目和逻辑核的数目相等。用户可以配置CPU_NUM
以更改使用中的线程数目。