From 664d8c55609253e68d153a91514c8fefa00557b1 Mon Sep 17 00:00:00 2001 From: Dmitrii Agibov Date: Thu, 21 Jul 2022 14:06:50 +0100 Subject: MLIA-549 Integrate TOSA checker into MLIA - Add new module for TOSA - Add advisor workflow components - Use TOSA checker for getting operators compatibility information Change-Id: I769e5e2a84e15779658f0895b4a347384def63bf --- src/mlia/devices/tosa/advisor.py | 98 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 src/mlia/devices/tosa/advisor.py (limited to 'src/mlia/devices/tosa/advisor.py') diff --git a/src/mlia/devices/tosa/advisor.py b/src/mlia/devices/tosa/advisor.py new file mode 100644 index 0000000..6a32b94 --- /dev/null +++ b/src/mlia/devices/tosa/advisor.py @@ -0,0 +1,98 @@ +# SPDX-FileCopyrightText: Copyright 2022, Arm Limited and/or its affiliates. +# SPDX-License-Identifier: Apache-2.0 +"""TOSA advisor.""" +from pathlib import Path +from typing import Any +from typing import Dict +from typing import List +from typing import Optional +from typing import Union + +from mlia.core._typing import PathOrFileLike +from mlia.core.advice_generation import AdviceCategory +from mlia.core.advice_generation import AdviceProducer +from mlia.core.advisor import DefaultInferenceAdvisor +from mlia.core.advisor import InferenceAdvisor +from mlia.core.context import Context +from mlia.core.context import ExecutionContext +from mlia.core.data_analysis import DataAnalyzer +from mlia.core.data_collection import DataCollector +from mlia.core.events import Event +from mlia.devices.tosa.advice_generation import TOSAAdviceProducer +from mlia.devices.tosa.config import TOSAConfiguration +from mlia.devices.tosa.data_analysis import TOSADataAnalyzer +from mlia.devices.tosa.data_collection import TOSAOperatorCompatibility +from mlia.devices.tosa.events import TOSAAdvisorStartedEvent +from mlia.devices.tosa.handlers import TOSAEventHandler + + +class TOSAInferenceAdvisor(DefaultInferenceAdvisor): + """TOSA inference advisor.""" + + @classmethod + def name(cls) -> str: + """Return name of the advisor.""" + return "tosa_inference_advisor" + + def get_collectors(self, context: Context) -> List[DataCollector]: + """Return list of the data collectors.""" + model = self.get_model(context) + + collectors: List[DataCollector] = [] + + if AdviceCategory.OPERATORS in context.advice_category: + collectors.append(TOSAOperatorCompatibility(model)) + + return collectors + + def get_analyzers(self, context: Context) -> List[DataAnalyzer]: + """Return list of the data analyzers.""" + return [ + TOSADataAnalyzer(), + ] + + def get_producers(self, context: Context) -> List[AdviceProducer]: + """Return list of the advice producers.""" + return [ + TOSAAdviceProducer(), + ] + + def get_events(self, context: Context) -> List[Event]: + """Return list of the startup events.""" + model = self.get_model(context) + target_profile = self.get_target_profile(context) + + return [ + TOSAAdvisorStartedEvent(model, TOSAConfiguration(target_profile)), + ] + + +def configure_and_get_tosa_advisor( + context: ExecutionContext, + target_profile: str, + model: Union[Path, str], + output: Optional[PathOrFileLike] = None, + **_extra_args: Any +) -> InferenceAdvisor: + """Create and configure TOSA advisor.""" + if context.event_handlers is None: + context.event_handlers = [TOSAEventHandler(output)] + + if context.config_parameters is None: + context.config_parameters = _get_config_parameters(model, target_profile) + + return TOSAInferenceAdvisor() + + +def _get_config_parameters( + model: Union[Path, str], target_profile: str +) -> Dict[str, Any]: + """Get configuration parameters for the advisor.""" + advisor_parameters: Dict[str, Any] = { + "tosa_inference_advisor": { + "model": str(model), + "target_profile": target_profile, + } + } + + return advisor_parameters -- cgit v1.2.1