xref: /aosp_15_r20/external/executorch/schema/program.fbs (revision 523fa7a60841cd1ecfb9cc4201f1ca8b03ed023a)
1*523fa7a6SAndroid Build Coastguard Worker// Copyright (c) Meta Platforms, Inc. and affiliates.
2*523fa7a6SAndroid Build Coastguard Worker
3*523fa7a6SAndroid Build Coastguard Worker//
4*523fa7a6SAndroid Build Coastguard Worker// See README.md before modifying this file.
5*523fa7a6SAndroid Build Coastguard Worker//
6*523fa7a6SAndroid Build Coastguard Worker
7*523fa7a6SAndroid Build Coastguard Workerinclude "scalar_type.fbs";
8*523fa7a6SAndroid Build Coastguard Worker
9*523fa7a6SAndroid Build Coastguard Workernamespace executorch_flatbuffer;
10*523fa7a6SAndroid Build Coastguard Worker
11*523fa7a6SAndroid Build Coastguard Worker// Identifier of a valid executor schema.
12*523fa7a6SAndroid Build Coastguard Workerfile_identifier "ET12";
13*523fa7a6SAndroid Build Coastguard Worker// Extension of written files.
14*523fa7a6SAndroid Build Coastguard Workerfile_extension "pte";
15*523fa7a6SAndroid Build Coastguard Worker
16*523fa7a6SAndroid Build Coastguard Worker// Table that contains the metadata about how
17*523fa7a6SAndroid Build Coastguard Worker// to unflatten the flattened input/output from compiler
18*523fa7a6SAndroid Build Coastguard Workertable ContainerMetadata {
19*523fa7a6SAndroid Build Coastguard Worker  encoded_inp_str: string;
20*523fa7a6SAndroid Build Coastguard Worker  encoded_out_str: string;
21*523fa7a6SAndroid Build Coastguard Worker}
22*523fa7a6SAndroid Build Coastguard Worker
23*523fa7a6SAndroid Build Coastguard Workertable Null {}
24*523fa7a6SAndroid Build Coastguard Worker
25*523fa7a6SAndroid Build Coastguard Worker// Contains information relevant to the allocation of non-constant
26*523fa7a6SAndroid Build Coastguard Worker// buffer data (e.g. from tensors).
27*523fa7a6SAndroid Build Coastguard Worker// This refers to where the buffer needs to be placed in an existing
28*523fa7a6SAndroid Build Coastguard Worker// memory and at what offset from its base address.
29*523fa7a6SAndroid Build Coastguard Workertable AllocationDetails {
30*523fa7a6SAndroid Build Coastguard Worker  memory_id: uint;  // ID of the memory where this data needs to be placed.
31*523fa7a6SAndroid Build Coastguard Worker
32*523fa7a6SAndroid Build Coastguard Worker  // Offset in bytes relative to the start of the memory area indicated by
33*523fa7a6SAndroid Build Coastguard Worker  // memory_id.
34*523fa7a6SAndroid Build Coastguard Worker  //
35*523fa7a6SAndroid Build Coastguard Worker  // Originally this field was a single 32-bit uint, but we need 64 bits for
36*523fa7a6SAndroid Build Coastguard Worker  // larger models. To preserve backwards compatibility, the high bits are
37*523fa7a6SAndroid Build Coastguard Worker  // managed in a separate 32-bit field. Users should combine the two fields
38*523fa7a6SAndroid Build Coastguard Worker  // to get the full 64-bit offset.
39*523fa7a6SAndroid Build Coastguard Worker  memory_offset_low: uint;  // Least significant 32 bits
40*523fa7a6SAndroid Build Coastguard Worker  memory_offset_high: uint;  // Most significant 32 bits. Defaults to zero.
41*523fa7a6SAndroid Build Coastguard Worker}
42*523fa7a6SAndroid Build Coastguard Worker
43*523fa7a6SAndroid Build Coastguard Worker// Indicates the types of shape a Tensor may have, from the point
44*523fa7a6SAndroid Build Coastguard Worker// of view of their dynamism.
45*523fa7a6SAndroid Build Coastguard Workerenum TensorShapeDynamism : byte {
46*523fa7a6SAndroid Build Coastguard Worker  // Static shape. Memory is allocated by the compiler.
47*523fa7a6SAndroid Build Coastguard Worker  STATIC = 0,
48*523fa7a6SAndroid Build Coastguard Worker  // Dynamic shape but with an upper bound.
49*523fa7a6SAndroid Build Coastguard Worker  // Memory is allocated by the compiler.
50*523fa7a6SAndroid Build Coastguard Worker  DYNAMIC_BOUND = 1,
51*523fa7a6SAndroid Build Coastguard Worker  // Dynamic shape without upper bound.
52*523fa7a6SAndroid Build Coastguard Worker  // Memory allocation is handled by the runtime.
53*523fa7a6SAndroid Build Coastguard Worker  DYNAMIC_UNBOUND = 2,
54*523fa7a6SAndroid Build Coastguard Worker}
55*523fa7a6SAndroid Build Coastguard Worker
56*523fa7a6SAndroid Build Coastguard Worker
57*523fa7a6SAndroid Build Coastguard Worker// Table to put additional information about tensors in that is not applicable
58*523fa7a6SAndroid Build Coastguard Worker// to the vast majority of tensors in the vast majority of programs.
59*523fa7a6SAndroid Build Coastguard Workertable ExtraTensorInfo {
60*523fa7a6SAndroid Build Coastguard Worker  // [Optional] Specifies the SubsegmentOffsets in
61*523fa7a6SAndroid Build Coastguard Worker  //  program.mutable_data_segments that specifies where the data is located in.
62*523fa7a6SAndroid Build Coastguard Worker  //  If not present and the data is located in a segment, then the data is in
63*523fa7a6SAndroid Build Coastguard Worker  //  the first index.
64*523fa7a6SAndroid Build Coastguard Worker  mutable_data_segments_idx: uint64;
65*523fa7a6SAndroid Build Coastguard Worker
66*523fa7a6SAndroid Build Coastguard Worker  // [Optional] The unique name of the tensor. e.g. 'mod.linear.weight'
67*523fa7a6SAndroid Build Coastguard Worker  fully_qualified_name: string;
68*523fa7a6SAndroid Build Coastguard Worker}
69*523fa7a6SAndroid Build Coastguard Worker
70*523fa7a6SAndroid Build Coastguard Workertable Tensor {
71*523fa7a6SAndroid Build Coastguard Worker  scalar_type: ScalarType;
72*523fa7a6SAndroid Build Coastguard Worker
73*523fa7a6SAndroid Build Coastguard Worker  // Offset in scalar_type elements (e.g., multiples of 4 bytes for an int
74*523fa7a6SAndroid Build Coastguard Worker  // scalar type) from the beginning of the tensor buffer to the beginning of
75*523fa7a6SAndroid Build Coastguard Worker  // the actual data. Currently, the runtime only supports a value of zero.
76*523fa7a6SAndroid Build Coastguard Worker  storage_offset: int;
77*523fa7a6SAndroid Build Coastguard Worker
78*523fa7a6SAndroid Build Coastguard Worker  sizes: [int];
79*523fa7a6SAndroid Build Coastguard Worker
80*523fa7a6SAndroid Build Coastguard Worker  // Specifies in what order the dimensions are laid out in memory (from outer
81*523fa7a6SAndroid Build Coastguard Worker  // to inner).
82*523fa7a6SAndroid Build Coastguard Worker  //
83*523fa7a6SAndroid Build Coastguard Worker  // For example, given a rank 3 Tensor of size (3, 5, 2). If we name
84*523fa7a6SAndroid Build Coastguard Worker  // dimensions: [row, column, batch], then a dim_order of:
85*523fa7a6SAndroid Build Coastguard Worker  // - (2, 0, 1) represents a [batch, row, column] ordering where "column" is
86*523fa7a6SAndroid Build Coastguard Worker  //   the innermost dimension, then comes "row", and the outermost dimension is
87*523fa7a6SAndroid Build Coastguard Worker  //   "batch".
88*523fa7a6SAndroid Build Coastguard Worker  // - (0, 2, 1) represents a [row, batch, column] ordering where "column" is
89*523fa7a6SAndroid Build Coastguard Worker  //   the innermost dimension, then comes "batch", and the outermost dimension
90*523fa7a6SAndroid Build Coastguard Worker  //   is "row".
91*523fa7a6SAndroid Build Coastguard Worker  dim_order: [ubyte];
92*523fa7a6SAndroid Build Coastguard Worker
93*523fa7a6SAndroid Build Coastguard Worker  // out of scope M1
94*523fa7a6SAndroid Build Coastguard Worker  requires_grad: bool;
95*523fa7a6SAndroid Build Coastguard Worker
96*523fa7a6SAndroid Build Coastguard Worker  // Overall, a Tensor is either constant or mutable. At method load time
97*523fa7a6SAndroid Build Coastguard Worker  //  constant tensors receive a dataptr into the serialized program. Mutable
98*523fa7a6SAndroid Build Coastguard Worker  //  tensors can either receive a pointer from the heirarchical allocator or a
99*523fa7a6SAndroid Build Coastguard Worker  //  nullptr if they will receive a data pointer at execution time (inputs
100*523fa7a6SAndroid Build Coastguard Worker  //  and control flow placeholders can be like this). Mutable tensors may or
101*523fa7a6SAndroid Build Coastguard Worker  //  may not also have an initial value in the serialized program.
102*523fa7a6SAndroid Build Coastguard Worker  //
103*523fa7a6SAndroid Build Coastguard Worker  // In summary:
104*523fa7a6SAndroid Build Coastguard Worker  //   data_buffer_idx > 0, allocation_info = Null: Tensor is a constant.
105*523fa7a6SAndroid Build Coastguard Worker  //   data_buffer_idx = 0, allocation_info = Non Null: Tensor is mutable and
106*523fa7a6SAndroid Build Coastguard Worker  //     will receive a dataptr at method load time.
107*523fa7a6SAndroid Build Coastguard Worker  //   data_buffer_idx = 0, allocation_info = Null: Tensor is mutable and
108*523fa7a6SAndroid Build Coastguard Worker  //     will receive a dataptr at input time or during execution.
109*523fa7a6SAndroid Build Coastguard Worker  //   data_buffer_idx > 0, allocation_info = Non Null: Tensor is mutable and
110*523fa7a6SAndroid Build Coastguard Worker  //     will receive a dataptr at method load time, and has an initial state.
111*523fa7a6SAndroid Build Coastguard Worker  //
112*523fa7a6SAndroid Build Coastguard Worker  // Tensor data is stored inline if program.constant_buffer is null. Otherwise
113*523fa7a6SAndroid Build Coastguard Worker  //  it is in a segment. If this tensor's allocation_info is null then the
114*523fa7a6SAndroid Build Coastguard Worker  //  tensor data location is specified by program.constant_segment. If the
115*523fa7a6SAndroid Build Coastguard Worker  //  allocation_info is non_null then the data is somewhere in
116*523fa7a6SAndroid Build Coastguard Worker  //  program.mutable_data_segments. If tensor_info is Null, then the data is
117*523fa7a6SAndroid Build Coastguard Worker  //  in program.mutable_data_segments[0] otherwise if tensor_info is non-null
118*523fa7a6SAndroid Build Coastguard Worker  //  then the mutable_data_segment index is specified by
119*523fa7a6SAndroid Build Coastguard Worker  //  tensor_info.mutable_data_segments_index.
120*523fa7a6SAndroid Build Coastguard Worker  data_buffer_idx: uint;
121*523fa7a6SAndroid Build Coastguard Worker
122*523fa7a6SAndroid Build Coastguard Worker  // [Optional] preallocation details for non-constants (null otherwise).
123*523fa7a6SAndroid Build Coastguard Worker  allocation_info: AllocationDetails;
124*523fa7a6SAndroid Build Coastguard Worker
125*523fa7a6SAndroid Build Coastguard Worker  // May not be needed.
126*523fa7a6SAndroid Build Coastguard Worker  layout: byte;
127*523fa7a6SAndroid Build Coastguard Worker
128*523fa7a6SAndroid Build Coastguard Worker  // Determines the type of the tensor's shape, from the point of view of its
129*523fa7a6SAndroid Build Coastguard Worker  // dynamic or not behavior, and consequently how the allocation of the
130*523fa7a6SAndroid Build Coastguard Worker  // underlying memory is handled, and also how to interpret the sizes and
131*523fa7a6SAndroid Build Coastguard Worker  // strides fields.
132*523fa7a6SAndroid Build Coastguard Worker  // 1. dynamism == STATIC: sizes field represents the static shape of
133*523fa7a6SAndroid Build Coastguard Worker  //    the tensor.
134*523fa7a6SAndroid Build Coastguard Worker  // 2. dynamism == DYNAMIC_BOUND: sizes field represents the upper bound shape
135*523fa7a6SAndroid Build Coastguard Worker  //    of the tensor. Each dimension of the tensor at runtime should never
136*523fa7a6SAndroid Build Coastguard Worker  //    exceed the corresponding dimension of the upper bound shape.
137*523fa7a6SAndroid Build Coastguard Worker  //
138*523fa7a6SAndroid Build Coastguard Worker  // 3. dynamism == DYNAMIC_UNBOUND: the stored sizes field can be ignored since
139*523fa7a6SAndroid Build Coastguard Worker  //    shape is fully dynamic.
140*523fa7a6SAndroid Build Coastguard Worker  shape_dynamism: TensorShapeDynamism;
141*523fa7a6SAndroid Build Coastguard Worker
142*523fa7a6SAndroid Build Coastguard Worker  // [Optional] Additional information about the Tensor that is not applicable
143*523fa7a6SAndroid Build Coastguard Worker  // to most tensors.
144*523fa7a6SAndroid Build Coastguard Worker  extra_tensor_info: ExtraTensorInfo;
145*523fa7a6SAndroid Build Coastguard Worker}
146*523fa7a6SAndroid Build Coastguard Worker
147*523fa7a6SAndroid Build Coastguard Workertable Int {
148*523fa7a6SAndroid Build Coastguard Worker  int_val: long;
149*523fa7a6SAndroid Build Coastguard Worker}
150*523fa7a6SAndroid Build Coastguard Worker
151*523fa7a6SAndroid Build Coastguard Workertable Bool {
152*523fa7a6SAndroid Build Coastguard Worker  bool_val: bool;
153*523fa7a6SAndroid Build Coastguard Worker}
154*523fa7a6SAndroid Build Coastguard Worker
155*523fa7a6SAndroid Build Coastguard Workertable Double {
156*523fa7a6SAndroid Build Coastguard Worker  double_val: double;
157*523fa7a6SAndroid Build Coastguard Worker}
158*523fa7a6SAndroid Build Coastguard Worker
159*523fa7a6SAndroid Build Coastguard Workertable String {
160*523fa7a6SAndroid Build Coastguard Worker  string_val: string;
161*523fa7a6SAndroid Build Coastguard Worker}
162*523fa7a6SAndroid Build Coastguard Worker
163*523fa7a6SAndroid Build Coastguard Workertable IntList {
164*523fa7a6SAndroid Build Coastguard Worker  items: [long];
165*523fa7a6SAndroid Build Coastguard Worker}
166*523fa7a6SAndroid Build Coastguard Worker
167*523fa7a6SAndroid Build Coastguard Workertable DoubleList {
168*523fa7a6SAndroid Build Coastguard Worker  items: [double];
169*523fa7a6SAndroid Build Coastguard Worker}
170*523fa7a6SAndroid Build Coastguard Worker
171*523fa7a6SAndroid Build Coastguard Workertable BoolList {
172*523fa7a6SAndroid Build Coastguard Worker  items: [bool];
173*523fa7a6SAndroid Build Coastguard Worker}
174*523fa7a6SAndroid Build Coastguard Worker
175*523fa7a6SAndroid Build Coastguard Worker// Unlike primitive lists, tensor lists have mutable members and aliasing behavior when
176*523fa7a6SAndroid Build Coastguard Worker// elements are added to them. To match this aliasing behavior, the runtime tensor list is
177*523fa7a6SAndroid Build Coastguard Worker// serialized by serializing its elements into the ExecutionPlan.values array, and then
178*523fa7a6SAndroid Build Coastguard Worker// serializing their corresponding indices into TensorList.items.
179*523fa7a6SAndroid Build Coastguard Workertable TensorList {
180*523fa7a6SAndroid Build Coastguard Worker  items: [int];  // EValue indices.
181*523fa7a6SAndroid Build Coastguard Worker}
182*523fa7a6SAndroid Build Coastguard Worker
183*523fa7a6SAndroid Build Coastguard Worker// Similar to TensorList except the indices can also point to None.
184*523fa7a6SAndroid Build Coastguard Workertable OptionalTensorList {
185*523fa7a6SAndroid Build Coastguard Worker  items: [int];
186*523fa7a6SAndroid Build Coastguard Worker}
187*523fa7a6SAndroid Build Coastguard Worker
188*523fa7a6SAndroid Build Coastguard Worker// Supported values in Executorch kernels, Enums are serialized as ints.
189*523fa7a6SAndroid Build Coastguard Workerunion KernelTypes {
190*523fa7a6SAndroid Build Coastguard Worker  Null,
191*523fa7a6SAndroid Build Coastguard Worker  Int,
192*523fa7a6SAndroid Build Coastguard Worker  Bool,
193*523fa7a6SAndroid Build Coastguard Worker  Double,
194*523fa7a6SAndroid Build Coastguard Worker  Tensor,
195*523fa7a6SAndroid Build Coastguard Worker  String,
196*523fa7a6SAndroid Build Coastguard Worker  IntList,
197*523fa7a6SAndroid Build Coastguard Worker  DoubleList,
198*523fa7a6SAndroid Build Coastguard Worker  BoolList,
199*523fa7a6SAndroid Build Coastguard Worker  TensorList,
200*523fa7a6SAndroid Build Coastguard Worker  OptionalTensorList,
201*523fa7a6SAndroid Build Coastguard Worker}
202*523fa7a6SAndroid Build Coastguard Worker
203*523fa7a6SAndroid Build Coastguard Worker// Abstraction for program values. A subset of types supported in core pytorch kernels.
204*523fa7a6SAndroid Build Coastguard Workertable EValue {
205*523fa7a6SAndroid Build Coastguard Worker  val: KernelTypes;
206*523fa7a6SAndroid Build Coastguard Worker}
207*523fa7a6SAndroid Build Coastguard Worker
208*523fa7a6SAndroid Build Coastguard Workertable Operator {
209*523fa7a6SAndroid Build Coastguard Worker  // Operator registry and lookup is uniquely identified by its name, and overload name.
210*523fa7a6SAndroid Build Coastguard Worker  // TODO(larryliu): is there a more efficient way to represent this
211*523fa7a6SAndroid Build Coastguard Worker  name: string;
212*523fa7a6SAndroid Build Coastguard Worker  overload: string;
213*523fa7a6SAndroid Build Coastguard Worker}
214*523fa7a6SAndroid Build Coastguard Worker
215*523fa7a6SAndroid Build Coastguard Workertable KernelCall {
216*523fa7a6SAndroid Build Coastguard Worker  // Index to the operators table in the program.
217*523fa7a6SAndroid Build Coastguard Worker  op_index: int;
218*523fa7a6SAndroid Build Coastguard Worker
219*523fa7a6SAndroid Build Coastguard Worker  // Indexes to the (values) required by the operation (in and out).
220*523fa7a6SAndroid Build Coastguard Worker  args: [int];
221*523fa7a6SAndroid Build Coastguard Worker}
222*523fa7a6SAndroid Build Coastguard Worker
223*523fa7a6SAndroid Build Coastguard Workertable DelegateCall {
224*523fa7a6SAndroid Build Coastguard Worker  // Index to the delegates table in the program.
225*523fa7a6SAndroid Build Coastguard Worker  delegate_index: int;
226*523fa7a6SAndroid Build Coastguard Worker
227*523fa7a6SAndroid Build Coastguard Worker  // Indexes to the (values) required by the delegates (in and out).
228*523fa7a6SAndroid Build Coastguard Worker  args: [int];
229*523fa7a6SAndroid Build Coastguard Worker}
230*523fa7a6SAndroid Build Coastguard Worker
231*523fa7a6SAndroid Build Coastguard Workertable MoveCall {
232*523fa7a6SAndroid Build Coastguard Worker  // Index into the values table of the evalue we are moving from
233*523fa7a6SAndroid Build Coastguard Worker  move_from: int;
234*523fa7a6SAndroid Build Coastguard Worker
235*523fa7a6SAndroid Build Coastguard Worker  // Index into the values table of the evalue we are moving into
236*523fa7a6SAndroid Build Coastguard Worker  move_to: int;
237*523fa7a6SAndroid Build Coastguard Worker}
238*523fa7a6SAndroid Build Coastguard Worker
239*523fa7a6SAndroid Build Coastguard Workertable JumpFalseCall {
240*523fa7a6SAndroid Build Coastguard Worker  // Index into the values table of boolean that specifies whether or not to jump
241*523fa7a6SAndroid Build Coastguard Worker  cond_value_index: int;
242*523fa7a6SAndroid Build Coastguard Worker
243*523fa7a6SAndroid Build Coastguard Worker  // Value to set the executor program counter if the jump occurs
244*523fa7a6SAndroid Build Coastguard Worker  destination_instruction: int;
245*523fa7a6SAndroid Build Coastguard Worker}
246*523fa7a6SAndroid Build Coastguard Worker
247*523fa7a6SAndroid Build Coastguard Workertable FreeCall {
248*523fa7a6SAndroid Build Coastguard Worker  // Index into values table of the tensor whose underlying data blob is being freed
249*523fa7a6SAndroid Build Coastguard Worker  value_index: int;
250*523fa7a6SAndroid Build Coastguard Worker}
251*523fa7a6SAndroid Build Coastguard Worker
252*523fa7a6SAndroid Build Coastguard Workerunion InstructionArguments {
253*523fa7a6SAndroid Build Coastguard Worker  KernelCall,
254*523fa7a6SAndroid Build Coastguard Worker  DelegateCall,
255*523fa7a6SAndroid Build Coastguard Worker  MoveCall,
256*523fa7a6SAndroid Build Coastguard Worker  JumpFalseCall,
257*523fa7a6SAndroid Build Coastguard Worker  FreeCall,
258*523fa7a6SAndroid Build Coastguard Worker}
259*523fa7a6SAndroid Build Coastguard Worker
260*523fa7a6SAndroid Build Coastguard Worker// Basic unit of execution
261*523fa7a6SAndroid Build Coastguard Workertable Instruction {
262*523fa7a6SAndroid Build Coastguard Worker  instr_args: InstructionArguments;
263*523fa7a6SAndroid Build Coastguard Worker}
264*523fa7a6SAndroid Build Coastguard Worker
265*523fa7a6SAndroid Build Coastguard Workertable Frame {
266*523fa7a6SAndroid Build Coastguard Worker  // For storing the frame to print stacktraces
267*523fa7a6SAndroid Build Coastguard Worker  filename: string;  // Name of the file in which the instruction exists
268*523fa7a6SAndroid Build Coastguard Worker  lineno: int;       // Line number at which the instruction was called
269*523fa7a6SAndroid Build Coastguard Worker  name: string;      // Name of the function the instruction was called from
270*523fa7a6SAndroid Build Coastguard Worker  context: string;   // Source code of the instruction
271*523fa7a6SAndroid Build Coastguard Worker}
272*523fa7a6SAndroid Build Coastguard Worker
273*523fa7a6SAndroid Build Coastguard Workertable FrameList {
274*523fa7a6SAndroid Build Coastguard Worker  // For storing the frames to print stacktraces
275*523fa7a6SAndroid Build Coastguard Worker  items: [Frame];
276*523fa7a6SAndroid Build Coastguard Worker}
277*523fa7a6SAndroid Build Coastguard Worker
278*523fa7a6SAndroid Build Coastguard Worker// Indicates where a piece of data is stored.
279*523fa7a6SAndroid Build Coastguard Workerenum DataLocation : byte {
280*523fa7a6SAndroid Build Coastguard Worker  // Stored directly in the flatbuffer.
281*523fa7a6SAndroid Build Coastguard Worker  INLINE = 0,
282*523fa7a6SAndroid Build Coastguard Worker  // Stored in a segment.
283*523fa7a6SAndroid Build Coastguard Worker  SEGMENT = 1,
284*523fa7a6SAndroid Build Coastguard Worker}
285*523fa7a6SAndroid Build Coastguard Worker
286*523fa7a6SAndroid Build Coastguard Worker// Indicates where the delegate data is stored
287*523fa7a6SAndroid Build Coastguard Workertable BackendDelegateDataReference {
288*523fa7a6SAndroid Build Coastguard Worker  // Indicates which list to index into:
289*523fa7a6SAndroid Build Coastguard Worker  //     INLINE -> Program.backend_delegate_data
290*523fa7a6SAndroid Build Coastguard Worker  //     SEGMENT -> Program.segments
291*523fa7a6SAndroid Build Coastguard Worker  location: DataLocation;
292*523fa7a6SAndroid Build Coastguard Worker
293*523fa7a6SAndroid Build Coastguard Worker  // The index into the list indicated by the location.
294*523fa7a6SAndroid Build Coastguard Worker  index: uint;
295*523fa7a6SAndroid Build Coastguard Worker}
296*523fa7a6SAndroid Build Coastguard Worker
297*523fa7a6SAndroid Build Coastguard Workertable CompileSpec {
298*523fa7a6SAndroid Build Coastguard Worker  // One compile spec. There are can be multiple specs for one method
299*523fa7a6SAndroid Build Coastguard Worker  key: string; // like max_value
300*523fa7a6SAndroid Build Coastguard Worker  value: [ubyte]; // like 4, or other types based on needs.
301*523fa7a6SAndroid Build Coastguard Worker}
302*523fa7a6SAndroid Build Coastguard Worker
303*523fa7a6SAndroid Build Coastguard Workertable BackendDelegate {
304*523fa7a6SAndroid Build Coastguard Worker  // Used to resolve the delegate backend classes, for example, "TCE0", "TCE1", etc.
305*523fa7a6SAndroid Build Coastguard Worker  // This string is also used in to_backend.
306*523fa7a6SAndroid Build Coastguard Worker  id: string;
307*523fa7a6SAndroid Build Coastguard Worker
308*523fa7a6SAndroid Build Coastguard Worker  // A binary blob (from a subgraph) as an output of preprocessing. Will be
309*523fa7a6SAndroid Build Coastguard Worker  // provided to the backend code at init time. Can be very large, on the
310*523fa7a6SAndroid Build Coastguard Worker  // order of 10-100MB.
311*523fa7a6SAndroid Build Coastguard Worker  processed: BackendDelegateDataReference;
312*523fa7a6SAndroid Build Coastguard Worker
313*523fa7a6SAndroid Build Coastguard Worker  // The compilation spec for the lowered module's forward function
314*523fa7a6SAndroid Build Coastguard Worker  // Example: [CompileSpec["max_value", 4]]
315*523fa7a6SAndroid Build Coastguard Worker  compile_specs: [CompileSpec];
316*523fa7a6SAndroid Build Coastguard Worker}
317*523fa7a6SAndroid Build Coastguard Worker
318*523fa7a6SAndroid Build Coastguard Worker// A sequence of blocking instructions to be executed in order. The
319*523fa7a6SAndroid Build Coastguard Worker// abstraction is not currently leveraged, all current programs are 1 chain.
320*523fa7a6SAndroid Build Coastguard Worker// We are leaving chains as part of the program definition for future use cases
321*523fa7a6SAndroid Build Coastguard Worker// around graph level async where different threads will be represented as
322*523fa7a6SAndroid Build Coastguard Worker// seperate chains.
323*523fa7a6SAndroid Build Coastguard Workertable Chain {
324*523fa7a6SAndroid Build Coastguard Worker  // Indices of the values that are (non-static) inputs into this Chain.
325*523fa7a6SAndroid Build Coastguard Worker  inputs: [int];
326*523fa7a6SAndroid Build Coastguard Worker
327*523fa7a6SAndroid Build Coastguard Worker  // Indices of the values that are outputs out of this Chain.
328*523fa7a6SAndroid Build Coastguard Worker  outputs: [int];
329*523fa7a6SAndroid Build Coastguard Worker
330*523fa7a6SAndroid Build Coastguard Worker  // List of instructions to be executed in order.
331*523fa7a6SAndroid Build Coastguard Worker  instructions: [Instruction];
332*523fa7a6SAndroid Build Coastguard Worker
333*523fa7a6SAndroid Build Coastguard Worker  // Optional list of frames for each instruction.
334*523fa7a6SAndroid Build Coastguard Worker  // The backend config must have 'emit_stacktrace' set to true to emit
335*523fa7a6SAndroid Build Coastguard Worker  stacktrace: [FrameList];
336*523fa7a6SAndroid Build Coastguard Worker}
337*523fa7a6SAndroid Build Coastguard Worker
338*523fa7a6SAndroid Build Coastguard Workertable ExecutionPlan {
339*523fa7a6SAndroid Build Coastguard Worker
340*523fa7a6SAndroid Build Coastguard Worker  // Name of a method on the nn.Module that was traced to create this program.
341*523fa7a6SAndroid Build Coastguard Worker  name: string;
342*523fa7a6SAndroid Build Coastguard Worker
343*523fa7a6SAndroid Build Coastguard Worker  // Type meta data for input/output to the execution plan
344*523fa7a6SAndroid Build Coastguard Worker  container_meta_type: ContainerMetadata;
345*523fa7a6SAndroid Build Coastguard Worker
346*523fa7a6SAndroid Build Coastguard Worker  // A list of all values used in this execution plan.
347*523fa7a6SAndroid Build Coastguard Worker  values: [EValue];
348*523fa7a6SAndroid Build Coastguard Worker
349*523fa7a6SAndroid Build Coastguard Worker  // Indices to the 'Evalues' that are inputs to this execution plan.
350*523fa7a6SAndroid Build Coastguard Worker  // This list contains only the non-constant tensors (i.e. not part of
351*523fa7a6SAndroid Build Coastguard Worker  // the saved program).
352*523fa7a6SAndroid Build Coastguard Worker  inputs: [int];
353*523fa7a6SAndroid Build Coastguard Worker
354*523fa7a6SAndroid Build Coastguard Worker  // Indices to the 'Evalues' that are outputs of this execution plan.
355*523fa7a6SAndroid Build Coastguard Worker  // This signals a lifespan that goes beyond the execution.
356*523fa7a6SAndroid Build Coastguard Worker  outputs: [int];
357*523fa7a6SAndroid Build Coastguard Worker
358*523fa7a6SAndroid Build Coastguard Worker  // List of Chains of kernels.
359*523fa7a6SAndroid Build Coastguard Worker  chains: [Chain];
360*523fa7a6SAndroid Build Coastguard Worker
361*523fa7a6SAndroid Build Coastguard Worker  // Operators used in this execution plan
362*523fa7a6SAndroid Build Coastguard Worker  operators: [Operator];
363*523fa7a6SAndroid Build Coastguard Worker
364*523fa7a6SAndroid Build Coastguard Worker  // A list of delegates and each is a special instance of execution, the same level of chains.
365*523fa7a6SAndroid Build Coastguard Worker  delegates: [BackendDelegate];
366*523fa7a6SAndroid Build Coastguard Worker
367*523fa7a6SAndroid Build Coastguard Worker  // List of buffer sizes for non_constant memory allocations. (Think neural net activations)
368*523fa7a6SAndroid Build Coastguard Worker  // A list instead of a single buffer to account for complex memory hierarchies.
369*523fa7a6SAndroid Build Coastguard Worker  // TODO(jakeszwe, razy): How to reconcile this with the ability for the hierarchical memory allocator
370*523fa7a6SAndroid Build Coastguard Worker  // to be id based instead of index based.
371*523fa7a6SAndroid Build Coastguard Worker  // Runtime should use the len(constant_buffer) as the ground truth of the
372*523fa7a6SAndroid Build Coastguard Worker  // constants memory buffer size, and ignore non_const_buffer_sizes[0].
373*523fa7a6SAndroid Build Coastguard Worker  non_const_buffer_sizes: [int64];
374*523fa7a6SAndroid Build Coastguard Worker
375*523fa7a6SAndroid Build Coastguard Worker}
376*523fa7a6SAndroid Build Coastguard Worker
377*523fa7a6SAndroid Build Coastguard Worker// Constant tensor data stored directly in the flatbuffer.
378*523fa7a6SAndroid Build Coastguard Workertable Buffer {
379*523fa7a6SAndroid Build Coastguard Worker  // During serialization, this alignment may be rewritten to a larger value.
380*523fa7a6SAndroid Build Coastguard Worker  // The magic "@executorch-tensor-alignment" comment tells EXIR which lines to
381*523fa7a6SAndroid Build Coastguard Worker  // patch.
382*523fa7a6SAndroid Build Coastguard Worker  storage: [ubyte] (force_align: 16);  // @executorch-tensor-alignment
383*523fa7a6SAndroid Build Coastguard Worker}
384*523fa7a6SAndroid Build Coastguard Worker
385*523fa7a6SAndroid Build Coastguard Worker// Delegate data stored directly in the flatbuffer. This is a different type
386*523fa7a6SAndroid Build Coastguard Worker// than Buffer because tensors and delegates can have different alignment
387*523fa7a6SAndroid Build Coastguard Worker// requirements.
388*523fa7a6SAndroid Build Coastguard Workertable BackendDelegateInlineData {
389*523fa7a6SAndroid Build Coastguard Worker  // During serialization, this alignment may be rewritten to a larger value.
390*523fa7a6SAndroid Build Coastguard Worker  // The magic "@executorch-delegate-alignment" comment tells EXIR which lines
391*523fa7a6SAndroid Build Coastguard Worker  // to patch.
392*523fa7a6SAndroid Build Coastguard Worker  data: [ubyte] (force_align: 16);  // @executorch-delegate-alignment
393*523fa7a6SAndroid Build Coastguard Worker}
394*523fa7a6SAndroid Build Coastguard Worker
395*523fa7a6SAndroid Build Coastguard Worker// Describes a contiguous piece of data that lives outside of the flatbuffer data,
396*523fa7a6SAndroid Build Coastguard Worker// typically appended afterwards in the file. The "extended header" in the file,
397*523fa7a6SAndroid Build Coastguard Worker// when present, points to the segment base offset.
398*523fa7a6SAndroid Build Coastguard Workertable DataSegment {
399*523fa7a6SAndroid Build Coastguard Worker  // Segment offsets are relative to the segment base offset provided in
400*523fa7a6SAndroid Build Coastguard Worker  // the extended file header. Segments will typically be aligned in a
401*523fa7a6SAndroid Build Coastguard Worker  // way to make it possible to use mmap() to load them.
402*523fa7a6SAndroid Build Coastguard Worker  offset: uint64;
403*523fa7a6SAndroid Build Coastguard Worker
404*523fa7a6SAndroid Build Coastguard Worker  // The size in bytes of valid data starting at the offset. The segment
405*523fa7a6SAndroid Build Coastguard Worker  // data may be followed by padding before the segment that follows it,
406*523fa7a6SAndroid Build Coastguard Worker  // to make it easier to use mmap().
407*523fa7a6SAndroid Build Coastguard Worker  size: uint64;
408*523fa7a6SAndroid Build Coastguard Worker}
409*523fa7a6SAndroid Build Coastguard Worker
410*523fa7a6SAndroid Build Coastguard Worker// Describes data offsets into a particular segment
411*523fa7a6SAndroid Build Coastguard Workertable SubsegmentOffsets {
412*523fa7a6SAndroid Build Coastguard Worker  // Index of the segment in Program.segments
413*523fa7a6SAndroid Build Coastguard Worker  segment_index: uint;
414*523fa7a6SAndroid Build Coastguard Worker
415*523fa7a6SAndroid Build Coastguard Worker  // Each element is an offset in bytes into the data of the segment pointed to
416*523fa7a6SAndroid Build Coastguard Worker  // by segment_index. Offsets must be aligned to @executorch-tensor-alignment.
417*523fa7a6SAndroid Build Coastguard Worker  offsets: [uint64];
418*523fa7a6SAndroid Build Coastguard Worker}
419*523fa7a6SAndroid Build Coastguard Worker
420*523fa7a6SAndroid Build Coastguard Workertable Program {
421*523fa7a6SAndroid Build Coastguard Worker  // Schema version.
422*523fa7a6SAndroid Build Coastguard Worker  version: uint;
423*523fa7a6SAndroid Build Coastguard Worker
424*523fa7a6SAndroid Build Coastguard Worker  // List of ExecutionPlans that make up the program. Each ExecutionPlan corresponds with a
425*523fa7a6SAndroid Build Coastguard Worker  // different entry point into the model.
426*523fa7a6SAndroid Build Coastguard Worker  execution_plan: [ExecutionPlan];
427*523fa7a6SAndroid Build Coastguard Worker
428*523fa7a6SAndroid Build Coastguard Worker  // Tables of constant data, used for constant Values (e.g.data field of weight tensors).
429*523fa7a6SAndroid Build Coastguard Worker  // Each constant is assigned an index into the table which are each individually aligned.
430*523fa7a6SAndroid Build Coastguard Worker  // 0 index is reserved to be pointed to by non-constant Tensors.
431*523fa7a6SAndroid Build Coastguard Worker  // If this field is non-empty, constant_segment.offsets must be empty.
432*523fa7a6SAndroid Build Coastguard Worker  // DEPRECATED: After D61996249 on 2024-09-05, no new PTE files will use this field.
433*523fa7a6SAndroid Build Coastguard Worker  constant_buffer: [Buffer];
434*523fa7a6SAndroid Build Coastguard Worker
435*523fa7a6SAndroid Build Coastguard Worker  // List of delegate data. Pointed to by BackendDelegateDataReference.
436*523fa7a6SAndroid Build Coastguard Worker  backend_delegate_data: [BackendDelegateInlineData];
437*523fa7a6SAndroid Build Coastguard Worker
438*523fa7a6SAndroid Build Coastguard Worker  // List of data segments that follow the Program data in this file, sorted by
439*523fa7a6SAndroid Build Coastguard Worker  // offset. Elements in this schema can refer to these segments by index.
440*523fa7a6SAndroid Build Coastguard Worker  segments: [DataSegment];
441*523fa7a6SAndroid Build Coastguard Worker
442*523fa7a6SAndroid Build Coastguard Worker  // Describes the offsets of each constant tensor, relative to the segment
443*523fa7a6SAndroid Build Coastguard Worker  // offset. If constant_segment.offsets field is non-empty, constant_buffer
444*523fa7a6SAndroid Build Coastguard Worker  // must be empty. constant_segment.offsets[0] is reserved to be pointed to by
445*523fa7a6SAndroid Build Coastguard Worker  // non-constant Tensors.
446*523fa7a6SAndroid Build Coastguard Worker  constant_segment: SubsegmentOffsets;
447*523fa7a6SAndroid Build Coastguard Worker
448*523fa7a6SAndroid Build Coastguard Worker  // [Optional] Describes the offsets into various segments for each mutable
449*523fa7a6SAndroid Build Coastguard Worker  // tensor. Only mutable tensors with a meaningful initial state are
450*523fa7a6SAndroid Build Coastguard Worker  // serialized here (for example weights that will be trained on-device as
451*523fa7a6SAndroid Build Coastguard Worker  // opposed to just layer activations). Seperate from the constant_segment to
452*523fa7a6SAndroid Build Coastguard Worker  // reduce peak memory usage by letting us read directly from the PTE file
453*523fa7a6SAndroid Build Coastguard Worker  // into the mutable tensor, as opposed to loading the .pte data into
454*523fa7a6SAndroid Build Coastguard Worker  // constant memory, copying it over, and then being unable to release the
455*523fa7a6SAndroid Build Coastguard Worker  // constant segment. No two elements should point to the same segment.
456*523fa7a6SAndroid Build Coastguard Worker  mutable_data_segments: [SubsegmentOffsets];
457*523fa7a6SAndroid Build Coastguard Worker}
458*523fa7a6SAndroid Build Coastguard Worker
459*523fa7a6SAndroid Build Coastguard Workerroot_type Program;
460