TracedLayer_cn.rst 5.3 KB
Newer Older
Z
Zeng Jinle 已提交
1 2 3 4 5
.. _cn_api_fluid_dygraph_TracedLayer:

TracedLayer
-------------------------------

6

Z
Zeng Jinle 已提交
7 8
.. py:class:: paddle.fluid.dygraph.TracedLayer(program, parameters, feed_names, fetch_names)

S
swtkiwi 已提交
9 10 11 12
:api_attr: 命令式编程模式(动态图)



Z
Zeng Jinle 已提交
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
TracedLayer用于将前向动态图模型转换为静态图模型,主要用于将动态图保存后做在线C++预测。除此以外,用户也可使用转换后的静态图模型在Python端做预测,通常比原先的动态图性能更好。

TracedLayer使用 ``Executor`` 和 ``CompiledProgram`` 运行静态图模型。转换后的静态图模型与原动态图模型共享参数。

所有的TracedLayer对象均不应通过构造函数创建,而应通过调用静态方法 ``TracedLayer.trace(layer, inputs)`` 创建。

TracedLayer只能用于将data independent的动态图模型转换为静态图模型,即待转换的动态图模型不应随tensor数据或维度的变化而变化。

.. py:staticmethod:: trace(layer, inputs)

创建TracedLayer对象的唯一接口,该接口会调用 ``layer(*inputs)`` 方法运行动态图模型并将其转换为静态图模型。

参数:
    - **layer** (dygraph.Layer) - 待追踪的动态图layer对象。
    - **inputs** (list(Variable)) - 动态图layer对象的输入变量列表。

返回: 包含2个元素的tuple,其中第一个元素是 ``layer(*inputs)`` 的输出结果,第二个元素是转换后得到的TracedLayer对象。

返回类型: tuple

**代码示例**

.. code-block:: python

    import paddle.fluid as fluid
    from paddle.fluid.dygraph import Linear, to_variable, TracedLayer
    import numpy as np

    class ExampleLayer(fluid.dygraph.Layer):
        def __init__(self):
            super(ExampleLayer, self).__init__()
            self._fc = Linear(3, 10)

        def forward(self, input):
            return self._fc(input)

    with fluid.dygraph.guard():
        layer = ExampleLayer()
        in_np = np.random.random([2, 3]).astype('float32')
        in_var = to_variable(in_np)
        out_dygraph, static_layer = TracedLayer.trace(layer, inputs=[in_var])

        # 内部使用Executor运行静态图模型
        out_static_graph = static_layer([in_var])
        print(len(out_static_graph)) # 1
        print(out_static_graph[0].shape) # (2, 10)

        # 将静态图模型保存为预测模型
        static_layer.save_inference_model(dirname='./saved_infer_model')

.. py:method:: set_strategy(build_strategy=None, exec_strategy=None)

设置构建和执行静态图模型的相关策略。

参数:
    - **build_strategy** (BuildStrategy, 可选) - TracedLayer内部 ``CompiledProgram`` 的构建策略。
    - **exec_strategy** (ExecutionStrategy, 可选) - TracedLayer内部 ``CompiledProgram`` 的执行策略。

返回: 无

**代码示例**

.. code-block:: python

    import paddle.fluid as fluid
    from paddle.fluid.dygraph import Linear, to_variable, TracedLayer
    import numpy as np

    class ExampleLayer(fluid.dygraph.Layer):
        def __init__(self):
            super(ExampleLayer, self).__init__()
            self._fc = Linear(3, 10)

        def forward(self, input):
            return self._fc(input)

    with fluid.dygraph.guard():
        layer = ExampleLayer()
        in_np = np.random.random([2, 3]).astype('float32')
        in_var = to_variable(in_np)

        out_dygraph, static_layer = TracedLayer.trace(layer, inputs=[in_var])

        build_strategy = fluid.BuildStrategy()
        build_strategy.enable_inplace = True

        exec_strategy = fluid.ExecutionStrategy()
        exec_strategy.num_threads = 2

        static_layer.set_strategy(build_strategy=build_strategy, exec_strategy=exec_strategy)
        out_static_graph = static_layer([in_var])

.. py:method:: save_inference_model(dirname, feed=None, fetch=None)

将TracedLayer保存为用于预测部署的模型。保存的预测模型可被C++预测接口加载。

参数:
    - **dirname** (str) - 预测模型的保存目录。
    - **feed** (list(int), 可选) - 预测模型输入变量的索引。若为None,则TracedLayer的所有输入变量均会作为预测模型的输入。默认值为None。
    - **fetch** (list(int), 可选) - 预测模型输出变量的索引。若为None,则TracedLayer的所有输出变量均会作为预测模型的输出。默认值为None。

返回: 无

**代码示例**

.. code-block:: python

    import paddle.fluid as fluid
    from paddle.fluid.dygraph import Linear, to_variable, TracedLayer
    import numpy as np

    class ExampleLayer(fluid.dygraph.Layer):
        def __init__(self):
            super(ExampleLayer, self).__init__()
            self._fc = Linear(3, 10)

        def forward(self, input):
            return self._fc(input)

    save_dirname = './saved_infer_model'
    in_np = np.random.random([2, 3]).astype('float32')

    with fluid.dygraph.guard():
        layer = ExampleLayer()
        in_var = to_variable(in_np)
        out_dygraph, static_layer = TracedLayer.trace(layer, inputs=[in_var])
        static_layer.save_inference_model(save_dirname, feed=[0], fetch=[0])

    place = fluid.CPUPlace()
    exe = fluid.Executor(place)
    program, feed_vars, fetch_vars = fluid.io.load_inference_model(save_dirname,
                                        exe)

    fetch, = exe.run(program, feed={feed_vars[0]: in_np}, fetch_list=fetch_vars)
    print(fetch.shape) # (2, 10)