aboutsummaryrefslogtreecommitdiff
path: root/src/mlia/target
diff options
context:
space:
mode:
authorRuomei Yan <ruomei.yan@arm.com>2023-02-20 15:32:54 +0000
committerBenjamin Klimczak <benjamin.klimczak@arm.com>2023-10-11 15:42:28 +0100
commit446c379c92e15ad8f24ed0db853dd0fc9c271151 (patch)
treefb9e2b20fba15d3aa44054eb76d76fbdb1459006 /src/mlia/target
parentf0b8ed75fed9dc69ab1f6313339f9f7e38bfc725 (diff)
downloadmlia-446c379c92e15ad8f24ed0db853dd0fc9c271151.tar.gz
Add a CLI component to enable rewrites
* Add flags for rewrite (--rewrite, --rewrite-start, --rewrite-end, --rewrite-target) * Refactor CLI interfaces to accept tflite models with optimize for rewrite, keras models with optimize for clustering and pruning * Refactor and move common.py and select.py out of the folder nn/tensorflow/optimizations * Add file nn/rewrite/core/rewrite.py as placeholder * Update/add unit tests * Refactor OptimizeModel in ethos_u/data_collection.py for accepting tflite model case * Extend the logic so that if "--rewrite" is specified, we don't add pruning to also accept TFLite models. * Update README.md Resolves: MLIA-750, MLIA-854, MLIA-865 Signed-off-by: Benjamin Klimczak <benjamin.klimczak@arm.com> Change-Id: I67d85f71fa253d2bad4efe304ad8225970b9622c
Diffstat (limited to 'src/mlia/target')
-rw-r--r--src/mlia/target/ethos_u/advice_generation.py2
-rw-r--r--src/mlia/target/ethos_u/advisor.py16
-rw-r--r--src/mlia/target/ethos_u/data_analysis.py2
-rw-r--r--src/mlia/target/ethos_u/data_collection.py42
-rw-r--r--src/mlia/target/ethos_u/performance.py2
5 files changed, 46 insertions, 18 deletions
diff --git a/src/mlia/target/ethos_u/advice_generation.py b/src/mlia/target/ethos_u/advice_generation.py
index a9f9eac..351082a 100644
--- a/src/mlia/target/ethos_u/advice_generation.py
+++ b/src/mlia/target/ethos_u/advice_generation.py
@@ -11,7 +11,7 @@ from mlia.core.advice_generation import ContextAwareAdviceProducer
from mlia.core.advice_generation import FactBasedAdviceProducer
from mlia.core.common import AdviceCategory
from mlia.core.common import DataItem
-from mlia.nn.tensorflow.optimizations.select import OptimizationSettings
+from mlia.nn.select import OptimizationSettings
from mlia.target.common.reporters import handle_model_is_not_tflite_compatible_common
from mlia.target.common.reporters import handle_tflite_check_failed_common
from mlia.target.common.reporters import ModelIsNotTFLiteCompatible
diff --git a/src/mlia/target/ethos_u/advisor.py b/src/mlia/target/ethos_u/advisor.py
index d2c308a..321734c 100644
--- a/src/mlia/target/ethos_u/advisor.py
+++ b/src/mlia/target/ethos_u/advisor.py
@@ -54,8 +54,20 @@ class EthosUInferenceAdvisor(DefaultInferenceAdvisor):
if is_tflite_model(model):
# TensorFlow Lite models do not support optimization (only performance)!
if context.category_enabled(AdviceCategory.OPTIMIZATION):
- raise RuntimeError(
- "Optimizations are not supported for TensorFlow Lite files."
+ optimization_settings = self._get_optimization_settings(context)
+
+ optimization_types = {
+ opt["optimization_type"] for opt in optimization_settings[0]
+ }
+ if optimization_types != {"rewrite"}:
+ raise RuntimeError(
+ "Only 'rewrite' is supported for TensorFlow Lite files."
+ )
+
+ collectors.append(
+ EthosUOptimizationPerformance(
+ model, target_config, optimization_settings, backends
+ )
)
if context.category_enabled(AdviceCategory.PERFORMANCE):
collectors.append(EthosUPerformance(model, target_config, backends))
diff --git a/src/mlia/target/ethos_u/data_analysis.py b/src/mlia/target/ethos_u/data_analysis.py
index 3df4bff..5c6080f 100644
--- a/src/mlia/target/ethos_u/data_analysis.py
+++ b/src/mlia/target/ethos_u/data_analysis.py
@@ -10,7 +10,7 @@ from mlia.backend.vela.compat import Operators
from mlia.core.common import DataItem
from mlia.core.data_analysis import Fact
from mlia.core.data_analysis import FactExtractor
-from mlia.nn.tensorflow.optimizations.select import OptimizationSettings
+from mlia.nn.select import OptimizationSettings
from mlia.nn.tensorflow.tflite_compat import TFLiteCompatibilityInfo
from mlia.target.common.reporters import analyze_tflite_compatibility_common
from mlia.target.ethos_u.performance import OptimizationPerformanceMetrics
diff --git a/src/mlia/target/ethos_u/data_collection.py b/src/mlia/target/ethos_u/data_collection.py
index 0654143..0f3a8d2 100644
--- a/src/mlia/target/ethos_u/data_collection.py
+++ b/src/mlia/target/ethos_u/data_collection.py
@@ -5,6 +5,7 @@ from __future__ import annotations
import logging
from pathlib import Path
+from typing import Any
from mlia.backend.vela.compat import Operators
from mlia.backend.vela.compat import supported_operators
@@ -12,15 +13,17 @@ from mlia.core.context import Context
from mlia.core.data_collection import ContextAwareDataCollector
from mlia.core.errors import FunctionalityNotSupportedError
from mlia.core.performance import estimate_performance
+from mlia.nn.select import get_optimizer
+from mlia.nn.select import OptimizationSettings
from mlia.nn.tensorflow.config import get_keras_model
from mlia.nn.tensorflow.config import get_tflite_model
from mlia.nn.tensorflow.config import KerasModel
-from mlia.nn.tensorflow.optimizations.select import get_optimizer
-from mlia.nn.tensorflow.optimizations.select import OptimizationSettings
+from mlia.nn.tensorflow.config import TFLiteModel
from mlia.nn.tensorflow.tflite_compat import TFLiteChecker
from mlia.nn.tensorflow.tflite_compat import TFLiteCompatibilityInfo
from mlia.nn.tensorflow.utils import is_tflite_model
from mlia.nn.tensorflow.utils import save_keras_model
+from mlia.nn.tensorflow.utils import save_tflite_model
from mlia.target.ethos_u.config import EthosUConfiguration
from mlia.target.ethos_u.performance import EthosUPerformanceEstimator
from mlia.target.ethos_u.performance import OptimizationPerformanceMetrics
@@ -103,7 +106,7 @@ class OptimizeModel:
self.context = context
self.opt_settings = opt_settings
- def __call__(self, keras_model: KerasModel) -> KerasModel:
+ def __call__(self, keras_model: KerasModel) -> Any:
"""Run optimization."""
optimizer = get_optimizer(keras_model, self.opt_settings)
@@ -112,9 +115,19 @@ class OptimizeModel:
optimizer.apply_optimization()
model = optimizer.get_model()
+
+ if isinstance(model, Path):
+ return model
+
+ if isinstance(model, TFLiteModel):
+ model_path = self.context.get_model_path("optimized_model.tflite")
+ with open(model.model_path, "rb") as file_handle:
+ model_data = bytearray(file_handle.read())
+ save_tflite_model(model_data, model_path)
+ return TFLiteModel(model_path)
+
model_path = self.context.get_model_path("optimized_model.h5")
save_keras_model(model, model_path)
-
return KerasModel(model_path)
@@ -146,14 +159,17 @@ class EthosUOptimizationPerformance(ContextAwareDataCollector):
opt_settings = self._parse_optimization_params(self.optimizations)
- try:
- keras_model = get_keras_model(self.model, self.context)
- except NotImplementedError as err:
- raise FunctionalityNotSupportedError(
- reason="Unable to run model optimizations",
- description=f"{self.model} is not a Keras model and "
- "could not be converted to a Keras model",
- ) from err
+ if opt_settings[0][0].optimization_type != "rewrite":
+ try:
+ model = get_keras_model(self.model, self.context)
+ except NotImplementedError as err:
+ raise FunctionalityNotSupportedError(
+ reason="Unable to run model optimizations",
+ description=f"{self.model} is not a Keras model and "
+ "could not be converted to a Keras model",
+ ) from err
+ else:
+ model = self.model # type: ignore
optimizers = [OptimizeModel(self.context, opts) for opts in opt_settings]
@@ -163,7 +179,7 @@ class EthosUOptimizationPerformance(ContextAwareDataCollector):
self.backends,
)
original_metrics, *optimized_metrics = estimate_performance(
- keras_model, estimator, optimizers # type: ignore
+ model, estimator, optimizers # type: ignore
)
result = OptimizationPerformanceMetrics(
diff --git a/src/mlia/target/ethos_u/performance.py b/src/mlia/target/ethos_u/performance.py
index f7f9a8c..a0526e4 100644
--- a/src/mlia/target/ethos_u/performance.py
+++ b/src/mlia/target/ethos_u/performance.py
@@ -15,9 +15,9 @@ from mlia.backend.corstone import is_corstone_backend
from mlia.backend.corstone.performance import estimate_performance
from mlia.core.context import Context
from mlia.core.performance import PerformanceEstimator
+from mlia.nn.select import OptimizationSettings
from mlia.nn.tensorflow.config import get_tflite_model
from mlia.nn.tensorflow.config import ModelConfiguration
-from mlia.nn.tensorflow.optimizations.select import OptimizationSettings
from mlia.target.ethos_u.config import EthosUConfiguration
from mlia.target.registry import supported_backends
from mlia.utils.logging import log_action