aboutsummaryrefslogtreecommitdiff
path: root/src/mlia/target/ethos_u
diff options
context:
space:
mode:
Diffstat (limited to 'src/mlia/target/ethos_u')
-rw-r--r--src/mlia/target/ethos_u/advisor.py4
-rw-r--r--src/mlia/target/ethos_u/config.py5
-rw-r--r--src/mlia/target/ethos_u/data_analysis.py6
-rw-r--r--src/mlia/target/ethos_u/performance.py48
-rw-r--r--src/mlia/target/ethos_u/reporters.py87
5 files changed, 51 insertions, 99 deletions
diff --git a/src/mlia/target/ethos_u/advisor.py b/src/mlia/target/ethos_u/advisor.py
index b5932d0..edcfcfc 100644
--- a/src/mlia/target/ethos_u/advisor.py
+++ b/src/mlia/target/ethos_u/advisor.py
@@ -109,7 +109,9 @@ class EthosUInferenceAdvisor(DefaultInferenceAdvisor):
def _get_target_config(self, context: Context) -> EthosUConfiguration:
"""Get target configuration."""
target_profile = self.get_target_profile(context)
- return cast(EthosUConfiguration, profile(target_profile))
+ target_config = cast(EthosUConfiguration, profile(target_profile))
+ target_config.compiler_options.output_dir = context.output_dir # type: ignore
+ return target_config
def _get_optimization_settings(self, context: Context) -> list[list[dict]]:
"""Get optimization settings."""
diff --git a/src/mlia/target/ethos_u/config.py b/src/mlia/target/ethos_u/config.py
index 73baa61..b3416d3 100644
--- a/src/mlia/target/ethos_u/config.py
+++ b/src/mlia/target/ethos_u/config.py
@@ -1,4 +1,4 @@
-# SPDX-FileCopyrightText: Copyright 2022-2023, Arm Limited and/or its affiliates.
+# SPDX-FileCopyrightText: Copyright 2022-2024, Arm Limited and/or its affiliates.
# SPDX-License-Identifier: Apache-2.0
"""Ethos-U configuration."""
from __future__ import annotations
@@ -10,6 +10,7 @@ from mlia.backend.corstone import is_corstone_backend
from mlia.backend.manager import get_available_backends
from mlia.backend.vela.compiler import resolve_compiler_config
from mlia.backend.vela.compiler import VelaCompilerOptions
+from mlia.backend.vela.compiler import VelaInitData
from mlia.target.config import TargetProfile
from mlia.utils.filesystem import get_vela_config
@@ -53,7 +54,7 @@ class EthosUConfiguration(TargetProfile):
)
@property
- def resolved_compiler_config(self) -> dict[str, Any]:
+ def resolved_compiler_config(self) -> VelaInitData:
"""Resolve compiler configuration."""
return resolve_compiler_config(self.compiler_options)
diff --git a/src/mlia/target/ethos_u/data_analysis.py b/src/mlia/target/ethos_u/data_analysis.py
index 5c6080f..d42d82a 100644
--- a/src/mlia/target/ethos_u/data_analysis.py
+++ b/src/mlia/target/ethos_u/data_analysis.py
@@ -1,4 +1,4 @@
-# SPDX-FileCopyrightText: Copyright 2022-2023, Arm Limited and/or its affiliates.
+# SPDX-FileCopyrightText: Copyright 2022-2024, Arm Limited and/or its affiliates.
# SPDX-License-Identifier: Apache-2.0
"""Ethos-U data analysis module."""
from __future__ import annotations
@@ -110,13 +110,13 @@ class EthosUDataAnalyzer(FactExtractor):
if not optimizations:
return
- orig = optimization_results.original_perf_metrics.in_kilobytes()
+ orig = optimization_results.original_perf_metrics
orig_memory = orig.memory_usage
orig_cycles = orig.npu_cycles
diffs: list[OptimizationDiff] = []
for opt_type, opt_perf_metrics in optimizations:
- opt = opt_perf_metrics.in_kilobytes()
+ opt = opt_perf_metrics
opt_memory = opt.memory_usage
opt_cycles = opt.npu_cycles
diff --git a/src/mlia/target/ethos_u/performance.py b/src/mlia/target/ethos_u/performance.py
index 8decb75..1e2a504 100644
--- a/src/mlia/target/ethos_u/performance.py
+++ b/src/mlia/target/ethos_u/performance.py
@@ -54,7 +54,6 @@ class MemoryUsage:
sram_memory_area_size: int | float
dram_memory_area_size: int | float
- unknown_memory_area_size: int | float
on_chip_flash_memory_area_size: int | float
off_chip_flash_memory_area_size: int | float
memory_size_type: MemorySizeType = MemorySizeType.BYTES
@@ -67,27 +66,6 @@ class MemoryUsage:
"Off chip flash used",
]
- def in_kilobytes(self) -> MemoryUsage:
- """Return memory usage with values in kilobytes."""
- if self.memory_size_type == MemorySizeType.KILOBYTES:
- return self
-
- kilobytes = [
- value / BYTES_PER_KILOBYTE
- for value in [
- self.sram_memory_area_size,
- self.dram_memory_area_size,
- self.unknown_memory_area_size,
- self.on_chip_flash_memory_area_size,
- self.off_chip_flash_memory_area_size,
- ]
- ]
-
- return MemoryUsage(
- *kilobytes, # type: ignore
- memory_size_type=MemorySizeType.KILOBYTES,
- )
-
@dataclass
class PerformanceMetrics:
@@ -98,23 +76,6 @@ class PerformanceMetrics:
memory_usage: MemoryUsage | None
layerwise_perf_info: LayerwisePerfInfo | None
- def in_kilobytes(self) -> PerformanceMetrics:
- """Return metrics with memory usage in KiB."""
- if self.memory_usage is None:
- return PerformanceMetrics(
- self.target_config,
- self.npu_cycles,
- self.memory_usage,
- self.layerwise_perf_info,
- )
-
- return PerformanceMetrics(
- self.target_config,
- self.npu_cycles,
- self.memory_usage.in_kilobytes(),
- self.layerwise_perf_info,
- )
-
@dataclass
class OptimizationPerformanceMetrics:
@@ -157,7 +118,6 @@ class VelaPerformanceEstimator(
MemoryUsage(
vela_perf_metrics.sram_memory_area_size,
vela_perf_metrics.dram_memory_area_size,
- vela_perf_metrics.unknown_memory_area_size,
vela_perf_metrics.on_chip_flash_memory_area_size,
vela_perf_metrics.off_chip_flash_memory_area_size,
),
@@ -192,12 +152,8 @@ class CorstonePerformanceEstimator(
else model
)
- optimized_model_path = self.context.get_model_path(
- f"{model_path.stem}_vela.tflite"
- )
-
- vela_comp.optimize_model(
- model_path, self.target_config.compiler_options, optimized_model_path
+ optimized_model_path = vela_comp.compile_model(
+ model_path, self.target_config.compiler_options
)
corstone_perf_metrics = estimate_performance(
diff --git a/src/mlia/target/ethos_u/reporters.py b/src/mlia/target/ethos_u/reporters.py
index b747ce5..384d623 100644
--- a/src/mlia/target/ethos_u/reporters.py
+++ b/src/mlia/target/ethos_u/reporters.py
@@ -4,6 +4,7 @@
from __future__ import annotations
from collections import defaultdict
+from dataclasses import asdict
from dataclasses import fields
from typing import Any
from typing import Callable
@@ -119,29 +120,50 @@ def report_target_details(target_config: EthosUConfiguration) -> Report:
"""Return table representation for the target."""
compiler_config = target_config.resolved_compiler_config
+ memory_dict = dict(
+ zip(
+ ["Sram", "Dram", "OnChipFlash", "OffChipFlash"],
+ [
+ compiler_config.sram_memory_data,
+ compiler_config.dram_memory_data,
+ compiler_config.on_chip_flash_memory_data,
+ compiler_config.off_chip_flash_memory_data,
+ ],
+ )
+ )
+
+ memory_dict = {
+ key: val
+ for key, val in memory_dict.items()
+ if not list(asdict(val).values()).count(None) == len(list(asdict(val).values()))
+ }
+
memory_settings = [
ReportItem(
"Const mem area",
"const_mem_area",
- compiler_config["const_mem_area"],
+ compiler_config.const_mem_area,
),
ReportItem(
"Arena mem area",
"arena_mem_area",
- compiler_config["arena_mem_area"],
+ compiler_config.arena_mem_area,
),
ReportItem(
"Cache mem area",
"cache_mem_area",
- compiler_config["cache_mem_area"],
- ),
- ReportItem(
- "Arena cache size",
- "arena_cache_size",
- BytesCell(compiler_config["arena_cache_size"]),
+ compiler_config.cache_mem_area,
),
]
+ if compiler_config.arena_cache_size is not None:
+ memory_settings.append(
+ ReportItem(
+ "Arena cache size",
+ "arena_cache_size",
+ BytesCell(compiler_config.arena_cache_size),
+ )
+ )
mem_areas_settings = [
ReportItem(
f"{mem_area_name}",
@@ -151,67 +173,48 @@ def report_target_details(target_config: EthosUConfiguration) -> Report:
ReportItem(
"Clock scales",
"clock_scales",
- mem_area_settings["clock_scales"],
+ mem_area_settings.clock_scale,
),
ReportItem(
"Burst length",
"burst_length",
- BytesCell(mem_area_settings["burst_length"]),
+ BytesCell(mem_area_settings.burst_length),
),
ReportItem(
"Read latency",
"read_latency",
- CyclesCell(mem_area_settings["read_latency"]),
+ CyclesCell(mem_area_settings.read_latency),
),
ReportItem(
"Write latency",
"write_latency",
- CyclesCell(mem_area_settings["write_latency"]),
+ CyclesCell(mem_area_settings.write_latency),
),
],
)
- for mem_area_name, mem_area_settings in compiler_config["memory_area"].items()
+ for mem_area_name, mem_area_settings in memory_dict.items()
]
system_settings = [
ReportItem(
"Accelerator clock",
"accelerator_clock",
- ClockCell(compiler_config["core_clock"]),
+ ClockCell(compiler_config.core_clock),
),
ReportItem(
"AXI0 port",
"axi0_port",
- compiler_config["axi0_port"],
+ compiler_config.axi0_port,
),
ReportItem(
"AXI1 port",
"axi1_port",
- compiler_config["axi1_port"],
+ compiler_config.axi1_port,
),
ReportItem(
"Memory area settings", "memory_area", None, nested_items=mem_areas_settings
),
]
-
- arch_settings = [
- ReportItem(
- "Permanent storage mem area",
- "permanent_storage_mem_area",
- compiler_config["permanent_storage_mem_area"],
- ),
- ReportItem(
- "Feature map storage mem area",
- "feature_map_storage_mem_area",
- compiler_config["feature_map_storage_mem_area"],
- ),
- ReportItem(
- "Fast storage mem area",
- "fast_storage_mem_area",
- compiler_config["fast_storage_mem_area"],
- ),
- ]
-
return NestedReport(
"Target information",
"target",
@@ -221,21 +224,15 @@ def report_target_details(target_config: EthosUConfiguration) -> Report:
ReportItem(
"Memory mode",
alias="memory_mode",
- value=compiler_config["memory_mode"],
+ value=compiler_config.memory_mode,
nested_items=memory_settings,
),
ReportItem(
"System config",
alias="system_config",
- value=compiler_config["system_config"],
+ value=compiler_config.system_config,
nested_items=system_settings,
),
- ReportItem(
- "Architecture settings",
- "arch_settings",
- None,
- nested_items=arch_settings,
- ),
],
)
@@ -244,7 +241,6 @@ def metrics_as_records(
perf_metrics: list[PerformanceMetrics],
) -> tuple[list[tuple], list[tuple]]:
"""Convert perf metrics object into list of records."""
- perf_metrics = [item.in_kilobytes() for item in perf_metrics]
def _layerwise_as_metrics(
perf_metrics: list[PerformanceMetrics],
@@ -314,9 +310,6 @@ def metrics_as_records(
return []
metric_map["SRAM used"].append(metrics.memory_usage.sram_memory_area_size)
metric_map["DRAM used"].append(metrics.memory_usage.dram_memory_area_size)
- metric_map["Unknown memory area used"].append(
- metrics.memory_usage.unknown_memory_area_size
- )
metric_map["On-chip flash used"].append(
metrics.memory_usage.on_chip_flash_memory_area_size
)