单机训练
准备工作
要进行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.data(name="image", shape=[None, 784], dtype='float32')
label = fluid.data(name="label", shape=[None, 1], dtype='int64')
hidden = fluid.layers.fc(input=image, size=100, act='relu')
prediction = fluid.layers.fc(input=hidden, size=10, act='softmax')
loss = fluid.layers.cross_entropy(input=prediction, label=label)
loss = fluid.layers.mean(loss)
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()
运行 这一程序,初始化之后的参数默认被放在全局scope中,即 fluid.global_scope()
。例如:
exe = fluid.Executor(fluid.CUDAPlace(0))
exe.run(program=fluid.default_startup_program())
载入预定义参数
在神经网络训练过程中,经常会需要载入预定义模型,进而继续进行训练。如何载入预定义参数,请参考 模型/变量的保存、载入与增量训练。
单卡训练
执行单卡训练可以使用 fluid.Executor()
中的 run()
方法,运行训练fluid.Program
即可。在运行的时候,用户可以通过 run(feed=...)
参数传入数据;用户可以通过 run(fetch=...)
获取输出数据。例如:
import paddle.fluid as fluid
import numpy
train_program = fluid.Program()
startup_program = fluid.Program()
with fluid.program_guard(train_program, startup_program):
data = fluid.data(name='X', shape=[None, 1], dtype='float32')
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:
compiled_prog = fluid.CompiledProgram(train_program)
loss_data, = exe.run(compiled_prog,
feed={"X": x},
fetch_list=[loss.name])
多卡训练
在多卡训练中,你可以使用 fluid.CompiledProgram
来编译 fluid.Program
,然后调用 with_data_parallel
。例如:
# 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)
compiled_prog = fluid.CompiledProgram(
train_program).with_data_parallel(
loss_name=loss.name)
loss_data, = exe.run(compiled_prog,
feed={"X": x},
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
以更改使用中的线程数目。