commit
bab5e53c03
@ -0,0 +1,38 @@
|
||||
# Design Doc: Model Format
|
||||
|
||||
## Motivation
|
||||
|
||||
A model is an output of the training process. One complete model consists of two parts, the **topology** and the **parameters**. In order to support industrial deployment, the model format must be self-complete and must not expose any training source code.
|
||||
|
||||
As a result, In PaddlePaddle, the **topology** is represented as a [ProgramDesc](https://github.com/PaddlePaddle/Paddle/blob/1c0a4c901c9fc881d120249c703b15d1c50dae7d/doc/design/program.md), which describes the model structure. The **parameters** contain all the trainable weights in the model. We must support large size parameters and efficient serialization/deserialization of parameters.
|
||||
|
||||
## Implementation
|
||||
|
||||
The topology is saved as a plain text in a detailed self-contain protobuf file.
|
||||
|
||||
The parameters are saved as a binary file. As we all know, the protobuf message has a limit of [64M size](https://developers.google.com/protocol-buffers/docs/reference/cpp/google.protobuf.io.coded_stream#CodedInputStream.SetTotalBytesLimit.details). We have done a [benchmark experiment](https://github.com/PaddlePaddle/Paddle/pull/4610), which shows that protobuf is not fit for the task.
|
||||
|
||||
As a result, we design a particular format for tensor serialization. By default, an arbitrary tensor in Paddle is a [LoDTensor](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/framework/lod_tensor.md), and has a description information proto of [LoDTensorDesc](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/framework/framework.proto#L99). We save the DescProto as the byte string header. It contains all the necessary information, such as the `dims`, the `name` of the tensor, and the `LoD` information in [LoDTensor](https://github.com/PaddlePaddle/Paddle/blob/1c0a4c901c9fc881d120249c703b15d1c50dae7d/paddle/framework/lod_tensor.md). A tensor stores values in a continuous memory buffer. For speed we dump the raw memory to disk and save it as the byte string content. So, the binary format of one tensor is,
|
||||
|
||||
|HeaderLength|ContentLength|**LoDTensorDesc**|**TensorValue**|
|
||||
|
||||
The table below shows a tensor's byte view in detail. Note that all the signed values are written in the little-endian format.
|
||||
|
||||
```text
|
||||
[offset] [type] [description]
|
||||
0004 4 bytes integer HeaderLength, the length of LoDTensorDesc
|
||||
0008 4 bytes integer ContentLength, the length of LodTensor Buffer
|
||||
0009 1 bytes char TensorDesc
|
||||
00010 1 bytes char TensorDesc
|
||||
...
|
||||
00100 1 bytes char TensorValue
|
||||
00101 1 bytes char TensorValue
|
||||
00102 1 bytes char TensorValue ..
|
||||
...
|
||||
```
|
||||
|
||||
## Summary
|
||||
|
||||
- We introduce a model format.
|
||||
- The `ProgramDesc` describe the model **topology**.
|
||||
- A bunch of specified format binary tensors describe the **parameters**.
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue