var_desc.md 2.6 KB
Newer Older
W
weixing 已提交
1 2
# Design Doc: Var_desc

Q
qiaolongfei 已提交
3
## Background
4
PaddlePaddle divides the description of neural network computation into two stages: compile time and runtime. At compile time, the neural network computation is described as a `ProgramDesc` whereas at runtime an `Executor` interprets the `ProgramDesc` to compute the operations.
Q
qiaolongfei 已提交
5

6
PaddlePaddle uses proto message to describe compile time program because :
Q
qiaolongfei 已提交
7

8
1. The computation program description must be serializable and saved in a file.
9
1. During distributed training, the serialized program will be sent to multiple workers. It should also be possible to break the program into different components, each of which can be executed on a different worker.
Q
qiaolongfei 已提交
10

11
The computation `Program` consists of nested `Blocks`. Each `Block` will consist of data(i.e. `Variable`)  and  `Operations`. The concept to represent them is in the table below.
Q
qiaolongfei 已提交
12

Q
qiaolongfei 已提交
13 14 15 16
| |compile time|runtime|
|---|---|---|
|Data|VarDesc(proto)|Variable(cpp)|
|Operation|OpDesc(proto)|Operator(cpp)|
Q
qiaolongfei 已提交
17 18


19
## Definition of VarType
Q
qiaolongfei 已提交
20

21
A VarDesc should have a name, type and whether or not it is persistable. The are different kinds of variable types supported in PaddlePaddle, apart from the POD_Types like: `LOD_TENSOR`, `SELECTED_ROWS`, `FEED_MINIBATCH`, `FETCH_LIST`, `STEP_SCOPES`, `LOD_RANK_TABLE`, `LOD_TENSOR_ARRAY`, `PLACE_LIST`, `READER` and `CHANNEL`. These are declared inside `VarType`. A `VarDesc` then looks as the following:
Q
qiaolongfei 已提交
22 23 24 25

```proto
message VarDesc {
  required string name = 1;
Y
Yu Yang 已提交
26
  required VarType type = 2;
27
  optional bool persistable = 3 [ default = false ];
Q
qiaolongfei 已提交
28
}
Q
qiaolongfei 已提交
29
```
Q
qiaolongfei 已提交
30

Y
Yu Yang 已提交
31
## Definition of TensorDesc
Q
qiaolongfei 已提交
32 33

```proto
34 35 36 37 38 39 40 41 42 43 44 45
message TensorDesc {
  // Should only be PODType. Is enforced in C++
  required Type data_type = 1;
  repeated int64 dims = 2; // [UNK, 640, 480] is saved as [-1, 640, 480]
}
```

The `Type` here comes from the enum defined inside of `VarType` :

```proto
enum Type {
  // Pod Types
Q
qiaolongfei 已提交
46 47 48 49 50 51 52 53
  BOOL = 0;
  INT16 = 1;
  INT32 = 2;
  INT64 = 3;
  FP16 = 4;
  FP32 = 5;
  FP64 = 6;

54 55 56 57 58 59 60 61 62 63 64
  // Other types that may need additional descriptions
  LOD_TENSOR = 7;
  SELECTED_ROWS = 8;
  FEED_MINIBATCH = 9;
  FETCH_LIST = 10;
  STEP_SCOPES = 11;
  LOD_RANK_TABLE = 12;
  LOD_TENSOR_ARRAY = 13;
  PLACE_LIST = 14;
  READER = 15;
  CHANNEL = 16;
Q
qiaolongfei 已提交
65 66 67
}
```

Y
Yu Yang 已提交
68
A TensorDesc describes `SelectedRows` and `LoDTensor`. For details of `SelectedRows`, please reference [`SelectedRows`](./selected_rows.md).
Q
qiaolongfei 已提交
69

Y
Yu Yang 已提交
70
## Definition of LodTensorDesc
Q
qiaolongfei 已提交
71

Y
Yu Yang 已提交
72 73 74
```proto
message LoDTensorDesc {
  required TensorDesc tensor = 1;
75
  optional int32 lod_level = 2 [ default = 0 ];
Y
Yu Yang 已提交
76
}
Q
qiaolongfei 已提交
77 78
```

Y
Yu Yang 已提交
79
A LoDTensorDesc contains a tensor and a lod_level.
Q
qiaolongfei 已提交
80

Y
Yu Yang 已提交
81
## Definition of Variable in Python
Q
qiaolongfei 已提交
82

Y
Yu Yang 已提交
83
For Variable in Python, please reference [`Python API`](./python_api.md).