mindstudio-probe 1.0.1__py3-none-any.whl → 1.0.4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {mindstudio_probe-1.0.1.dist-info → mindstudio_probe-1.0.4.dist-info}/LICENSE +201 -201
- {mindstudio_probe-1.0.1.dist-info → mindstudio_probe-1.0.4.dist-info}/METADATA +36 -30
- mindstudio_probe-1.0.4.dist-info/RECORD +276 -0
- {mindstudio_probe-1.0.1.dist-info → mindstudio_probe-1.0.4.dist-info}/WHEEL +1 -1
- {mindstudio_probe-1.0.1.dist-info → mindstudio_probe-1.0.4.dist-info}/entry_points.txt +1 -0
- msprobe/README.md +101 -182
- msprobe/__init__.py +1 -0
- msprobe/{config/config.json → config.json} +49 -27
- msprobe/core/__init__.py +0 -0
- msprobe/{pytorch → core}/advisor/advisor.py +124 -124
- msprobe/{pytorch → core}/advisor/advisor_const.py +59 -59
- msprobe/{pytorch → core}/advisor/advisor_result.py +58 -58
- msprobe/core/common/const.py +341 -241
- msprobe/core/common/exceptions.py +100 -88
- msprobe/core/common/{file_check.py → file_utils.py} +478 -265
- msprobe/core/common/log.py +76 -55
- msprobe/core/common/utils.py +385 -516
- msprobe/core/common_config.py +85 -58
- msprobe/core/compare/acc_compare.py +300 -0
- msprobe/core/compare/check.py +95 -0
- msprobe/core/compare/compare_cli.py +49 -0
- msprobe/core/compare/highlight.py +223 -0
- msprobe/core/compare/multiprocessing_compute.py +149 -0
- msprobe/{pytorch → core}/compare/npy_compare.py +295 -244
- msprobe/core/compare/utils.py +430 -0
- msprobe/core/data_dump/data_collector.py +154 -140
- msprobe/core/data_dump/data_processor/base.py +314 -245
- msprobe/core/data_dump/data_processor/factory.py +59 -61
- msprobe/core/data_dump/data_processor/mindspore_processor.py +186 -0
- msprobe/core/data_dump/data_processor/pytorch_processor.py +366 -346
- msprobe/core/data_dump/json_writer.py +96 -116
- msprobe/core/data_dump/scope.py +178 -178
- msprobe/core/grad_probe/__init__.py +0 -0
- msprobe/core/grad_probe/constant.py +71 -0
- msprobe/core/grad_probe/grad_compare.py +171 -0
- msprobe/core/grad_probe/utils.py +64 -0
- msprobe/docs/01.installation.md +89 -0
- msprobe/docs/02.config_introduction.md +165 -0
- msprobe/docs/03.config_examples.md +247 -0
- msprobe/docs/04.acl_config_examples.md +76 -0
- msprobe/docs/05.data_dump_PyTorch.md +198 -0
- msprobe/docs/06.data_dump_MindSpore.md +243 -0
- msprobe/docs/07.accuracy_checker_PyTorch.md +274 -0
- msprobe/docs/08.accuracy_checker_online_PyTorch.md +198 -0
- msprobe/docs/09.accuracy_checker_MindSpore.md +68 -0
- msprobe/docs/10.accuracy_compare_PyTorch.md +245 -0
- msprobe/docs/11.accuracy_compare_MindSpore.md +202 -0
- msprobe/docs/12.overflow_check_PyTorch.md +79 -0
- msprobe/docs/13.overflow_check_MindSpore.md +31 -0
- msprobe/{pytorch/doc/parse_tool.md → docs/14.data_parse_PyTorch.md} +283 -286
- msprobe/docs/15.free_benchmarking_PyTorch.md +164 -0
- msprobe/docs/17.grad_probe.md +207 -0
- msprobe/docs/FAQ_PyTorch.md +177 -0
- msprobe/docs/S02.report_free_benchmarking_validation_performance_baseline.md +146 -0
- msprobe/docs/img/free_benchmark_framework.png +0 -0
- msprobe/docs/img/grad_probe_image-1.png +0 -0
- msprobe/docs/img/grad_probe_image-2.png +0 -0
- msprobe/docs/img/grad_probe_image-3.png +0 -0
- msprobe/docs/img/grad_probe_image-4.png +0 -0
- msprobe/docs/img/grad_probe_image.png +0 -0
- msprobe/mindspore/__init__.py +1 -1
- msprobe/mindspore/api_accuracy_checker/__init__.py +0 -0
- msprobe/mindspore/api_accuracy_checker/api_accuracy_checker.py +255 -0
- msprobe/mindspore/api_accuracy_checker/api_info.py +69 -0
- msprobe/mindspore/api_accuracy_checker/api_runner.py +156 -0
- msprobe/mindspore/api_accuracy_checker/base_compare_algorithm.py +197 -0
- msprobe/mindspore/api_accuracy_checker/cmd_parser.py +6 -0
- msprobe/mindspore/api_accuracy_checker/compute_element.py +239 -0
- msprobe/mindspore/api_accuracy_checker/main.py +9 -0
- msprobe/mindspore/api_accuracy_checker/type_mapping.py +114 -0
- msprobe/mindspore/api_accuracy_checker/utils.py +80 -0
- msprobe/mindspore/cell_processor.py +34 -0
- msprobe/mindspore/common/const.py +106 -0
- msprobe/mindspore/common/log.py +38 -0
- msprobe/mindspore/common/utils.py +81 -0
- msprobe/mindspore/compare/distributed_compare.py +75 -0
- msprobe/mindspore/compare/ms_compare.py +219 -0
- msprobe/mindspore/compare/ms_graph_compare.py +348 -0
- msprobe/mindspore/compare/ms_to_pt_api.yaml +399 -0
- msprobe/mindspore/debugger/debugger_config.py +66 -51
- msprobe/mindspore/debugger/precision_debugger.py +126 -32
- msprobe/mindspore/dump/dump_tool_factory.py +35 -38
- msprobe/mindspore/dump/hook_cell/api_registry.py +118 -0
- msprobe/mindspore/dump/hook_cell/hook_cell.py +55 -0
- msprobe/mindspore/dump/hook_cell/support_wrap_ops.yaml +922 -0
- msprobe/mindspore/dump/hook_cell/wrap_api.py +113 -0
- msprobe/mindspore/dump/jit_dump.py +72 -0
- msprobe/mindspore/dump/kernel_graph_dump.py +59 -60
- msprobe/mindspore/dump/kernel_kbyk_dump.py +64 -0
- msprobe/mindspore/free_benchmark/__init__.py +0 -0
- msprobe/mindspore/free_benchmark/api_pynative_self_check.py +116 -0
- msprobe/mindspore/free_benchmark/common/__init__.py +0 -0
- msprobe/mindspore/free_benchmark/common/config.py +12 -0
- msprobe/mindspore/free_benchmark/common/handler_params.py +17 -0
- msprobe/mindspore/free_benchmark/common/utils.py +71 -0
- msprobe/mindspore/free_benchmark/data/support_wrap_ops.yaml +842 -0
- msprobe/mindspore/free_benchmark/decorator/__init__.py +0 -0
- msprobe/mindspore/free_benchmark/decorator/dec_forward.py +43 -0
- msprobe/mindspore/free_benchmark/decorator/decorator_factory.py +107 -0
- msprobe/mindspore/free_benchmark/handler/__init__.py +0 -0
- msprobe/mindspore/free_benchmark/handler/base_handler.py +90 -0
- msprobe/mindspore/free_benchmark/handler/check_handler.py +41 -0
- msprobe/mindspore/free_benchmark/handler/fix_handler.py +36 -0
- msprobe/mindspore/free_benchmark/handler/handler_factory.py +21 -0
- msprobe/mindspore/free_benchmark/perturbation/add_noise.py +67 -0
- msprobe/mindspore/free_benchmark/perturbation/base_perturbation.py +21 -0
- msprobe/mindspore/free_benchmark/perturbation/bit_noise.py +63 -0
- msprobe/mindspore/free_benchmark/perturbation/exchange_value.py +51 -0
- msprobe/mindspore/free_benchmark/perturbation/improve_precision.py +35 -0
- msprobe/mindspore/free_benchmark/perturbation/no_change.py +12 -0
- msprobe/mindspore/free_benchmark/perturbation/perturbation_factory.py +29 -0
- msprobe/mindspore/free_benchmark/self_check_tool_factory.py +33 -0
- msprobe/mindspore/grad_probe/__init__.py +0 -0
- msprobe/mindspore/grad_probe/global_context.py +90 -0
- msprobe/mindspore/grad_probe/grad_analyzer.py +231 -0
- msprobe/mindspore/grad_probe/grad_monitor.py +27 -0
- msprobe/mindspore/grad_probe/grad_stat_csv.py +132 -0
- msprobe/mindspore/grad_probe/hook.py +94 -0
- msprobe/mindspore/grad_probe/utils.py +30 -0
- msprobe/mindspore/ms_config.py +128 -78
- msprobe/mindspore/overflow_check/kernel_graph_overflow_check.py +44 -45
- msprobe/mindspore/overflow_check/overflow_check_tool_factory.py +34 -32
- msprobe/mindspore/runtime.py +4 -0
- msprobe/mindspore/service.py +378 -0
- msprobe/mindspore/task_handler_factory.py +24 -21
- msprobe/msprobe.py +105 -67
- msprobe/pytorch/__init__.py +4 -4
- msprobe/pytorch/api_accuracy_checker/common/config.py +53 -50
- msprobe/pytorch/api_accuracy_checker/common/utils.py +214 -224
- msprobe/pytorch/api_accuracy_checker/compare/algorithm.py +213 -216
- msprobe/pytorch/api_accuracy_checker/compare/api_precision_compare.py +606 -545
- msprobe/pytorch/api_accuracy_checker/compare/api_precision_standard.yaml +132 -132
- msprobe/pytorch/api_accuracy_checker/compare/api_precision_threshold.yaml +390 -390
- msprobe/pytorch/api_accuracy_checker/compare/compare.py +386 -345
- msprobe/pytorch/api_accuracy_checker/compare/compare_column.py +73 -73
- msprobe/pytorch/api_accuracy_checker/compare/compare_utils.py +245 -248
- msprobe/pytorch/api_accuracy_checker/config.yaml +10 -4
- msprobe/pytorch/api_accuracy_checker/run_ut/data_generate.py +335 -328
- msprobe/pytorch/api_accuracy_checker/run_ut/multi_run_ut.py +200 -203
- msprobe/pytorch/api_accuracy_checker/run_ut/run_overflow_check.py +133 -127
- msprobe/pytorch/api_accuracy_checker/run_ut/run_ut.py +592 -493
- msprobe/pytorch/api_accuracy_checker/run_ut/run_ut_utils.py +70 -7
- msprobe/pytorch/api_accuracy_checker/run_ut/torch_ut_setting.json +7 -4
- msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/__init__.py +0 -0
- msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/attl.py +197 -0
- msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/client.py +325 -0
- msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/device_dispatch.py +204 -0
- msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/server.py +219 -0
- msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/ssl_config.py +10 -0
- msprobe/pytorch/bench_functions/__init__.py +15 -0
- msprobe/pytorch/bench_functions/apply_adam_w.py +28 -0
- msprobe/pytorch/bench_functions/confusion_transpose.py +19 -0
- msprobe/pytorch/bench_functions/fast_gelu.py +55 -0
- msprobe/pytorch/bench_functions/layer_norm_eval.py +6 -0
- msprobe/pytorch/bench_functions/linear.py +12 -0
- msprobe/pytorch/bench_functions/matmul_backward.py +48 -0
- msprobe/pytorch/bench_functions/npu_fusion_attention.py +509 -0
- msprobe/pytorch/bench_functions/rms_norm.py +15 -0
- msprobe/pytorch/bench_functions/rotary_mul.py +52 -0
- msprobe/pytorch/bench_functions/scaled_mask_softmax.py +26 -0
- msprobe/pytorch/bench_functions/swiglu.py +55 -0
- msprobe/pytorch/common/__init__.py +2 -2
- msprobe/pytorch/common/compare_script.template +14 -14
- msprobe/pytorch/common/log.py +20 -31
- msprobe/pytorch/common/parse_json.py +39 -37
- msprobe/pytorch/common/utils.py +305 -224
- msprobe/pytorch/compare/distributed_compare.py +66 -111
- msprobe/pytorch/compare/mapping.yaml +607 -607
- msprobe/pytorch/compare/match.py +34 -36
- msprobe/pytorch/compare/pt_compare.py +50 -0
- msprobe/pytorch/debugger/debugger_config.py +95 -86
- msprobe/pytorch/debugger/precision_debugger.py +125 -95
- msprobe/pytorch/free_benchmark/__init__.py +8 -8
- msprobe/pytorch/free_benchmark/common/constant.py +70 -67
- msprobe/pytorch/free_benchmark/common/counter.py +71 -71
- msprobe/pytorch/free_benchmark/common/enums.py +37 -37
- msprobe/pytorch/free_benchmark/common/params.py +129 -129
- msprobe/pytorch/free_benchmark/common/utils.py +102 -98
- msprobe/pytorch/free_benchmark/compare/grad_saver.py +179 -183
- msprobe/pytorch/free_benchmark/compare/single_benchmark.py +104 -104
- msprobe/pytorch/free_benchmark/main.py +105 -102
- msprobe/pytorch/free_benchmark/perturbed_layers/base_layer.py +13 -13
- msprobe/pytorch/free_benchmark/perturbed_layers/layer_factory.py +41 -41
- msprobe/pytorch/free_benchmark/perturbed_layers/npu/add_noise.py +90 -90
- msprobe/pytorch/free_benchmark/perturbed_layers/npu/bit_noise.py +104 -104
- msprobe/pytorch/free_benchmark/perturbed_layers/npu/change_value.py +63 -63
- msprobe/pytorch/free_benchmark/perturbed_layers/npu/improve_precision.py +68 -68
- msprobe/pytorch/free_benchmark/perturbed_layers/npu/no_change.py +28 -28
- msprobe/pytorch/free_benchmark/perturbed_layers/npu/npu_base_layser.py +45 -45
- msprobe/pytorch/free_benchmark/perturbed_layers/run_cpu.py +19 -19
- msprobe/pytorch/free_benchmark/result_handlers/base_handler.py +217 -203
- msprobe/pytorch/free_benchmark/result_handlers/check_handler.py +39 -39
- msprobe/pytorch/free_benchmark/result_handlers/fix_handler.py +23 -23
- msprobe/pytorch/free_benchmark/result_handlers/handler_factory.py +30 -31
- msprobe/pytorch/free_benchmark/result_handlers/preheat_handler.py +170 -170
- msprobe/pytorch/function_factory.py +76 -0
- msprobe/pytorch/functional/dump_module.py +39 -39
- msprobe/pytorch/grad_probe/__init__.py +0 -0
- msprobe/pytorch/grad_probe/grad_monitor.py +91 -0
- msprobe/pytorch/grad_probe/grad_stat_csv.py +129 -0
- msprobe/pytorch/hook_module/api_registry.py +161 -161
- msprobe/pytorch/hook_module/hook_module.py +120 -109
- msprobe/pytorch/hook_module/support_wrap_ops.yaml +1879 -1876
- msprobe/pytorch/hook_module/utils.py +30 -29
- msprobe/pytorch/hook_module/wrap_aten.py +110 -100
- msprobe/pytorch/hook_module/wrap_distributed.py +78 -75
- msprobe/pytorch/hook_module/wrap_functional.py +105 -108
- msprobe/pytorch/hook_module/wrap_npu_custom.py +93 -73
- msprobe/pytorch/hook_module/wrap_tensor.py +71 -72
- msprobe/pytorch/hook_module/wrap_torch.py +86 -88
- msprobe/pytorch/hook_module/wrap_vf.py +62 -64
- msprobe/pytorch/module_processer.py +138 -98
- msprobe/pytorch/online_dispatch/__init__.py +20 -20
- msprobe/pytorch/online_dispatch/compare.py +236 -236
- msprobe/pytorch/online_dispatch/dispatch.py +271 -273
- msprobe/pytorch/online_dispatch/dump_compare.py +155 -186
- msprobe/pytorch/online_dispatch/single_compare.py +391 -391
- msprobe/pytorch/online_dispatch/torch_ops_config.yaml +49 -49
- msprobe/pytorch/online_dispatch/utils.py +130 -187
- msprobe/pytorch/parse.py +4 -4
- msprobe/pytorch/parse_tool/cli.py +32 -32
- msprobe/pytorch/parse_tool/lib/compare.py +260 -259
- msprobe/pytorch/parse_tool/lib/config.py +52 -51
- msprobe/pytorch/parse_tool/lib/file_desc.py +31 -31
- msprobe/pytorch/parse_tool/lib/interactive_cli.py +102 -102
- msprobe/pytorch/parse_tool/lib/parse_exception.py +54 -54
- msprobe/pytorch/parse_tool/lib/parse_tool.py +158 -158
- msprobe/pytorch/parse_tool/lib/utils.py +316 -367
- msprobe/pytorch/parse_tool/lib/visualization.py +85 -90
- msprobe/pytorch/pt_config.py +188 -93
- msprobe/pytorch/service.py +246 -167
- mindstudio_probe-1.0.1.dist-info/RECORD +0 -228
- msprobe/config/README.md +0 -397
- msprobe/mindspore/doc/dump.md +0 -65
- msprobe/mindspore/dump/api_kbk_dump.py +0 -55
- msprobe/pytorch/compare/acc_compare.py +0 -1024
- msprobe/pytorch/compare/highlight.py +0 -100
- msprobe/pytorch/doc/FAQ.md +0 -193
- msprobe/pytorch/doc/api_accuracy_checker.md +0 -269
- msprobe/pytorch/doc/atat/321/207/342/226/223/342/225/233/321/205/342/225/221/320/266/321/205/342/225/226/320/265/321/205/320/225/342/225/226/321/206/320/245/342/226/221/321/206/320/235/320/276dump/321/206/320/260/320/227/321/205/320/227/320/226/321/206/320/220/320/267/321/210/320/223/342/225/234/321/205/320/257/342/225/221/321/207/342/225/221/342/224/220/321/206/320/232/320/265/321/205/320/241/320/232.md +0 -182
- msprobe/pytorch/doc/dump.md +0 -207
- msprobe/pytorch/doc/ptdbg_ascend_compare.md +0 -176
- msprobe/pytorch/doc/ptdbg_ascend_overview.md +0 -68
- msprobe/pytorch/doc/ptdbg_ascend_quickstart.md +0 -381
- msprobe/pytorch/doc/run_overflow_check.md +0 -25
- msprobe/pytorch/doc//321/205/320/254/320/270/321/207/342/225/221/342/224/220/321/207/342/226/223/342/225/233/321/205/342/225/221/320/266/321/206/320/277/320/244/321/205/320/277/342/225/243.md +0 -90
- msprobe/test/core_ut/common/test_utils.py +0 -345
- msprobe/test/core_ut/data_dump/test_data_collector.py +0 -47
- msprobe/test/core_ut/data_dump/test_json_writer.py +0 -183
- msprobe/test/core_ut/data_dump/test_scope.py +0 -151
- msprobe/test/core_ut/test_common_config.py +0 -152
- msprobe/test/core_ut/test_file_check.py +0 -218
- msprobe/test/core_ut/test_log.py +0 -109
- msprobe/test/mindspore_ut/test_api_kbk_dump.py +0 -51
- msprobe/test/mindspore_ut/test_debugger_config.py +0 -42
- msprobe/test/mindspore_ut/test_dump_tool_factory.py +0 -51
- msprobe/test/mindspore_ut/test_kernel_graph_dump.py +0 -66
- msprobe/test/mindspore_ut/test_kernel_graph_overflow_check.py +0 -63
- msprobe/test/mindspore_ut/test_ms_config.py +0 -69
- msprobe/test/mindspore_ut/test_overflow_check_tool_factory.py +0 -51
- msprobe/test/mindspore_ut/test_precision_debugger.py +0 -56
- msprobe/test/mindspore_ut/test_task_handler_factory.py +0 -58
- msprobe/test/pytorch_ut/advisor/test_advisor.py +0 -83
- msprobe/test/pytorch_ut/api_accuracy_checker/common/test_common_utils.py +0 -108
- msprobe/test/pytorch_ut/api_accuracy_checker/common/test_config.py +0 -39
- msprobe/test/pytorch_ut/api_accuracy_checker/compare/test_algorithm.py +0 -112
- msprobe/test/pytorch_ut/api_accuracy_checker/compare/test_api_precision_compare.py +0 -77
- msprobe/test/pytorch_ut/api_accuracy_checker/compare/test_compare.py +0 -125
- msprobe/test/pytorch_ut/api_accuracy_checker/compare/test_compare_column.py +0 -10
- msprobe/test/pytorch_ut/api_accuracy_checker/compare/test_compare_utils.py +0 -43
- msprobe/test/pytorch_ut/api_accuracy_checker/run_ut/dump.json +0 -179
- msprobe/test/pytorch_ut/api_accuracy_checker/run_ut/forward.json +0 -63
- msprobe/test/pytorch_ut/api_accuracy_checker/run_ut/test_data_generate.py +0 -99
- msprobe/test/pytorch_ut/api_accuracy_checker/run_ut/test_multi_run_ut.py +0 -115
- msprobe/test/pytorch_ut/api_accuracy_checker/run_ut/test_run_ut.py +0 -72
- msprobe/test/pytorch_ut/compare/test_acc_compare.py +0 -17
- msprobe/test/pytorch_ut/free_benchmark/perturbed_layers/test_perturbed_layser.py +0 -105
- msprobe/test/pytorch_ut/free_benchmark/result_handlers/test_result_handler.py +0 -121
- msprobe/test/pytorch_ut/free_benchmark/test_main.py +0 -101
- msprobe/test/pytorch_ut/functional/test_dump_module.py +0 -15
- msprobe/test/pytorch_ut/hook_module/test_api_registry.py +0 -130
- msprobe/test/pytorch_ut/hook_module/test_hook_module.py +0 -42
- msprobe/test/pytorch_ut/hook_module/test_wrap_aten.py +0 -65
- msprobe/test/pytorch_ut/hook_module/test_wrap_distributed.py +0 -35
- msprobe/test/pytorch_ut/hook_module/test_wrap_functional.py +0 -20
- msprobe/test/pytorch_ut/hook_module/test_wrap_tensor.py +0 -35
- msprobe/test/pytorch_ut/hook_module/test_wrap_torch.py +0 -43
- msprobe/test/pytorch_ut/hook_module/test_wrap_vf.py +0 -11
- msprobe/test/pytorch_ut/test_pt_config.py +0 -69
- msprobe/test/pytorch_ut/test_service.py +0 -59
- msprobe/test/resources/advisor.txt +0 -3
- msprobe/test/resources/compare_result_20230703104808.csv +0 -9
- msprobe/test/resources/compare_result_without_accuracy.csv +0 -9
- msprobe/test/resources/config.yaml +0 -3
- msprobe/test/resources/npu_test.pkl +0 -8
- msprobe/test/run_test.sh +0 -30
- msprobe/test/run_ut.py +0 -58
- msprobe/test/test_module_processer.py +0 -64
- {mindstudio_probe-1.0.1.dist-info → mindstudio_probe-1.0.4.dist-info}/top_level.txt +0 -0
- /msprobe/{pytorch/doc → docs}/img/BLOOM-7B_1.png +0 -0
- /msprobe/{pytorch/doc → docs}/img/BLOOM-7B_2.png +0 -0
- /msprobe/{pytorch/doc → docs}/img/BLOOM-7B_3.png +0 -0
- /msprobe/{pytorch/doc → docs}/img/BLOOM-7B_4.png +0 -0
- /msprobe/{pytorch/doc → docs}/img/GPT-3_1.png +0 -0
- /msprobe/{pytorch/doc → docs}/img/GPT-3_2.png +0 -0
- /msprobe/{pytorch/doc → docs}/img/GPT-3_3.png +0 -0
- /msprobe/{pytorch/doc → docs}/img/GPT-3_4.png +0 -0
- /msprobe/{pytorch/doc → docs}/img/GPT-3_5.png +0 -0
- /msprobe/{pytorch/doc → docs}/img/GPT-3_6.png +0 -0
- /msprobe/{pytorch/doc → docs}/img/GPT-3_7.png +0 -0
- /msprobe/{pytorch/doc → docs}/img/GPT-3_8.png +0 -0
- /msprobe/{pytorch/doc → docs}/img/YOLOV5S_1.png +0 -0
- /msprobe/{pytorch/doc → docs}/img/YOLOV5S_2.png +0 -0
- /msprobe/{pytorch/doc → docs}/img/accuracy_checking_details.png +0 -0
- /msprobe/{pytorch/doc → docs}/img/accuracy_checking_result.png +0 -0
- /msprobe/{pytorch/doc → docs}/img/api_precision_compare_details.png +0 -0
- /msprobe/{pytorch/doc → docs}/img/api_precision_compare_result.png +0 -0
- /msprobe/{pytorch/doc → docs}/img/auto_analyze_log.png +0 -0
- /msprobe/{pytorch/doc → docs}/img/compare_result_pkl.png +0 -0
- /msprobe/{pytorch/doc → docs}/img/compare_result_pkl_md5.png.png +0 -0
- /msprobe/{pytorch/doc → docs}/img/cpu_info.png +0 -0
- /msprobe/{config → docs}/img/free_benchmark.png +0 -0
- /msprobe/{pytorch/doc → docs}/img/module_compare.png +0 -0
|
@@ -1,367 +1,316 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
# -*- coding: utf-8 -*-
|
|
3
|
-
"""
|
|
4
|
-
# Copyright (C) 2022-2024. Huawei Technologies Co., Ltd. All rights reserved.
|
|
5
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
-
# you may not use this file except in compliance with the License.
|
|
7
|
-
# You may obtain a copy of the License at
|
|
8
|
-
#
|
|
9
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
-
#
|
|
11
|
-
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
-
# See the License for the specific language governing permissions and
|
|
15
|
-
# limitations under the License.
|
|
16
|
-
"""
|
|
17
|
-
import
|
|
18
|
-
import
|
|
19
|
-
import
|
|
20
|
-
import
|
|
21
|
-
import
|
|
22
|
-
import
|
|
23
|
-
import
|
|
24
|
-
import
|
|
25
|
-
import
|
|
26
|
-
import
|
|
27
|
-
from
|
|
28
|
-
from msprobe.
|
|
29
|
-
|
|
30
|
-
from msprobe.
|
|
31
|
-
from msprobe.core.common.
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
from
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
from rich.
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
return file_count
|
|
96
|
-
|
|
97
|
-
@staticmethod
|
|
98
|
-
def get_sorted_subdirectories_names(self, directory):
|
|
99
|
-
subdirectories = []
|
|
100
|
-
for item in os.listdir(directory):
|
|
101
|
-
item_path = os.path.join(directory, item)
|
|
102
|
-
if os.path.isdir(item_path):
|
|
103
|
-
subdirectories.append(item)
|
|
104
|
-
return sorted(subdirectories)
|
|
105
|
-
|
|
106
|
-
@staticmethod
|
|
107
|
-
def get_sorted_files_names(self, directory):
|
|
108
|
-
files = []
|
|
109
|
-
for item in os.listdir(directory):
|
|
110
|
-
item_path = os.path.join(directory, item)
|
|
111
|
-
if os.path.isfile(item_path):
|
|
112
|
-
files.append(item)
|
|
113
|
-
return sorted(files)
|
|
114
|
-
|
|
115
|
-
@staticmethod
|
|
116
|
-
def check_npy_files_valid_in_dir(self, dir_path):
|
|
117
|
-
for file_name in os.listdir(dir_path):
|
|
118
|
-
file_path = os.path.join(dir_path, file_name)
|
|
119
|
-
check_file_or_directory_path(file_path)
|
|
120
|
-
_, file_extension = os.path.splitext(file_path)
|
|
121
|
-
if not file_extension == '.npy':
|
|
122
|
-
return False
|
|
123
|
-
return True
|
|
124
|
-
|
|
125
|
-
@staticmethod
|
|
126
|
-
def get_md5_for_numpy(self, obj):
|
|
127
|
-
np_bytes = obj.tobytes()
|
|
128
|
-
md5_hash = hashlib.md5(np_bytes)
|
|
129
|
-
return md5_hash.hexdigest()
|
|
130
|
-
|
|
131
|
-
@staticmethod
|
|
132
|
-
def
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
self.print(content)
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
return
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
return
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
def
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
def
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
if path.endswith(
|
|
296
|
-
self.log.error(
|
|
297
|
-
raise ParseException(ParseException.
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
self.log.error("
|
|
303
|
-
raise ParseException(ParseException.PARSE_INVALID_PATH_ERROR)
|
|
304
|
-
|
|
305
|
-
def
|
|
306
|
-
if
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
npu_info_result = namedtuple('npu_info_result', ['shape', 'dtype', 'max', 'min', 'mean'])
|
|
318
|
-
res = npu_info_result(data.shape, data.dtype, data.max(), data.min(), data.mean())
|
|
319
|
-
return res
|
|
320
|
-
|
|
321
|
-
def list_file_with_pattern(self, path, pattern, extern_pattern, gen_info_func):
|
|
322
|
-
self.check_path_valid(path)
|
|
323
|
-
file_list = {}
|
|
324
|
-
re_pattern = re.compile(pattern)
|
|
325
|
-
for dir_path, _, file_names in os.walk(path, followlinks=True):
|
|
326
|
-
for name in file_names:
|
|
327
|
-
match = re_pattern.match(name)
|
|
328
|
-
if not match:
|
|
329
|
-
continue
|
|
330
|
-
if extern_pattern != '' and not re.match(extern_pattern, name):
|
|
331
|
-
continue
|
|
332
|
-
file_list[name] = gen_info_func(name, match, dir_path)
|
|
333
|
-
return file_list
|
|
334
|
-
|
|
335
|
-
def check_path_format(self, path, suffix):
|
|
336
|
-
if os.path.isfile(path):
|
|
337
|
-
if not path.endswith(suffix):
|
|
338
|
-
self.log.error("%s is not a %s file." % (path, suffix))
|
|
339
|
-
raise ParseException(ParseException.PARSE_INVALID_FILE_FORMAT_ERROR)
|
|
340
|
-
elif os.path.isdir(path):
|
|
341
|
-
self.log.error("Please specify a single file path")
|
|
342
|
-
raise ParseException(ParseException.PARSE_INVALID_PATH_ERROR)
|
|
343
|
-
else:
|
|
344
|
-
self.log.error("The file path %s is invalid" % path)
|
|
345
|
-
raise ParseException(ParseException.PARSE_INVALID_PATH_ERROR)
|
|
346
|
-
|
|
347
|
-
def check_path_name(self, path):
|
|
348
|
-
if len(os.path.realpath(path)) > Const.DIRECTORY_LENGTH or len(os.path.basename(path)) > \
|
|
349
|
-
Const.FILE_NAME_LENGTH:
|
|
350
|
-
self.log.error('The file path length exceeds limit.')
|
|
351
|
-
raise ParseException(ParseException.PARSE_INVALID_PATH_ERROR)
|
|
352
|
-
if not re.match(Const.FILE_PATTERN, os.path.realpath(path)):
|
|
353
|
-
self.log.error('The file path {} contains special characters.'.format(path))
|
|
354
|
-
raise ParseException(ParseException.PARSE_INVALID_PATH_ERROR)
|
|
355
|
-
|
|
356
|
-
def check_str_param(self, param):
|
|
357
|
-
if len(param) > Const.FILE_NAME_LENGTH:
|
|
358
|
-
self.log.error('The parameter length exceeds limit')
|
|
359
|
-
raise ParseException(ParseException.PARSE_INVALID_PARAM_ERROR)
|
|
360
|
-
if not re.match(Const.FILE_PATTERN, param):
|
|
361
|
-
self.log.error('The parameter {} contains special characters.'.format(param))
|
|
362
|
-
raise ParseException(ParseException.PARSE_INVALID_PARAM_ERROR)
|
|
363
|
-
|
|
364
|
-
def is_subdir_count_equal(self, dir1, dir2):
|
|
365
|
-
dir1_count = self.get_subdir_count(dir1)
|
|
366
|
-
dir2_count = self.get_subdir_count(dir2)
|
|
367
|
-
return dir1_count == dir2_count
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
"""
|
|
4
|
+
# Copyright (C) 2022-2024. Huawei Technologies Co., Ltd. All rights reserved.
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
"""
|
|
17
|
+
import os
|
|
18
|
+
import re
|
|
19
|
+
import sys
|
|
20
|
+
import subprocess
|
|
21
|
+
import hashlib
|
|
22
|
+
import time
|
|
23
|
+
import numpy as np
|
|
24
|
+
from collections import namedtuple
|
|
25
|
+
from msprobe.pytorch.parse_tool.lib.config import Const
|
|
26
|
+
from msprobe.pytorch.parse_tool.lib.file_desc import DumpDecodeFileDesc, FileDesc
|
|
27
|
+
from msprobe.pytorch.parse_tool.lib.parse_exception import ParseException
|
|
28
|
+
from msprobe.core.common.file_utils import change_mode, check_other_user_writable,\
|
|
29
|
+
check_path_executable, check_path_owner_consistent
|
|
30
|
+
from msprobe.core.common.const import FileCheckConst
|
|
31
|
+
from msprobe.core.common.file_utils import FileChecker, check_file_or_directory_path, remove_path
|
|
32
|
+
from msprobe.pytorch.common.log import logger
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
try:
|
|
36
|
+
from rich.traceback import install
|
|
37
|
+
from rich.panel import Panel
|
|
38
|
+
from rich.table import Table
|
|
39
|
+
from rich import print as rich_print
|
|
40
|
+
from rich.columns import Columns
|
|
41
|
+
|
|
42
|
+
install()
|
|
43
|
+
except ImportError as err:
|
|
44
|
+
install = None
|
|
45
|
+
Panel = None
|
|
46
|
+
Table = None
|
|
47
|
+
Columns = None
|
|
48
|
+
rich_print = None
|
|
49
|
+
logger.warning(
|
|
50
|
+
"Failed to import rich, Some features may not be available. Please run 'pip install rich' to fix it.")
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class Util:
|
|
54
|
+
def __init__(self):
|
|
55
|
+
self.ms_accu_cmp = None
|
|
56
|
+
self.log = logger
|
|
57
|
+
self.python = sys.executable
|
|
58
|
+
|
|
59
|
+
@staticmethod
|
|
60
|
+
def print(content):
|
|
61
|
+
rich_print(content)
|
|
62
|
+
|
|
63
|
+
@staticmethod
|
|
64
|
+
def path_strip(path):
|
|
65
|
+
return path.strip("'").strip('"')
|
|
66
|
+
|
|
67
|
+
@staticmethod
|
|
68
|
+
def check_executable_file(path):
|
|
69
|
+
check_path_owner_consistent(path)
|
|
70
|
+
check_other_user_writable(path)
|
|
71
|
+
check_path_executable(path)
|
|
72
|
+
|
|
73
|
+
@staticmethod
|
|
74
|
+
def get_subdir_count(self, directory):
|
|
75
|
+
subdir_count = 0
|
|
76
|
+
path_checker = FileChecker(directory)
|
|
77
|
+
path_checker.common_check()
|
|
78
|
+
for _, dirs, _ in os.walk(directory):
|
|
79
|
+
subdir_count += len(dirs)
|
|
80
|
+
break
|
|
81
|
+
return subdir_count
|
|
82
|
+
|
|
83
|
+
@staticmethod
|
|
84
|
+
def get_subfiles_count(self, directory):
|
|
85
|
+
file_count = 0
|
|
86
|
+
for root, _, files in os.walk(directory, topdown=True):
|
|
87
|
+
path_checker = FileChecker(root)
|
|
88
|
+
path_checker.common_check()
|
|
89
|
+
file_count += len(files)
|
|
90
|
+
path_depth = root.count(os.sep)
|
|
91
|
+
if path_depth <= Const.MAX_TRAVERSAL_DEPTH:
|
|
92
|
+
yield root, _, files
|
|
93
|
+
else:
|
|
94
|
+
_[:] = []
|
|
95
|
+
return file_count
|
|
96
|
+
|
|
97
|
+
@staticmethod
|
|
98
|
+
def get_sorted_subdirectories_names(self, directory):
|
|
99
|
+
subdirectories = []
|
|
100
|
+
for item in os.listdir(directory):
|
|
101
|
+
item_path = os.path.join(directory, item)
|
|
102
|
+
if os.path.isdir(item_path):
|
|
103
|
+
subdirectories.append(item)
|
|
104
|
+
return sorted(subdirectories)
|
|
105
|
+
|
|
106
|
+
@staticmethod
|
|
107
|
+
def get_sorted_files_names(self, directory):
|
|
108
|
+
files = []
|
|
109
|
+
for item in os.listdir(directory):
|
|
110
|
+
item_path = os.path.join(directory, item)
|
|
111
|
+
if os.path.isfile(item_path):
|
|
112
|
+
files.append(item)
|
|
113
|
+
return sorted(files)
|
|
114
|
+
|
|
115
|
+
@staticmethod
|
|
116
|
+
def check_npy_files_valid_in_dir(self, dir_path):
|
|
117
|
+
for file_name in os.listdir(dir_path):
|
|
118
|
+
file_path = os.path.join(dir_path, file_name)
|
|
119
|
+
check_file_or_directory_path(file_path)
|
|
120
|
+
_, file_extension = os.path.splitext(file_path)
|
|
121
|
+
if not file_extension == '.npy':
|
|
122
|
+
return False
|
|
123
|
+
return True
|
|
124
|
+
|
|
125
|
+
@staticmethod
|
|
126
|
+
def get_md5_for_numpy(self, obj):
|
|
127
|
+
np_bytes = obj.tobytes()
|
|
128
|
+
md5_hash = hashlib.md5(np_bytes)
|
|
129
|
+
return md5_hash.hexdigest()
|
|
130
|
+
|
|
131
|
+
@staticmethod
|
|
132
|
+
def deal_with_dir_or_file_inconsistency(self, output_path):
|
|
133
|
+
remove_path(output_path)
|
|
134
|
+
raise ParseException("Inconsistent directory structure or file.")
|
|
135
|
+
|
|
136
|
+
@staticmethod
|
|
137
|
+
def deal_with_value_if_has_zero(self, data):
|
|
138
|
+
if data.dtype in Const.FLOAT_TYPE:
|
|
139
|
+
zero_mask = (data == 0)
|
|
140
|
+
# 给0的地方加上eps防止除0
|
|
141
|
+
data[zero_mask] += np.finfo(data.dtype).eps
|
|
142
|
+
else:
|
|
143
|
+
# int type + float eps 会报错,所以这里要强转
|
|
144
|
+
data = data.astype(float)
|
|
145
|
+
zero_mask = (data == 0)
|
|
146
|
+
data[zero_mask] += np.finfo(float).eps
|
|
147
|
+
return data
|
|
148
|
+
|
|
149
|
+
@staticmethod
|
|
150
|
+
def dir_contains_only(self, path, endfix):
|
|
151
|
+
for root, _, files in os.walk(path, topdown=True):
|
|
152
|
+
path_checker = FileChecker(root)
|
|
153
|
+
path_checker.common_check()
|
|
154
|
+
for file in files:
|
|
155
|
+
if not file.endswith(endfix):
|
|
156
|
+
return False
|
|
157
|
+
path_depth = root.count(os.sep)
|
|
158
|
+
if path_depth <= Const.MAX_TRAVERSAL_DEPTH:
|
|
159
|
+
yield root, _, files
|
|
160
|
+
else:
|
|
161
|
+
_[:] = []
|
|
162
|
+
return True
|
|
163
|
+
|
|
164
|
+
@staticmethod
|
|
165
|
+
def localtime_str(self):
|
|
166
|
+
return time.strftime("%Y%m%d%H%M%S", time.localtime())
|
|
167
|
+
|
|
168
|
+
@staticmethod
|
|
169
|
+
def change_filemode_safe(self, path):
|
|
170
|
+
change_mode(path, FileCheckConst.DATA_FILE_AUTHORITY)
|
|
171
|
+
|
|
172
|
+
@staticmethod
|
|
173
|
+
def _gen_npu_dump_convert_file_info(name, match, dir_path):
|
|
174
|
+
return DumpDecodeFileDesc(name, dir_path, int(match.groups()[-4]), op_name=match.group(2),
|
|
175
|
+
op_type=match.group(1), task_id=int(match.group(3)), anchor_type=match.groups()[-3],
|
|
176
|
+
anchor_idx=int(match.groups()[-2]))
|
|
177
|
+
|
|
178
|
+
@staticmethod
|
|
179
|
+
def _gen_numpy_file_info(name, math, dir_path):
|
|
180
|
+
return FileDesc(name, dir_path)
|
|
181
|
+
|
|
182
|
+
def execute_command(self, cmd):
|
|
183
|
+
if not cmd:
|
|
184
|
+
self.log.error("Commond is None")
|
|
185
|
+
return -1
|
|
186
|
+
self.log.info("[RUN CMD]: %s", cmd)
|
|
187
|
+
cmd = cmd.split(" ")
|
|
188
|
+
complete_process = subprocess.run(cmd, shell=False)
|
|
189
|
+
return complete_process.returncode
|
|
190
|
+
|
|
191
|
+
def print_panel(self, content, title='', fit=True):
|
|
192
|
+
if not Panel:
|
|
193
|
+
self.print(content)
|
|
194
|
+
return
|
|
195
|
+
if fit:
|
|
196
|
+
self.print(Panel.fit(content, title=title))
|
|
197
|
+
else:
|
|
198
|
+
self.print(Panel(content, title=title))
|
|
199
|
+
|
|
200
|
+
def check_msaccucmp(self, target_file):
|
|
201
|
+
if os.path.split(target_file)[-1] != Const.MS_ACCU_CMP_FILE_NAME:
|
|
202
|
+
self.log.error(
|
|
203
|
+
"Check msaccucmp failed in dir %s. This is not a correct msaccucmp file" % target_file)
|
|
204
|
+
raise ParseException(ParseException.PARSE_MSACCUCMP_ERROR)
|
|
205
|
+
result = subprocess.run(
|
|
206
|
+
[self.python, target_file, "--help"], stdout=subprocess.PIPE, shell=False)
|
|
207
|
+
if result.returncode == 0:
|
|
208
|
+
self.log.info("Check [%s] success.", target_file)
|
|
209
|
+
else:
|
|
210
|
+
self.log.error("Check msaccucmp failed in dir %s" % target_file)
|
|
211
|
+
self.log.error("Please specify a valid msaccucmp.py path or install the cann package")
|
|
212
|
+
raise ParseException(ParseException.PARSE_MSACCUCMP_ERROR)
|
|
213
|
+
return target_file
|
|
214
|
+
|
|
215
|
+
def gen_npy_info_txt(self, source_data):
|
|
216
|
+
(shape, dtype, max_data, min_data, mean) = \
|
|
217
|
+
self.npy_info(source_data)
|
|
218
|
+
return \
|
|
219
|
+
'[Shape: %s] [Dtype: %s] [Max: %s] [Min: %s] [Mean: %s]' % (shape, dtype, max_data, min_data, mean)
|
|
220
|
+
|
|
221
|
+
def list_convert_files(self, path, external_pattern=""):
|
|
222
|
+
return self.list_file_with_pattern(
|
|
223
|
+
path, Const.OFFLINE_DUMP_CONVERT_PATTERN, external_pattern, self._gen_npu_dump_convert_file_info
|
|
224
|
+
)
|
|
225
|
+
|
|
226
|
+
def list_numpy_files(self, path, extern_pattern=''):
|
|
227
|
+
return self.list_file_with_pattern(path, Const.NUMPY_PATTERN, extern_pattern,
|
|
228
|
+
self._gen_numpy_file_info)
|
|
229
|
+
|
|
230
|
+
def create_columns(self, content):
|
|
231
|
+
if not Columns:
|
|
232
|
+
self.log.error("No module named rich, please install it")
|
|
233
|
+
raise ParseException(ParseException.PARSE_NO_MODULE_ERROR)
|
|
234
|
+
return Columns(content)
|
|
235
|
+
|
|
236
|
+
def create_table(self, title, columns):
|
|
237
|
+
if not Table:
|
|
238
|
+
self.log.error("No module named rich, please install it and restart parse tool")
|
|
239
|
+
raise ParseException(ParseException.PARSE_NO_MODULE_ERROR)
|
|
240
|
+
table = Table(title=title)
|
|
241
|
+
for column_name in columns:
|
|
242
|
+
table.add_column(column_name, overflow='fold')
|
|
243
|
+
return table
|
|
244
|
+
|
|
245
|
+
def check_path_valid(self, path):
|
|
246
|
+
path = self.path_strip(path)
|
|
247
|
+
path_checker = FileChecker(path)
|
|
248
|
+
path_checker.common_check()
|
|
249
|
+
return True
|
|
250
|
+
|
|
251
|
+
def check_files_in_path(self, path):
|
|
252
|
+
if os.path.isdir(path) and len(os.listdir(path)) == 0:
|
|
253
|
+
self.log.error("No files in %s." % path)
|
|
254
|
+
raise ParseException(ParseException.PARSE_INVALID_PATH_ERROR)
|
|
255
|
+
|
|
256
|
+
def npy_info(self, source_data):
|
|
257
|
+
if isinstance(source_data, np.ndarray):
|
|
258
|
+
data = source_data
|
|
259
|
+
else:
|
|
260
|
+
self.log.error("Invalid data, data is not ndarray")
|
|
261
|
+
raise ParseException(ParseException.PARSE_INVALID_DATA_ERROR)
|
|
262
|
+
if data.dtype == 'object':
|
|
263
|
+
self.log.error("Invalid data, data is object.")
|
|
264
|
+
raise ParseException(ParseException.PARSE_INVALID_DATA_ERROR)
|
|
265
|
+
if np.size(data) == 0:
|
|
266
|
+
self.log.error("Invalid data, data is empty")
|
|
267
|
+
raise ParseException(ParseException.PARSE_INVALID_DATA_ERROR)
|
|
268
|
+
npu_info_result = namedtuple('npu_info_result', ['shape', 'dtype', 'max', 'min', 'mean'])
|
|
269
|
+
res = npu_info_result(data.shape, data.dtype, data.max(), data.min(), data.mean())
|
|
270
|
+
return res
|
|
271
|
+
|
|
272
|
+
def list_file_with_pattern(self, path, pattern, extern_pattern, gen_info_func):
|
|
273
|
+
self.check_path_valid(path)
|
|
274
|
+
file_list = {}
|
|
275
|
+
re_pattern = re.compile(pattern)
|
|
276
|
+
for dir_path, _, file_names in os.walk(path, topdown=True):
|
|
277
|
+
path_checker = FileChecker(dir)
|
|
278
|
+
path_checker.common_check()
|
|
279
|
+
for name in file_names:
|
|
280
|
+
match = re_pattern.match(name)
|
|
281
|
+
if not match:
|
|
282
|
+
continue
|
|
283
|
+
if extern_pattern != '' and re_pattern.match(extern_pattern) and not re.match(extern_pattern, name):
|
|
284
|
+
continue
|
|
285
|
+
file_list[name] = gen_info_func(name, match, dir_path)
|
|
286
|
+
path_depth = dir_path.count(os.sep)
|
|
287
|
+
if path_depth <= Const.MAX_TRAVERSAL_DEPTH:
|
|
288
|
+
yield dir_path, _, file_names
|
|
289
|
+
else:
|
|
290
|
+
_[:] = []
|
|
291
|
+
return file_list
|
|
292
|
+
|
|
293
|
+
def check_file_path_format(self, path, suffix):
|
|
294
|
+
if os.path.isfile(path):
|
|
295
|
+
if not path.endswith(suffix):
|
|
296
|
+
self.log.error("%s is not a %s file." % (path, suffix))
|
|
297
|
+
raise ParseException(ParseException.PARSE_INVALID_FILE_FORMAT_ERROR)
|
|
298
|
+
elif os.path.isdir(path):
|
|
299
|
+
self.log.error("Please specify a single file path")
|
|
300
|
+
raise ParseException(ParseException.PARSE_INVALID_PATH_ERROR)
|
|
301
|
+
else:
|
|
302
|
+
self.log.error("The file path %s is invalid" % path)
|
|
303
|
+
raise ParseException(ParseException.PARSE_INVALID_PATH_ERROR)
|
|
304
|
+
|
|
305
|
+
def check_str_param(self, param):
|
|
306
|
+
if len(param) > Const.FILE_NAME_LENGTH:
|
|
307
|
+
self.log.error('The parameter length exceeds limit')
|
|
308
|
+
raise ParseException(ParseException.PARSE_INVALID_PARAM_ERROR)
|
|
309
|
+
if not re.match(Const.FILE_PATTERN, param):
|
|
310
|
+
self.log.error('The parameter {} contains special characters.'.format(param))
|
|
311
|
+
raise ParseException(ParseException.PARSE_INVALID_PARAM_ERROR)
|
|
312
|
+
|
|
313
|
+
def is_subdir_count_equal(self, dir1, dir2):
|
|
314
|
+
dir1_count = self.get_subdir_count(dir1)
|
|
315
|
+
dir2_count = self.get_subdir_count(dir2)
|
|
316
|
+
return dir1_count == dir2_count
|