blob: d63e36b5fa9a1f5ceb4b7dc1c889c1dd8572a68b [file] [edit]
From 1c747fd6365504125688579d75e74f58ff3b4ec0 Mon Sep 17 00:00:00 2001
From: Tommy Chiang <ototot@google.com>
Date: Tue, 22 Oct 2024 01:47:18 +0000
Subject: [PATCH] Add QoS/Preemption options to MtkNeuronSettings
PiperOrigin-RevId: 687135593
PATCH_NAME=mtk-preemption
---
.../configuration/configuration.proto | 11 +++++
.../configuration/configuration_generated.h | 46 ++++++++++++++++---
.../configuration/flatbuffer_to_proto.cc | 4 ++
.../configuration/flatbuffer_to_proto_test.cc | 4 ++
.../configuration/proto_to_flatbuffer.cc | 3 +-
.../configuration/proto_to_flatbuffer_test.cc | 8 ++++
6 files changed, 69 insertions(+), 7 deletions(-)
diff --git a/tensorflow/lite/acceleration/configuration/configuration.proto b/tensorflow/lite/acceleration/configuration/configuration.proto
index 657ae5e1..33bc6d95 100644
--- a/tensorflow/lite/acceleration/configuration/configuration.proto
+++ b/tensorflow/lite/acceleration/configuration/configuration.proto
@@ -787,6 +787,17 @@ message MtkNeuronSettings {
// 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.
diff --git a/tensorflow/lite/acceleration/configuration/configuration_generated.h b/tensorflow/lite/acceleration/configuration/configuration_generated.h
index 2820f7c4..ef43aa6f 100644
--- a/tensorflow/lite/acceleration/configuration/configuration_generated.h
+++ b/tensorflow/lite/acceleration/configuration/configuration_generated.h
@@ -2835,6 +2835,8 @@ struct MtkNeuronSettingsT : public ::flatbuffers::NativeTable {
std::vector<std::string> compile_options{};
std::vector<std::string> accelerator_names{};
std::string neuron_config_path{};
+ int32_t inference_deadline_ms = 0;
+ int32_t inference_abort_time_ms = 0;
};
struct MtkNeuronSettings FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table {
@@ -2850,7 +2852,9 @@ struct MtkNeuronSettings FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table
VT_USE_CACHEABLE_BUFFER = 16,
VT_COMPILE_OPTIONS = 18,
VT_ACCELERATOR_NAMES = 20,
- VT_NEURON_CONFIG_PATH = 22
+ VT_NEURON_CONFIG_PATH = 22,
+ VT_INFERENCE_DEADLINE_MS = 24,
+ VT_INFERENCE_ABORT_TIME_MS = 26
};
tflite::MtkNeuronSettings_::ExecutionPreference execution_preference() const {
return static_cast<tflite::MtkNeuronSettings_::ExecutionPreference>(GetField<int32_t>(VT_EXECUTION_PREFERENCE, 0));
@@ -2882,6 +2886,12 @@ struct MtkNeuronSettings FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table
const ::flatbuffers::String *neuron_config_path() const {
return GetPointer<const ::flatbuffers::String *>(VT_NEURON_CONFIG_PATH);
}
+ int32_t inference_deadline_ms() const {
+ return GetField<int32_t>(VT_INFERENCE_DEADLINE_MS, 0);
+ }
+ int32_t inference_abort_time_ms() const {
+ return GetField<int32_t>(VT_INFERENCE_ABORT_TIME_MS, 0);
+ }
bool Verify(::flatbuffers::Verifier &verifier) const {
return VerifyTableStart(verifier) &&
VerifyField<int32_t>(verifier, VT_EXECUTION_PREFERENCE, 4) &&
@@ -2900,6 +2910,8 @@ struct MtkNeuronSettings FLATBUFFERS_FINAL_CLASS : private ::flatbuffers::Table
verifier.VerifyVectorOfStrings(accelerator_names()) &&
VerifyOffset(verifier, VT_NEURON_CONFIG_PATH) &&
verifier.VerifyString(neuron_config_path()) &&
+ VerifyField<int32_t>(verifier, VT_INFERENCE_DEADLINE_MS, 4) &&
+ VerifyField<int32_t>(verifier, VT_INFERENCE_ABORT_TIME_MS, 4) &&
verifier.EndTable();
}
MtkNeuronSettingsT *UnPack(const ::flatbuffers::resolver_function_t *_resolver = nullptr) const;
@@ -2941,6 +2953,12 @@ struct MtkNeuronSettingsBuilder {
void add_neuron_config_path(::flatbuffers::Offset<::flatbuffers::String> neuron_config_path) {
fbb_.AddOffset(MtkNeuronSettings::VT_NEURON_CONFIG_PATH, neuron_config_path);
}
+ void add_inference_deadline_ms(int32_t inference_deadline_ms) {
+ fbb_.AddElement<int32_t>(MtkNeuronSettings::VT_INFERENCE_DEADLINE_MS, inference_deadline_ms, 0);
+ }
+ void add_inference_abort_time_ms(int32_t inference_abort_time_ms) {
+ fbb_.AddElement<int32_t>(MtkNeuronSettings::VT_INFERENCE_ABORT_TIME_MS, inference_abort_time_ms, 0);
+ }
explicit MtkNeuronSettingsBuilder(::flatbuffers::FlatBufferBuilder &_fbb)
: fbb_(_fbb) {
start_ = fbb_.StartTable();
@@ -2963,8 +2981,12 @@ inline ::flatbuffers::Offset<MtkNeuronSettings> CreateMtkNeuronSettings(
bool use_cacheable_buffer = true,
::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> compile_options = 0,
::flatbuffers::Offset<::flatbuffers::Vector<::flatbuffers::Offset<::flatbuffers::String>>> accelerator_names = 0,
- ::flatbuffers::Offset<::flatbuffers::String> neuron_config_path = 0) {
+ ::flatbuffers::Offset<::flatbuffers::String> neuron_config_path = 0,
+ int32_t inference_deadline_ms = 0,
+ int32_t inference_abort_time_ms = 0) {
MtkNeuronSettingsBuilder builder_(_fbb);
+ builder_.add_inference_abort_time_ms(inference_abort_time_ms);
+ builder_.add_inference_deadline_ms(inference_deadline_ms);
builder_.add_neuron_config_path(neuron_config_path);
builder_.add_accelerator_names(accelerator_names);
builder_.add_compile_options(compile_options);
@@ -2989,7 +3011,9 @@ inline ::flatbuffers::Offset<MtkNeuronSettings> CreateMtkNeuronSettingsDirect(
bool use_cacheable_buffer = true,
const std::vector<::flatbuffers::Offset<::flatbuffers::String>> *compile_options = nullptr,
const std::vector<::flatbuffers::Offset<::flatbuffers::String>> *accelerator_names = nullptr,
- const char *neuron_config_path = nullptr) {
+ const char *neuron_config_path = nullptr,
+ int32_t inference_deadline_ms = 0,
+ int32_t inference_abort_time_ms = 0) {
auto optimization_hints__ = optimization_hints ? _fbb.CreateVector<int32_t>(*optimization_hints) : 0;
auto compile_options__ = compile_options ? _fbb.CreateVector<::flatbuffers::Offset<::flatbuffers::String>>(*compile_options) : 0;
auto accelerator_names__ = accelerator_names ? _fbb.CreateVector<::flatbuffers::Offset<::flatbuffers::String>>(*accelerator_names) : 0;
@@ -3005,7 +3029,9 @@ inline ::flatbuffers::Offset<MtkNeuronSettings> CreateMtkNeuronSettingsDirect(
use_cacheable_buffer,
compile_options__,
accelerator_names__,
- neuron_config_path__);
+ neuron_config_path__,
+ inference_deadline_ms,
+ inference_abort_time_ms);
}
::flatbuffers::Offset<MtkNeuronSettings> CreateMtkNeuronSettings(::flatbuffers::FlatBufferBuilder &_fbb, const MtkNeuronSettingsT *_o, const ::flatbuffers::rehasher_function_t *_rehasher = nullptr);
@@ -5534,7 +5560,9 @@ inline bool operator==(const MtkNeuronSettingsT &lhs, const MtkNeuronSettingsT &
(lhs.use_cacheable_buffer == rhs.use_cacheable_buffer) &&
(lhs.compile_options == rhs.compile_options) &&
(lhs.accelerator_names == rhs.accelerator_names) &&
- (lhs.neuron_config_path == rhs.neuron_config_path);
+ (lhs.neuron_config_path == rhs.neuron_config_path) &&
+ (lhs.inference_deadline_ms == rhs.inference_deadline_ms) &&
+ (lhs.inference_abort_time_ms == rhs.inference_abort_time_ms);
}
inline bool operator!=(const MtkNeuronSettingsT &lhs, const MtkNeuronSettingsT &rhs) {
@@ -5561,6 +5589,8 @@ inline void MtkNeuronSettings::UnPackTo(MtkNeuronSettingsT *_o, const ::flatbuff
{ auto _e = compile_options(); if (_e) { _o->compile_options.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->compile_options[_i] = _e->Get(_i)->str(); } } else { _o->compile_options.resize(0); } }
{ auto _e = accelerator_names(); if (_e) { _o->accelerator_names.resize(_e->size()); for (::flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->accelerator_names[_i] = _e->Get(_i)->str(); } } else { _o->accelerator_names.resize(0); } }
{ auto _e = neuron_config_path(); if (_e) _o->neuron_config_path = _e->str(); }
+ { auto _e = inference_deadline_ms(); _o->inference_deadline_ms = _e; }
+ { auto _e = inference_abort_time_ms(); _o->inference_abort_time_ms = _e; }
}
inline ::flatbuffers::Offset<MtkNeuronSettings> MtkNeuronSettings::Pack(::flatbuffers::FlatBufferBuilder &_fbb, const MtkNeuronSettingsT* _o, const ::flatbuffers::rehasher_function_t *_rehasher) {
@@ -5581,6 +5611,8 @@ inline ::flatbuffers::Offset<MtkNeuronSettings> CreateMtkNeuronSettings(::flatbu
auto _compile_options = _o->compile_options.size() ? _fbb.CreateVectorOfStrings(_o->compile_options) : 0;
auto _accelerator_names = _o->accelerator_names.size() ? _fbb.CreateVectorOfStrings(_o->accelerator_names) : 0;
auto _neuron_config_path = _o->neuron_config_path.empty() ? 0 : _fbb.CreateString(_o->neuron_config_path);
+ auto _inference_deadline_ms = _o->inference_deadline_ms;
+ auto _inference_abort_time_ms = _o->inference_abort_time_ms;
return tflite::CreateMtkNeuronSettings(
_fbb,
_execution_preference,
@@ -5592,7 +5624,9 @@ inline ::flatbuffers::Offset<MtkNeuronSettings> CreateMtkNeuronSettings(::flatbu
_use_cacheable_buffer,
_compile_options,
_accelerator_names,
- _neuron_config_path);
+ _neuron_config_path,
+ _inference_deadline_ms,
+ _inference_abort_time_ms);
}
diff --git a/tensorflow/lite/acceleration/configuration/flatbuffer_to_proto.cc b/tensorflow/lite/acceleration/configuration/flatbuffer_to_proto.cc
index 87f822cf..8ed43c97 100644
--- a/tensorflow/lite/acceleration/configuration/flatbuffer_to_proto.cc
+++ b/tensorflow/lite/acceleration/configuration/flatbuffer_to_proto.cc
@@ -469,6 +469,10 @@ proto::MtkNeuronSettings ConvertMtkNeuronSettings(
proto_settings.set_neuron_config_path(settings.neuron_config_path()->str());
}
+ proto_settings.set_inference_deadline_ms(settings.inference_deadline_ms());
+ proto_settings.set_inference_abort_time_ms(
+ settings.inference_abort_time_ms());
+
return proto_settings;
}
diff --git a/tensorflow/lite/acceleration/configuration/flatbuffer_to_proto_test.cc b/tensorflow/lite/acceleration/configuration/flatbuffer_to_proto_test.cc
index bd5ef446..7ac336c8 100644
--- a/tensorflow/lite/acceleration/configuration/flatbuffer_to_proto_test.cc
+++ b/tensorflow/lite/acceleration/configuration/flatbuffer_to_proto_test.cc
@@ -572,6 +572,8 @@ TEST_F(ConversionTest, MtkNeuronSettings) {
input_settings->compile_options = {"TEST_COMPILE_OPTIONS"};
input_settings->accelerator_names = {"TEST_ACCELERATOR_NAME"};
input_settings->neuron_config_path = "TEST_NEURON_CONFIG_PATH";
+ input_settings->inference_deadline_ms = 1337;
+ input_settings->inference_abort_time_ms = 42;
const proto::ComputeSettings compute = ConvertFromFlatbuffer(settings_);
const proto::MtkNeuronSettings& output_settings =
@@ -596,6 +598,8 @@ TEST_F(ConversionTest, MtkNeuronSettings) {
EXPECT_EQ(output_settings.accelerator_names().size(), 1);
EXPECT_EQ(output_settings.accelerator_names().at(0), "TEST_ACCELERATOR_NAME");
EXPECT_EQ(output_settings.neuron_config_path(), "TEST_NEURON_CONFIG_PATH");
+ EXPECT_EQ(output_settings.inference_deadline_ms(), 1337);
+ EXPECT_EQ(output_settings.inference_abort_time_ms(), 42);
}
TEST_F(ConversionTest, MiniBenchmarkSettings) {
diff --git a/tensorflow/lite/acceleration/configuration/proto_to_flatbuffer.cc b/tensorflow/lite/acceleration/configuration/proto_to_flatbuffer.cc
index 366869ba..a35c259e 100644
--- a/tensorflow/lite/acceleration/configuration/proto_to_flatbuffer.cc
+++ b/tensorflow/lite/acceleration/configuration/proto_to_flatbuffer.cc
@@ -428,7 +428,8 @@ Offset<MtkNeuronSettings> ConvertMtkNeuronSettings(
settings.compile_options().end()),
builder.CreateVectorOfStrings(settings.accelerator_names().begin(),
settings.accelerator_names().end()),
- builder.CreateString(settings.neuron_config_path()));
+ builder.CreateString(settings.neuron_config_path()),
+ settings.inference_deadline_ms(), settings.inference_abort_time_ms());
}
Offset<CoralSettings> ConvertCoralSettings(const proto::CoralSettings& settings,
diff --git a/tensorflow/lite/acceleration/configuration/proto_to_flatbuffer_test.cc b/tensorflow/lite/acceleration/configuration/proto_to_flatbuffer_test.cc
index e504f09c..c0db23fa 100644
--- a/tensorflow/lite/acceleration/configuration/proto_to_flatbuffer_test.cc
+++ b/tensorflow/lite/acceleration/configuration/proto_to_flatbuffer_test.cc
@@ -184,6 +184,8 @@ TEST(ConversionTest, MtkNeuronSettings) {
const std::string kCompileOptions = "TEST_COMPILE_OPTIONS";
const std::string kAcceleratorName = "TEST_ACCELERATOR_NAME";
const std::string kNeuronConfigPath = "TEST_NEURON_CONFIG_PATH";
+ const int32_t kInferenceDeadlineMs = 1337;
+ const int32_t kInferenceAbortTimeMs = 42;
// Create the proto settings.
proto::TFLiteSettings input_settings;
@@ -198,6 +200,8 @@ TEST(ConversionTest, MtkNeuronSettings) {
mtk_neuron_settings->add_compile_options(kCompileOptions);
mtk_neuron_settings->add_accelerator_names(kAcceleratorName);
mtk_neuron_settings->set_neuron_config_path(kNeuronConfigPath);
+ mtk_neuron_settings->set_inference_deadline_ms(kInferenceDeadlineMs);
+ mtk_neuron_settings->set_inference_abort_time_ms(kInferenceAbortTimeMs);
flatbuffers::FlatBufferBuilder flatbuffers_builder;
// Convert.
@@ -231,6 +235,10 @@ TEST(ConversionTest, MtkNeuronSettings) {
kAcceleratorName);
EXPECT_EQ(output_mtk_neuron_settings->neuron_config_path()->str(),
kNeuronConfigPath);
+ EXPECT_EQ(output_mtk_neuron_settings->inference_deadline_ms(),
+ kInferenceDeadlineMs);
+ EXPECT_EQ(output_mtk_neuron_settings->inference_abort_time_ms(),
+ kInferenceAbortTimeMs);
}
} // namespace