# Copyright 2020-2021 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 container of metadata used in profiler parser.""" GIGABYTES = 1024 * 1024 * 1024 class HWTSContainer: """ HWTS output container. Args: split_list (list): The split list of metadata in HWTS output file. """ def __init__(self, split_list): self._op_name = '' self._duration = None self._status = split_list[0] self._task_id = split_list[6] self._cycle_counter = float(split_list[7]) self._stream_id = split_list[8] @property def status(self): """Get the status of the operator, i.e. Start or End.""" return self._status @property def task_id(self): """Get the task id of the operator.""" return self._task_id @property def cycle_counter(self): """Get the cycle counter.""" return self._cycle_counter @property def stream_id(self): """Get the stream id of the operator.""" return self._stream_id @property def op_name(self): """Get the name of the operator.""" return self._op_name @op_name.setter def op_name(self, name): """Set the name of the operator.""" self._op_name = name @property def duration(self): """Get the duration of the operator execution.""" return self._duration @duration.setter def duration(self, value): """Set the duration of the operator execution.""" self._duration = value class TimelineContainer: """ A container of operator computation metadata. Args: split_list (list): The split list of metadata in op_compute output file. """ def __init__(self, split_list): self._op_name = split_list[0] self._stream_id = str(split_list[1]) self._start_time = float(split_list[2]) self._duration = float(split_list[3]) self._pid = None if len(split_list) == 5: self._pid = int(split_list[4]) @property def op_name(self): """Get the name of the operator.""" return self._op_name @property def stream_id(self): """Get the stream id of the operator.""" return self._stream_id @property def start_time(self): """Get the execution start time of the operator.""" return self._start_time @property def duration(self): """Get the duration of the operator execution.""" return self._duration @property def pid(self): """Get the pid of the operator execution.""" return self._pid class MemoryGraph: """ A container for graph. Args: graph_proto (proto): Graph proto, defined in profiler module. """ def __init__(self, graph_proto): self._graph_proto = graph_proto self.graph_id = graph_proto.graph_id self.static_mem = graph_proto.static_mem / GIGABYTES self.fp_start = None self.bp_end = None self.lines = [] self.nodes = {} self.breakdowns = [] def to_dict(self): """Convert Graph to dict.""" graph = { 'graph_id': self.graph_id, 'static_mem': self.static_mem, 'nodes': self.nodes, 'fp_start': self.fp_start, 'bp_end': self.bp_end, 'lines': self.lines, 'breakdowns': self.breakdowns } return graph class MemoryNode: """ A container for node. Args: node_proto (proto): Node proto. """ def __init__(self, node_proto): self._node_proto = node_proto self.node_id = node_proto.node_id self.name = node_proto.node_name self.fullname = "" self.input_ids = list(node_proto.input_tensor_id) self.output_ids = list(node_proto.output_tensor_id) self.workspace_ids = list(node_proto.workspace_tensor_id) self.inputs = [] self.outputs = [] self.workspaces = [] self.allocations = 0 self.deallocations = 0 self.size = 0 self.mem_change = 0 def to_dict(self): """Convert Node to dict.""" node = { 'name': self.name, 'fullname': self.fullname, 'node_id': self.node_id, 'allocations': self.allocations, 'size': self.size, 'allocated': self.mem_change, 'inputs': self.inputs, 'outputs': self.outputs } return node class MemoryTensor: """ A container for tensor. Args: tensor_proto (proto): Tensor proto. """ def __init__(self, tensor_proto): self._tensor_proto = tensor_proto self.tensor_id = tensor_proto.tensor_id self.life_long = tensor_proto.life_long self.life_start = tensor_proto.life_start self.life_end = tensor_proto.life_end self.size = tensor_proto.size / GIGABYTES self.type = tensor_proto.type self.shape = "" self.format = "" self.dtype = "" self.source_node = "" self.name = "" def to_dict(self): """Convert Tensor to a dict.""" tensor = { 'tensor_name': self.name, 'tensor_id': self.tensor_id, 'size': self.size, 'type': self.type, 'shape': self.shape, 'format': self.format, 'data_type': self.dtype, 'life_long': self.life_long, 'life_start': self.life_start, 'life_end': self.life_end } return tensor