基本用法

    源代码转写的ProgramTranslator进行动态图转静态图,其基本原理是通过分析Python代码来将动态图代码转写为静态图代码,并在底层自动帮用户使用执行器运行。其基本使用方法十分简便,只需要在要转化的函数(该函数也可以是用户自定义动态图Layer的forward函数)前添加一个装饰器 ,一个转化例子如下,可以直接运行被装饰函数得到结果:

    若要存储转化后的静态图模型,可以调用 paddle.jit.save ,我们定义一个简单全连接网络SimpleFcLayer,需要在下面SimpleFcLayer的forward函数添加装饰器:

    1. import numpy as np
    2. import paddle
    3. class SimpleFcLayer(paddle.nn.Layer):
    4. def __init__(self, batch_size, feature_size, fc_size):
    5. super(SimpleFcLayer, self).__init__()
    6. self._linear = paddle.nn.Linear(feature_size, fc_size)
    7. np.random.random((batch_size, fc_size)).astype('float32'))
    8. def forward(self, x):
    9. fc = self._linear(x)
    10. return fc + self._offset

    trace是指在模型运行时记录下其运行过哪些算子。TracedLayer就是基于这种技术,在一次执行动态图的过程中,记录所有运行的算子,并构建和保存静态图模型。一个使用例子如下:

    我们还是定义一个简单的全连接网络作为例子,注意这里不需要像ProgramTranslator在forward函数添加装饰器:

    1. import numpy as np
    2. import paddle
    3. class SimpleFcLayer(paddle.nn.Layer):
    4. super(SimpleFcLayer, self).__init__()
    5. self._linear = paddle.nn.Linear(feature_size, fc_size)
    6. np.random.random((batch_size, fc_size)).astype('float32'))
    7. def forward(self, x):
    8. fc = self._linear(x)
    9. return fc + self._offset

    载入的模型可以使用静态图方式运行

    1. place = paddle.CPUPlace()
    2. exe = paddle.Executor(place)
    3. fetch, = exe.run(program, feed={feed_vars[0]: in_np}, fetch_list=fetch_vars)

    但是也正如我们阐述的原理,trace只是记录了一次执行涉及的算子。若在用户的模型代码中,包含了依赖数据条件(包括输入的值或者shape)的控制流分支,即根据数据条件触发运行不同的算子,则TracedLayer无法正常工作。比如下面:

    基于源代码转换的ProgramTranslator对比基于trace的TracedLayer,前者能够处理依赖数据条件的控制流分支。因此我们更推荐用户使用ProgramTranslator,如果遇到问题再以TracedLayer作为备选方案。