Merge pull request !269 from 治愈系潇洒哥/mastertags/v0.5.0-beta
| @@ -23,13 +23,15 @@ import os | |||||
| from flask import Blueprint | from flask import Blueprint | ||||
| from flask import jsonify | from flask import jsonify | ||||
| from flask import request | from flask import request | ||||
| from flask import Response | |||||
| from marshmallow import ValidationError | from marshmallow import ValidationError | ||||
| from mindinsight.conf import settings | from mindinsight.conf import settings | ||||
| from mindinsight.datavisual.utils.tools import get_train_id, get_profiler_dir, \ | from mindinsight.datavisual.utils.tools import get_train_id, get_profiler_dir, \ | ||||
| unquote_args, to_int | |||||
| unquote_args, to_int, get_device_id | |||||
| from mindinsight.profiler.analyser.analyser_factory import AnalyserFactory | from mindinsight.profiler.analyser.analyser_factory import AnalyserFactory | ||||
| from mindinsight.profiler.analyser.minddata_analyser import MinddataAnalyser | from mindinsight.profiler.analyser.minddata_analyser import MinddataAnalyser | ||||
| from mindinsight.profiler.proposer.compose_proposer import ComposeProposal | |||||
| from mindinsight.profiler.common.util import analyse_device_list_from_profiler_dir | from mindinsight.profiler.common.util import analyse_device_list_from_profiler_dir | ||||
| from mindinsight.profiler.common.validator.validate import validate_condition, \ | from mindinsight.profiler.common.validator.validate import validate_condition, \ | ||||
| validate_ui_proc, validate_minddata_pipeline_condition | validate_ui_proc, validate_minddata_pipeline_condition | ||||
| @@ -276,6 +278,44 @@ def get_profiler_abs_dir(requests): | |||||
| return profiler_dir_abs | return profiler_dir_abs | ||||
| @BLUEPRINT.route("/profile/summary/propose", methods=["GET"]) | |||||
| def get_profile_summary_proposal(): | |||||
| """ | |||||
| Get summary profiling proposal. | |||||
| Returns: | |||||
| str, the summary profiling proposal. | |||||
| Raises: | |||||
| ParamValueError: If the parameters contain some errors. | |||||
| Examples: | |||||
| >>> GET http://xxxx/v1/mindinsight/profile/summary/propose | |||||
| """ | |||||
| profiler_dir = get_profiler_dir(request) | |||||
| train_id = get_train_id(request) | |||||
| device_id = get_device_id(request) | |||||
| if not profiler_dir or not train_id: | |||||
| raise ParamValueError("No profiler_dir or train_id.") | |||||
| profiler_dir_abs = os.path.join(settings.SUMMARY_BASE_DIR, train_id, profiler_dir) | |||||
| try: | |||||
| profiler_dir_abs = validate_and_normalize_path(profiler_dir_abs, "profiler") | |||||
| except ValidationError: | |||||
| raise ParamValueError("Invalid profiler dir") | |||||
| step_trace_condition = {"filter_condition": {"mode": "proc", | |||||
| "proc_name": "iteration_interval", | |||||
| "step_id": 0}} | |||||
| options = {'step_trace': {"iter_interval": step_trace_condition}} | |||||
| proposal_type_list = ['step_trace', 'minddata', 'minddata_pipeline', 'common'] | |||||
| proposal_obj = ComposeProposal(profiler_dir_abs, device_id, proposal_type_list) | |||||
| proposal_info = proposal_obj.get_proposal(options) | |||||
| # Use json.dumps for orderly return | |||||
| return Response(json.dumps(proposal_info), mimetype='application/json') | |||||
| @BLUEPRINT.route("/profile/minddata-pipeline/op-queue", methods=["POST"]) | @BLUEPRINT.route("/profile/minddata-pipeline/op-queue", methods=["POST"]) | ||||
| def get_minddata_pipeline_op_queue_info(): | def get_minddata_pipeline_op_queue_info(): | ||||
| """ | """ | ||||
| @@ -176,6 +176,27 @@ def unquote_args(request, arg_name): | |||||
| return arg_value | return arg_value | ||||
| def get_device_id(request): | |||||
| """ | |||||
| Get device ID from requst query string and unquote content. | |||||
| Args: | |||||
| request (FlaskRequest): Http request instance. | |||||
| Returns: | |||||
| str, unquoted device ID. | |||||
| """ | |||||
| device_id = request.args.get('device_id') | |||||
| if device_id is not None: | |||||
| try: | |||||
| device_id = unquote(device_id, errors='strict') | |||||
| except UnicodeDecodeError: | |||||
| raise exceptions.UrlDecodeError('Unquote train id error with strict mode') | |||||
| else: | |||||
| device_id = "0" | |||||
| return device_id | |||||
| def if_nan_inf_to_none(name, value): | def if_nan_inf_to_none(name, value): | ||||
| """ | """ | ||||
| Transform value to None if it is NaN or Inf. | Transform value to None if it is NaN or Inf. | ||||
| @@ -197,6 +218,7 @@ def if_nan_inf_to_none(name, value): | |||||
| class Counter: | class Counter: | ||||
| """Count accumulator with limit checking.""" | """Count accumulator with limit checking.""" | ||||
| def __init__(self, max_count=None, init_count=0): | def __init__(self, max_count=None, init_count=0): | ||||
| self._count = init_count | self._count = init_count | ||||
| self._max_count = max_count | self._max_count = max_count | ||||
| @@ -144,3 +144,8 @@ def get_field_value(row_info, field_name, header, time_type='realtime'): | |||||
| value = to_millisecond(value) | value = to_millisecond(value) | ||||
| return value | return value | ||||
| def get_options(options): | |||||
| if options is None: | |||||
| options = {} | |||||
| return options | |||||
| @@ -0,0 +1,14 @@ | |||||
| # Copyright 2019 Huawei Technologies Co., Ltd | |||||
| # | |||||
| # Licensed under the Apache License, Version 2.0 (the "License"); | |||||
| # you may not use this file except in compliance with the License. | |||||
| # You may obtain a copy of the License at | |||||
| # | |||||
| # http://www.apache.org/licenses/LICENSE-2.0 | |||||
| # | |||||
| # Unless required by applicable law or agreed to in writing, software | |||||
| # distributed under the License is distributed on an "AS IS" BASIS, | |||||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
| # See the License for the specific language governing permissions and | |||||
| # limitations under the License. | |||||
| # ============================================================================ | |||||
| @@ -0,0 +1,20 @@ | |||||
| # Copyright 2019 Huawei Technologies Co., Ltd | |||||
| # | |||||
| # Licensed under the Apache License, Version 2.0 (the "License"); | |||||
| # you may not use this file except in compliance with the License. | |||||
| # You may obtain a copy of the License at | |||||
| # | |||||
| # http://www.apache.org/licenses/LICENSE-2.0 | |||||
| # | |||||
| # Unless required by applicable law or agreed to in writing, software | |||||
| # distributed under the License is distributed on an "AS IS" BASIS, | |||||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
| # See the License for the specific language governing permissions and | |||||
| # limitations under the License. | |||||
| # ============================================================================ | |||||
| """All proposers.""" | |||||
| from mindinsight.profiler.proposer.allproposers.common_proposer import CommonProposer | |||||
| from mindinsight.profiler.proposer.allproposers.step_trace_proposer import StepTraceProposer | |||||
| __all__ = ["CommonProposer", "StepTraceProposer"] | |||||
| @@ -0,0 +1,44 @@ | |||||
| # Copyright 2020 Huawei Technologies Co., Ltd | |||||
| # | |||||
| # Licensed under the Apache License, Version 2.0 (the "License"); | |||||
| # you may not use this file except in compliance with the License. | |||||
| # You may obtain a copy of the License at | |||||
| # | |||||
| # http://www.apache.org/licenses/LICENSE-2.0 | |||||
| # | |||||
| # Unless required by applicable law or agreed to in writing, software | |||||
| # distributed under the License is distributed on an "AS IS" BASIS, | |||||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
| # See the License for the specific language governing permissions and | |||||
| # limitations under the License. | |||||
| # ============================================================================ | |||||
| """The proposer base class.""" | |||||
| from abc import ABC, abstractmethod | |||||
| from mindinsight.profiler.common.log import logger | |||||
| from mindinsight.profiler.analyser.analyser_factory import AnalyserFactory | |||||
| from mindinsight.utils.exceptions import MindInsightException | |||||
| class Proposer(ABC): | |||||
| """The proposer base class.""" | |||||
| def __init__(self, profiling_path, device_id): | |||||
| self.profiling_path = profiling_path | |||||
| self.device_id = device_id | |||||
| def get_analyser_result(self, analyser_type, condition=None): | |||||
| logger.debug("The Proposer 'analyser_type' is %s, 'options' is %s", str(analyser_type), str(condition)) | |||||
| analyser_result = {} | |||||
| try: | |||||
| analyser = AnalyserFactory.instance().get_analyser(analyser_type, self.profiling_path, self.device_id) | |||||
| analyser_result = analyser.query(condition) | |||||
| logger.debug("The 'analyser_result' is %s, the 'condition' is %s.", str(analyser_result), str(condition)) | |||||
| except MindInsightException as e: | |||||
| logger.warning(e) | |||||
| return analyser_result | |||||
| @abstractmethod | |||||
| def analyze(self, options=None): | |||||
| """analysis and get proposal.""" | |||||
| raise NotImplementedError("Must define analyze function to inherit Class Propose") | |||||
| @@ -0,0 +1,42 @@ | |||||
| # Copyright 2020 Huawei Technologies Co., Ltd | |||||
| # | |||||
| # Licensed under the Apache License, Version 2.0 (the "License"); | |||||
| # you may not use this file except in compliance with the License. | |||||
| # You may obtain a copy of the License at | |||||
| # | |||||
| # http://www.apache.org/licenses/LICENSE-2.0 | |||||
| # | |||||
| # Unless required by applicable law or agreed to in writing, software | |||||
| # distributed under the License is distributed on an "AS IS" BASIS, | |||||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
| # See the License for the specific language governing permissions and | |||||
| # limitations under the License. | |||||
| # ============================================================================ | |||||
| """The common proposer.""" | |||||
| from collections import OrderedDict | |||||
| from mindinsight.profiler.common.util import get_options | |||||
| from mindinsight.profiler.proposer.allproposers.base_proposer import Proposer | |||||
| from mindinsight.profiler.common.log import logger | |||||
| class CommonProposer(Proposer): | |||||
| """The common proposer.""" | |||||
| def __init__(self, profiling_dir, device_id): | |||||
| super().__init__(profiling_dir, device_id) | |||||
| self.__proposal_dict = OrderedDict() | |||||
| self.__proposal_dict["common-profiler_tutorial"] = None | |||||
| def analyze(self, options=None): | |||||
| """ | |||||
| Get the proposal from proposer. | |||||
| Args: | |||||
| options: options for proposer analysis | |||||
| Returns: | |||||
| dict, the proposal from proposer instance. | |||||
| """ | |||||
| logger.info('The CommonProposer is running') | |||||
| options = get_options(options) | |||||
| return self.__proposal_dict | |||||
| @@ -0,0 +1,76 @@ | |||||
| # Copyright 2020 Huawei Technologies Co., Ltd | |||||
| # | |||||
| # Licensed under the Apache License, Version 2.0 (the "License"); | |||||
| # you may not use this file except in compliance with the License. | |||||
| # You may obtain a copy of the License at | |||||
| # | |||||
| # http://www.apache.org/licenses/LICENSE-2.0 | |||||
| # | |||||
| # Unless required by applicable law or agreed to in writing, software | |||||
| # distributed under the License is distributed on an "AS IS" BASIS, | |||||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
| # See the License for the specific language governing permissions and | |||||
| # limitations under the License. | |||||
| # ============================================================================ | |||||
| """The step trace proposer.""" | |||||
| from collections import OrderedDict | |||||
| from mindinsight.profiler.common.util import get_options | |||||
| from mindinsight.profiler.proposer.allproposers.base_proposer import Proposer | |||||
| from mindinsight.profiler.common.log import logger | |||||
| class StepTraceProposer(Proposer): | |||||
| """The step trace proposer.""" | |||||
| def __init__(self, profiling_dir, device_id): | |||||
| super().__init__(profiling_dir, device_id) | |||||
| self.__step_trace_iter_interval_threshold = 0.5 | |||||
| self.__proposer_type = "step_trace" | |||||
| self.__proposal_dict = OrderedDict() | |||||
| self.__iter_interval_label = "step_trace-iter_interval" | |||||
| def analyze(self, options=None): | |||||
| """ | |||||
| Get the proposal from proposer. | |||||
| Args: | |||||
| options (dict): options for proposer analysis. | |||||
| - step_trace: include optional parameters for step trace,The dictionary key is iter_interval | |||||
| used to get the analyser options for iteration interval time. | |||||
| Returns: | |||||
| dict, the proposal from proposer instance,the dictionary key is a language internationalization | |||||
| label, and the value is used to format the value in the language internationalization string. | |||||
| Examples: | |||||
| >>> proposer_type = 'step_trace' | |||||
| >>> proposer = ProposerFactory.instance().get_proposer(proposer_type, self.profiling_dir, self.device_id) | |||||
| >>> result = proposer.analyze(options) | |||||
| """ | |||||
| logger.info("The StepTraceProposer is running") | |||||
| options = get_options(options) | |||||
| logger.debug("The StepTraceProposer 'options' is %s", str(options)) | |||||
| step_trace_condition = options.get("step_trace", {}) | |||||
| # Get the proposals of iteration interval. | |||||
| self._iter_interval_analyze(step_trace_condition) | |||||
| return self.__proposal_dict | |||||
| def _iter_interval_analyze(self, step_trace_condition): | |||||
| """Get the proposals of iteration interval.""" | |||||
| iter_interval_dict = OrderedDict() | |||||
| default_iter_interval_lst = [0] | |||||
| iter_interval_condition = step_trace_condition.get("iter_interval", {}) | |||||
| analyser_result = self.get_analyser_result(self.__proposer_type, condition=iter_interval_condition) | |||||
| iter_interval_length_lst = analyser_result.get("info", {}).get("iteration_interval", | |||||
| default_iter_interval_lst) | |||||
| logger.debug("The 'iter_interval_length_lst' is %s", str(iter_interval_length_lst)) | |||||
| # Check the iter_interval_length_lst. | |||||
| if not isinstance(iter_interval_length_lst, list) or not iter_interval_length_lst: | |||||
| logger.warning("The 'iter_interval_length_lst' is %s, it is null or not a list", | |||||
| str(iter_interval_length_lst)) | |||||
| else: | |||||
| if iter_interval_length_lst[0] > self.__step_trace_iter_interval_threshold: | |||||
| iter_interval_dict[self.__iter_interval_label] = [str(self.__step_trace_iter_interval_threshold)] | |||||
| self.__proposal_dict.update(iter_interval_dict) | |||||
| @@ -0,0 +1,84 @@ | |||||
| # Copyright 2020 Huawei Technologies Co., Ltd | |||||
| # | |||||
| # Licensed under the Apache License, Version 2.0 (the "License"); | |||||
| # you may not use this file except in compliance with the License. | |||||
| # You may obtain a copy of the License at | |||||
| # | |||||
| # http://www.apache.org/licenses/LICENSE-2.0 | |||||
| # | |||||
| # Unless required by applicable law or agreed to in writing, software | |||||
| # distributed under the License is distributed on an "AS IS" BASIS, | |||||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
| # See the License for the specific language governing permissions and | |||||
| # limitations under the License. | |||||
| # ============================================================================ | |||||
| """The Compose Proposals.""" | |||||
| from collections import OrderedDict | |||||
| from mindinsight.profiler.common.log import logger | |||||
| from mindinsight.profiler.common.util import get_options | |||||
| from mindinsight.profiler.proposer.proposer_factory import ProposerFactory | |||||
| class ComposeProposal: | |||||
| """Get the proposals from multiple different proposers.""" | |||||
| def __init__(self, profiling_path, device_id, type_list=None): | |||||
| self.profiling_path = profiling_path | |||||
| self.device_id = device_id | |||||
| self.compose_proposer_type_list = type_list | |||||
| # Postfix of category label, used for UI to identify the label as category label. | |||||
| self.type_label_postfix = "-proposer_type_label" | |||||
| def get_proposal(self, options=None): | |||||
| """ | |||||
| Get compose proposals. | |||||
| Args: | |||||
| options (dict): options for composed proposal. | |||||
| - compose_proposal_result: execution results of the already running proposers. | |||||
| - step_trace: include optional parameters for step trace,The dictionary key is iter_interval | |||||
| used to get the analyser options for iteration interval time. | |||||
| Returns: | |||||
| dict, the proposals from multiple different proposers. | |||||
| Examples: | |||||
| >>> type_list = ['common', 'step_trace'] | |||||
| >>> condition = {"filter_condition": {'mode': "proc", "proc_name": "iteration_interval"}} | |||||
| >>> options = {'step_trace': {"iter_interval": condition}} | |||||
| >>> cp = ComposeProposal(self.profiling_dir, self.device_id, type_list) | |||||
| >>> result_proposal = cp.get_proposal(options=options) | |||||
| """ | |||||
| logger.info("The ComposeProposal is running") | |||||
| options = get_options(options) | |||||
| logger.debug("The 'options' is %s", str(options)) | |||||
| # The flag whether to write category label. | |||||
| type_label_flag = options.get("type_label_flag", True) | |||||
| compose_proposal_result = OrderedDict() | |||||
| logger.debug("The 'compose_proposer_type_list' is %s", str(self.compose_proposer_type_list)) | |||||
| for proposer_type in self.compose_proposer_type_list: | |||||
| proposer = ProposerFactory.instance().get_proposer(proposer_type, self.profiling_path, self.device_id) | |||||
| if proposer is None: | |||||
| continue | |||||
| # Write the result of proposals to option for other proposer to get. | |||||
| options["compose_proposal_result"] = compose_proposal_result | |||||
| result = proposer.analyze(options) | |||||
| # Insert category label. | |||||
| if result and type_label_flag: | |||||
| proposer_type_label = proposer_type + "-type_label" | |||||
| # Get the name of the category label, the default is the same as the proposer type. | |||||
| type_label_name = options.get(proposer_type_label, proposer_type) | |||||
| # Add postfix to category label name | |||||
| type_proposal_label = type_label_name + self.type_label_postfix | |||||
| compose_proposal_result[type_proposal_label] = None | |||||
| # Merge results to the proposals dictionary. | |||||
| compose_proposal_result.update(result) | |||||
| elif result and not type_label_flag: | |||||
| # Merge results to the proposals dictionary. | |||||
| compose_proposal_result.update(result) | |||||
| logger.debug("The 'compose_proposal_result' is %s", str(compose_proposal_result)) | |||||
| return compose_proposal_result | |||||
| @@ -0,0 +1,67 @@ | |||||
| # Copyright 2020 Huawei Technologies Co., Ltd | |||||
| # | |||||
| # Licensed under the Apache License, Version 2.0 (the "License"); | |||||
| # you may not use this file except in compliance with the License. | |||||
| # You may obtain a copy of the License at | |||||
| # | |||||
| # http://www.apache.org/licenses/LICENSE-2.0 | |||||
| # | |||||
| # Unless required by applicable law or agreed to in writing, software | |||||
| # distributed under the License is distributed on an "AS IS" BASIS, | |||||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
| # See the License for the specific language governing permissions and | |||||
| # limitations under the License. | |||||
| # ============================================================================ | |||||
| """The proposer factory.""" | |||||
| import threading | |||||
| import mindinsight.profiler.proposer.allproposers as proposer_module | |||||
| from mindinsight.profiler.common.log import logger | |||||
| class ProposerFactory: | |||||
| """The Proposer factory is used to create Proposer special instance.""" | |||||
| _lock = threading.Lock() | |||||
| _instance = None | |||||
| def __new__(cls, *args, **kwargs): | |||||
| if cls._instance is None: | |||||
| with cls._lock: | |||||
| if cls._instance is None: | |||||
| cls._instance = super().__new__(cls, *args, **kwargs) | |||||
| return cls._instance | |||||
| @classmethod | |||||
| def instance(cls): | |||||
| """The factory instance.""" | |||||
| if cls._instance is None: | |||||
| cls._instance = cls() | |||||
| return cls._instance | |||||
| def get_proposer(self, proposer_type, *args): | |||||
| """ | |||||
| Get the specified proposer according to the proposer type. | |||||
| Args: | |||||
| proposer_type (str): The proposer type. | |||||
| args (list): The parameters required for the specific proposer class. | |||||
| Returns: | |||||
| Proposer, the specified proposer instance. | |||||
| Examples: | |||||
| >>> proposer_type = 'step_trace' | |||||
| >>> proposer = ProposerFactory.instance().get_proposer(proposer_type, self.profiling_dir, self.device_id) | |||||
| """ | |||||
| logger.debug("The 'proposer_type' is %s,The 'args' is %s", proposer_type, str(args)) | |||||
| proposer_instance = None | |||||
| sub_name = proposer_type.split('_') | |||||
| proposer_class_name = ''.join([name.capitalize() for name in sub_name]) | |||||
| proposer_class_name += 'Proposer' | |||||
| if hasattr(proposer_module, proposer_class_name): | |||||
| proposer_instance = getattr(proposer_module, proposer_class_name)(*args) | |||||
| else: | |||||
| logger.warning("The proposer class %s does not exist.", proposer_class_name) | |||||
| return proposer_instance | |||||
| @@ -0,0 +1,14 @@ | |||||
| # Copyright 2020 Huawei Technologies Co., Ltd | |||||
| # | |||||
| # Licensed under the Apache License, Version 2.0 (the "License"); | |||||
| # you may not use this file except in compliance with the License. | |||||
| # You may obtain a copy of the License at | |||||
| # | |||||
| # http://www.apache.org/licenses/LICENSE-2.0 | |||||
| # | |||||
| # Unless required by applicable law or agreed to in writing, software | |||||
| # distributed under the License is distributed on an "AS IS" BASIS, | |||||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
| # See the License for the specific language governing permissions and | |||||
| # limitations under the License. | |||||
| # ============================================================================ | |||||
| @@ -0,0 +1,117 @@ | |||||
| # Copyright 2020 Huawei Technologies Co., Ltd | |||||
| # | |||||
| # Licensed under the Apache License, Version 2.0 (the "License"); | |||||
| # you may not use this file except in compliance with the License. | |||||
| # You may obtain a copy of the License at | |||||
| # | |||||
| # http://www.apache.org/licenses/LICENSE-2.0 | |||||
| # | |||||
| # Unless required by applicable law or agreed to in writing, software | |||||
| # distributed under the License is distributed on an "AS IS" BASIS, | |||||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
| # See the License for the specific language governing permissions and | |||||
| # limitations under the License. | |||||
| # ============================================================================ | |||||
| """Test the proposer module.""" | |||||
| import os | |||||
| from unittest import TestCase | |||||
| from collections import OrderedDict | |||||
| from mindinsight.profiler.proposer.proposer_factory import ProposerFactory | |||||
| from mindinsight.profiler.proposer.compose_proposer import ComposeProposal | |||||
| class TestPropose(TestCase): | |||||
| """Test the class of Proposer.""" | |||||
| def setUp(self) -> None: | |||||
| """Initialization before test case execution.""" | |||||
| self.profiling_dir = os.path.realpath(os.path.join(os.path.dirname(__file__), | |||||
| '../../../utils/resource/profiler')) | |||||
| self.device_id = 0 | |||||
| self.common_proposal_dict = OrderedDict() | |||||
| self.common_proposal_dict["common-profiler_tutorial"] = None | |||||
| self.step_trace_proposal_dict = OrderedDict() | |||||
| self.step_trace_proposal_dict["step_trace-iter_interval"] = ['0.5'] | |||||
| def test_propose_compose(self): | |||||
| """Test the class of ComposeProposal.""" | |||||
| proposal_dict = OrderedDict() | |||||
| proposal_dict["step_trace-proposer_type_label"] = None | |||||
| proposal_dict.update(self.step_trace_proposal_dict) | |||||
| proposal_dict["common-proposer_type_label"] = None | |||||
| proposal_dict.update(self.common_proposal_dict) | |||||
| type_list = ['step_trace', 'common'] | |||||
| condition = {"filter_condition": {'mode': "proc", | |||||
| "proc_name": "iteration_interval", | |||||
| "step_id": 0}} | |||||
| options = {'step_trace': {"iter_interval": condition}} | |||||
| cp = ComposeProposal(self.profiling_dir, self.device_id, type_list) | |||||
| result = cp.get_proposal(options=options) | |||||
| self.assertDictEqual(proposal_dict, result) | |||||
| def test_propose_compose_exception(self): | |||||
| """Test the class of ComposeProposal.""" | |||||
| profiling_dir = os.path.realpath(os.path.join(os.path.dirname(__file__), | |||||
| '../../../utils/resource/test')) | |||||
| proposal_dict = OrderedDict() | |||||
| proposal_dict["common-proposer_type_label"] = None | |||||
| proposal_dict.update(self.common_proposal_dict) | |||||
| type_list = ['step_trace', 'common'] | |||||
| condition = {"filter_condition": {'mode': "proc", | |||||
| "proc_name": "iteration_interval", | |||||
| "step_id": 0}} | |||||
| options = {'step_trace': {"iter_interval": condition}} | |||||
| cp = ComposeProposal(profiling_dir, self.device_id, type_list) | |||||
| result = cp.get_proposal(options=options) | |||||
| self.assertDictEqual(proposal_dict, result) | |||||
| def test_propose_compose_type_label(self): | |||||
| """Test the class of ComposeProposal.""" | |||||
| proposal_dict = OrderedDict() | |||||
| proposal_dict["test_label-proposer_type_label"] = None | |||||
| proposal_dict.update(self.step_trace_proposal_dict) | |||||
| proposal_dict["common-proposer_type_label"] = None | |||||
| proposal_dict.update(self.common_proposal_dict) | |||||
| type_list = ['step_trace', 'common'] | |||||
| condition = {"filter_condition": {'mode': "proc", | |||||
| "proc_name": "iteration_interval", | |||||
| "step_id": 0}} | |||||
| options = {'step_trace': {"iter_interval": condition}, "step_trace-type_label": "test_label"} | |||||
| cp = ComposeProposal(self.profiling_dir, self.device_id, type_list) | |||||
| result = cp.get_proposal(options=options) | |||||
| self.assertDictEqual(proposal_dict, result) | |||||
| def test_propose_compose_type_label_flag(self): | |||||
| """Test the class of ComposeProposal.""" | |||||
| proposal_dict = OrderedDict() | |||||
| proposal_dict.update(self.step_trace_proposal_dict) | |||||
| proposal_dict.update(self.common_proposal_dict) | |||||
| type_list = ['step_trace', 'common'] | |||||
| condition = {"filter_condition": {'mode': "proc", | |||||
| "proc_name": "iteration_interval", | |||||
| "step_id": 0}} | |||||
| options = {'step_trace': {"iter_interval": condition}, | |||||
| "step_trace-type_label": "test_label", | |||||
| "type_label_flag": False} | |||||
| cp = ComposeProposal(self.profiling_dir, self.device_id, type_list) | |||||
| result = cp.get_proposal(options=options) | |||||
| self.assertDictEqual(proposal_dict, result) | |||||
| def test_propose_common(self): | |||||
| proposer_type = 'common' | |||||
| proposer = ProposerFactory.instance().get_proposer(proposer_type, self.profiling_dir, self.device_id) | |||||
| result = proposer.analyze() | |||||
| self.assertDictEqual(self.common_proposal_dict, result) | |||||
| def test_propose_step_trace(self): | |||||
| """Test the class of step trace.""" | |||||
| proposer_type = 'step_trace' | |||||
| proposer = ProposerFactory.instance().get_proposer(proposer_type, self.profiling_dir, self.device_id) | |||||
| condition = {"filter_condition": {'mode': "proc", | |||||
| "proc_name": "iteration_interval", | |||||
| "step_id": 0}} | |||||
| options = {'step_trace': {"iter_interval": condition}} | |||||
| result = proposer.analyze(options) | |||||
| self.assertDictEqual(self.step_trace_proposal_dict, result) | |||||
| @@ -1,22 +1,22 @@ | |||||
| step_num,start_point,end_point,total,fp_point,bp_point,iteration_interval,fp_and_bp,tail,stream_10_parallel_0_start_point,stream_10_parallel_0_end_point,stream_10_parallel_0,stream_10_parallel_1_start_point,stream_10_parallel_1_end_point,stream_10_parallel_1,stream_10_parallel_2_start_point,stream_10_parallel_2_end_point,stream_10_parallel_2,stream_11_parallel_0_start_point,stream_11_parallel_0_end_point,stream_11_parallel_0 | |||||
| 1,45000030081,45004033128,4003047,45000030081,45001733025,0,1702944,2300103,45000042679,45000060275,17596,45001048152,45001346254,298102,45002247411,45002448354,200943,45000049687,45000075987,26300 | |||||
| 2,45004033128,45017085658,13052530,45013070937,45014785314,9037809,1714377,2300344,45013085379,45013105429,20050,45014087119,45014385136,298017,45015297166,45015504449,207283,45013084925,45013118334,33409 | |||||
| 3,45017085658,45030119392,13033734,45026116231,45027818443,9030573,1702212,2300949,45026131909,45026150554,18645,45027134392,45027430418,296026,45028337093,45028537767,200674,45026129217,45026160937,31720 | |||||
| 4,45030119392,45043158607,13039215,45039152348,45040856975,9032956,1704627,2301632,45039169890,45039188966,19076,45040169338,45040466770,297432,45041374122,45041567754,193632,45039171681,45039193865,22184 | |||||
| 5,45043158607,45056198128,13039521,45052190932,45053898028,9032325,1707096,2300100,45052207675,45052222642,14967,45053204442,45053505540,301098,45054413207,45054616536,203329,45052201931,45052237599,35668 | |||||
| 6,45056198128,45069239564,13041436,45065233106,45066939463,9034978,1706357,2300101,45065245482,45065272534,27052,45066248423,45066546419,297996,45067455113,45067659145,204032,45065245817,45065279896,34079 | |||||
| 7,45069239564,45082281383,13041819,45078274997,45079980193,9035433,1705196,2301190,45078293910,45078312935,19025,45079287754,45079593841,306087,45080492957,45080691395,198438,45078292067,45078322277,30210 | |||||
| 8,45082281383,45095336378,13054995,45091321488,45093036084,9040105,1714596,2300294,45091338628,45091359138,20510,45092338469,45092638994,300525,45093554195,45093747470,193275,45091341356,45091369667,28311 | |||||
| 9,45095336378,45108372225,13035847,45104363079,45106071009,9026701,1707930,2301216,45104374524,45104400088,25564,45105378751,45105683029,304278,45106587481,45106785336,197855,45104382131,45104410852,28721 | |||||
| 10,45108372225,45121412413,13040188,45117401873,45119111301,9029648,1709428,2301112,45117417721,45117439668,21947,45118413083,45118718050,304967,45119629347,45119829996,200649,45117421502,45117446718,25216 | |||||
| 11,45121412413,45134477662,13065249,45130459598,45132175723,9047185,1716125,2301939,45130478168,45130498936,20768,45131477957,45131775220,297263,45132691645,45132893707,202062,45130470285,45130501652,31367 | |||||
| 12,45134477662,45147533298,13055636,45143521860,45145232553,9044198,1710693,2300745,45143533787,45143557293,23506,45144533554,45144841545,307991,45145744997,45145952255,207258,45143537383,45143563466,26083 | |||||
| 13,45147533298,45160588134,13054836,45156570201,45158286694,9036903,1716493,2301440,45156581069,45156609506,28437,45157581617,45157880841,299224,45158806166,45158999875,193709,45156589050,45156615664,26614 | |||||
| 14,45160588134,45173640064,13051930,45169625906,45171339426,9037772,1713520,2300638,45169637432,45169661754,24322,45170639482,45170940949,301467,45171853721,45172056606,202885,45169644605,45169673410,28805 | |||||
| 15,45173640064,45186671634,13031570,45182666696,45184371430,9026632,1704734,2300204,45182678355,45182698471,20116,45183679568,45183981082,301514,45184887156,45185083035,195879,45182680062,45182708455,28393 | |||||
| 16,45186671634,45199720448,13048814,45195714716,45197420410,9043082,1705694,2300038,45195728993,45195754646,25653,45196732493,45197028048,295555,45197934921,45198139237,204316,45195733069,45195764102,31033 | |||||
| 17,45199720448,45212762605,13042157,45208758416,45210460864,9037968,1702448,2301741,45208771010,45208790367,19357,45209773548,45210074988,301440,45210978277,45211173577,195300,45208773143,45208803280,30137 | |||||
| 18,45212762605,45225814601,13051996,45221801814,45223514580,9039209,1712766,2300021,45221815911,45221839644,23733,45222819211,45223114544,295333,45224031469,45224234043,202574,45221812106,45221849103,36997 | |||||
| 19,45225814601,45238848430,13033829,45234842015,45236548356,9027414,1706341,2300074,45234855444,45234876469,21025,45235853358,45236160825,307467,45237063061,45237260964,197903,45234857141,45234882976,25835 | |||||
| 20,45238848430,45251899738,13051308,45247879385,45249598280,9030955,1718895,2301458,45247896725,45247917316,20591,45248896361,45249193681,297320,45250117916,45250315651,197735,45247894228,45247926723,32495 | |||||
| -,45121436513,45134482124,13045611,45130471874,45132181322,9035360,1709449,2300802,45130486422,45130508229,21808,45131486785,45131787364,300579,45132697369,45132897305,199936,45130487458,45130517315,29857 | |||||
| step_num,start_point,end_point,total,fp_point,bp_point,iteration_interval,fp_and_bp,tail,stream_10_parallel_0_start_point,stream_10_parallel_0_end_point,stream_10_parallel_0,stream_10_parallel_1_start_point,stream_10_parallel_1_end_point,stream_10_parallel_1,stream_10_parallel_2_start_point,stream_10_parallel_2_end_point,stream_10_parallel_2,stream_11_parallel_0_start_point,stream_11_parallel_0_end_point,stream_11_parallel_0 | |||||
| 1,45000030081,45004033128,4003047,45000030081,45001733025,0,1702944,2300103,45000042679,45000060275,17596,45001048152,45001346254,298102,45002247411,45002448354,200943,45000049687,45000075987,26300 | |||||
| 2,45004033128,45017085658,13052530,45013070937,45014785314,9037809,1714377,2300344,45013085379,45013105429,20050,45014087119,45014385136,298017,45015297166,45015504449,207283,45013084925,45013118334,33409 | |||||
| 3,45017085658,45030119392,13033734,45026116231,45027818443,9030573,1702212,2300949,45026131909,45026150554,18645,45027134392,45027430418,296026,45028337093,45028537767,200674,45026129217,45026160937,31720 | |||||
| 4,45030119392,45043158607,13039215,45039152348,45040856975,9032956,1704627,2301632,45039169890,45039188966,19076,45040169338,45040466770,297432,45041374122,45041567754,193632,45039171681,45039193865,22184 | |||||
| 5,45043158607,45056198128,13039521,45052190932,45053898028,9032325,1707096,2300100,45052207675,45052222642,14967,45053204442,45053505540,301098,45054413207,45054616536,203329,45052201931,45052237599,35668 | |||||
| 6,45056198128,45069239564,13041436,45065233106,45066939463,9034978,1706357,2300101,45065245482,45065272534,27052,45066248423,45066546419,297996,45067455113,45067659145,204032,45065245817,45065279896,34079 | |||||
| 7,45069239564,45082281383,13041819,45078274997,45079980193,9035433,1705196,2301190,45078293910,45078312935,19025,45079287754,45079593841,306087,45080492957,45080691395,198438,45078292067,45078322277,30210 | |||||
| 8,45082281383,45095336378,13054995,45091321488,45093036084,9040105,1714596,2300294,45091338628,45091359138,20510,45092338469,45092638994,300525,45093554195,45093747470,193275,45091341356,45091369667,28311 | |||||
| 9,45095336378,45108372225,13035847,45104363079,45106071009,9026701,1707930,2301216,45104374524,45104400088,25564,45105378751,45105683029,304278,45106587481,45106785336,197855,45104382131,45104410852,28721 | |||||
| 10,45108372225,45121412413,13040188,45117401873,45119111301,9029648,1709428,2301112,45117417721,45117439668,21947,45118413083,45118718050,304967,45119629347,45119829996,200649,45117421502,45117446718,25216 | |||||
| 11,45121412413,45134477662,13065249,45130459598,45132175723,9047185,1716125,2301939,45130478168,45130498936,20768,45131477957,45131775220,297263,45132691645,45132893707,202062,45130470285,45130501652,31367 | |||||
| 12,45134477662,45147533298,13055636,45143521860,45145232553,9044198,1710693,2300745,45143533787,45143557293,23506,45144533554,45144841545,307991,45145744997,45145952255,207258,45143537383,45143563466,26083 | |||||
| 13,45147533298,45160588134,13054836,45156570201,45158286694,9036903,1716493,2301440,45156581069,45156609506,28437,45157581617,45157880841,299224,45158806166,45158999875,193709,45156589050,45156615664,26614 | |||||
| 14,45160588134,45173640064,13051930,45169625906,45171339426,9037772,1713520,2300638,45169637432,45169661754,24322,45170639482,45170940949,301467,45171853721,45172056606,202885,45169644605,45169673410,28805 | |||||
| 15,45173640064,45186671634,13031570,45182666696,45184371430,9026632,1704734,2300204,45182678355,45182698471,20116,45183679568,45183981082,301514,45184887156,45185083035,195879,45182680062,45182708455,28393 | |||||
| 16,45186671634,45199720448,13048814,45195714716,45197420410,9043082,1705694,2300038,45195728993,45195754646,25653,45196732493,45197028048,295555,45197934921,45198139237,204316,45195733069,45195764102,31033 | |||||
| 17,45199720448,45212762605,13042157,45208758416,45210460864,9037968,1702448,2301741,45208771010,45208790367,19357,45209773548,45210074988,301440,45210978277,45211173577,195300,45208773143,45208803280,30137 | |||||
| 18,45212762605,45225814601,13051996,45221801814,45223514580,9039209,1712766,2300021,45221815911,45221839644,23733,45222819211,45223114544,295333,45224031469,45224234043,202574,45221812106,45221849103,36997 | |||||
| 19,45225814601,45238848430,13033829,45234842015,45236548356,9027414,1706341,2300074,45234855444,45234876469,21025,45235853358,45236160825,307467,45237063061,45237260964,197903,45234857141,45234882976,25835 | |||||
| 20,45238848430,45251899738,13051308,45247879385,45249598280,9030955,1718895,2301458,45247896725,45247917316,20591,45248896361,45249193681,297320,45250117916,45250315651,197735,45247894228,45247926723,32495 | |||||
| -,45121436513,45134482124,13045611,45130471874,45132181322,9035360,1709449,2300802,45130486422,45130508229,21808,45131486785,45131787364,300579,45132697369,45132897305,199936,45130487458,45130517315,29857 | |||||