executor_cn.rst 5.7 KB
Newer Older
T
Tink_Y 已提交
1 2 3 4 5 6
#################
 fluid.executor
#################



H
1207  
Hao Wang 已提交
7
.. _cn_api_fluid_executor_Executor:
T
Tink_Y 已提交
8 9

Executor
H
1207  
Hao Wang 已提交
10
-------------------------------
T
Tink_Y 已提交
11 12 13 14 15 16 17


.. py:class:: paddle.fluid.executor.Executor (place)




H
Hao Wang 已提交
18 19


T
Tink_Y 已提交
20 21 22 23 24 25 26 27 28 29 30 31 32
执行引擎(Executor)使用python脚本驱动,仅支持在单GPU环境下运行。多卡环境下请参考 ``ParallelExecutor`` 。
Python Executor可以接收传入的program,并根据feed map(输入映射表)和fetch_list(结果获取表)
向program中添加feed operators(数据输入算子)和fetch operators(结果获取算子)。
feed map为该program提供输入数据。fetch_list提供program训练结束后用户预期的变量(或识别类场景中的命名)。

应注意,执行器会执行program中的所有算子而不仅仅是依赖于fetch_list的那部分。

Executor将全局变量存储到全局作用域中,并为临时变量创建局部作用域。
当每一mini-batch上的前向/反向运算完成后,局部作用域的内容将被废弃,
但全局作用域中的变量将在Executor的不同执行过程中一直存在。

program中所有的算子会按顺序执行。

H
Hao Wang 已提交
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
**示例代码**

.. code-block:: python

    # 新建一个执行引擎Executor名为exe。 
    place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace()
    exe = fluid.Executor(place)

    # 仅运行一次startup program.
    # 不需要优化/编译这个startup program. 
    exe.run(fluid.default_startup_program())

    # 无需编译,直接运行main program
    loss, = exe.run(fluid.default_main_program(),
                        feed=feed_dict,
                        fetch_list=[loss.name])

    # 另一种方法是,编译这个main program然后运行. 参考CompiledProgram 
    compiled_prog = compiler.CompiledProgram(
            fluid.default_main_program()).with_data_parallel(
            loss_name=loss.name)
    loss, = exe.run(compiled_prog,
                        feed=feed_dict,
                        fetch_list=[loss.name])


T
Tink_Y 已提交
59 60 61 62 63
参数:	
    - **place** (core.CPUPlace|core.CUDAPlace(n)) – 指明了 ``Executor`` 的执行场所



H
Hao Wang 已提交
64
提示:你可以用 ``Executor`` 来调试基于并行GPU实现的复杂网络,他们有完全一样的参数也会产生相同的结果。
T
Tink_Y 已提交
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


.. py:method:: close()


关闭这个执行器(Executor)。调用这个方法后不可以再使用这个执行器。 对于分布式训练, 该函数会释放在PServers上涉及到目前训练器的资源。
   
**示例代码**

..  code-block:: python
    
    cpu = core.CPUPlace()
    exe = Executor(cpu)
    ...
    exe.close()


.. py:method:: run(program=None, feed=None, fetch_list=None, feed_var_name='feed', fetch_var_name='fetch', scope=None, return_numpy=True,use_program_cache=False)


调用该执行器对象的此方法可以执行program。通过feed map提供待学习数据,以及借助fetch_list得到相应的结果。
Python执行器(Executor)可以接收传入的program,并根据输入映射表(feed map)和结果获取表(fetch_list)
向program中添加数据输入算子(feed operators)和结果获取算子(fetch operators)。
feed map为该program提供输入数据。fetch_list提供program训练结束后用户预期的变量(或识别类场景中的命名)。

应注意,执行器会执行program中的所有算子而不仅仅是依赖于fetch_list的那部分。

参数:  
H
Hao Wang 已提交
93 94
	- **program** (Program|CompiledProgram) – 需要执行的program,如果没有给定那么默认使用default_main_program (未编译的)
	- **feed** (dict) – 前向输入的变量,数据,词典dict类型, 例如 {“image”: ImageData, “label”: LabelData}
T
Tink_Y 已提交
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
	- **fetch_list** (list) – 用户想得到的变量或者命名的列表, run会根据这个列表给与结果
	- **feed_var_name** (str) – 前向算子(feed operator)变量的名称
	- **fetch_var_name** (str) – 结果获取算子(fetch operator)的输出变量名称
	- **scope** (Scope) – 执行这个program的域,用户可以指定不同的域。缺省为全局域
	- **return_numpy** (bool) – 如果为True,则将结果张量(fetched tensor)转化为numpy
	- **use_program_cache** (bool) – 当program较上次比没有改动则将其置为True
	
返回:	根据fetch_list来获取结果

返回类型:	list(numpy.array)


**示例代码**

..  code-block:: python

T
tink2123 已提交
111 112 113
	data = fluid.layers.data(name='X', shape=[1], dtype='float32')
	out = fluid.layers.create_tensor(dtype='float32')
	hidden = fluid.layers.fc(input=data, size=10)
H
Hao Wang 已提交
114
	fluid.layers.assign(hidden,out)
T
tink2123 已提交
115
	loss = fluid.layers.mean(out)
T
Tink_Y 已提交
116
	adam = fluid.optimizer.Adam()
H
Hao Wang 已提交
117
	# adam.minimize(loss)
T
Tink_Y 已提交
118 119 120


..  code-block:: python
H
Hao Wang 已提交
121

T
Tink_Y 已提交
122
	cpu = core.CPUPlace()
T
tink2123 已提交
123 124
	exe = fluid.Executor(cpu)
	exe.run(fluid.default_startup_program())
H
Hao Wang 已提交
125

T
Tink_Y 已提交
126 127 128 129 130 131 132 133 134 135
..  code-block:: python
	
	x = numpy.random.random(size=(10, 1)).astype('float32')
	outs = exe.run(
		feed={'X': x},
		fetch_list=[loss.name])
	



H
1207  
Hao Wang 已提交
136 137 138 139 140 141 142 143 144 145 146






.. _cn_api_fluid_executor_global_scope:

global_scope
-------------------------------

147
.. py:function:: paddle.fluid.executor.global_scope ()
H
1207  
Hao Wang 已提交
148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165


获取全局/默认作用域实例。很多api使用默认 ``global_scope`` ,例如 ``Executor.run`` 。

返回:全局/默认作用域实例

返回类型:Scope






.. _cn_api_fluid_executor_scope_guard:

scope_guard
-------------------------------

166
.. py:function:: paddle.fluid.executor.scope_guard (scope)
H
1207  
Hao Wang 已提交
167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195


修改全局/默认作用域(scope),  运行时中的所有变量都将分配给新的scope。

参数:
	- **scope** - 新的全局/默认 scope。

**代码示例**

..  code-block:: python

	import paddle.fluid as fluid
	
	new_scope = fluid.Scope()
	with fluid.scope_guard(new_scope):
		...













T
Tink_Y 已提交
196