diff options
Diffstat (limited to 'src/mlia/target')
-rw-r--r-- | src/mlia/target/ethos_u/advisor.py | 4 | ||||
-rw-r--r-- | src/mlia/target/ethos_u/config.py | 5 | ||||
-rw-r--r-- | src/mlia/target/ethos_u/data_analysis.py | 6 | ||||
-rw-r--r-- | src/mlia/target/ethos_u/performance.py | 48 | ||||
-rw-r--r-- | src/mlia/target/ethos_u/reporters.py | 87 |
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 ) |