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