// Copyright 2020 The TensorFlow Authors. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. //----------------------------------------------------------------------------- // WARNING: read all the warnings below before modifying this file! //----------------------------------------------------------------------------- // // This schema defines how to configure TFLite for delegation. These // definitions can be used in multiple ways: as output of a compatibility list, // in benchmarking tools and to decouple delegate instantiation from code. // // The schema is work-in-progress, covering the most broadly used delegates and // options. // // This schema is written using ProtoBuf syntax, but it is also used to generate // a corresponding FlatBuffer schema. // // WARNING: The TfLiteSettings flatbuffer is used as part of the ABI // for TensorFlow in Play Services, so please be careful to preserve // binary backwards compatibility! // // WARNING: the Protobuf to Flatbuffer schema conversion does NOT // pay any attention to the protobuf field numbers in this file, // so setting the protobuf field numbers is NOT sufficient to preserve binary // backwards compatibility. Instead, to preserve backwards binary // compatibility, new fields MUST ONLY be added at the END of messages, // and fields should NEVER be deleted, but instead can only be deprecated. // // WARNING: before modifying this file, you should copy the previous contents // of this file to 'testdata/configuration.proto_prev'. This is used to test // that your changes will preserve binary backwards compatibility. // // WARNING: you need to manually generate and update the generated flatbuffer // code (configuration_generated.h) when modifying this file. See BUILD for // more information. Below are manual steps for reference: // bazel build // //tensorflow/lite/acceleration/configuration:proto_to_flatbuffer // && cp // bazel-bin/tensorflow/lite/acceleration/configuration/configuration_generated.h // tensorflow/lite/acceleration/configuration/configuration_generated.h // NOTE: If you are a Google developer using the internal dev environment, // please read the description of the following bash script and then run it: // ./third_party/tensorflow/lite/acceleration/configuration/google/regenerate_tflite_configuration_generated_header.sh // LINT.IfChange syntax = "proto2"; package tflite.proto; // ExecutionPreference is used to match accelerators against the preferences of // the current application or usecase. Some of the values here can appear both // in the compatibility list and as input, some only as input. // // These are separate from NNAPIExecutionPreference - the compatibility list // design doesn't assume a one-to-one mapping between which usecases // compatibility list entries have been developed for and what settings are used // for NNAPI. enum ExecutionPreference { // Match any selected preference. Allowlist (semantically - value is same as // on input). ANY = 0; // Match low latency preference. Both compatibility list and input. LOW_LATENCY = 1; // Math low power preference. Both compatibility list and input. LOW_POWER = 2; // Never accelerate. Can be used for input to compatibility list or for // standalone Acceleration configuration. FORCE_CPU = 3; } // TFLite accelerator to use. // // STATUS: support library and the stable delegate loader settings are agnostic // to the actual accelerator. enum Delegate { NONE = 0; NNAPI = 1; GPU = 2; HEXAGON = 3; XNNPACK = 4; // The EdgeTpu in Pixel devices. EDGETPU = 5; // The Coral EdgeTpu Dev Board / USB accelerator. EDGETPU_CORAL = 6; // Apple CoreML. CORE_ML = 7; // Arm NN Delegate. ARMNN = 8; // MediaTek Neuron Delegate. MTK_NEURON = 9; } enum NNAPIExecutionPreference { // Undefined. UNDEFINED = 0; // Prefer executing in a way that minimizes battery drain. NNAPI_LOW_POWER = 1; // Prefer returning a single answer as fast as possible, even if this causes // more power consumption. NNAPI_FAST_SINGLE_ANSWER = 2; // Prefer maximizing the throughput of successive frames, for example when // processing successive frames coming from the camera. NNAPI_SUSTAINED_SPEED = 3; } enum NNAPIExecutionPriority { NNAPI_PRIORITY_UNDEFINED = 0; NNAPI_PRIORITY_LOW = 1; NNAPI_PRIORITY_MEDIUM = 2; NNAPI_PRIORITY_HIGH = 3; } // One possible acceleration configuration. message ComputeSettings { // Which preference to use this accelerator for. optional ExecutionPreference preference = 1; // How to configure TFLite optional TFLiteSettings tflite_settings = 2; // Identifiers to use for instrumentation and telemetry. optional string model_namespace_for_statistics = 3; optional string model_identifier_for_statistics = 4; // 'Maybe' acceleration: use mini-benchmark to select settings. optional MinibenchmarkSettings settings_to_test_locally = 5; } // NNAPI delegate settings. message NNAPISettings { // Which instance (NNAPI accelerator) to use. One driver may provide several // accelerators (though a driver may also hide several back-ends behind one // name, at the choice of the driver vendor). // Note that driver introspection is only available in Android Q and later. optional string accelerator_name = 1; // Deprecated; use the compilation_caching_settings in TFLiteSettings. // // NNAPI model compilation caching settings to be passed to // tflite::StatefulNnApiDelegate optional string cache_directory = 2 [deprecated = true]; optional string model_token = 3 [deprecated = true]; // NNAPI execution preference to pass. See // https://developer.android.com/ndk/reference/group/neural-networks.html optional NNAPIExecutionPreference execution_preference = 4; // Number of instances to cache for the same model (for input size // changes). This is mandatory for getting reasonable performance in that // case. optional int32 no_of_nnapi_instances_to_cache = 5; // Deprecated; use the fallback_settings in TFLiteSettings. // // Whether to automatically fall back to TFLite CPU path. optional FallbackSettings fallback_settings = 6 [deprecated = true]; // Whether to allow use of NNAPI CPU (nnapi-reference accelerator) on Android // 10+ when an accelerator name is not specified. The NNAPI CPU typically // performs less well than the TfLite built-in kernels; but allowing allows a // model to be partially accelerated which may be a win. optional bool allow_nnapi_cpu_on_android_10_plus = 7; optional NNAPIExecutionPriority execution_priority = 8; // Whether to allow dynamic dimension sizes without re-compilation. // A tensor of with dynamic dimension must have a valid dims_signature // defined. // Only supported in NNAPI 1.1 and newer versions. // WARNING: Setting this flag to true may result in model being rejected by // accelerator. This should only be enabled if the target device supports // dynamic dimensions of the model. // By default this is set to false. optional bool allow_dynamic_dimensions = 9; // Whether to allow the NNAPI accelerator to optionally use lower-precision // float16 (16-bit floating point) arithmetic when doing calculations on // float32 (32-bit floating point). optional bool allow_fp16_precision_for_fp32 = 10; // Whether to use NNAPI Burst mode. // Burst mode allows accelerators to efficiently manage resources, which // would significantly reduce overhead especially if the same delegate // instance is to be used for multiple inferences. optional bool use_burst_computation = 11; // Optional pointer to NNAPI Support Library provided pointer to // NnApiSLDriverImplFL5 which can be used to construct the // NNAPI delegate. optional int64 support_library_handle = 12; } // LINT.IfChange // Which GPU backend to select. Default behaviour on Android is to try OpenCL // and if it's not available fall back to OpenGL. enum GPUBackend { UNSET = 0; OPENCL = 1; OPENGL = 2; // Not yet supported. // VULKAN = 3; // METAL = 4; } // GPU inference priorities define relative priorities given by the GPU delegate // to different client needs. // Corresponds to TfLiteGpuInferencePriority. enum GPUInferencePriority { GPU_PRIORITY_AUTO = 0; GPU_PRIORITY_MAX_PRECISION = 1; GPU_PRIORITY_MIN_LATENCY = 2; GPU_PRIORITY_MIN_MEMORY_USAGE = 3; } // GPU inference preference for initialization time vs. inference time. // Corresponds to TfLiteGpuInferenceUsage. enum GPUInferenceUsage { // Delegate will be used only once, therefore, bootstrap/init time should // be taken into account. GPU_INFERENCE_PREFERENCE_FAST_SINGLE_ANSWER = 0; // Prefer maximizing the throughput. Same delegate will be used repeatedly on // multiple inputs. GPU_INFERENCE_PREFERENCE_SUSTAINED_SPEED = 1; } // GPU Delegate settings. // // See // https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/delegates/gpu/delegate.h message GPUSettings { // Obsolete: Ignored if inference_priority1/2/3 are set. optional bool is_precision_loss_allowed = 1; optional bool enable_quantized_inference = 2 [default = true]; optional GPUBackend force_backend = 3; // Ordered priorities provide better control over desired semantics, // where priority(n) is more important than priority(n+1). Therefore, // each time inference engine needs to make a decision, it uses // ordered priorities to do so. // // Default values correspond to GPU_PRIORITY_AUTO. // AUTO priority can only be used when higher priorities are fully specified. // For example: // VALID: priority1 = MIN_LATENCY, priority2 = AUTO, priority3 = AUTO // VALID: priority1 = MIN_LATENCY, priority2 = MAX_PRECISION, // priority3 = AUTO // INVALID: priority1 = AUTO, priority2 = MIN_LATENCY, priority3 = AUTO // INVALID: priority1 = MIN_LATENCY, priority2 = AUTO, // priority3 = MAX_PRECISION // Invalid priorities will result in error. // // For more information, see TfLiteGpuDelegateOptionsV2. optional GPUInferencePriority inference_priority1 = 4 [default = GPU_PRIORITY_AUTO]; optional GPUInferencePriority inference_priority2 = 5 [default = GPU_PRIORITY_AUTO]; optional GPUInferencePriority inference_priority3 = 6 [default = GPU_PRIORITY_AUTO]; // Whether to optimize for compilation+execution time or execution time only. optional GPUInferenceUsage inference_preference = 7; // Model serialization. Setting both of these fields will also set the // TFLITE_GPU_EXPERIMENTAL_FLAGS_ENABLE_SERIALIZATION flag on the delegate. // // GPU model serialization directory passed in TfLiteGpuDelegateOptionsV2. // This should be set to the application's code cache directory so that it can // not be accessed by other apps and is correctly deleted on app updates. // tflite::StatefulNnApiDelegate optional string cache_directory = 8; // Normally, the model name with version number should be provided here, since // each model needs an unique ID to avoid cache collision. optional string model_token = 9; } // LINT.ThenChange(GpuAccelerationConfig.java) // Hexagon Delegate settings. // // See // https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/delegates/hexagon/hexagon_delegate.h message HexagonSettings { optional int32 debug_level = 1; optional int32 powersave_level = 2; optional bool print_graph_profile = 3; optional bool print_graph_debug = 4; } // XNNPack Delegate settings. // // See // https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/delegates/xnnpack/xnnpack_delegate.h enum XNNPackFlags { // These flags match the flags in xnnpack_delegate.h. TFLITE_XNNPACK_DELEGATE_NO_FLAGS = 0; // Enable fast signed integer XNNpack kernels. TFLITE_XNNPACK_DELEGATE_FLAG_QS8 = 1; // Enable fast unsigned integer XNNpack kernels. TFLITE_XNNPACK_DELEGATE_FLAG_QU8 = 2; // Enable both, signed and unsigned integer XNNpack kernels. TFLITE_XNNPACK_DELEGATE_FLAG_QS8_QU8 = 3; // Force 16-bit floating point inference. TFLITE_XNNPACK_DELEGATE_FLAG_FORCE_FP16 = 4; // Enable XNNPACK acceleration for FULLY_CONNECTED operator with dynamic // weights. TFLITE_XNNPACK_DELEGATE_FLAG_DYNAMIC_FULLY_CONNECTED = 8; // Enable XNNPACK acceleration for VAR_HANDLE, READ_VARIABLE, and // ASSIGN_VARIABLE operators. TFLITE_XNNPACK_DELEGATE_FLAG_VARIABLE_OPERATORS = 16; // Enable transient indirection buffer to reduce memory usage in selected // operators. TFLITE_XNNPACK_DELEGATE_FLAG_TRANSIENT_INDIRECTION_BUFFER = 32; // Enable the latest XNNPACK operators and features in the delegate which have // not yet been enabled by default. TFLITE_XNNPACK_DELEGATE_FLAG_ENABLE_LATEST_OPERATORS = 64; // Enable XNNPack subgraph reshaping. TFLITE_XNNPACK_DELEGATE_FLAG_ENABLE_SUBGRAPH_RESHAPING = 128; } message XNNPackSettings { optional int32 num_threads = 1; // If flags is unset or zero, it means use the default XNNPack delegate flags. // Any other value means use exactly (and only) the flags specified. optional XNNPackFlags flags = 2; // Path to the XNNPack cache file. XNNPack packed buffers are saved to and // reloaded from this cache which can reduce initialization time and the // packing memory footprint. optional string weight_cache_file_path = 3; // Extra flags to pass to xnn_create_runtime. optional int32 runtime_flags = 4; } // CoreML Delegate settings. // // See // https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/delegates/coreml/coreml_delegate.h message CoreMLSettings { // Note the enum order change from the above header for better proto practice. enum EnabledDevices { // Always create Core ML delegate. DEVICES_ALL = 0; // Create Core ML delegate only on devices with Apple Neural Engine. DEVICES_WITH_NEURAL_ENGINE = 1; } // Only create delegate when Neural Engine is available on the device. optional EnabledDevices enabled_devices = 1; // Specifies target Core ML version for model conversion. // Core ML 3 come with a lot more ops, but some ops (e.g. reshape) is not // delegated due to input rank constraint. // if not set to one of the valid versions, the delegate will use highest // version possible in the platform. // Valid versions: (2, 3) optional int32 coreml_version = 2; // This sets the maximum number of Core ML delegates created. // Each graph corresponds to one delegated node subset in the // TFLite model. Set this to 0 to delegate all possible partitions. optional int32 max_delegated_partitions = 3 [default = 0]; // This sets the minimum number of nodes per partition delegated with // Core ML delegate. Defaults to 2. optional int32 min_nodes_per_partition = 4 [default = 2]; } // Stable delegate loader settings. // // See // tensorflow/lite/core/acceleration/configuration/c/stable_delegate.h // An example stable delegate: // tensorflow/lite/delegates/utils/experimental/sample_stable_delegate message StableDelegateLoaderSettings { // The path of the stable delegate shared object file. Then the stable // delegate provider can dynamically load the shared object file. optional string delegate_path = 1; // Uniquely identifies a delegate. Format (snake_case): {vendor}_{delegate}. // e.g. "google_edgetpu_delegate" optional string delegate_name = 2; } // Fields related to compilation caching. In this context compilation caching // refers to the concept of caching compilation artifacts that a delegate might // produce when translating a model graph into a delegate-internal structure // (for example, this could include compiled CPU code, or instructions for a // separate accelerator chip such as a GPU, TPU, or DSP). Caching compilation // artifacts can speed-up subsequent compilations, and hence the time it takes // to apply a delegate. // // Compilation caching is an optional feature. Setting these fields for a // delegate that does not implement it will have no effect. message CompilationCachingSettings { // The cache dir for the TFLite model. // If not set then the delegate should not try to cache the compilation. // // The delegate is responsible for synchronizing access to files in the // 'cache_dir'. E.g., it is legal to create multiple threads or processes, // each of which has its own delegate instance, and provide the same // 'cache_dir' to those delegate instances. optional string cache_dir = 1; // The unique token string for a TFLite model. A caller that wants the // delegate to cache the compilation should set this field. If set then it is // the caller's responsibility to ensure there is no clash of the tokens. // E.g., if an app uses several models (with this delegate) on a given device, // then no two models should have the same model_token. If no model token is // provided, but the 'cache_dir' is set, then the delegate might still cache // the compilation, e.g. by deriving a unique token internally, but this // behavior can be delegate-specific. NOTE: when using compilation caching, it // is not recommended to use the same delegate instance for multiple models. optional string model_token = 2; } // EdgeTPU device spec. // message EdgeTpuDeviceSpec { // EdgeTPU platform types. enum PlatformType { MMIO = 0; REFERENCE = 1; SIMULATOR = 2; REMOTE_SIMULATOR = 3; } // Execution platform for the EdgeTPU device. optional PlatformType platform_type = 1; // Number of chips to use for the EdgeTPU device. optional int32 num_chips = 2; // Paths to the EdgeTPU devices; repeated string device_paths = 3; // Chip family used by the EdgeTpu device. optional int32 chip_family = 4; } // Generic definitions of EdgeTPU power states. enum EdgeTpuPowerState { // Undefined power state. UNDEFINED_POWERSTATE = 0; // TPU core is off but control cluster is on. TPU_CORE_OFF = 1; // A non-active low-power state that has much smaller transition time to // active compared to off. READY = 2; // Minimum power active state. ACTIVE_MIN_POWER = 3; // Very low performance, very low power. ACTIVE_VERY_LOW_POWER = 4; // Low performance, low power. ACTIVE_LOW_POWER = 5; // The normal performance and power. This setting usually provides the // optimal perf/power trade-off for the average use-case. ACTIVE = 6; // Maximum performance level. Potentially higher power and thermal. This // setting may not be allowed in production depending on the system. OVER_DRIVE = 7; } message EdgeTpuInactivePowerConfig { // Inactive power states between inferences. optional EdgeTpuPowerState inactive_power_state = 1; // Inactive timeout in microseconds between inferences. optional int64 inactive_timeout_us = 2; } // EdgeTPU Delegate settings. // // For security reasons, only certain apps that are part of the platform's // trusted code base are permitted to use the features defined in this message. // General apps should use `GoogleEdgeTpuSettings` instead. message EdgeTpuSettings { // Float truncation types for EdgeTPU. enum FloatTruncationType { UNSPECIFIED = 0; NO_TRUNCATION = 1; BFLOAT16 = 2; HALF = 3; } enum QosClass { QOS_UNDEFINED = 0; BEST_EFFORT = 1; REALTIME = 2; } // Target inference power state for running the model. optional EdgeTpuPowerState inference_power_state = 1; // Inactive power states between inferences. repeated EdgeTpuInactivePowerConfig inactive_power_configs = 2; // Priority for the inference request. optional int32 inference_priority = 3 [default = -1]; // Device spec for creating the EdgeTpu device. optional EdgeTpuDeviceSpec edgetpu_device_spec = 4; // A unique identifier of the input TfLite model. optional string model_token = 5; // Float truncation type for EdgeTPU. optional FloatTruncationType float_truncation_type = 6; // QoS class to determine chunking size for PRO onward. optional QosClass qos_class = 7 [default = QOS_UNDEFINED]; // Cluster IDs the model will be compiled for. repeated int32 hardware_cluster_ids = 8 [packed = true]; // Public model ID to be logged in logs, traces and metrics for identifying // the model to help debugging. // The configured string must obey the following rules: // 1. Must not contain any confidential information, because public_model_id // will be logged in android logs and traces which are publicly visible. // 2. Must not contain any private user data or PII (Personally Identifiable // Information), such as age, language, geography, religion, etc. // 3. Should be <=30 chars, otherwise EdgeTpu software might truncate the // string due to logging size constraints. // 4. Please try to use a unique name so that it's easier to identify the // model during debugging. optional string public_model_id = 9; // Layer IR (intermediate representation) TGC (tensor graph in C++) backend // options. // * If set to YES, compile as per layer IR -> TGC -> codegen flow. // * If set to NO, compile as per layer IR -> layer IR -> codegen flow. // * If set to AUTO, we try to run as per layer IR -> TGC -> codegen flow. If // not successful, we will fallback to layer IR -> layer IR -> codegen flow. // * If UNSPECIFIED, it is same as NO for now. enum UseLayerIrTgcBackend { USE_LAYER_IR_TGC_BACKEND_UNSPECIFIED = 0; USE_LAYER_IR_TGC_BACKEND_NO = 1; USE_LAYER_IR_TGC_BACKEND_YES = 2; USE_LAYER_IR_TGC_BACKEND_AUTO = 3; } optional UseLayerIrTgcBackend use_layer_ir_tgc_backend = 10 [default = USE_LAYER_IR_TGC_BACKEND_UNSPECIFIED]; // Whether to use TPU server for the inference. optional bool use_tpu_server = 11 [default = false]; } // Google EdgeTPU delegate settings. message GoogleEdgeTpuSettings { enum Priority { PRIORITY_UNDEFINED = 0; PRIORITY_LOW = 1; PRIORITY_MEDIUM = 2; PRIORITY_HIGH = 3; } enum TriState { TRISTATE_UNDEFINED = 0; TRISTATE_FALSE = 1; TRISTATE_TRUE = 2; } // Controls the verbosity level of the delegate log messages. Set to -1 to let // the delegate choose. Otherwise, it must range from 0 to 10 (inclusive), // where lower values indicate less verbosity. A higher verbosity level may // have an adverse impact on the delegate performance. optional int32 log_verbosity = 1 [default = -1]; // Whether or not the client requests detailed delegate traces. // The resulting traces can be used for performance analysis with tools such // as perfetto (https://perfetto.dev/docs/quickstart/android-tracing). // Enabling tracing may have an adverse impact on the delegate performance. optional bool enable_tracing = 2 [default = false]; // Specifies the execution priority. The priority is global. Requests from // different clients are prioritized relative to one another. optional Priority priority = 3; // Reserved. optional bytes extension_data = 4; // A unique identifier of the input model. Creating delegates with different // user model binaries with the same model identifier will overwrite // previously cached entries, saving disk space. // If this field is not set, the model will be treated as a new entry, and // will cost disk space to cache. // This field is different from the model_token in CompilationCachingSettings, // where the users may reuse the same model_identifier for different flavors // of the same model to save disk space, whereas model_token must be unique. // Example usage: // (1) An app only uses one model, and wants to update the model. // For both the existing and new models, set: model_identifier = "my_model" // Creating the delegate with the new entry this way will delete the old // cache entry, and replace it with the new version of "my_model" // (2) An app A/B tests two versions of the same model (e.g. a stable version // and a testing/staging/beta version), and wants to frequently switch // between them. // The clients should use different model_identifier for the two variants. // Model_A: model_identifier = "my_model_a" // Model_B: model_identifier = "my_model_b" // Both Model A and B will be cached separately, and coexist for efficient // lookups. optional string model_identifier = 5 [default = ""]; // If set to true, the user must use TFLite Async API to run the inference. optional bool use_async_api = 6 [default = false]; // Specifies whether or not the delegate should handle cache management for // the imported input or output buffers with TFLite Async API. These // options have no effect if the user is not using the TFLite Async API. optional bool delegate_should_manage_cache_for_inputs = 7 [default = true]; optional bool delegate_should_manage_cache_for_outputs = 8 [default = true]; // Specifies whether or not cache coherency is preferred for the imported // input or output buffers with TFLite Async API. These options are purely // advisory. Even if the user specifies that cache coherency is preferred, // the delegate may still choose to use cache incoherent memory under certain // circumstances, e.g. hardware limitation. If it is set to // TRISTATE_UNDEFINED, the delegate will use the default value based on the // device type. These options have no effect if the user is not using the // TFLite Async API. optional TriState prefer_cache_coherency_for_inputs = 9; optional TriState prefer_cache_coherency_for_outputs = 10; // Whether to allow the accelerator to optionally use lower-precision // float16 (16-bit floating point) arithmetic when doing calculations on // float32 (32-bit floating point). optional bool allow_fp16_precision_for_fp32 = 11 [default = false]; } // Coral Dev Board / USB accelerator delegate settings. // // See // https://github.com/google-coral/edgetpu/blob/master/libedgetpu/edgetpu_c.h message CoralSettings { enum Performance { UNDEFINED = 0; MAXIMUM = 1; HIGH = 2; MEDIUM = 3; LOW = 4; } // The Edge Tpu device to be used. See // https://github.com/google-coral/libcoral/blob/982426546dfa10128376d0c24fd8a8b161daac97/coral/tflite_utils.h#L131-L137 optional string device = 1; // The desired performance level. This setting adjusts the internal clock // rate to achieve different performance / power balance. Higher performance // values improve speed, but increase power usage. optional Performance performance = 2 [default = MAXIMUM]; // If true, always perform device firmware update (DFU) after reset. DFU is // usually only necessary after power cycle. optional bool usb_always_dfu = 3; // The maximum bulk in queue length. Larger queue length may improve USB // performance on the direction from device to host. When not specified (or // zero), `usb_max_bulk_in_queue_length` will default to 32 according to the // current EdgeTpu Coral implementation. optional int32 usb_max_bulk_in_queue_length = 4; } message CPUSettings { // Set to -1 to let the interpreter choose. Otherwise, must be > 0. optional int32 num_threads = 1 [default = -1]; } // Arm NN Delegate Settings. // More information about Arm NN delegate options can be found in // https://arm-software.github.io/armnn/latest/delegate.xhtml#delegateoptions message ArmNNSettings { // A comma separated list without whitespaces of backends // which should be used for execution. Falls back to next backend in list // if previous does not provide support for operation. optional string backends = 1; // Allows the use of optimisation techniques e.g. Winograd that // will reduce execution time with the possibility of a drop in accuracy. optional bool fastmath = 2; // Additional Arm NN delegate options. See // https://arm-software.github.io/armnn/latest/delegate.xhtml#delegateoptions optional string additional_parameters = 3; } // MediaTek Neuron Delegate Settings. // See https://neuropilot.mediatek.com/ for more information. message MtkNeuronSettings { enum ExecutionPreference { PREFERENCE_UNDEFINED = 0; // Prefer execution in a power-efficient mode, optimizing for low power // consumption. PREFERENCE_LOW_POWER = 1; // Prefer execution that provides shorter single-shot latency, optimizing // for fast response times. PREFERENCE_FAST_SINGLE_ANSWER = 2; // Prefer execution that provides sustained speed for continuous operation // and higher throughput, optimizing for overall performance in ongoing or // repetitive tasks. PREFERENCE_SUSTAINED_SPEED = 3; // Prefer execution in the turbo boost mode, which may boost the frequencies // of APU and other system components such as CPU and DRAM, to achieve // maximum performance. If boosting is not supported in the underlying // system, it falls back to the behavior of PREFERENCE_FAST_SINGLE_ANSWER. PREFERENCE_TURBO_BOOST = 4; } enum ExecutionPriority { PRIORITY_UNDEFINED = 0; PRIORITY_LOW = 90; PRIORITY_MEDIUM = 100; PRIORITY_HIGH = 110; } enum OptimizationHint { OPTIMIZATION_NONE = 0; // Optimization hint for reducing latency. This hint may distribute the // workload across multiple APU cores in the compiled model to achieve // faster execution. OPTIMIZATION_LOW_LATENCY = 1; // Optimization hint for reducing DRAM access and minimizing memory // bandwidth usage through kernel fusion and data fusion techniques. OPTIMIZATION_DEEP_FUSION = 2; // Optimization hint for processing multiple input samples in parallel // across available APU cores in the batch dimension. This optimization is // effective for models with a batch size greater than 1. OPTIMIZATION_BATCH_PROCESSING = 3; } // How to check the operator compatibility with the underlying accelerator. enum OperationCheckMode { NO_OPERATION_CHECK = 0; // Checks each node separately with multiple queries to the backend. PER_NODE_OPERATION_CHECK = 1; // Checks all nodes in the graph at once with a batched query to the // backend. PRE_OPERATION_CHECK = 2; } // The preferred execution mode. The system-wide default will be used when // PREFERENCE_UNDEFINED is passed to the delegate. optional ExecutionPreference execution_preference = 1; // The execution priority of the inference request. The system-wide default // will be used when PRIORITY_UNDEFINED is passed to the delegate. optional ExecutionPriority execution_priority = 2; // The optimization hints that will instruct the model compiler. repeated OptimizationHint optimization_hints = 3 [packed = true]; // Whether and how to check the operator compatibility with the underlying // accelerator. optional OperationCheckMode operation_check_mode = 4; // Whether to allow the accelerator to optionally use lower-precision FP16 // arithmetic when performing calculations on FP32 data. optional bool allow_fp16_precision_for_fp32 = 5; // Whether to use AHardwareBuffer_* API to manage buffers. Requires Android // API level >= 26, or a dedicated AHardwareBuffer API shim on non-Android // platforms. optional bool use_ahwb = 6; // Whether to use cachable (consistent / coherent) memory. This will affect // both buffer allocation and buffer importing behaviors. optional bool use_cacheable_buffer = 7 [default = true]; // Extra options for the Neuron compiler, such as "--opt-bw". // See docs at https://neuropilot.mediatek.com/ for available options. repeated string compile_options = 8; // Optional list of target accelerator device names. // If empty, the delegate will automatically select the accelerator. // See docs at https://neuropilot.mediatek.com/ for available accelerators. repeated string accelerator_names = 9; // Optional path to the platform-dependent Neuron configuration file. // See docs at https://neuropilot.mediatek.com/ for more details. optional string neuron_config_path = 10; // The deadline time duration (in ms) of the inference (waiting + execution). // The scheduler would adjust scheduling based on this value. Note that // setting this value to zero implies no deadline requirement. optional int32 inference_deadline_ms = 11; // The maximum inference (waiting + execution) time duration (in ms). The // scheduler would abort the inference if the inference time dutation exceed // the time specified. Note that setting this value to zero implies no abort // time requirement. optional int32 inference_abort_time_ms = 12; } // How to configure TFLite. message TFLiteSettings { // Which delegate to use. optional Delegate delegate = 1; // How to configure the chosen delegate. // (In principle we would like to use 'oneof', but flatc turns that into an // nested anonymous table rather than a union. See // https://github.com/google/flatbuffers/issues/4628). optional NNAPISettings nnapi_settings = 2; optional GPUSettings gpu_settings = 3; optional HexagonSettings hexagon_settings = 4; optional XNNPackSettings xnnpack_settings = 5; optional CoreMLSettings coreml_settings = 11; // How to configure CPU execution. optional CPUSettings cpu_settings = 6; // Shared delegation settings. optional int32 max_delegated_partitions = 7; // For configuring the EdgeTpuDelegate. // See also `google_edgetpu_settings` below. optional EdgeTpuSettings edgetpu_settings = 8; // For configuring the Coral EdgeTpu Delegate. optional CoralSettings coral_settings = 10; // Whether to automatically fall back to TFLite CPU path. optional FallbackSettings fallback_settings = 9; // Whether to disable default delegates (XNNPack). // TODO(b/260405596): Update the comment to clarify the interaction between // `disable_default_delegates` and `fallback_settings`. optional bool disable_default_delegates = 12; // For loading a stable delegate. If an app supplies a delegate shared library // (e.g. packaged with the app, or downloaded separately), the app can use // this field for passing the path to the delegate shared library. // // The stable delegate loader settings field works together with the settings // of other concrete stable delegates; the stable delegate loader is not a // concrete delegate type but a mechanism for initializing the TF Lite stable // delegates. // // See // tensorflow/lite/delegates/utils/experimental/sample_stable_delegate optional StableDelegateLoaderSettings stable_delegate_loader_settings = 13; // For configuring the Google EdgeTpu Delegate. optional GoogleEdgeTpuSettings google_edgetpu_settings = 14; // Compilation caching settings. optional CompilationCachingSettings compilation_caching_settings = 15; // For configuring the Arm NN delegate. optional ArmNNSettings armnn_settings = 16; // For configuring MediaTek Neuron delegate. optional MtkNeuronSettings mtk_neuron_settings = 17; } // Whether to automatically fallback to TFLite CPU path on delegation errors. // // Typically fallback is enabled in production use but disabled in tests and // benchmarks to ensure they test the intended path. message FallbackSettings { // Whether to allow automatically falling back to TfLite CPU path on // compilation failure. Default is not allowing automatic fallback. // // This is useful in naive production usecases where the caller would prefer // for the model to run even if it's not accelerated. More advanced users will // implement fallback themselves; e.g., by using a different model on CPU. // // Note that compilation errors may occur either at initial // ModifyGraphWithDelegate() time, or when calling AllocateTensors() after // resizing. optional bool allow_automatic_fallback_on_compilation_error = 7; // Whether to allow automatically falling back to TfLite CPU path on // execution error. Default is not allowing automatic fallback. // // Experimental, use with care (only when you have complete control over the // client code). // // The caveat above for compilation error holds. Additionally, execution-time // errors are harder to handle automatically as they require invalidating the // TfLite interpreter which most client code has not been designed to deal // with. optional bool allow_automatic_fallback_on_execution_error = 8; } // On-device mini-benchmark result storage. The following definitions are used // to keep an append-only log of benchmark results on-device. (Hence there is // single top-level event that is used for all data). // // These definitions don't need a proto-to-flatbuffer conversion, since they are // not used for specifying configuration in the Tasks library. // Which stage of benchmarking the event is for. // There might be multiple events with the same type, if a benchmark is run // multiple times. enum BenchmarkEventType { UNDEFINED_BENCHMARK_EVENT_TYPE = 0; // Benchmark start. A start without an end can be interpreted as a test that // has crashed or hung. START = 1; // Benchmarking completion. A model was successfully loaded, acceleration // configured and inference run without errors. There may still be an issue // with correctness of results, or with performance. END = 2; // Benchmark was not completed due to an error. The error may be a handled // error (e.g., failure in a delegate), or a crash. ERROR = 3; // Benchmark data has been sent for logging. LOGGED = 4; // Benchmark encountered an error but was able to continue. The error is not // related to the model execution but to the mini-benchmark logic. An example // of error is a failure when trying to set the CPU affinity of the benchmark // runner process. RECOVERED_ERROR = 5; } // A correctness metric from a benchmark, for example KL-divergence between // known-good CPU output and on-device output. These are primarily used for // telemetry and monitored server-side. message BenchmarkMetric { optional string name = 1; repeated float values = 2 [packed = true]; } // Outcome of a successfully complete benchmark run. This information is // intended to both be used on-device to select best compute configuration as // well as sent to server for monitoring. // // Used with event type END. // Next ID: 7 message BenchmarkResult { // Time to load model and apply acceleration. Initialization may get run // multiple times to get information on variance. repeated int64 initialization_time_us = 1 [packed = true]; // Time to run inference (call Invoke()). Inference may get run multiple times // to get information on variance. repeated int64 inference_time_us = 2 [packed = true]; // Maximum memory used. Measures size of application heap (does not // necessarily take into account driver-side allocation. optional int32 max_memory_kb = 3; // Whether the inference produced correct results (validation graph output // 'ok' for all test inputs). Used on-device to disallow configurations that // produce incorrect results (e.g., due to OpenCL driver bugs). optional bool ok = 4; // Metrics that were used to determine the 'ok' status. repeated BenchmarkMetric metrics = 5; message InferenceOutput { // The matching Flatbuffer type is ubyte. optional bytes value = 1; } // Model output in byte format. Each InferenceOutput comes from one output // tensor. It is ordered the same as tflite::Interpreter::output_tensor(), // i.e. the value of output_tensor(i) is stored in actual_output[i]. Only // populated in custom validation case. repeated InferenceOutput actual_output = 6; } // A handled error. message ErrorCode { // Which delegate the error comes from (or NONE, if it comes from the tflite // framework). optional Delegate source = 1; // What the tflite level error is. optional int32 tflite_error = 2; // What the underlying error is (e.g., NNAPI or OpenGL error). optional int64 underlying_api_error = 3; } // When during benchmark execution an error occurred. enum BenchmarkStage { UNKNOWN = 0; // During model loading or delegation. INITIALIZATION = 1; // During inference. INFERENCE = 2; } // An error that occurred during benchmarking. // // Used with event type ERROR. message BenchmarkError { // How far benchmarking got. optional BenchmarkStage stage = 1; // Process exit code. optional int32 exit_code = 2; // Signal the process received. optional int32 signal = 3; // Handled tflite error. repeated ErrorCode error_code = 4; // Mini-benchmark error code. optional int32 mini_benchmark_error_code = 5; } // Top-level benchmarking event stored on-device. All events for a model are // parsed to detect the status. message BenchmarkEvent { // Which settings were used for benchmarking. optional TFLiteSettings tflite_settings = 1; // Type of the event. optional BenchmarkEventType event_type = 2; // Result of benchmark, used when type is END. optional BenchmarkResult result = 3; // Error during benchmark, used when type is ERROR. optional BenchmarkError error = 4; // Start timestamps. These are used for // 1. Checking whether a test was started but not completed within a given // deadline. // 2. Optionally, telemetry timestamps. optional int64 boottime_us = 5; optional int64 wallclock_us = 6; } // Represent the decision on the best acceleration from the mini-benchmark. message BestAccelerationDecision { // Number of events used to take the decision. // Using just the size instaed of the full list of events to save space. optional int32 number_of_source_events = 1; // Event with min latency in the source ones. optional BenchmarkEvent min_latency_event = 2; // Min latency as read from min_latency_event. optional int64 min_inference_time_us = 3; } // Represent a failure during the initialization of the mini-benchmark. message BenchmarkInitializationFailure { // Status code returned by the mini-benchmark initialization function. optional int32 initialization_status = 1; } // Events generated by the mini-benchmark before and after triggering // the different configuration-specific benchmarks message MiniBenchmarkEvent { // Not using oneof because of the way the generated cpp code. // See comment above on TfLite settings for details. // If set to true, this event is used to mark all previous events in the // mini-benchmark internal storage as read and one of the other fields // in this message will have a value. optional bool is_log_flushing_event = 1; // Event generated when a best acceleration decision is taken. optional BestAccelerationDecision best_acceleration_decision = 2; // Reports a failure during mini-benchmark initialization. optional BenchmarkInitializationFailure initialization_failure = 3; // Event generated while benchmarking the different settings to test locally. optional BenchmarkEvent benchmark_event = 4; } // How to access the model for mini-benchmark. // Mini-benchmark can read the model from a file path, a file // descriptor, or in-memory model. The file descriptor typically comes from the // Android asset manager. Since mini-benchmark runs in a separate process, it // can not access the in-memory model directly. Instead, it will copy the // in-memory model to the validation process. // // Users should set one of the following: // 1) filename, or // 2) all of fd, offset (optional, default to 0) and length, or // 3) both buffer_handle and length. message ModelFile { // Filename for reading model from. optional string filename = 1; // File descriptor to read model from. optional int64 fd = 2; // Offset for model in file descriptor. optional int64 offset = 3; // Length of model. optional int64 length = 4; optional ModelIdGroup model_id_group = 5; // In-memory buffer handle to the model. This handle will be cast to a pointer // of type const uint8_t* to load the model. The caller needs to ensure the // buffer handle out-lives the mini-benchmark main process. // NOTE: When using buffer_handle, this proto should not serialized and copied // across process boundaries (e.g. via a file), since it may contain handles // that refer to addresses in the current process's address space. optional int64 buffer_handle = 6; } message ModelIdGroup { optional string model_namespace = 1; optional string model_id = 2; } // Where to store mini-benchmark state. message BenchmarkStoragePaths { // Base path to the files used to store benchmark results in. Two files // will be generated: one with the given path and an extra file to store // events related to best acceleration results at path storage_file_path + // ".extra.fb". Must be specific to the model. // Note on Android, this should be the code cache directory. optional string storage_file_path = 1; // Path to a directory for intermediate files (lock files, extracted // binaries). // Note on Android, this typically is the data cache directory (i.e. the one // returned by `getCacheDir()`). optional string data_directory_path = 2; } // Validation related settings. // Next ID: 2 message ValidationSettings { // Timeout for one settings under test. If test didn't finish within this // timeout, this setting is considered hanging. optional int64 per_test_timeout_ms = 1; } // How to run a minibenchmark. // Next ID: 5 message MinibenchmarkSettings { // Which settings to test. This would typically be filled in from an // allowlist. repeated TFLiteSettings settings_to_test = 1; // How to access the model. This would typically be set dynamically, as it // depends on the application folder and/or runtime state. // NOTE: When using buffer_handle, this proto should not serialized and copied // across process boundaries (e.g. via a file), since it may contain handles // that refer to addresses in the current process's address space. optional ModelFile model_file = 2; // Where to store state. This would typically be set dynamically, as it // depends on the application folder. optional BenchmarkStoragePaths storage_paths = 3; // Validation test related settings. optional ValidationSettings validation_settings = 4; } // Schema used for cache Benchmark result. message BenchmarkEventStorage { optional ModelIdGroup model_id_group = 1; optional BenchmarkEvent benchmark_event = 2; } // LINT.ThenChange(//tensorflow/lite/acceleration/configuration/testdata/configuration.proto_prev:all)