1*523fa7a6SAndroid Build Coastguard Worker# Copyright (c) Meta Platforms, Inc. and affiliates. 2*523fa7a6SAndroid Build Coastguard Worker# All rights reserved. 3*523fa7a6SAndroid Build Coastguard Worker# 4*523fa7a6SAndroid Build Coastguard Worker# This source code is licensed under the BSD-style license found in the 5*523fa7a6SAndroid Build Coastguard Worker# LICENSE file in the root directory of this source tree. 6*523fa7a6SAndroid Build Coastguard Worker 7*523fa7a6SAndroid Build Coastguard Worker# pyre-strict 8*523fa7a6SAndroid Build Coastguard Workerfrom __future__ import annotations 9*523fa7a6SAndroid Build Coastguard Worker 10*523fa7a6SAndroid Build Coastguard Workerfrom typing import Any, Dict, Enum, List, Optional, Sequence, Tuple 11*523fa7a6SAndroid Build Coastguard Worker 12*523fa7a6SAndroid Build Coastguard Workerfrom executorch.exir._warnings import experimental 13*523fa7a6SAndroid Build Coastguard Worker 14*523fa7a6SAndroid Build Coastguard Worker@experimental("This API is experimental and subject to change without notice.") 15*523fa7a6SAndroid Build Coastguard Workerclass Verification(Enum): 16*523fa7a6SAndroid Build Coastguard Worker """Verification maps C++ Program::Verification to Python. 17*523fa7a6SAndroid Build Coastguard Worker 18*523fa7a6SAndroid Build Coastguard Worker .. warning:: 19*523fa7a6SAndroid Build Coastguard Worker 20*523fa7a6SAndroid Build Coastguard Worker This API is experimental and subject to change without notice. 21*523fa7a6SAndroid Build Coastguard Worker """ 22*523fa7a6SAndroid Build Coastguard Worker 23*523fa7a6SAndroid Build Coastguard Worker Minimal: ... 24*523fa7a6SAndroid Build Coastguard Worker InternalConsistency: ... 25*523fa7a6SAndroid Build Coastguard Worker 26*523fa7a6SAndroid Build Coastguard Worker@experimental("This API is experimental and subject to change without notice.") 27*523fa7a6SAndroid Build Coastguard Workerclass ExecuTorchModule: 28*523fa7a6SAndroid Build Coastguard Worker """ExecuTorchModule is a Python wrapper around a C++ ExecuTorch program. 29*523fa7a6SAndroid Build Coastguard Worker 30*523fa7a6SAndroid Build Coastguard Worker .. warning:: 31*523fa7a6SAndroid Build Coastguard Worker 32*523fa7a6SAndroid Build Coastguard Worker This API is experimental and subject to change without notice. 33*523fa7a6SAndroid Build Coastguard Worker """ 34*523fa7a6SAndroid Build Coastguard Worker 35*523fa7a6SAndroid Build Coastguard Worker # pyre-ignore[2, 3]: "Any" in parameter and return type annotations. 36*523fa7a6SAndroid Build Coastguard Worker def __call__(self, inputs: Any, clone_outputs: bool = True) -> List[Any]: ... 37*523fa7a6SAndroid Build Coastguard Worker # pyre-ignore[2, 3]: "Any" in parameter and return type annotations. 38*523fa7a6SAndroid Build Coastguard Worker def run_method( 39*523fa7a6SAndroid Build Coastguard Worker self, 40*523fa7a6SAndroid Build Coastguard Worker method_name: str, 41*523fa7a6SAndroid Build Coastguard Worker inputs: Sequence[Any], # pyre-ignore[2]: "Any" in parameter type annotations. 42*523fa7a6SAndroid Build Coastguard Worker clone_outputs: bool = True, 43*523fa7a6SAndroid Build Coastguard Worker ) -> List[Any]: ... 44*523fa7a6SAndroid Build Coastguard Worker # pyre-ignore[2, 3]: "Any" in parameter and return type annotations. 45*523fa7a6SAndroid Build Coastguard Worker def forward( 46*523fa7a6SAndroid Build Coastguard Worker self, 47*523fa7a6SAndroid Build Coastguard Worker inputs: Sequence[Any], # pyre-ignore[2]: "Any" in parameter type annotations. 48*523fa7a6SAndroid Build Coastguard Worker clone_outputs: bool = True, 49*523fa7a6SAndroid Build Coastguard Worker ) -> List[Any]: ... 50*523fa7a6SAndroid Build Coastguard Worker # pyre-ignore[3]: "Any" in return type annotations. 51*523fa7a6SAndroid Build Coastguard Worker def plan_execute(self) -> List[Any]: ... 52*523fa7a6SAndroid Build Coastguard Worker # Bundled program methods. 53*523fa7a6SAndroid Build Coastguard Worker def load_bundled_input( 54*523fa7a6SAndroid Build Coastguard Worker self, bundle: BundledModule, method_name: str, testset_idx: int 55*523fa7a6SAndroid Build Coastguard Worker ) -> None: ... 56*523fa7a6SAndroid Build Coastguard Worker # pyre-ignore[3]: "Any" in return type annotations. 57*523fa7a6SAndroid Build Coastguard Worker def verify_result_with_bundled_expected_output( 58*523fa7a6SAndroid Build Coastguard Worker self, 59*523fa7a6SAndroid Build Coastguard Worker bundle: BundledModule, 60*523fa7a6SAndroid Build Coastguard Worker method_name: str, 61*523fa7a6SAndroid Build Coastguard Worker testset_idx: int, 62*523fa7a6SAndroid Build Coastguard Worker rtol: float = 1e-5, 63*523fa7a6SAndroid Build Coastguard Worker atol: float = 1e-8, 64*523fa7a6SAndroid Build Coastguard Worker ) -> List[Any]: ... 65*523fa7a6SAndroid Build Coastguard Worker def has_etdump(self) -> bool: ... 66*523fa7a6SAndroid Build Coastguard Worker def write_etdump_result_to_file( 67*523fa7a6SAndroid Build Coastguard Worker self, path: str, debug_buffer_path: Optional[str] = None 68*523fa7a6SAndroid Build Coastguard Worker ) -> None: ... 69*523fa7a6SAndroid Build Coastguard Worker def method_meta(self, method_name: str) -> MethodMeta: ... 70*523fa7a6SAndroid Build Coastguard Worker def method_names(self) -> List[str]: ... 71*523fa7a6SAndroid Build Coastguard Worker 72*523fa7a6SAndroid Build Coastguard Worker@experimental("This API is experimental and subject to change without notice.") 73*523fa7a6SAndroid Build Coastguard Workerclass BundledModule: 74*523fa7a6SAndroid Build Coastguard Worker """ 75*523fa7a6SAndroid Build Coastguard Worker .. warning:: 76*523fa7a6SAndroid Build Coastguard Worker 77*523fa7a6SAndroid Build Coastguard Worker This API is experimental and subject to change without notice. 78*523fa7a6SAndroid Build Coastguard Worker """ 79*523fa7a6SAndroid Build Coastguard Worker 80*523fa7a6SAndroid Build Coastguard Worker ... 81*523fa7a6SAndroid Build Coastguard Worker 82*523fa7a6SAndroid Build Coastguard Worker@experimental("This API is experimental and subject to change without notice.") 83*523fa7a6SAndroid Build Coastguard Workerclass TensorInfo: 84*523fa7a6SAndroid Build Coastguard Worker """Metadata about a tensor such as the shape and dtype. 85*523fa7a6SAndroid Build Coastguard Worker 86*523fa7a6SAndroid Build Coastguard Worker .. warning:: 87*523fa7a6SAndroid Build Coastguard Worker 88*523fa7a6SAndroid Build Coastguard Worker This API is experimental and subject to change without notice. 89*523fa7a6SAndroid Build Coastguard Worker """ 90*523fa7a6SAndroid Build Coastguard Worker 91*523fa7a6SAndroid Build Coastguard Worker def sizes(self) -> Tuple[int, ...]: 92*523fa7a6SAndroid Build Coastguard Worker """Shape of the tensor as a tuple""" 93*523fa7a6SAndroid Build Coastguard Worker ... 94*523fa7a6SAndroid Build Coastguard Worker 95*523fa7a6SAndroid Build Coastguard Worker def dtype(self) -> int: 96*523fa7a6SAndroid Build Coastguard Worker """The data type of the elements inside the tensor. 97*523fa7a6SAndroid Build Coastguard Worker See documentation for ScalarType in executorch/runtime/core/portable_type/scalar_type.h 98*523fa7a6SAndroid Build Coastguard Worker for the values these integers can take.""" 99*523fa7a6SAndroid Build Coastguard Worker ... 100*523fa7a6SAndroid Build Coastguard Worker 101*523fa7a6SAndroid Build Coastguard Worker def is_memory_planned(self) -> bool: 102*523fa7a6SAndroid Build Coastguard Worker """True if the tensor is already memory planned, meaning no allocation 103*523fa7a6SAndroid Build Coastguard Worker needs to be provided. False otherwise""" 104*523fa7a6SAndroid Build Coastguard Worker ... 105*523fa7a6SAndroid Build Coastguard Worker 106*523fa7a6SAndroid Build Coastguard Worker def nbytes(self) -> int: 107*523fa7a6SAndroid Build Coastguard Worker """Number of bytes in the tensor. Not the same as numel if the dtype is 108*523fa7a6SAndroid Build Coastguard Worker larger than 1 byte wide""" 109*523fa7a6SAndroid Build Coastguard Worker ... 110*523fa7a6SAndroid Build Coastguard Worker 111*523fa7a6SAndroid Build Coastguard Worker def __repr__(self) -> str: ... 112*523fa7a6SAndroid Build Coastguard Worker 113*523fa7a6SAndroid Build Coastguard Worker@experimental("This API is experimental and subject to change without notice.") 114*523fa7a6SAndroid Build Coastguard Workerclass MethodMeta: 115*523fa7a6SAndroid Build Coastguard Worker """Metadata about a method such as the number of inputs and outputs. 116*523fa7a6SAndroid Build Coastguard Worker 117*523fa7a6SAndroid Build Coastguard Worker .. warning:: 118*523fa7a6SAndroid Build Coastguard Worker 119*523fa7a6SAndroid Build Coastguard Worker This API is experimental and subject to change without notice. 120*523fa7a6SAndroid Build Coastguard Worker """ 121*523fa7a6SAndroid Build Coastguard Worker 122*523fa7a6SAndroid Build Coastguard Worker def name(self) -> str: 123*523fa7a6SAndroid Build Coastguard Worker """The name of the method, such as 'forward'""" 124*523fa7a6SAndroid Build Coastguard Worker ... 125*523fa7a6SAndroid Build Coastguard Worker 126*523fa7a6SAndroid Build Coastguard Worker def num_inputs(self) -> int: 127*523fa7a6SAndroid Build Coastguard Worker """The number of user inputs to the method. This does not include any 128*523fa7a6SAndroid Build Coastguard Worker internal buffers or weights, which don't need to be provided by the user""" 129*523fa7a6SAndroid Build Coastguard Worker ... 130*523fa7a6SAndroid Build Coastguard Worker 131*523fa7a6SAndroid Build Coastguard Worker def num_outputs(self) -> int: 132*523fa7a6SAndroid Build Coastguard Worker """The number of outputs from the method. This does not include any mutated 133*523fa7a6SAndroid Build Coastguard Worker internal buffers""" 134*523fa7a6SAndroid Build Coastguard Worker ... 135*523fa7a6SAndroid Build Coastguard Worker 136*523fa7a6SAndroid Build Coastguard Worker def input_tensor_meta(self, index: int) -> TensorInfo: 137*523fa7a6SAndroid Build Coastguard Worker """The tensor info for the 'index'th input. Index must be in the interval 138*523fa7a6SAndroid Build Coastguard Worker [0, num_inputs()). Raises an IndexError if the index is out of bounds""" 139*523fa7a6SAndroid Build Coastguard Worker ... 140*523fa7a6SAndroid Build Coastguard Worker 141*523fa7a6SAndroid Build Coastguard Worker def output_tensor_meta(self, index: int) -> TensorInfo: 142*523fa7a6SAndroid Build Coastguard Worker """The tensor info for the 'index'th output. Index must be in the interval 143*523fa7a6SAndroid Build Coastguard Worker [0, num_outputs()). Raises an IndexError if the index is out of bounds""" 144*523fa7a6SAndroid Build Coastguard Worker ... 145*523fa7a6SAndroid Build Coastguard Worker 146*523fa7a6SAndroid Build Coastguard Worker def __repr__(self) -> str: ... 147*523fa7a6SAndroid Build Coastguard Worker 148*523fa7a6SAndroid Build Coastguard Worker@experimental("This API is experimental and subject to change without notice.") 149*523fa7a6SAndroid Build Coastguard Workerdef _load_for_executorch( 150*523fa7a6SAndroid Build Coastguard Worker path: str, 151*523fa7a6SAndroid Build Coastguard Worker enable_etdump: bool = False, 152*523fa7a6SAndroid Build Coastguard Worker debug_buffer_size: int = 0, 153*523fa7a6SAndroid Build Coastguard Worker program_verification: Verification = Verification.InternalConsistency, 154*523fa7a6SAndroid Build Coastguard Worker) -> ExecuTorchModule: 155*523fa7a6SAndroid Build Coastguard Worker """Load an ExecuTorch Program from a file. 156*523fa7a6SAndroid Build Coastguard Worker 157*523fa7a6SAndroid Build Coastguard Worker .. warning:: 158*523fa7a6SAndroid Build Coastguard Worker 159*523fa7a6SAndroid Build Coastguard Worker This API is experimental and subject to change without notice. 160*523fa7a6SAndroid Build Coastguard Worker 161*523fa7a6SAndroid Build Coastguard Worker Args: 162*523fa7a6SAndroid Build Coastguard Worker path: File path to the ExecuTorch program as a string. 163*523fa7a6SAndroid Build Coastguard Worker enable_etdump: If true, enables an ETDump which can store profiling information. 164*523fa7a6SAndroid Build Coastguard Worker See documentation at https://pytorch.org/executorch/stable/etdump.html 165*523fa7a6SAndroid Build Coastguard Worker for how to use it. 166*523fa7a6SAndroid Build Coastguard Worker debug_buffer_size: If non-zero, enables a debug buffer which can store 167*523fa7a6SAndroid Build Coastguard Worker intermediate results of each instruction in the ExecuTorch program. 168*523fa7a6SAndroid Build Coastguard Worker This is the fixed size of the buffer, if you have more intermediate 169*523fa7a6SAndroid Build Coastguard Worker result bytes than this allows, the execution will abort with a failed 170*523fa7a6SAndroid Build Coastguard Worker runtime check. 171*523fa7a6SAndroid Build Coastguard Worker """ 172*523fa7a6SAndroid Build Coastguard Worker ... 173*523fa7a6SAndroid Build Coastguard Worker 174*523fa7a6SAndroid Build Coastguard Worker@experimental("This API is experimental and subject to change without notice.") 175*523fa7a6SAndroid Build Coastguard Workerdef _load_for_executorch_from_buffer( 176*523fa7a6SAndroid Build Coastguard Worker buffer: bytes, 177*523fa7a6SAndroid Build Coastguard Worker enable_etdump: bool = False, 178*523fa7a6SAndroid Build Coastguard Worker debug_buffer_size: int = 0, 179*523fa7a6SAndroid Build Coastguard Worker program_verification: Verification = Verification.InternalConsistency, 180*523fa7a6SAndroid Build Coastguard Worker) -> ExecuTorchModule: 181*523fa7a6SAndroid Build Coastguard Worker """Same as _load_for_executorch, but takes a byte buffer instead of a file path. 182*523fa7a6SAndroid Build Coastguard Worker 183*523fa7a6SAndroid Build Coastguard Worker .. warning:: 184*523fa7a6SAndroid Build Coastguard Worker 185*523fa7a6SAndroid Build Coastguard Worker This API is experimental and subject to change without notice. 186*523fa7a6SAndroid Build Coastguard Worker """ 187*523fa7a6SAndroid Build Coastguard Worker ... 188*523fa7a6SAndroid Build Coastguard Worker 189*523fa7a6SAndroid Build Coastguard Worker@experimental("This API is experimental and subject to change without notice.") 190*523fa7a6SAndroid Build Coastguard Workerdef _load_for_executorch_from_bundled_program( 191*523fa7a6SAndroid Build Coastguard Worker module: BundledModule, enable_etdump: bool = False, debug_buffer_size: int = 0 192*523fa7a6SAndroid Build Coastguard Worker) -> ExecuTorchModule: 193*523fa7a6SAndroid Build Coastguard Worker """Same as _load_for_executorch, but takes a bundled program instead of a file path. 194*523fa7a6SAndroid Build Coastguard Worker 195*523fa7a6SAndroid Build Coastguard Worker See https://pytorch.org/executorch/stable/bundled-io.html for documentation. 196*523fa7a6SAndroid Build Coastguard Worker 197*523fa7a6SAndroid Build Coastguard Worker .. warning:: 198*523fa7a6SAndroid Build Coastguard Worker 199*523fa7a6SAndroid Build Coastguard Worker This API is experimental and subject to change without notice. 200*523fa7a6SAndroid Build Coastguard Worker """ 201*523fa7a6SAndroid Build Coastguard Worker ... 202*523fa7a6SAndroid Build Coastguard Worker 203*523fa7a6SAndroid Build Coastguard Worker@experimental("This API is experimental and subject to change without notice.") 204*523fa7a6SAndroid Build Coastguard Workerdef _load_bundled_program_from_buffer( 205*523fa7a6SAndroid Build Coastguard Worker buffer: bytes, non_const_pool_size: int = ... 206*523fa7a6SAndroid Build Coastguard Worker) -> BundledModule: 207*523fa7a6SAndroid Build Coastguard Worker """ 208*523fa7a6SAndroid Build Coastguard Worker .. warning:: 209*523fa7a6SAndroid Build Coastguard Worker 210*523fa7a6SAndroid Build Coastguard Worker This API is experimental and subject to change without notice. 211*523fa7a6SAndroid Build Coastguard Worker """ 212*523fa7a6SAndroid Build Coastguard Worker ... 213*523fa7a6SAndroid Build Coastguard Worker 214*523fa7a6SAndroid Build Coastguard Worker@experimental("This API is experimental and subject to change without notice.") 215*523fa7a6SAndroid Build Coastguard Workerdef _get_operator_names() -> List[str]: 216*523fa7a6SAndroid Build Coastguard Worker """ 217*523fa7a6SAndroid Build Coastguard Worker .. warning:: 218*523fa7a6SAndroid Build Coastguard Worker 219*523fa7a6SAndroid Build Coastguard Worker This API is experimental and subject to change without notice. 220*523fa7a6SAndroid Build Coastguard Worker """ 221*523fa7a6SAndroid Build Coastguard Worker ... 222*523fa7a6SAndroid Build Coastguard Worker 223*523fa7a6SAndroid Build Coastguard Worker@experimental("This API is experimental and subject to change without notice.") 224*523fa7a6SAndroid Build Coastguard Workerdef _create_profile_block(name: str) -> None: 225*523fa7a6SAndroid Build Coastguard Worker """ 226*523fa7a6SAndroid Build Coastguard Worker .. warning:: 227*523fa7a6SAndroid Build Coastguard Worker 228*523fa7a6SAndroid Build Coastguard Worker This API is experimental and subject to change without notice. 229*523fa7a6SAndroid Build Coastguard Worker """ 230*523fa7a6SAndroid Build Coastguard Worker ... 231*523fa7a6SAndroid Build Coastguard Worker 232*523fa7a6SAndroid Build Coastguard Worker@experimental("This API is experimental and subject to change without notice.") 233*523fa7a6SAndroid Build Coastguard Workerdef _dump_profile_results() -> bytes: 234*523fa7a6SAndroid Build Coastguard Worker """ 235*523fa7a6SAndroid Build Coastguard Worker .. warning:: 236*523fa7a6SAndroid Build Coastguard Worker 237*523fa7a6SAndroid Build Coastguard Worker This API is experimental and subject to change without notice. 238*523fa7a6SAndroid Build Coastguard Worker """ 239*523fa7a6SAndroid Build Coastguard Worker ... 240*523fa7a6SAndroid Build Coastguard Worker 241*523fa7a6SAndroid Build Coastguard Worker@experimental("This API is experimental and subject to change without notice.") 242*523fa7a6SAndroid Build Coastguard Workerdef _reset_profile_results() -> None: 243*523fa7a6SAndroid Build Coastguard Worker """ 244*523fa7a6SAndroid Build Coastguard Worker .. warning:: 245*523fa7a6SAndroid Build Coastguard Worker 246*523fa7a6SAndroid Build Coastguard Worker This API is experimental and subject to change without notice. 247*523fa7a6SAndroid Build Coastguard Worker """ 248*523fa7a6SAndroid Build Coastguard Worker ... 249