.ptd
文件格式¶
ExecuTorch .ptd
文件被序列化为修改版的二进制 flatbuffer 文件,并在其后附加数据段。它们提供了一种使用 FlatTensor 格式存储命名数据的方法。命名数据可以是张量,也可以是 것입니다(通常用于不公开数据格式的后端)。
与 PTD 文件格式相关的代码位于 //executorch/extension/flat_tensor/
目录中。
┌───────────────────────────────────┐
│Standard flatbuffer header │
├───────────────────────────────────┤
│ExecuTorch extended header │
├───────────────────────────────────┤
│Flatbuffer-serialized metadata │
│(FlatTensor) │
│ │
┌─ ├───────────────────────────────────┤
│ │Padding │
│ ├───────────────────────────────────┤
│ │Data segment │
│ │ │
│ │ │
│ ├───────────────────────────────────┤
│ │Padding │
Blobs ─┤ ├───────────────────────────────────┤
│ │Data segment │
│ │ │
│ │ │
│ ├───────────────────────────────────┤
│ │Padding │
│ ├───────────────────────────────────┤
│ │... │
└─ └───────────────────────────────────┘
兼容性¶
PTD 文件旨在存储可由 ExecuTorch 模型加载的命名数据。
头部¶
PTD 文件可以通过偏移量 4 处的魔术字符串来识别,该字符串以 FT
开头,后跟两位 ASCII 十进制数字(来自 FlatBuffers 模式的文件标识符)。
PTD 文件在偏移量 8 处有一个扩展头部,该头部由魔术字符串 FH01
识别。此头部包含 flatbuffer 序列化的元数据以及后续数据段的大小和偏移量信息。
请注意,此头部是 ExecuTorch 特定的,但即使存在,也不会干扰大多数 flatbuffer 解析代码(除了很少使用的 GetBufferStartFromRootPointer()
)。
所有数字均为小端序,与主机系统无关。
头部布局
[0..3] uint32_t byte offset to the beginning of the flatbuffer root table.
[4..7] File magic bytes: "FT" followed by two ASCII decimal digits. The digits
correspond to the FlatBuffers file identifier.
Extended header (always present):
| [8..11] Extended header magic bytes: "FH01" - FlatTensor Header version 01.
| [12..15] uint32_t size of this extended header in bytes, including the magic
| header and this size field. Currently fixed at 40 bytes.
| [16..23] uint64_t offset (from byte offset zero) to the start of the
| flatbuffer data.
| [24..31] uint64_t size of the flatbuffer-encoded tensor metadata in bytes.
| [32..39] uint64_t offset (from byte offset zero) to the start of the first
| data segment.
| [40..47] uint64_t total size of all data segments in bytes.
End of extended header.
示例
Offset to flatbuffer root (0x44)
| File magic ("FT01")
| | Extended header magic ("FH01")
| | | Extended header size (0x28)
vvvvvvvvvvv vvvvvvvvvvv vvvvvvvvvvv vvvvvvvvvvv
0x0000 44 00 00 00 46 54 30 31 46 48 30 31 28 00 00 00
0x0010 30 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00
0x0020 30 01 00 00 00 00 00 00 20 00 00 00 00 00 00 00
^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^
| | Flatbuffer size (0x100)
| | Segment data size (0x20)
Segment base offset (0x130)
注意:此示例来自检查 ModuleAddMul.ptd 文件。
python -m test.models.export_program --modules "ModuleAddMul" --external-constants --outdir .
xxd -l 64 ModuleAddMulProgram.ptd
FlatTensor¶
有关 FlatTensor flatbuffer 模式,请参阅 //executorch/extension/flat_tensor/serialize/flat_tensor.fbs
。
flatbuffer 编码的元数据跟在头部之后,包含
Schema version:版本信息,用于兼容性。
Data segments:包含偏移量和大小信息的段描述符列表。
Named data:命名数据条目列表,每个条目包含
Key:数据块的字符串标识符。
Segment index:对包含该数据块的数据段的引用。
Tensor layout:可选元数据,包括标量类型、大小和维度顺序(如果数据段包含张量)。
张量布局¶
如果数据段包含规范张量,则可能具有相关的布局信息
Scalar type:数据类型(float32、int32 等),使用 ExecutorTorch 标量类型。
Sizes:张量的维度。
Dim order:内存布局顺序,指定维度在内存中的排列方式。
数据段¶
元数据中的 FlatTensor.segments
列表包含每个数据段的偏移量和大小信息。此列表中的偏移量相对于扩展头部中指定的段基准偏移量。
每个段包含
Offset:相对于段基准偏移量的偏移量。
Size:有效数据的大小(以字节为单位)(可能后跟填充)。
命名数据访问¶
张量通过字符串键访问,通过 named_data
列表。每个条目将一个字符串键映射到
指向原始数据的段索引。
可选的张量布局元数据(如果数据段包含张量)。
此设计允许
多个命名数据块引用相同的数据段。
无需加载整个数据块即可访问张量布局数据。