forked from huawei/mindspore2022
89 lines
3.9 KiB
Python
89 lines
3.9 KiB
Python
# 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.
|
|
# ============================================================================
|
|
"""Minddata aicpu parser."""
|
|
import os
|
|
|
|
from mindspore.profiler.common.util import get_file_join_name, fwrite_format
|
|
from mindspore import log as logger
|
|
|
|
|
|
class MinddataParser:
|
|
"""Minddata Aicpu Parser."""
|
|
@staticmethod
|
|
def parse_minddata_aicpu_data(minddata_aicpu_source_path):
|
|
"""
|
|
Parse minddata get_next info which contains queue size and execute time.
|
|
|
|
Args:
|
|
minddata_aicpu_source_path (str): the source file path.
|
|
|
|
Returns:
|
|
list[Union[str, float]], the converted data.
|
|
"""
|
|
result = list()
|
|
try:
|
|
with open(minddata_aicpu_source_path) as source_data_file:
|
|
source_data = source_data_file.read()
|
|
step_data = source_data.split("\x00")
|
|
for one_step in step_data:
|
|
if one_step:
|
|
node_info = one_step.split(", ")
|
|
node_name, node_start, node_end, queue_size = "", 0, 0, 0
|
|
if node_info:
|
|
node_name = node_info[0].replace("Node:", "")
|
|
if len(node_info) > 2:
|
|
node_start = node_info[1].replace("Run start:", "")
|
|
if node_start.isdigit():
|
|
node_start = int(node_start)
|
|
node_end = node_info[2].replace("Run end:", "")
|
|
if node_end.isdigit():
|
|
node_end = int(node_end)
|
|
if len(node_info) > 3:
|
|
queue_size = node_info[3].replace("queue size:", "")
|
|
if queue_size.isdigit():
|
|
queue_size = int(queue_size)
|
|
|
|
one_step_list = [node_name, node_start, node_end, queue_size]
|
|
result.append(one_step_list)
|
|
except OSError:
|
|
logger.error("Open get_next profiling file error.")
|
|
|
|
return result
|
|
|
|
@staticmethod
|
|
def execute(source_path, output_path, device_id):
|
|
"""
|
|
Execute the parser.
|
|
|
|
Args:
|
|
source_path (str): the source file path.
|
|
output_path (str): the output file path.
|
|
device_id (str): the device id.
|
|
"""
|
|
col_names = ["node_name", "start_time", "end_time", "queue_size"]
|
|
minddata_aicpu_source_path = get_file_join_name(
|
|
input_path=source_path, file_name='DATA_PREPROCESS.dev.AICPUMI')
|
|
if not minddata_aicpu_source_path:
|
|
minddata_aicpu_source_path = get_file_join_name(
|
|
input_path=os.path.join(source_path, "data"), file_name='DATA_PREPROCESS.dev.AICPUMI')
|
|
if not minddata_aicpu_source_path:
|
|
return
|
|
minddata_aicpu_output_path = os.path.join(output_path, "minddata_aicpu_" + device_id + ".txt")
|
|
|
|
minddata_aicpu_data = MinddataParser.parse_minddata_aicpu_data(minddata_aicpu_source_path)
|
|
if minddata_aicpu_data:
|
|
fwrite_format(minddata_aicpu_output_path, " ".join(col_names), is_start=True)
|
|
fwrite_format(minddata_aicpu_output_path, minddata_aicpu_data, is_start=True)
|