meta-digi/meta-digi-dey/dynamic-layers/imx-machine-learning/recipes-nnstreamer/nnstreamer/nnstreamer/0001-Fix-to-provide-default...

126 lines
5.6 KiB
Diff

From e7585fe374349fb6e022c7515271a2ca475015b2 Mon Sep 17 00:00:00 2001
From: Nolann Chobert <nolann.chobert@nxp.com>
Date: Thu, 16 Oct 2025 17:39:33 +0200
Subject: [PATCH] [Filter/TFLite] Fix to provide default delegates
Some external delegates might need to access default delegates such as
XNNPACK to accelerate unsupported operations.
Upstream-Status: Pending
Signed-off-by: Nolann Chobert <nolann.chobert@nxp.com>
---
.../tensor_filter_tensorflow_lite.cc | 41 ++++++++++++-------
1 file changed, 26 insertions(+), 15 deletions(-)
diff --git a/ext/nnstreamer/tensor_filter/tensor_filter_tensorflow_lite.cc b/ext/nnstreamer/tensor_filter/tensor_filter_tensorflow_lite.cc
index 95ab68c6..d293e78c 100644
--- a/ext/nnstreamer/tensor_filter/tensor_filter_tensorflow_lite.cc
+++ b/ext/nnstreamer/tensor_filter/tensor_filter_tensorflow_lite.cc
@@ -98,13 +98,6 @@
#define TFLITE_SUBPLUGIN_NAME "tensorflow-lite"
#endif
-/**
- * @brief prevent usage by TFLite of default delegates that may not be supported
- */
-#if TFLITE_VERSION_MAJOR >= 2 && TFLITE_VERSION_MINOR >= 4
-#define TFLITE_RESOLVER_WITHOUT_DEFAULT_DELEGATES
-#endif
-
/**
* @brief Macro for debug mode.
*/
@@ -157,6 +150,7 @@ typedef struct {
GHashTable *ext_delegate_kv_table; /**< external delegate key values options */
QNNBackendType qnn_backend_type; /**< QNN Delegate backend type */
QNNPerformanceMode qnn_performance_mode; /**< QNN Delegate performance mode */
+ bool use_default_delegates; /**< whether to use default delegates in resolver */
} tflite_option_s;
/**
@@ -197,6 +191,10 @@ class TFLiteInterpreter
void setModelPath (const char *model_path);
void setExtDelegate (const char *lib_path, GHashTable *key_val);
void getExtDelegate (const char **lib_path, GHashTable **key_val);
+ void setUseDefaultDelegates (gboolean use_default)
+ {
+ use_default_delegates = use_default;
+ }
/** @brief get current model path */
const char *getModelPath ()
{
@@ -248,6 +246,7 @@ class TFLiteInterpreter
GHashTable *ext_delegate_kv_table; /**< external delegate key values options */
QNNBackendType qnn_backend_type; /**< QNN Delegate backend type */
QNNPerformanceMode qnn_performance_mode; /**< QNN Delegate performance mode */
+ bool use_default_delegates; /**< whether to use default delegates in resolver */
std::unique_ptr<tflite::Interpreter> interpreter;
std::unique_ptr<tflite::FlatBufferModel> model;
@@ -324,6 +323,7 @@ TFLiteInterpreter::TFLiteInterpreter ()
ext_delegate_kv_table = nullptr;
qnn_backend_type = QNN_BACKEND_UNDEFINED;
qnn_performance_mode = QNN_PERFMODE_Default;
+ use_default_delegates = FALSE;
g_mutex_init (&mutex);
@@ -460,12 +460,14 @@ TFLiteInterpreter::loadModel (int num_threads, tflite_delegate_e delegate_e)
interpreter = nullptr;
-#ifdef TFLITE_RESOLVER_WITHOUT_DEFAULT_DELEGATES
- tflite::ops::builtin::BuiltinOpResolverWithoutDefaultDelegates resolver;
-#else
- tflite::ops::builtin::BuiltinOpResolver resolver;
-#endif
- tflite::InterpreterBuilder (*model, resolver) (&interpreter);
+ if (use_default_delegates) {
+ tflite::ops::builtin::BuiltinOpResolver resolver;
+ tflite::InterpreterBuilder (*model, resolver) (&interpreter);
+ } else {
+ tflite::ops::builtin::BuiltinOpResolverWithoutDefaultDelegates resolver;
+ tflite::InterpreterBuilder (*model, resolver) (&interpreter);
+ }
+
if (!interpreter) {
ml_loge ("Failed to construct interpreter\n");
return -2;
@@ -1075,6 +1077,7 @@ TFLiteCore::init (tflite_option_s *option)
{
interpreter->setModelPath (option->model_file);
interpreter->setExtDelegate (option->ext_delegate_path, option->ext_delegate_kv_table);
+ interpreter->setUseDefaultDelegates (option->use_default_delegates);
interpreter->qnn_backend_type = option->qnn_backend_type;
interpreter->qnn_performance_mode = option->qnn_performance_mode;
num_threads = option->num_threads;
@@ -1395,6 +1398,13 @@ tflite_parseCustomOption (const GstTensorFilterProperties *prop, tflite_option_s
if (g_ascii_strcasecmp (pair[0], "NumThreads") == 0) {
option->num_threads = (int) g_ascii_strtoll (pair[1], NULL, 10);
+ } else if (g_ascii_strcasecmp (pair[0], "UseDefaultDelegates") == 0) {
+ if (g_ascii_strcasecmp (pair[1], "true") == 0 || g_ascii_strcasecmp (pair[1], "1") == 0)
+ option->use_default_delegates = TRUE;
+ else if (g_ascii_strcasecmp (pair[1], "false") == 0 || g_ascii_strcasecmp (pair[1], "0") == 0)
+ option->use_default_delegates = FALSE;
+ else
+ ml_logw ("Invalid value for UseDefaultDelegates (%s). Use 'true' or 'false'.", pair[1]);
} else if (g_ascii_strcasecmp (pair[0], "Delegate") == 0) {
if (g_ascii_strcasecmp (pair[1], "NNAPI") == 0)
option->delegate = TFLITE_DELEGATE_NNAPI;
@@ -1777,8 +1787,9 @@ _nns_filter_register_tflite (void)
{
nnstreamer_filter_probe (&NNS_support_tensorflow_lite);
nnstreamer_filter_set_custom_property_desc (NNS_support_tensorflow_lite.v0.name,
- "NumThreads", "Number of threads. Set 0 for default behaviors.", "Delegate",
- "TF-Lite delegation options: {'NNAPI', 'GPU', 'XNNPACK', 'External', 'QNN'}."
+ "NumThreads", "Number of threads. Set 0 for default behaviors.",
+ "UseDefaultDelegates", "Whether to use default delegates in resolver. Set 'true' or 'false'. Default is 'false'.",
+ "Delegate", "TF-Lite delegation options: {'NNAPI', 'GPU', 'XNNPACK', 'External', 'QNN'}."
" Do not specify to disable delegation.",
"ExtDelegateLib", "Path to external delegate shared library", "ExtDelegateKeyVal",
"key/values pairs optional parameters for delegate."
--
2.34.1