This is an automated email from the ASF dual-hosted git repository. xiaoxiang pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/nuttx-apps.git
commit dda8cab3355041ef5fbed333b973d91001d7834b Author: xinhaiteng <xinhait...@xiaomi.com> AuthorDate: Thu Apr 25 11:38:19 2024 +0800 ml: tflm mean optimization patch Separate the Int8 implementation of the 'mean' operator to reduce the code size. Signed-off-by: xinhaiteng <xinhait...@xiaomi.com> --- mlearning/tflite-micro/0003-mean-int8.patch | 112 ++++++++++++++++++++++++++++ mlearning/tflite-micro/Makefile | 1 + 2 files changed, 113 insertions(+) diff --git a/mlearning/tflite-micro/0003-mean-int8.patch b/mlearning/tflite-micro/0003-mean-int8.patch new file mode 100644 index 000000000..de45afe8b --- /dev/null +++ b/mlearning/tflite-micro/0003-mean-int8.patch @@ -0,0 +1,112 @@ +From 9507345939722d4bc2f2791394217680fc5c987b Mon Sep 17 00:00:00 2001 +From: xinhaiteng <xinhait...@xiaomi.com> +Date: Wed, 24 Apr 2024 09:26:54 +0800 +Subject: [PATCH] tflite: add mean-int8 operator + +VELAPLATFO-30990 + +Separate the Int8 implementation of the 'mean' operator to reduce the code size. + +Change-Id: I5eb9e3cc939668b6531ef9e56f7c32090f1de141 +Signed-off-by: xinhaiteng <xinhait...@xiaomi.com> +--- + tensorflow/lite/micro/kernels/reduce.cc | 9 +++++++++ + tensorflow/lite/micro/kernels/reduce.h | 3 +++ + tensorflow/lite/micro/kernels/reduce_common.cc | 16 ++++++++++++++++ + .../lite/micro/micro_mutable_op_resolver.h | 5 +++-- + 4 files changed, 31 insertions(+), 2 deletions(-) + +diff --git a/tensorflow/lite/micro/kernels/reduce.cc b/tensorflow/lite/micro/kernels/reduce.cc +index a689d3b93..090bafc3c 100644 +--- a/tensorflow/lite/micro/kernels/reduce.cc ++++ b/tensorflow/lite/micro/kernels/reduce.cc +@@ -49,6 +49,11 @@ TfLiteStatus EvalMean(TfLiteContext* context, TfLiteNode* node) { + static_cast<OpDataReduce*>(node->user_data)); + } + ++TfLiteStatus EvalMeanInt8(TfLiteContext* context, TfLiteNode* node) { ++ return EvalMeanHelperInt8(context, node, ++ static_cast<OpDataReduce*>(node->user_data)); ++} ++ + TfLiteStatus EvalMax(TfLiteContext* context, TfLiteNode* node) { + OpDataReduce* op_data = static_cast<OpDataReduce*>(node->user_data); + return EvalMaxHelper(context, node, op_data); +@@ -63,6 +68,10 @@ TFLMRegistration Register_MEAN() { + return tflite::micro::RegisterOp(InitReduce, PrepareMeanOrSum, EvalMean); + } + ++TFLMRegistration Register_MEAN_INT8() { ++ return tflite::micro::RegisterOp(InitReduce, PrepareMeanOrSum, EvalMeanInt8); ++} ++ + TFLMRegistration Register_REDUCE_MAX() { + return tflite::micro::RegisterOp(InitReduce, PrepareMax, EvalMax); + } +diff --git a/tensorflow/lite/micro/kernels/reduce.h b/tensorflow/lite/micro/kernels/reduce.h +index 2daeef5fe..0e29b3af8 100644 +--- a/tensorflow/lite/micro/kernels/reduce.h ++++ b/tensorflow/lite/micro/kernels/reduce.h +@@ -50,6 +50,8 @@ TfLiteStatus EvalMaxHelper(TfLiteContext* context, TfLiteNode* node, + OpDataReduce* op_data); + TfLiteStatus EvalMeanHelper(TfLiteContext* context, TfLiteNode* node, + OpDataReduce* op_data); ++TfLiteStatus EvalMeanHelperInt8(TfLiteContext* context, TfLiteNode* node, ++ OpDataReduce* op_data); + TfLiteStatus EvalSumHelper(TfLiteContext* context, TfLiteNode* node, + OpDataReduce* op_data); + +@@ -57,6 +59,7 @@ void ReduceResolveAxis(const int* axis_data, int axis_count, + MeanParams* op_params); + + TFLMRegistration Register_MEAN(); ++TFLMRegistration Register_MEAN_INT8(); + TFLMRegistration Register_REDUCE_MAX(); + TFLMRegistration Register_SUM(); + +diff --git a/tensorflow/lite/micro/kernels/reduce_common.cc b/tensorflow/lite/micro/kernels/reduce_common.cc +index 2c1a92a50..6e4ab1cc9 100644 +--- a/tensorflow/lite/micro/kernels/reduce_common.cc ++++ b/tensorflow/lite/micro/kernels/reduce_common.cc +@@ -236,6 +236,22 @@ TfLiteStatus EvalMeanHelper(TfLiteContext* context, TfLiteNode* node, + return kTfLiteOk; + } + ++TfLiteStatus EvalMeanHelperInt8(TfLiteContext* context, TfLiteNode* node, ++ OpDataReduce* op_data) { ++ const TfLiteEvalTensor* input = tflite::micro::GetEvalInput(context, node, 0); ++ const TfLiteEvalTensor* axis = tflite::micro::GetEvalInput(context, node, 1); ++ ++ int num_axis = static_cast<int>(ElementCount(*axis->dims)); ++ int temp_index[kMaxNumberOfAxis]; ++ int resolved_axis[kMaxNumberOfReducedAxis]; ++ ++ TFLITE_DCHECK(input->type == kTfLiteInt8); ++ TF_LITE_ENSURE_OK( ++ context, EvalIntegerMean<int8_t>(context, node, num_axis, op_data, ++ temp_index, resolved_axis)); ++ return kTfLiteOk; ++} ++ + TfLiteStatus EvalMaxHelper(TfLiteContext* context, TfLiteNode* node, + OpDataReduce* op_data) { + const TfLiteEvalTensor* input = tflite::micro::GetEvalInput(context, node, 0); +diff --git a/tensorflow/lite/micro/micro_mutable_op_resolver.h b/tensorflow/lite/micro/micro_mutable_op_resolver.h +index ec8979c4e..253f83de1 100644 +--- a/tensorflow/lite/micro/micro_mutable_op_resolver.h ++++ b/tensorflow/lite/micro/micro_mutable_op_resolver.h +@@ -432,8 +432,9 @@ class MicroMutableOpResolver : public MicroOpResolver { + ParseMirrorPad); + } + +- TfLiteStatus AddMean() { +- return AddBuiltin(BuiltinOperator_MEAN, Register_MEAN(), ParseReducer); ++ TfLiteStatus AddMean( ++ const TFLMRegistration& registration = Register_MEAN()) { ++ return AddBuiltin(BuiltinOperator_MEAN, registration, ParseReducer); + } + + TfLiteStatus AddMinimum() { +-- +2.25.1 + diff --git a/mlearning/tflite-micro/Makefile b/mlearning/tflite-micro/Makefile index f6169e152..c016ed8c8 100644 --- a/mlearning/tflite-micro/Makefile +++ b/mlearning/tflite-micro/Makefile @@ -30,6 +30,7 @@ tflite-micro.zip: $(Q) patch -d $(TFLITE_MICRO_UNPACK) -p1 < tflite-micro.patch $(Q) patch -d $(TFLITE_MICRO_UNPACK) -p1 < 0001-dequantize-int8.patch $(Q) patch -d $(TFLITE_MICRO_UNPACK) -p1 < 0002-quantize-int8.patch + $(Q) patch -d $(TFLITE_MICRO_UNPACK) -p1 < 0003-mean-int8.patch # Download and unpack tarball if no git repo found ifeq ($(wildcard tflite-micro/.git),)