Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
机器未来
Paddle
提交
d34aadb3
P
Paddle
项目概览
机器未来
/
Paddle
与 Fork 源项目一致
Fork自
PaddlePaddle / Paddle
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
Paddle
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
d34aadb3
编写于
10月 09, 2017
作者:
Y
Yang Yang(Tony)
提交者:
GitHub
10月 09, 2017
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Create executor.md
上级
f8192f72
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
95 addition
and
0 deletion
+95
-0
doc/design/executor.md
doc/design/executor.md
+95
-0
未找到文件。
doc/design/executor.md
0 → 100644
浏览文件 @
d34aadb3
# Executor Desgin Doc
## Overview
`Executor`
evaluates a
`ProgramDesc`
. Essentially, it instantializes Variables and Operators, then run all the operators
```
c++
void
Executor
::
Run
(
const
ProgramDesc
&
pdesc
,
Scope
*
scope
)
{
auto
&
block
=
pdesc
.
blocks
(
0
);
auto
&
device
=
device_contexts_
[
0
];
// Instantiate all the vars in the global scope
for
(
auto
&
var
:
block
.
vars
())
{
scope
->
NewVar
(
var
.
name
());
}
// Decide which operator should be run
std
::
vector
<
bool
>
should_run
=
Preprocess
(
pdesc
);
// Run the block
Scope
&
local_scope
=
scope
->
NewScope
();
for
(
size_t
i
=
0
;
i
<
should_run
.
size
();
++
i
)
{
if
(
should_run
[
i
])
{
for
(
auto
var
:
block
.
ops
(
i
).
outputs
())
{
for
(
auto
argu
:
var
.
arguments
())
{
// Create variable in the local_scope
if
(
local_scope
.
FindVar
(
argu
)
==
nullptr
)
{
local_scope
.
NewVar
(
argu
);
}
}
}
auto
op
=
paddle
::
framework
::
OpRegistry
::
CreateOp
(
block
.
ops
(
i
));
op
->
Run
(
local_scope
,
*
device
);
}
}
}
```
## Tasks
As shown above, it is not hard to simply evaluate the graph. The real problem
is how do we actually construct the
`ProgramDesc`
. There are several different
situations that we need to consider.
### 1. Init @tony @qijun
##### Problem:
Not sure which block to put init ops. Same concerns applys to
`Load Model`
.
##### Solution: In seperate Blocks
All
`initop`
and
`parameter`
goes to
`block[0]`
. Actual run starts from
`block[1]`
.
When user writes
`a = Parameter(Variable, init)`
, a init op is inserted into
`block[0]`
, and a
`NOP`
is inserted into
`block[1]`
to substitute init op.
-
Pro:
-
Init Op can be run multiple times.
-
Compatiable with current
`Executor::Preprocessing`
-
Still only one
`ProgramDesc`
-
Con:
-
Let others know!
### 2. IO
#### 2.1 FeedOp and FetchOp
Design Doc: https://github.com/PaddlePaddle/Paddle/pull/4599
FeedOp and FetchOp in distributed environment:
https://github.com/PaddlePaddle/Paddle/issues/4613
#### 2.2 ReaderOp and WriterOp
### 3. Backward @jiayi
Executor test case is a good place to test
`backward`
module, even though executor
is not necessarily depends on
`backward`
. Currently exposed issue:
-
Fill One: https://github.com/PaddlePaddle/Paddle/issues/4627
-
Attribute map: https://github.com/PaddlePaddle/Paddle/issues/4642
### 4. Optimizer @longfei
Executor test case is a good place to test
`optimizer `
module, even though executor
is not necessarily depends on
`optimizer `
.
### 5. RNN @chunwei
To be discussed.
-
How to deal with multiple blocks
-
How to deal with LoDTensor
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录