提交 c52d0501 编写于 作者: Y yelihua

update ut, st and validation.

上级 eacfb6a5
......@@ -121,7 +121,7 @@ def get_training_trace_graph():
>>> GET http://xxxx/v1/mindinsight/profile/training-trace/graph
"""
summary_dir = request.args.get("dir")
profiler_dir = validate_and_normalize_profiler_path(summary_dir)
profiler_dir = validate_and_normalize_profiler_path(summary_dir, settings.SUMMARY_BASE_DIR)
graph_type = request.args.get("type", default='0')
graph_type = to_int(graph_type, 'graph_type')
device_id = request.args.get("device_id", default='0')
......@@ -150,7 +150,7 @@ def get_target_time_info():
>>> GET http://xxxx/v1/mindinsight/profile/training-trace/target-time-info
"""
summary_dir = request.args.get("dir")
profiler_dir = validate_and_normalize_profiler_path(summary_dir)
profiler_dir = validate_and_normalize_profiler_path(summary_dir, settings.SUMMARY_BASE_DIR)
proc_name = request.args.get("type")
validate_ui_proc(proc_name)
device_id = request.args.get("device_id", default='0')
......
......@@ -226,7 +226,9 @@ class StepTraceAnalyser(BaseAnalyser):
time_type (str): The value type. `systime` keeps the original value.
`realtime` transforms the value in millisecond. Default: `realtime`.
"""
if proc_name is None:
log.error('`proc_name` is required for query.')
raise ProfilerParamValueErrorException('`proc_name` is required for query.')
if step_id is None:
rows_info = self._data[:-1]
else:
......@@ -241,7 +243,7 @@ class StepTraceAnalyser(BaseAnalyser):
mode = filter_condition.get('mode', 'step')
self._validate_str_param(mode, ['step', 'proc'], 'mode')
step_id = filter_condition.get('step_id', 0)
step_id = filter_condition.get('step_id')
self._validate_step_id(step_id)
proc_name = filter_condition.get('proc_name')
......@@ -252,7 +254,7 @@ class StepTraceAnalyser(BaseAnalyser):
def _validate_step_id(self, step_id):
"""Validate step_id."""
if isinstance(step_id, int) and 0 <= step_id <= self._size:
if step_id is None or isinstance(step_id, int) and 0 <= step_id <= self._size:
return
log.error("Invalid step_id in request. step_id should be in [0, %d].", self._size)
raise StepNumNotSupportedException([0, self._size])
......
......@@ -135,6 +135,6 @@ def get_field_value(row_info, field_name, header, time_type='realtime'):
value = row_info[field_index]
value = to_int(value, field_name)
if time_type == 'realtime':
value = value / per_ms_syscnt
value = round(value / per_ms_syscnt, 4)
return value
......@@ -125,28 +125,28 @@ def validate_and_normalize_path(
return normalized_path
def validate_and_normalize_profiler_path(path):
def validate_and_normalize_profiler_path(summary_dir, summary_base_dir):
"""
Validate and normalize profiler path.
Args:
path (str): The path of summary directory.
summary_dir (str): The relative path of summary directory.
summary_base_dir (str): The summary base directory.
Returns:
str, normalized path of profiler directory.
"""
if not path:
if not summary_dir:
raise ProfilerParamValueErrorException('The file dir does not exist.')
try:
unquote_path = unquote(path, errors='strict')
unquote_path = unquote(summary_dir, errors='strict')
except UnicodeDecodeError:
raise ProfilerParamValueErrorException('Unquote error with strict mode')
profiler_dir = os.path.join(unquote_path, 'profiler')
profiler_dir = os.path.join(summary_base_dir, unquote_path, 'profiler')
try:
profiler_dir = validate_and_normalize_path(profiler_dir, 'profiler')
except ValidationError:
log.error('profiler dir <%s> is invalid', unquote_path)
log.error('profiler dir <%s> is invalid', profiler_dir)
raise ProfilerParamValueErrorException('Profiler dir is invalid.')
return profiler_dir
......@@ -43,8 +43,8 @@ class HWTSLogParser:
file_name = get_file_join_name(self._input_path, self._source_file_target)
if not file_name:
msg = ("Fail to find hwts log file, under directory %s" \
%self._input_path)
msg = ("Fail to find hwts log file, under directory %s"
% self._input_path)
raise RuntimeError(msg)
return file_name
......
......@@ -55,7 +55,7 @@ class StepTraceParser:
def output_file(self):
"""The property of step trace header."""
file_name = self._output_path.rsplit('/', 2)
return file_name
return file_name[-1] if len(file_name) == 3 else ''
def show(self):
"""The property of step trace info."""
......@@ -65,7 +65,7 @@ class StepTraceParser:
summary_info['total_steps'] = len(self._result) - 1
print('\nStep trace summary info (unit: syscnt):')
print(summary_info)
print('\nThe step trace parse result saves under {summary_dir}/%s' % self.output_file)
print('\nThe step trace parse result saves under ${summary_dir}/profiler/%s' % self.output_file)
def parse_and_save(self):
"""Parse step trace files and save the result."""
......@@ -76,7 +76,8 @@ class StepTraceParser:
except MindInsightException as err:
log.error("Failed to parse and save step trace files.")
log.exception(err)
log.info("Finish to save intermediate result for step trace file.")
else:
log.info("Finish to save intermediate result for step trace file.")
def _get_step_trace_file(self):
"""Get step trace file."""
......
......@@ -12,3 +12,9 @@
# See the License for the specific language governing permissions and
# limitations under the License.
# ============================================================================
"""Unit test for profiler."""
import os
RAW_DATA_BASE = os.path.realpath(os.path.join(os.path.dirname(__file__), '../../utils/resource'))
RAW_DATA = os.path.realpath(os.path.join(RAW_DATA_BASE, 'JOB1'))
PROFILER_DIR = os.path.realpath(os.path.join(RAW_DATA_BASE, 'profiler'))
......@@ -20,6 +20,7 @@ from unittest import TestCase
from mindinsight.profiler.analyser.analyser import AicoreDetailAnalyser
from mindinsight.profiler.analyser.analyser_factory import AnalyserFactory
from tests.ut.profiler import PROFILER_DIR
def get_detail_infos(indexes=None, sort_name=None, sort_type=True):
......@@ -34,9 +35,8 @@ def get_detail_infos(indexes=None, sort_name=None, sort_type=True):
Returns:
list[list], the AICORE operator detail information.
"""
profiling_dir = os.path.join(os.path.dirname(__file__), 'resource')
framework_path = os.path.join(profiling_dir, 'framework_raw_0.csv')
detail_path = os.path.join(profiling_dir, 'aicore_intermediate_0_detail.csv')
framework_path = os.path.join(PROFILER_DIR, 'framework_raw_1.csv')
detail_path = os.path.join(PROFILER_DIR, 'aicore_intermediate_1_detail.csv')
with open(framework_path, 'r') as fm_file, open(detail_path, 'r') as detail_file:
fm_csv_reader = csv.reader(fm_file)
......@@ -66,9 +66,8 @@ class TestAicoreDetailAnalyser(TestCase):
"""Test the class of `AicoreDetailAnalyser`."""
def setUp(self) -> None:
"""Initialization before test case execution."""
profiling_dir = os.path.join(os.path.dirname(__file__), 'resource')
self._analyser = AnalyserFactory.instance().get_analyser(
'aicore_detail', profiling_dir, '0'
'aicore_detail', PROFILER_DIR, '1'
)
def test_query_success_1(self):
......
......@@ -19,6 +19,7 @@ from unittest import TestCase
from mindinsight.profiler.analyser.analyser import AicoreTypeAnalyser
from mindinsight.profiler.analyser.analyser_factory import AnalyserFactory
from tests.ut.profiler import PROFILER_DIR
def get_type_infos(indexes=None, sort_name=None, sort_type=True):
......@@ -33,9 +34,8 @@ def get_type_infos(indexes=None, sort_name=None, sort_type=True):
Returns:
list[list], the AICORE operator type information.
"""
profiling_dir = os.path.join(os.path.dirname(__file__), 'resource')
aicore_type_path = os.path.join(
profiling_dir, 'aicore_intermediate_0_type.csv'
PROFILER_DIR, 'aicore_intermediate_1_type.csv'
)
with open(aicore_type_path, 'r') as aicore_type_path:
......@@ -64,9 +64,8 @@ class TestAicoreTypeAnalyser(TestCase):
"""Test the class of `AicoreTypeAnalyser`."""
def setUp(self) -> None:
"""Initialization before test case execution."""
profiling_dir = os.path.join(os.path.dirname(__file__), 'resource')
self._analyser = AnalyserFactory.instance().get_analyser(
'aicore_type', profiling_dir, '0'
'aicore_type', PROFILER_DIR, '1'
)
def test_query_success_1(self):
......
......@@ -26,6 +26,7 @@ from mindinsight.profiler.common.exceptions.exceptions import \
ProfilerPathErrorException, ProfilerDirNotFoundException, \
ProfilerFileNotFoundException
from mindinsight.profiler.parser.framework_parser import FrameworkParser
from tests.ut.profiler import PROFILER_DIR, RAW_DATA_BASE
def get_framework_result(file_path):
......@@ -50,7 +51,7 @@ class TestFrameworkParser:
"""Test the class of `FrameworkParser`."""
def setup_method(self):
"""Initialization before test case execution."""
raw_dir = os.path.join(os.path.dirname(__file__), 'resource')
raw_dir = RAW_DATA_BASE
FrameworkParser._raw_data_dir = raw_dir
self._output_path_1 = tempfile.mkdtemp(prefix='test_framework_parser_')
......@@ -88,9 +89,8 @@ class TestFrameworkParser:
def test_parse(self):
"""Test the parse function."""
expect_framework_file = os.path.join(
os.path.dirname(__file__), 'resource', 'framework_raw_0.csv'
)
expect_framework_file = os.path.join(PROFILER_DIR, 'framework_raw_0.csv')
expect_framework_file = os.path.realpath(expect_framework_file)
expect_result = get_framework_result(expect_framework_file)
self._parser_1.parse()
......
......@@ -19,3 +19,10 @@ def get_context(key):
"""Get key in context."""
context = {"device_id": 1}
return context.get(key)
def set_context(**kwargs):
"""Set context"""
context = {}
for key, value in kwargs.items():
context[key] = value
[Device0]
clock_realtime: 1591183963784568740
clock_monotonic_raw: 261003032627
full_op_time,execution_time
Default/AtomicAddrClean-op104,0.00133
Default/AtomicAddrClean-op105,0.000987
Default/AtomicAddrClean-op106,0.001129
Default/Cast-op10,0.00466
Default/network-WithLossCell/_backbone-LeNet5/conv1-Conv2d/Cast-op12,0.002366
Gradients/Default/network-WithLossCell/_backbone-LeNet5/conv1-Conv2d/gradConv2D/Cast-op53,0.004879
Default/TransData-op11,0.006366
Gradients/Default/network-WithLossCell/_backbone-LeNet5/gradReshape/TransData-op44,0.006782
Default/network-WithLossCell/_backbone-LeNet5/conv1-Conv2d/Conv2D-op13,0.05651
Default/network-WithLossCell/_backbone-LeNet5/fc3-Dense/MatMul-op9,0.370864
op_type,execution_time,execution_frequency,percent
AtomicAddrClean,0.007283,6,0.49
Cast,0.053395,13,3.63
TransData,0.121800,5,8.23
Conv2D,0.063656,2,4.33
MatMul,1.085982,9,73.80
task_id,stream_id,block_dim,full_op_name,op_name,op_type,subgraph,op_info
30290,0,1,Default/AtomicAddrClean-op104,AtomicAddrClean-op104,AtomicAddrClean,Default,"{""input_0"": {""format"": ""DefaultFormat"", ""data_type"": ""NUMBER_TYPE_FLOAT32"", ""shape"": """"}}"
30295,0,1,Default/AtomicAddrClean-op105,AtomicAddrClean-op105,AtomicAddrClean,Default,"{""input_0"": {""format"": ""DefaultFormat"", ""data_type"": ""NUMBER_TYPE_FLOAT32"", ""shape"": ""10""}}"
30300,0,1,Default/AtomicAddrClean-op106,AtomicAddrClean-op106,AtomicAddrClean,Default,"{""input_0"": {""format"": ""DefaultFormat"", ""data_type"": ""NUMBER_TYPE_FLOAT32"", ""shape"": ""84""}}"
30268,0,32,Default/Cast-op10,Cast-op10,Cast,Default,"{""input_0"": {""format"": ""DefaultFormat"", ""data_type"": ""NUMBER_TYPE_FLOAT32"", ""shape"": ""32,1,32,32""}, ""output_0"": {""format"": ""DefaultFormat"", ""data_type"": ""NUMBER_TYPE_FLOAT16"", ""shape"": ""32,1,32,32""}}"
30271,0,9,Default/network-WithLossCell/_backbone-LeNet5/conv1-Conv2d/Cast-op12,Cast-op12,Cast,Default,"{""input_0"": {""format"": ""FracZ"", ""data_type"": ""NUMBER_TYPE_FLOAT32"", ""shape"": ""25,1,16,16""}, ""output_0"": {""format"": ""FracZ"", ""data_type"": ""NUMBER_TYPE_FLOAT16"", ""shape"": ""25,1,16,16""}}"
30320,0,32,Gradients/Default/network-WithLossCell/_backbone-LeNet5/conv1-Conv2d/gradConv2D/Cast-op53,Cast-op53,Cast,Gradients,"{""input_0"": {""format"": ""NC1HWC0"", ""data_type"": ""NUMBER_TYPE_FLOAT32"", ""shape"": ""32,1,28,28,16""}, ""output_0"": {""format"": ""NC1HWC0"", ""data_type"": ""NUMBER_TYPE_FLOAT16"", ""shape"": ""32,1,28,28,16""}}"
30269,0,32,Default/TransData-op11,TransData-op11,TransData,Default,"{""input_0"": {""format"": ""DefaultFormat"", ""data_type"": ""NUMBER_TYPE_FLOAT16"", ""shape"": ""32,1,32,32""}, ""output_0"": {""format"": ""NC1HWC0"", ""data_type"": ""NUMBER_TYPE_FLOAT16"", ""shape"": ""32,1,32,32""}}"
30308,0,32,Gradients/Default/network-WithLossCell/_backbone-LeNet5/gradReshape/TransData-op44,TransData-op44,TransData,Gradients,"{""input_0"": {""format"": ""DefaultFormat"", ""data_type"": ""NUMBER_TYPE_FLOAT16"", ""shape"": ""32,16,5,5""}, ""output_0"": {""format"": ""NC1HWC0"", ""data_type"": ""NUMBER_TYPE_FLOAT16"", ""shape"": ""32,1,5,5,16""}}"
30272,0,32,Default/network-WithLossCell/_backbone-LeNet5/conv1-Conv2d/Conv2D-op13,Conv2D-op13,Conv2D,Default,"{""input_0"": {""format"": ""NC1HWC0"", ""data_type"": ""NUMBER_TYPE_FLOAT16"", ""shape"": ""32,1,32,32,16""}, ""input_1"": {""format"": ""FracZ"", ""data_type"": ""NUMBER_TYPE_FLOAT16"", ""shape"": ""25,1,16,16""}, ""output_0"": {""format"": ""NC1HWC0"", ""data_type"": ""NUMBER_TYPE_FLOAT16"", ""shape"": ""32,1,28,28,16""}}"
30286,0,1,Default/network-WithLossCell/_backbone-LeNet5/fc3-Dense/MatMul-op9,MatMul-op9,MatMul,Default,"{""input_0"": {""format"": ""DefaultFormat"", ""data_type"": ""NUMBER_TYPE_FLOAT32"", ""shape"": ""32,120""}, ""input_1"": {""format"": ""DefaultFormat"", ""data_type"": ""NUMBER_TYPE_FLOAT32"", ""shape"": ""84,120""}, ""input_2"": {""format"": ""DefaultFormat"", ""data_type"": ""NUMBER_TYPE_FLOAT32"", ""shape"": ""84""}, ""output_0"": {""format"": ""DefaultFormat"", ""data_type"": ""NUMBER_TYPE_FLOAT32"", ""shape"": ""32,84""}}"
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,45020526465,45041052609,20526144,45020538467,45032339821,12002,11801354,8712788,45020548731,45020574730,25999,45021556176,45021851790,295614,45032850758,45033055282,204524,45020553834,45020586153,32319
2,45041052609,45061577413,20524804,45041066169,45052867211,13560,11801042,8710202,45041077109,45041096998,19889,45042082149,45042383040,300891,45053384374,45053578836,194462,45041083492,45041111560,28068
3,45061577413,45082110285,20532872,45061590044,45073390989,12631,11800945,8719296,45061602230,45061625204,22974,45062605143,45062902171,297028,45073902745,45074101879,199134,45061603383,45061630503,27120
4,45082110285,45102643335,20533050,45082123831,45093925011,13546,11801180,8718324,45082137141,45082154700,17559,45083140904,45083440914,300010,45094442436,45094636568,194132,45082140632,45082172845,32213
5,45102643335,45123173197,20529862,45102656269,45114458162,12934,11801893,8715035,45102673781,45102695619,21838,45103675921,45103971688,295767,45114969344,45115173035,203691,45102675482,45102700807,25325
6,45123173197,45143698550,20525353,45123186047,45134986923,12850,11800876,8711627,45123206016,45123217888,11872,45124199293,45124505427,306134,45135499961,45135703946,203985,45123196109,45123230354,34245
7,45143698550,45164229070,20530520,45143712101,45155513651,13551,11801550,8715419,45143730950,45143750926,19976,45144731691,45145023183,291492,45156025144,45156224720,199576,45143728385,45143758571,30186
8,45164229070,45184754878,20525808,45164241588,45176043051,12518,11801463,8711827,45164257233,45164281239,24006,45165258707,45165559029,300322,45176561050,45176755753,194703,45164251768,45164285836,34068
9,45184754878,45205281328,20526450,45184767651,45196569566,12773,11801915,8711762,45184782578,45184799434,16856,45185780544,45186083913,303369,45197086694,45197282669,195975,45184787508,45184816578,29070
10,45205281328,45225808076,20526748,45205295181,45217096699,13853,11801518,8711377,45205312140,45205328049,15909,45206305285,45206614349,309064,45217611452,45217807480,196028,45205312068,45205339808,27740
11,45225808076,45246336247,20528171,45225820613,45237622360,12537,11801747,8713887,45225830974,45225860234,29260,45226834268,45227135750,301482,45238137612,45238341621,204009,45225833955,45225870064,36109
12,45246336247,45266862873,20526626,45246348376,45258149958,12129,11801582,8712915,45246362139,45246380039,17900,45247364231,45247660677,296446,45258666251,45258864967,198716,45246361528,45246394861,33333
13,45266862873,45287394213,20531340,45266875977,45278677761,13104,11801784,8716452,45266894199,45266909080,14881,45267890915,45268191344,300429,45279191183,45279391317,200134,45266888701,45266917000,28299
14,45287394213,45307923664,20529451,45287407755,45299209636,13542,11801881,8714028,45287427610,45287441066,13456,45288421386,45288719901,298515,45299722571,45299927585,205014,45287425310,45287449279,23969
15,45307923664,45328450904,20527240,45307935831,45319737272,12167,11801441,8713632,45307950324,45307974692,24368,45308952601,45309249485,296884,45320250207,45320450146,199939,45307946748,45307977430,30682
16,45328450904,45348980394,20529490,45328463014,45340264339,12110,11801325,8716055,45328476038,45328500997,24959,45329481974,45329782090,300116,45340777279,45340982640,205361,45328474691,45328507939,33248
17,45348980394,45369507222,20526828,45348994014,45360794759,13620,11800745,8712463,45349011746,45349029629,17883,45350010381,45350305839,295458,45361314636,45361505942,191306,45349006330,45349041259,34929
18,45369507222,45390033964,20526742,45369520766,45381322000,13544,11801234,8711964,45369533695,45369553091,19396,45370539131,45370831270,292139,45381839638,45382037802,198164,45369537705,45369568029,30324
19,45390033964,45410562185,20528221,45390046293,45401847702,12329,11801409,8714483,45390059837,45390080765,20928,45391059730,45391357314,297584,45402361677,45402562220,200543,45390060524,45390092731,32207
-,45215545457,45236073767,20528310,45215558418,45227359836,12961,11801418,8713930,45215573652,45215593314,19662,45216574125,45216873188,299063,45227874681,45228073840,199160,45215573018,45215603636,30619
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册