diff options
author | Artyom Palvelev <artyompp@google.com> | 2023-11-06 17:05:55 +0000 |
---|---|---|
committer | Artyom Palvelev <artyompp@google.com> | 2023-11-06 18:38:22 +0000 |
commit | 15ca84580d287cd9d0ae0ad71d7c43e5016cdaee (patch) | |
tree | ca6cc6df22dd1562a2842bd047e5cbc1ab3ade60 | |
parent | f17bab7374f7a05ecf019599473653509aa3bd7e (diff) | |
download | gamesdk-15ca84580d287cd9d0ae0ad71d7c43e5016cdaee.tar.gz |
update MemoryAdvice model
This commit fixes several issues with MemoryAdvice library:
* it removes "realtime" model which is trained on 0 and 1 labels,
so it couldn't accurately predict values in between;
* now red/yellow/green signals are given basing on the percentage
of available memory;
* available memory model is also updated:
- hyperparameters are generated now by Hyperopt;
- the final model is trained on the full dataset without validation.
Fix: 308808048
Test: use any memory-allocating app like Hogger, AGDKTunnel, etc
Change-Id: Ib3e05093efece5b09cda3212d16c76ee3b6ac1c0
-rw-r--r-- | games-memory-advice/core/memory_advice_impl.cpp | 16 | ||||
-rw-r--r-- | games-memory-advice/core/memory_advice_impl.h | 3 | ||||
-rw-r--r-- | games-memory-advice/default.json | 4 | ||||
-rw-r--r-- | games-memory-advice/src/main/assets/available.tflite | bin | 3660 -> 242928 bytes | |||
-rw-r--r-- | games-memory-advice/src/main/assets/realtime.tflite | bin | 3660 -> 0 bytes | |||
-rw-r--r-- | games-memory-advice/src/main/assets/realtime_features.json | 6 | ||||
-rw-r--r-- | test/memory_advice/crowdtester/app/src/main/java/com/memory_advice/crowdtester/MainActivity.java | 6 | ||||
-rw-r--r-- | test/memory_advice/endtoend/withallocation.cpp | 4 | ||||
-rw-r--r-- | test/memory_advice/endtoend/withmockmetrics.cpp | 2 | ||||
-rw-r--r-- | test/memory_advice/memory_utils.cpp | 14 | ||||
-rw-r--r-- | test/memory_advice/memory_utils.h | 2 |
11 files changed, 16 insertions, 41 deletions
diff --git a/games-memory-advice/core/memory_advice_impl.cpp b/games-memory-advice/core/memory_advice_impl.cpp index 6bb66796..3027ca62 100644 --- a/games-memory-advice/core/memory_advice_impl.cpp +++ b/games-memory-advice/core/memory_advice_impl.cpp @@ -39,26 +39,16 @@ MemoryAdviceImpl::MemoryAdviceImpl(const char* params, IPredictor* realtime_predictor, IPredictor* available_predictor) : metrics_provider_(metrics_provider), - realtime_predictor_(realtime_predictor), available_predictor_(available_predictor) { if (metrics_provider_ == nullptr) { default_metrics_provider_ = std::make_unique<DefaultMetricsProvider>(); metrics_provider_ = default_metrics_provider_.get(); } - if (realtime_predictor_ == nullptr) { - default_realtime_predictor_ = std::make_unique<DefaultPredictor>(); - realtime_predictor_ = default_realtime_predictor_.get(); - } if (available_predictor_ == nullptr) { default_available_predictor_ = std::make_unique<DefaultPredictor>(); available_predictor_ = default_available_predictor_.get(); } - initialization_error_code_ = - realtime_predictor_->Init("realtime.tflite", "realtime_features.json"); - if (initialization_error_code_ != MEMORYADVICE_ERROR_OK) { - return; - } initialization_error_code_ = available_predictor_->Init( "available.tflite", "available_features.json"); if (initialization_error_code_ != MEMORYADVICE_ERROR_OK) { @@ -145,12 +135,6 @@ Json::object MemoryAdviceImpl::GetAdvice() { data["sample"] = variable_metrics; data["build"] = build_; - if (variable_spec.find("predictRealtime") != variable_spec.end() && - variable_spec.at("predictRealtime").bool_value()) { - variable_metrics["predictedUsage"] = - Json(Clamp(realtime_predictor_->Predict(data), 0.0f, 1.0f)); - } - if (variable_spec.find("availableRealtime") != variable_spec.end() && variable_spec.at("availableRealtime").bool_value()) { variable_metrics["predictedAvailable"] = diff --git a/games-memory-advice/core/memory_advice_impl.h b/games-memory-advice/core/memory_advice_impl.h index 6fcef4af..c4a09ad2 100644 --- a/games-memory-advice/core/memory_advice_impl.h +++ b/games-memory-advice/core/memory_advice_impl.h @@ -30,9 +30,6 @@ using namespace json11; class MemoryAdviceImpl { private: IMetricsProvider* metrics_provider_; - /** @brief A predictor that tries to predict the current memory consumption - * as a percentage of total memory. */ - IPredictor* realtime_predictor_; /** @brief A predictor that attempts to predict the remanining memory that * can be safely allocated. */ IPredictor* available_predictor_; diff --git a/games-memory-advice/default.json b/games-memory-advice/default.json index 4f2d2c90..5544caea 100644 --- a/games-memory-advice/default.json +++ b/games-memory-advice/default.json @@ -3,10 +3,10 @@ "canaryProcessTester": true, "formulas": { "yellow": [ - "predictedUsage > 0.65" + "predictedAvailable < 0.20" ], "red": [ - "predictedUsage > 0.75" + "predictedAvailable < 0.15" ] } }, diff --git a/games-memory-advice/src/main/assets/available.tflite b/games-memory-advice/src/main/assets/available.tflite Binary files differindex af0bc9b3..97165a96 100644 --- a/games-memory-advice/src/main/assets/available.tflite +++ b/games-memory-advice/src/main/assets/available.tflite diff --git a/games-memory-advice/src/main/assets/realtime.tflite b/games-memory-advice/src/main/assets/realtime.tflite Binary files differdeleted file mode 100644 index 7b855bc5..00000000 --- a/games-memory-advice/src/main/assets/realtime.tflite +++ /dev/null diff --git a/games-memory-advice/src/main/assets/realtime_features.json b/games-memory-advice/src/main/assets/realtime_features.json deleted file mode 100644 index f4a9a848..00000000 --- a/games-memory-advice/src/main/assets/realtime_features.json +++ /dev/null @@ -1,6 +0,0 @@ -[ - "/baseline/constant/MemoryInfo/totalMem", - "/baseline/meminfo/SwapTotal", - "/sample/MemoryInfo/availMem", - "/sample/proc/oom_score" -]
\ No newline at end of file diff --git a/test/memory_advice/crowdtester/app/src/main/java/com/memory_advice/crowdtester/MainActivity.java b/test/memory_advice/crowdtester/app/src/main/java/com/memory_advice/crowdtester/MainActivity.java index 33ace957..67309cdf 100644 --- a/test/memory_advice/crowdtester/app/src/main/java/com/memory_advice/crowdtester/MainActivity.java +++ b/test/memory_advice/crowdtester/app/src/main/java/com/memory_advice/crowdtester/MainActivity.java @@ -30,10 +30,10 @@ public class MainActivity extends AppCompatActivity { try { javaPrediction = new JSONObject(javaAdvisor.getAdvice()) .getJSONObject("metrics") - .getDouble("predictedUsage"); + .getDouble("predictedAvailable"); nativePrediction = new JSONObject(getMemoryAdvice()) .getJSONObject("metrics") - .getDouble("predictedUsage"); + .getDouble("predictedAvailable"); } catch (JSONException e) { e.printStackTrace(); } @@ -64,4 +64,4 @@ public class MainActivity extends AppCompatActivity { public native int initMemoryAdvice(); public native String getMemoryAdvice(); public native boolean allocate(long bytes); -}
\ No newline at end of file +} diff --git a/test/memory_advice/endtoend/withallocation.cpp b/test/memory_advice/endtoend/withallocation.cpp index 4060716f..98fc1a48 100644 --- a/test/memory_advice/endtoend/withallocation.cpp +++ b/test/memory_advice/endtoend/withallocation.cpp @@ -46,8 +46,8 @@ std::string TestEndToEndWithAllocation() { while (s_impl->GetAdvice() .at("metrics") .object_items() - .at("predictedUsage") - .number_value() < 0.5) { + .at("predictedAvailable") + .number_value() > 0.5) { AllocateMemory(100 * kBytesInMegabyte); } std::string result = json11::Json(s_impl->GetAdvice()).dump(); diff --git a/test/memory_advice/endtoend/withmockmetrics.cpp b/test/memory_advice/endtoend/withmockmetrics.cpp index c8d97188..e8601f8e 100644 --- a/test/memory_advice/endtoend/withmockmetrics.cpp +++ b/test/memory_advice/endtoend/withmockmetrics.cpp @@ -58,7 +58,7 @@ std::string TestEndToEndWithMockMetrics() { TEST(EndToEndTest, WithMockMetrics) { auto result = TestEndToEndWithMockMetrics(); - std::string expected = GetAdviceString("12341234", "0.97!REGEX(\\d+)", "500", true); + std::string expected = GetAdviceString("12341234", "0.9!REGEX(\\d+)", "500", true); gamesdk_test::CheckStrings("Base", result, expected); } diff --git a/test/memory_advice/memory_utils.cpp b/test/memory_advice/memory_utils.cpp index 4fa25802..82dc6405 100644 --- a/test/memory_advice/memory_utils.cpp +++ b/test/memory_advice/memory_utils.cpp @@ -30,7 +30,7 @@ static std::list<std::unique_ptr<char[]>> allocated_bytes_list; static std::mutex allocated_mutex; std::string GetAdviceString(const std::string& avail_mem, - const std::string& predicted_usage, + const std::string& predicted_avail, const std::string& oom_score, bool with_warnings) { if (with_warnings) { return R"MA( @@ -44,8 +44,8 @@ std::string GetAdviceString(const std::string& avail_mem, "meta": { "time": !REGEX(\d+) }, - "predictedUsage": )MA" + - predicted_usage + R"MA(, + "predictedAvailable": )MA" + + predicted_avail + R"MA(, "proc": { "_meta":["duration", !REGEX(\d)], "oom_score": )MA" + @@ -54,11 +54,11 @@ std::string GetAdviceString(const std::string& avail_mem, }, "warnings": [ { - "formula": "predictedUsage>0.75", + "formula": "predictedAvailable<0.15", "level": "red" }, { - "formula": "predictedUsage>0.65", + "formula": "predictedAvailable<0.20", "level": "yellow" } ] @@ -76,8 +76,8 @@ std::string GetAdviceString(const std::string& avail_mem, "meta": { "time": !REGEX(\d+) }, - "predictedUsage": )MA" + - predicted_usage + R"MA(, + "predictedAvailable": )MA" + + predicted_avail + R"MA(, "proc": { "_meta":["duration", !REGEX(\d)], "oom_score": )MA" + diff --git a/test/memory_advice/memory_utils.h b/test/memory_advice/memory_utils.h index 44d72cf3..f51ed1fa 100644 --- a/test/memory_advice/memory_utils.h +++ b/test/memory_advice/memory_utils.h @@ -40,7 +40,7 @@ bool CheckStrings(const std::string& name, const std::string& result, // Generates an advice string that satisfies the given parameters std::string GetAdviceString(const std::string& avail_mem, - const std::string& predicted_usage, + const std::string& predicted_avail, const std::string& oom_score, bool with_warnings = false); |