# 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 gpu base analyser.""" import csv import os from mindinsight.profiler.analyser.base_analyser import BaseAnalyser from mindinsight.profiler.common.log import logger class GpuAnalyser(BaseAnalyser): """Gpu base analyser.""" _csv_file_to_analyse = "" def _load(self): """Load data according to the parsed AICORE operator types file.""" op_type_file_path = os.path.join( self._profiling_dir, self._csv_file_to_analyse.format(self._device_id) ) if not os.path.isfile(op_type_file_path): logger.warning('The file <%s> does not exist.', op_type_file_path) return with open(op_type_file_path, 'r') as file: csv_reader = csv.reader(file) _ = next(csv_reader) for info in csv_reader: self._data.append(self._convert_field_type(info)) @staticmethod def _convert_field_type(row): """ Convert the field type to the specific type. Args: row (list): One row data from parsed data. Returns: list, the converted data. """ return row def _filter(self, filter_condition): """ Filter the profiling data according to the filter condition. Args: filter_condition (dict): The filter condition. """ def _inner_filter(item: list): return self._default_filter(item, filter_condition) self._result = list(filter(_inner_filter, self._data)) class GpuOpTypeAnalyser(GpuAnalyser): """Gpu operation type analyser.""" _col_names = ["op_type", "type_occurrences", "total_time", "proportion", "avg_time"] _csv_file_to_analyse = 'gpu_op_type_info_{}.csv' @staticmethod def _convert_field_type(row): """ Convert the field type to the specific type. Args: row (list): One row data from parsed data. Returns: list, the converted data. """ return [row[0], int(row[1]), float(row[2]), float(row[3]), float(row[4])] class GpuOpInfoAnalyser(GpuAnalyser): """Gpu operation detail info analyser.""" _col_names = ["op_side", "op_type", "op_name", "op_full_name", "op_occurrences", "op_total_time", "op_avg_time", "proportion", "cuda_activity_cost_time", "cuda_activity_call_count"] _csv_file_to_analyse = 'gpu_op_detail_info_{}.csv' @staticmethod def _convert_field_type(row): """ Convert the field type to the specific type. Args: row (list): One row data from parsed data. Returns: list, the converted data. """ return [row[0], row[1], row[2], row[3], int(row[4]), float(row[5]), float(row[6]), float(row[7]), float(row[8]), int(row[9])] class GpuCudaActivityAnalyser(GpuAnalyser): """Gpu activity type analyser.""" _col_names = ["name", "type", "op_full_name", "stream_id", "block_dim", "grid_dim", "occurrences", "total_duration", "avg_duration", "max_duration", "min_duration"] _csv_file_to_analyse = 'gpu_activity_data_{}.csv' @staticmethod def _convert_field_type(row): """ Convert the field type to the specific type. Args: row (list): One row data from parsed data. Returns: list, the converted data. """ return [row[0], row[1], row[2], row[3], row[4], row[5], int(row[6]), float(row[7]), float(row[8]), float(row[9]), float(row[10])]