Files
wehub-resource-sync 8a852e4b4e
cffconvert / validate (push) Has been skipped
License Check / license-check (push) Failing after 2s
chore: import upstream snapshot with attribution
2026-07-13 12:14:16 +08:00

1151 lines
46 KiB
Protocol Buffer

// 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)