mindstudio-probe 1.0.1__py3-none-any.whl → 1.0.3__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.3.dist-info}/METADATA +5 -1
- mindstudio_probe-1.0.3.dist-info/RECORD +272 -0
- msprobe/README.md +78 -23
- msprobe/__init__.py +1 -0
- msprobe/config/README.md +182 -40
- msprobe/config/config.json +22 -0
- msprobe/core/__init__.py +0 -0
- msprobe/{pytorch → core}/advisor/advisor.py +3 -3
- msprobe/{pytorch → core}/advisor/advisor_result.py +2 -2
- msprobe/core/common/const.py +82 -5
- msprobe/core/common/exceptions.py +30 -18
- msprobe/core/common/file_check.py +19 -1
- msprobe/core/common/log.py +15 -1
- msprobe/core/common/utils.py +130 -30
- msprobe/core/common_config.py +32 -19
- msprobe/core/compare/acc_compare.py +299 -0
- msprobe/core/compare/check.py +95 -0
- msprobe/core/compare/compare_cli.py +49 -0
- msprobe/core/compare/highlight.py +222 -0
- msprobe/core/compare/multiprocessing_compute.py +149 -0
- msprobe/{pytorch → core}/compare/npy_compare.py +55 -4
- msprobe/core/compare/utils.py +429 -0
- msprobe/core/data_dump/data_collector.py +39 -35
- msprobe/core/data_dump/data_processor/base.py +85 -37
- msprobe/core/data_dump/data_processor/factory.py +5 -7
- msprobe/core/data_dump/data_processor/mindspore_processor.py +198 -0
- msprobe/core/data_dump/data_processor/pytorch_processor.py +94 -51
- msprobe/core/data_dump/json_writer.py +11 -11
- msprobe/core/grad_probe/__init__.py +0 -0
- msprobe/core/grad_probe/constant.py +71 -0
- msprobe/core/grad_probe/grad_compare.py +175 -0
- msprobe/core/grad_probe/utils.py +52 -0
- msprobe/doc/grad_probe/grad_probe.md +207 -0
- msprobe/doc/grad_probe/img/image-1.png +0 -0
- msprobe/doc/grad_probe/img/image-2.png +0 -0
- msprobe/doc/grad_probe/img/image-3.png +0 -0
- msprobe/doc/grad_probe/img/image-4.png +0 -0
- msprobe/doc/grad_probe/img/image.png +0 -0
- msprobe/mindspore/api_accuracy_checker/__init__.py +0 -0
- msprobe/mindspore/api_accuracy_checker/api_accuracy_checker.py +246 -0
- msprobe/mindspore/api_accuracy_checker/api_info.py +69 -0
- msprobe/mindspore/api_accuracy_checker/api_runner.py +152 -0
- msprobe/mindspore/api_accuracy_checker/base_compare_algorithm.py +197 -0
- msprobe/mindspore/api_accuracy_checker/compute_element.py +224 -0
- msprobe/mindspore/api_accuracy_checker/main.py +16 -0
- msprobe/mindspore/api_accuracy_checker/type_mapping.py +114 -0
- msprobe/mindspore/api_accuracy_checker/utils.py +63 -0
- msprobe/mindspore/cell_processor.py +34 -0
- msprobe/mindspore/common/const.py +87 -0
- msprobe/mindspore/common/log.py +38 -0
- msprobe/mindspore/common/utils.py +57 -0
- msprobe/mindspore/compare/distributed_compare.py +75 -0
- msprobe/mindspore/compare/ms_compare.py +117 -0
- msprobe/mindspore/compare/ms_graph_compare.py +317 -0
- msprobe/mindspore/compare/ms_to_pt_api.yaml +399 -0
- msprobe/mindspore/debugger/debugger_config.py +38 -15
- msprobe/mindspore/debugger/precision_debugger.py +79 -4
- msprobe/mindspore/doc/compare.md +58 -0
- msprobe/mindspore/doc/dump.md +158 -6
- msprobe/mindspore/dump/dump_tool_factory.py +19 -22
- msprobe/mindspore/dump/hook_cell/api_registry.py +104 -0
- msprobe/mindspore/dump/hook_cell/hook_cell.py +53 -0
- msprobe/mindspore/dump/hook_cell/support_wrap_ops.yaml +925 -0
- msprobe/mindspore/dump/hook_cell/wrap_functional.py +91 -0
- msprobe/mindspore/dump/hook_cell/wrap_tensor.py +63 -0
- msprobe/mindspore/dump/jit_dump.py +56 -0
- msprobe/mindspore/dump/kernel_kbyk_dump.py +65 -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 +42 -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/improve_precision.py +34 -0
- msprobe/mindspore/free_benchmark/perturbation/no_change.py +12 -0
- msprobe/mindspore/free_benchmark/perturbation/perturbation_factory.py +27 -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 +91 -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 +92 -0
- msprobe/mindspore/grad_probe/utils.py +29 -0
- msprobe/mindspore/ms_config.py +63 -15
- msprobe/mindspore/overflow_check/overflow_check_tool_factory.py +17 -15
- msprobe/mindspore/runtime.py +4 -0
- msprobe/mindspore/service.py +354 -0
- msprobe/mindspore/task_handler_factory.py +7 -4
- msprobe/msprobe.py +66 -26
- msprobe/pytorch/__init__.py +1 -1
- msprobe/pytorch/api_accuracy_checker/common/config.py +21 -16
- msprobe/pytorch/api_accuracy_checker/common/utils.py +1 -60
- msprobe/pytorch/api_accuracy_checker/compare/algorithm.py +2 -5
- msprobe/pytorch/api_accuracy_checker/compare/api_precision_compare.py +46 -10
- msprobe/pytorch/api_accuracy_checker/compare/compare.py +84 -48
- msprobe/pytorch/api_accuracy_checker/compare/compare_utils.py +8 -12
- msprobe/pytorch/api_accuracy_checker/config.yaml +7 -1
- msprobe/pytorch/api_accuracy_checker/run_ut/data_generate.py +15 -11
- msprobe/pytorch/api_accuracy_checker/run_ut/multi_run_ut.py +11 -15
- msprobe/pytorch/api_accuracy_checker/run_ut/run_overflow_check.py +16 -9
- msprobe/pytorch/api_accuracy_checker/run_ut/run_ut.py +193 -105
- msprobe/pytorch/api_accuracy_checker/run_ut/run_ut_utils.py +68 -1
- msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/__init__.py +0 -0
- msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/attl.py +202 -0
- msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/client.py +324 -0
- msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/device_dispatch.py +204 -0
- msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/server.py +218 -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 +421 -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/parse_json.py +3 -1
- msprobe/pytorch/common/utils.py +83 -7
- msprobe/pytorch/compare/distributed_compare.py +19 -64
- msprobe/pytorch/compare/match.py +3 -6
- msprobe/pytorch/compare/pt_compare.py +40 -0
- msprobe/pytorch/debugger/debugger_config.py +11 -2
- msprobe/pytorch/debugger/precision_debugger.py +34 -4
- msprobe/pytorch/doc/api_accuracy_checker.md +57 -13
- msprobe/pytorch/doc/api_accuracy_checker_online.md +187 -0
- msprobe/pytorch/doc/dump.md +73 -20
- msprobe/pytorch/doc/ptdbg_ascend_compare.md +75 -11
- msprobe/pytorch/doc/ptdbg_ascend_quickstart.md +3 -3
- msprobe/pytorch/doc/run_overflow_check.md +1 -1
- msprobe/pytorch/doc//321/206/320/247/320/260/321/206/320/260/320/227/321/206/320/255/320/226/321/205/342/225/226/320/265/321/205/320/225/342/225/226/321/205/320/254/342/225/221/321/206/320/251/320/277/321/211/320/272/320/234/321/210/320/277/320/221/321/205/320/242/320/234/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 +151 -0
- msprobe/pytorch/free_benchmark/common/constant.py +3 -0
- msprobe/pytorch/free_benchmark/common/utils.py +4 -0
- msprobe/pytorch/free_benchmark/compare/grad_saver.py +22 -26
- msprobe/pytorch/free_benchmark/main.py +7 -4
- msprobe/pytorch/free_benchmark/perturbed_layers/npu/add_noise.py +1 -1
- msprobe/pytorch/free_benchmark/perturbed_layers/npu/bit_noise.py +1 -1
- msprobe/pytorch/free_benchmark/perturbed_layers/npu/change_value.py +1 -1
- msprobe/pytorch/free_benchmark/perturbed_layers/npu/improve_precision.py +3 -3
- msprobe/pytorch/free_benchmark/perturbed_layers/npu/no_change.py +1 -1
- msprobe/pytorch/free_benchmark/perturbed_layers/run_cpu.py +1 -1
- msprobe/pytorch/free_benchmark/result_handlers/base_handler.py +43 -29
- msprobe/pytorch/free_benchmark/result_handlers/handler_factory.py +0 -1
- msprobe/pytorch/function_factory.py +75 -0
- msprobe/pytorch/functional/dump_module.py +4 -4
- msprobe/pytorch/grad_probe/__init__.py +0 -0
- msprobe/pytorch/grad_probe/grad_monitor.py +90 -0
- msprobe/pytorch/grad_probe/grad_stat_csv.py +129 -0
- msprobe/pytorch/hook_module/hook_module.py +14 -3
- msprobe/pytorch/hook_module/support_wrap_ops.yaml +2 -1
- msprobe/pytorch/hook_module/utils.py +9 -9
- msprobe/pytorch/hook_module/wrap_aten.py +20 -10
- msprobe/pytorch/hook_module/wrap_distributed.py +10 -7
- msprobe/pytorch/hook_module/wrap_functional.py +4 -7
- msprobe/pytorch/hook_module/wrap_npu_custom.py +21 -10
- msprobe/pytorch/hook_module/wrap_tensor.py +5 -6
- msprobe/pytorch/hook_module/wrap_torch.py +5 -7
- msprobe/pytorch/hook_module/wrap_vf.py +6 -8
- msprobe/pytorch/module_processer.py +53 -13
- msprobe/pytorch/online_dispatch/compare.py +4 -4
- msprobe/pytorch/online_dispatch/dispatch.py +39 -41
- msprobe/pytorch/online_dispatch/dump_compare.py +17 -47
- msprobe/pytorch/online_dispatch/single_compare.py +5 -5
- msprobe/pytorch/online_dispatch/utils.py +2 -43
- msprobe/pytorch/parse_tool/lib/compare.py +31 -19
- msprobe/pytorch/parse_tool/lib/config.py +2 -1
- msprobe/pytorch/parse_tool/lib/parse_tool.py +4 -4
- msprobe/pytorch/parse_tool/lib/utils.py +34 -80
- msprobe/pytorch/parse_tool/lib/visualization.py +4 -3
- msprobe/pytorch/pt_config.py +100 -6
- msprobe/pytorch/service.py +104 -19
- mindstudio_probe-1.0.1.dist-info/RECORD +0 -228
- 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/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.3.dist-info}/LICENSE +0 -0
- {mindstudio_probe-1.0.1.dist-info → mindstudio_probe-1.0.3.dist-info}/WHEEL +0 -0
- {mindstudio_probe-1.0.1.dist-info → mindstudio_probe-1.0.3.dist-info}/entry_points.txt +0 -0
- {mindstudio_probe-1.0.1.dist-info → mindstudio_probe-1.0.3.dist-info}/top_level.txt +0 -0
- /msprobe/{pytorch → core}/advisor/advisor_const.py +0 -0
- /msprobe/pytorch/doc/{atat → msprobe}/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 -0
|
@@ -8,13 +8,13 @@ class CodedException(Exception):
|
|
|
8
8
|
return self.error_info
|
|
9
9
|
|
|
10
10
|
|
|
11
|
-
class
|
|
11
|
+
class MsprobeException(CodedException):
|
|
12
12
|
INVALID_PARAM_ERROR = 0
|
|
13
13
|
OVERFLOW_NUMS_ERROR = 1
|
|
14
14
|
|
|
15
15
|
err_strs = {
|
|
16
|
-
INVALID_PARAM_ERROR: "[
|
|
17
|
-
OVERFLOW_NUMS_ERROR: "[
|
|
16
|
+
INVALID_PARAM_ERROR: "[msprobe] 无效参数: ",
|
|
17
|
+
OVERFLOW_NUMS_ERROR: "[msprobe] 超过预设溢出次数 当前溢出次数:"
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
|
|
@@ -27,12 +27,12 @@ class FileCheckException(CodedException):
|
|
|
27
27
|
FILE_TOO_LARGE_ERROR = 5
|
|
28
28
|
|
|
29
29
|
err_strs = {
|
|
30
|
-
SOFT_LINK_ERROR: "[
|
|
31
|
-
FILE_PERMISSION_ERROR: "[
|
|
32
|
-
INVALID_FILE_ERROR: "[
|
|
33
|
-
ILLEGAL_PATH_ERROR: "[
|
|
34
|
-
ILLEGAL_PARAM_ERROR: "[
|
|
35
|
-
FILE_TOO_LARGE_ERROR: "[
|
|
30
|
+
SOFT_LINK_ERROR: "[msprobe] 检测到软链接: ",
|
|
31
|
+
FILE_PERMISSION_ERROR: "[msprobe] 文件权限错误: ",
|
|
32
|
+
INVALID_FILE_ERROR: "[msprobe] 无效文件: ",
|
|
33
|
+
ILLEGAL_PATH_ERROR: "[msprobe] 非法文件路径: ",
|
|
34
|
+
ILLEGAL_PARAM_ERROR: "[msprobe] 非法打开方式: ",
|
|
35
|
+
FILE_TOO_LARGE_ERROR: "[msprobe] 文件过大: "
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
|
|
@@ -40,8 +40,8 @@ class ParseJsonException(CodedException):
|
|
|
40
40
|
UnexpectedNameStruct = 0
|
|
41
41
|
InvalidDumpJson = 1
|
|
42
42
|
err_strs = {
|
|
43
|
-
UnexpectedNameStruct: "[
|
|
44
|
-
InvalidDumpJson: "[
|
|
43
|
+
UnexpectedNameStruct: "[msprobe] Unexpected name in json: ",
|
|
44
|
+
InvalidDumpJson: "[msprobe] json格式不正确: ",
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
|
|
@@ -50,23 +50,23 @@ class ScopeException(CodedException):
|
|
|
50
50
|
InvalidScope = 1
|
|
51
51
|
ArgConflict = 2
|
|
52
52
|
err_strs = {
|
|
53
|
-
InvalidApiStr: "[
|
|
54
|
-
InvalidScope: "[
|
|
55
|
-
ArgConflict: "[
|
|
53
|
+
InvalidApiStr: "[msprobe] Invalid api_list: ",
|
|
54
|
+
InvalidScope: "[msprobe] Invalid scope: ",
|
|
55
|
+
ArgConflict: "[msprobe] Scope and api_list conflict: ",
|
|
56
56
|
}
|
|
57
57
|
|
|
58
58
|
|
|
59
59
|
class RepairException(CodedException):
|
|
60
60
|
InvalidRepairType = 0
|
|
61
61
|
err_strs = {
|
|
62
|
-
InvalidRepairType: "[
|
|
62
|
+
InvalidRepairType: "[msprobe] Invalid repair_type: "
|
|
63
63
|
}
|
|
64
64
|
|
|
65
65
|
|
|
66
66
|
class StepException(CodedException):
|
|
67
67
|
InvalidPostProcess = 0
|
|
68
68
|
err_strs = {
|
|
69
|
-
InvalidPostProcess: "[
|
|
69
|
+
InvalidPostProcess: "[msprobe] 错误的step后处理配置: ",
|
|
70
70
|
}
|
|
71
71
|
|
|
72
72
|
|
|
@@ -74,8 +74,8 @@ class FreeBenchmarkException(CodedException):
|
|
|
74
74
|
UnsupportedType = 0
|
|
75
75
|
InvalidGrad = 1
|
|
76
76
|
err_strs = {
|
|
77
|
-
UnsupportedType: "[
|
|
78
|
-
InvalidGrad: "[
|
|
77
|
+
UnsupportedType: "[msprobe] Free benchmark get unsupported type: ",
|
|
78
|
+
InvalidGrad: "[msprobe] Free benchmark gradient invalid: ",
|
|
79
79
|
}
|
|
80
80
|
|
|
81
81
|
|
|
@@ -86,3 +86,15 @@ class DistributedNotInitializedError(Exception):
|
|
|
86
86
|
|
|
87
87
|
def __str__(self):
|
|
88
88
|
return self.msg
|
|
89
|
+
|
|
90
|
+
class ApiAccuracyCheckerException(CodedException):
|
|
91
|
+
ParseJsonFailed = 0
|
|
92
|
+
UnsupportType = 1
|
|
93
|
+
WrongValue = 2
|
|
94
|
+
ApiWrong = 3
|
|
95
|
+
err_strs = {
|
|
96
|
+
ParseJsonFailed: "[msprobe] Api Accuracy Checker parse json failed: ",
|
|
97
|
+
UnsupportType: "[msprobe] Api Accuracy Checker get unsupported type: ",
|
|
98
|
+
WrongValue: "[msprobe] Api Accuracy Checker get wrong value: ",
|
|
99
|
+
ApiWrong: "[msprobe] Api Accuracy Checker something wrong with api: ",
|
|
100
|
+
}
|
|
@@ -262,4 +262,22 @@ def change_mode(path, mode):
|
|
|
262
262
|
|
|
263
263
|
def path_len_exceeds_limit(file_path):
|
|
264
264
|
return len(os.path.realpath(file_path)) > FileCheckConst.DIRECTORY_LENGTH or \
|
|
265
|
-
len(os.path.basename(file_path)) > FileCheckConst.FILE_NAME_LENGTH
|
|
265
|
+
len(os.path.basename(file_path)) > FileCheckConst.FILE_NAME_LENGTH
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
def check_file_type(path):
|
|
269
|
+
"""
|
|
270
|
+
Function Description:
|
|
271
|
+
determine if it is a file or a directory
|
|
272
|
+
Parameter:
|
|
273
|
+
path: path
|
|
274
|
+
Exception Description:
|
|
275
|
+
when neither a file nor a directory throw exception
|
|
276
|
+
"""
|
|
277
|
+
if os.path.isdir(path):
|
|
278
|
+
return FileCheckConst.DIR
|
|
279
|
+
elif os.path.isfile(path):
|
|
280
|
+
return FileCheckConst.FILE
|
|
281
|
+
else:
|
|
282
|
+
logger.error('Neither a file nor a directory.')
|
|
283
|
+
raise FileCheckException(FileCheckException.INVALID_FILE_ERROR)
|
msprobe/core/common/log.py
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import os
|
|
2
2
|
import time
|
|
3
3
|
import sys
|
|
4
|
+
from functools import wraps
|
|
5
|
+
from msprobe.core.common.const import MsgConst
|
|
6
|
+
|
|
4
7
|
|
|
5
8
|
class BaseLogger:
|
|
6
9
|
def __init__(self):
|
|
@@ -20,12 +23,23 @@ class BaseLogger:
|
|
|
20
23
|
def get_rank(self):
|
|
21
24
|
return self.rank
|
|
22
25
|
|
|
26
|
+
def filter_special_chars(func):
|
|
27
|
+
@wraps(func)
|
|
28
|
+
def func_level(self, msg):
|
|
29
|
+
for char in MsgConst.SPECIAL_CHAR:
|
|
30
|
+
msg = msg.replace(char, '_')
|
|
31
|
+
return func(self, msg)
|
|
32
|
+
return func_level
|
|
33
|
+
|
|
34
|
+
@filter_special_chars
|
|
23
35
|
def info(self, msg):
|
|
24
36
|
self._print_log(self.info_level, msg)
|
|
25
37
|
|
|
38
|
+
@filter_special_chars
|
|
26
39
|
def error(self, msg):
|
|
27
40
|
self._print_log(self.error_level, msg)
|
|
28
41
|
|
|
42
|
+
@filter_special_chars
|
|
29
43
|
def warning(self, msg):
|
|
30
44
|
self._print_log(self.warning_level, msg)
|
|
31
45
|
|
|
@@ -52,4 +66,4 @@ class BaseLogger:
|
|
|
52
66
|
raise exception
|
|
53
67
|
|
|
54
68
|
|
|
55
|
-
logger = BaseLogger()
|
|
69
|
+
logger = BaseLogger()
|
msprobe/core/common/utils.py
CHANGED
|
@@ -18,16 +18,17 @@ import collections
|
|
|
18
18
|
import os
|
|
19
19
|
import re
|
|
20
20
|
import shutil
|
|
21
|
-
import stat
|
|
22
21
|
import subprocess
|
|
23
22
|
import time
|
|
24
23
|
import json
|
|
24
|
+
import csv
|
|
25
25
|
from datetime import datetime, timezone
|
|
26
26
|
from pathlib import Path
|
|
27
|
+
import yaml
|
|
27
28
|
import numpy as np
|
|
28
29
|
|
|
29
|
-
from msprobe.core.common.file_check import FileOpen, FileChecker
|
|
30
|
-
from msprobe.core.common.const import Const, FileCheckConst, CompareConst
|
|
30
|
+
from msprobe.core.common.file_check import FileOpen, FileChecker, change_mode
|
|
31
|
+
from msprobe.core.common.const import Const, FileCheckConst, CompareConst
|
|
31
32
|
from msprobe.core.common.log import logger
|
|
32
33
|
|
|
33
34
|
|
|
@@ -148,21 +149,24 @@ def check_summary_only_valid(summary_only):
|
|
|
148
149
|
return summary_only
|
|
149
150
|
|
|
150
151
|
|
|
151
|
-
def check_compare_param(
|
|
152
|
-
if not (isinstance(
|
|
152
|
+
def check_compare_param(input_param, output_path, summary_compare=False, md5_compare=False):
|
|
153
|
+
if not (isinstance(input_param, dict) and isinstance(output_path, str)):
|
|
153
154
|
logger.error("Invalid input parameters")
|
|
154
155
|
raise CompareException(CompareException.INVALID_PARAM_ERROR)
|
|
155
|
-
|
|
156
|
-
check_file_or_directory_path(
|
|
157
|
-
check_file_or_directory_path(
|
|
156
|
+
|
|
157
|
+
check_file_or_directory_path(input_param.get("npu_json_path"), False)
|
|
158
|
+
check_file_or_directory_path(input_param.get("bench_json_path"), False)
|
|
159
|
+
check_file_or_directory_path(input_param.get("stack_json_path"), False)
|
|
158
160
|
if not summary_compare and not md5_compare:
|
|
159
|
-
check_file_or_directory_path(
|
|
160
|
-
check_file_or_directory_path(
|
|
161
|
+
check_file_or_directory_path(input_param.get("npu_dump_data_dir"), True)
|
|
162
|
+
check_file_or_directory_path(input_param.get("bench_dump_data_dir"), True)
|
|
161
163
|
check_file_or_directory_path(output_path, True)
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
164
|
+
|
|
165
|
+
with FileOpen(input_param.get("npu_json_path"), "r") as npu_json, \
|
|
166
|
+
FileOpen(input_param.get("bench_json_path"), "r") as bench_json, \
|
|
167
|
+
FileOpen(input_param.get("stack_json_path"), "r") as stack_json:
|
|
168
|
+
check_json_file(input_param, npu_json, bench_json, stack_json)
|
|
169
|
+
|
|
166
170
|
|
|
167
171
|
|
|
168
172
|
def check_configuration_param(stack_mode=False, auto_analyze=True, fuzzy_match=False):
|
|
@@ -257,6 +261,17 @@ def remove_path(path):
|
|
|
257
261
|
raise CompareException(CompareException.INVALID_PATH_ERROR) from err
|
|
258
262
|
|
|
259
263
|
|
|
264
|
+
def move_file(src_path, dst_path):
|
|
265
|
+
check_file_or_directory_path(src_path)
|
|
266
|
+
check_path_before_create(dst_path)
|
|
267
|
+
try:
|
|
268
|
+
shutil.move(src_path, dst_path)
|
|
269
|
+
except Exception as e:
|
|
270
|
+
logger.error(f"move file {src_path} to {dst_path} failed")
|
|
271
|
+
raise RuntimeError(f"move file {src_path} to {dst_path} failed") from e
|
|
272
|
+
change_mode(dst_path, FileCheckConst.DATA_FILE_AUTHORITY)
|
|
273
|
+
|
|
274
|
+
|
|
260
275
|
def get_dump_data_path(dump_dir):
|
|
261
276
|
"""
|
|
262
277
|
Function Description:
|
|
@@ -289,6 +304,7 @@ def create_directory(dir_path):
|
|
|
289
304
|
when invalid data throw exception
|
|
290
305
|
"""
|
|
291
306
|
if not os.path.exists(dir_path):
|
|
307
|
+
check_path_before_create(dir_path)
|
|
292
308
|
try:
|
|
293
309
|
os.makedirs(dir_path, mode=0o700)
|
|
294
310
|
except OSError as ex:
|
|
@@ -318,15 +334,6 @@ def execute_command(cmd):
|
|
|
318
334
|
raise CompareException(CompareException.INVALID_DATA_ERROR)
|
|
319
335
|
|
|
320
336
|
|
|
321
|
-
def save_numpy_data(file_path, data):
|
|
322
|
-
"""
|
|
323
|
-
save_numpy_data
|
|
324
|
-
"""
|
|
325
|
-
if not os.path.exists(os.path.dirname(file_path)):
|
|
326
|
-
os.makedirs(os.path.dirname(file_path))
|
|
327
|
-
np.save(file_path, data)
|
|
328
|
-
|
|
329
|
-
|
|
330
337
|
def parse_value_by_comma(value):
|
|
331
338
|
"""
|
|
332
339
|
parse value by comma, like '1,2,4,8'
|
|
@@ -472,14 +479,14 @@ def md5_find(data):
|
|
|
472
479
|
|
|
473
480
|
|
|
474
481
|
def task_dumppath_get(input_param):
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
if not
|
|
482
|
+
npu_path = input_param.get("npu_json_path", None)
|
|
483
|
+
bench_path = input_param.get("bench_json_path", None)
|
|
484
|
+
if not npu_path or not bench_path:
|
|
478
485
|
logger.error(f"Please check the json path is valid.")
|
|
479
486
|
raise CompareException(CompareException.INVALID_PATH_ERROR)
|
|
480
|
-
with FileOpen(
|
|
487
|
+
with FileOpen(npu_path, 'r') as npu_f:
|
|
481
488
|
npu_json_data = json.load(npu_f)
|
|
482
|
-
with FileOpen(
|
|
489
|
+
with FileOpen(bench_path, 'r') as bench_f:
|
|
483
490
|
bench_json_data = json.load(bench_f)
|
|
484
491
|
if npu_json_data['task'] != bench_json_data['task']:
|
|
485
492
|
logger.error(f"Please check the dump task is consistent.")
|
|
@@ -496,8 +503,8 @@ def task_dumppath_get(input_param):
|
|
|
496
503
|
else:
|
|
497
504
|
logger.error(f"Compare is not required for overflow_check or free_benchmark.")
|
|
498
505
|
raise CompareException(CompareException.INVALID_TASK_ERROR)
|
|
499
|
-
input_param['npu_dump_data_dir'] =
|
|
500
|
-
input_param['bench_dump_data_dir'] =
|
|
506
|
+
input_param['npu_dump_data_dir'] = os.path.join(os.path.dirname(npu_path), Const.DUMP_TENSOR_DATA)
|
|
507
|
+
input_param['bench_dump_data_dir'] = os.path.join(os.path.dirname(bench_path), Const.DUMP_TENSOR_DATA)
|
|
501
508
|
return summary_compare, md5_compare
|
|
502
509
|
|
|
503
510
|
|
|
@@ -514,3 +521,96 @@ def get_header_index(header_name, summary_compare=False):
|
|
|
514
521
|
|
|
515
522
|
def convert_tuple(data):
|
|
516
523
|
return data if isinstance(data, tuple) else (data, )
|
|
524
|
+
|
|
525
|
+
|
|
526
|
+
def write_csv(data, filepath, mode="a+"):
|
|
527
|
+
exist = os.path.exists(filepath)
|
|
528
|
+
with FileOpen(filepath, mode, encoding='utf-8-sig') as f:
|
|
529
|
+
writer = csv.writer(f)
|
|
530
|
+
writer.writerows(data)
|
|
531
|
+
if not exist:
|
|
532
|
+
change_mode(filepath, FileCheckConst.DATA_FILE_AUTHORITY)
|
|
533
|
+
|
|
534
|
+
|
|
535
|
+
def load_npy(filepath):
|
|
536
|
+
check_file_or_directory_path(filepath)
|
|
537
|
+
try:
|
|
538
|
+
npy = np.load(filepath)
|
|
539
|
+
except Exception as e:
|
|
540
|
+
logger.error(f"The numpy file failed to load. Please check the path: {filepath}.")
|
|
541
|
+
raise RuntimeError(f"Load numpy file {filepath} failed.") from e
|
|
542
|
+
return npy
|
|
543
|
+
|
|
544
|
+
|
|
545
|
+
def save_npy(data, filepath):
|
|
546
|
+
filepath = os.path.realpath(filepath)
|
|
547
|
+
check_path_before_create(filepath)
|
|
548
|
+
try:
|
|
549
|
+
np.save(filepath, data)
|
|
550
|
+
except Exception as e:
|
|
551
|
+
logger.error(f"The numpy file failed to save. Please check the path: {filepath}.")
|
|
552
|
+
raise RuntimeError(f"Save numpy file {filepath} failed.") from e
|
|
553
|
+
change_mode(filepath, FileCheckConst.DATA_FILE_AUTHORITY)
|
|
554
|
+
|
|
555
|
+
def save_npy_to_txt(self, data, dst_file='', align=0):
|
|
556
|
+
if os.path.exists(dst_file):
|
|
557
|
+
self.log.info("Dst file %s exists, will not save new one.", dst_file)
|
|
558
|
+
return
|
|
559
|
+
shape = data.shape
|
|
560
|
+
data = data.flatten()
|
|
561
|
+
if align == 0:
|
|
562
|
+
align = 1 if len(shape) == 0 else shape[-1]
|
|
563
|
+
elif data.size % align != 0:
|
|
564
|
+
pad_array = np.zeros((align - data.size % align,))
|
|
565
|
+
data = np.append(data, pad_array)
|
|
566
|
+
check_path_before_create(dst_file)
|
|
567
|
+
try:
|
|
568
|
+
np.savetxt(dst_file, data.reshape((-1, align)), delimiter=' ', fmt='%g')
|
|
569
|
+
except Exception as e:
|
|
570
|
+
self.log.error("An unexpected error occurred: %s when savetxt to %s" % (str(e)), dst_file)
|
|
571
|
+
change_mode(dst_file, FileCheckConst.DATA_FILE_AUTHORITY)
|
|
572
|
+
|
|
573
|
+
def get_json_contents(file_path):
|
|
574
|
+
ops = get_file_content_bytes(file_path)
|
|
575
|
+
try:
|
|
576
|
+
json_obj = json.loads(ops)
|
|
577
|
+
except ValueError as error:
|
|
578
|
+
logger.error('Failed to load json.')
|
|
579
|
+
raise CompareException(CompareException.INVALID_FILE_ERROR) from error
|
|
580
|
+
if not isinstance(json_obj, dict):
|
|
581
|
+
logger.error('Json file content is not a dictionary!')
|
|
582
|
+
raise CompareException(CompareException.INVALID_FILE_ERROR)
|
|
583
|
+
return json_obj
|
|
584
|
+
|
|
585
|
+
|
|
586
|
+
def get_file_content_bytes(file):
|
|
587
|
+
with FileOpen(file, 'rb') as file_handle:
|
|
588
|
+
return file_handle.read()
|
|
589
|
+
|
|
590
|
+
|
|
591
|
+
def load_yaml(yaml_path):
|
|
592
|
+
path_checker = FileChecker(yaml_path, FileCheckConst.FILE, FileCheckConst.READ_ABLE, FileCheckConst.YAML_SUFFIX)
|
|
593
|
+
checked_path = path_checker.common_check()
|
|
594
|
+
try:
|
|
595
|
+
with FileOpen(checked_path, "r") as f:
|
|
596
|
+
yaml_data = yaml.safe_load(f)
|
|
597
|
+
except Exception as e:
|
|
598
|
+
logger.error(f"The yaml file failed to load. Please check the path: {checked_path}.")
|
|
599
|
+
raise RuntimeError(f"Load yaml file {checked_path} failed.") from e
|
|
600
|
+
return yaml_data
|
|
601
|
+
|
|
602
|
+
|
|
603
|
+
def save_workbook(workbook, file_path):
|
|
604
|
+
"""
|
|
605
|
+
保存工作簿到指定的文件路径
|
|
606
|
+
workbook: 要保存的工作簿对象
|
|
607
|
+
file_path: 文件保存路径
|
|
608
|
+
"""
|
|
609
|
+
file_path = os.path.realpath(file_path)
|
|
610
|
+
check_path_before_create(file_path)
|
|
611
|
+
try:
|
|
612
|
+
workbook.save(file_path)
|
|
613
|
+
except Exception as e:
|
|
614
|
+
logger.error(f'Save result file "{os.path.basename(file_path)}" failed')
|
|
615
|
+
raise CompareException(CompareException.WRITE_FILE_ERROR) from e
|
|
616
|
+
change_mode(file_path, FileCheckConst.DATA_FILE_AUTHORITY)
|
msprobe/core/common_config.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from msprobe.core.common.const import Const
|
|
2
2
|
from msprobe.core.common.log import logger
|
|
3
|
-
from msprobe.core.common.exceptions import
|
|
3
|
+
from msprobe.core.common.exceptions import MsprobeException
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
class CommonConfig:
|
|
@@ -18,24 +18,27 @@ class CommonConfig:
|
|
|
18
18
|
|
|
19
19
|
def _check_config(self):
|
|
20
20
|
if self.task and self.task not in Const.TASK_LIST:
|
|
21
|
-
logger.error_log_with_exp(
|
|
22
|
-
|
|
21
|
+
logger.error_log_with_exp("task is invalid, it should be one of {}".format(Const.TASK_LIST),
|
|
22
|
+
MsprobeException(MsprobeException.INVALID_PARAM_ERROR))
|
|
23
23
|
if self.rank is not None and not isinstance(self.rank, list):
|
|
24
|
-
logger.error_log_with_exp("rank is invalid, it should be a list",
|
|
24
|
+
logger.error_log_with_exp("rank is invalid, it should be a list",
|
|
25
|
+
MsprobeException(MsprobeException.INVALID_PARAM_ERROR))
|
|
25
26
|
if self.step is not None and not isinstance(self.step, list):
|
|
26
|
-
logger.error_log_with_exp("step is invalid, it should be a list",
|
|
27
|
+
logger.error_log_with_exp("step is invalid, it should be a list",
|
|
28
|
+
MsprobeException(MsprobeException.INVALID_PARAM_ERROR))
|
|
27
29
|
if self.level and self.level not in Const.LEVEL_LIST:
|
|
28
|
-
logger.error_log_with_exp(
|
|
29
|
-
|
|
30
|
+
logger.error_log_with_exp("level is invalid, it should be one of {}".format(Const.LEVEL_LIST),
|
|
31
|
+
MsprobeException(MsprobeException.INVALID_PARAM_ERROR))
|
|
30
32
|
if self.seed is not None and not isinstance(self.seed, int):
|
|
31
|
-
logger.error_log_with_exp("seed is invalid, it should be an integer",
|
|
33
|
+
logger.error_log_with_exp("seed is invalid, it should be an integer",
|
|
34
|
+
MsprobeException(MsprobeException.INVALID_PARAM_ERROR))
|
|
32
35
|
if not isinstance(self.is_deterministic, bool):
|
|
33
|
-
logger.error_log_with_exp(
|
|
34
|
-
|
|
36
|
+
logger.error_log_with_exp("is_deterministic is invalid, it should be a boolean",
|
|
37
|
+
MsprobeException(MsprobeException.INVALID_PARAM_ERROR))
|
|
35
38
|
if not isinstance(self.enable_dataloader, bool):
|
|
36
|
-
logger.error_log_with_exp(
|
|
37
|
-
|
|
38
|
-
|
|
39
|
+
logger.error_log_with_exp("enable_dataloader is invalid, it should be a boolean",
|
|
40
|
+
MsprobeException(MsprobeException.INVALID_PARAM_ERROR))
|
|
41
|
+
|
|
39
42
|
|
|
40
43
|
class BaseConfig:
|
|
41
44
|
def __init__(self, json_config):
|
|
@@ -44,15 +47,25 @@ class BaseConfig:
|
|
|
44
47
|
self.data_mode = json_config.get('data_mode')
|
|
45
48
|
self.backward_input = json_config.get("backward_input")
|
|
46
49
|
self.file_format = json_config.get("file_format")
|
|
47
|
-
self.summary_mode =
|
|
48
|
-
self.
|
|
50
|
+
self.summary_mode = json_config.get("summary_mode")
|
|
51
|
+
self.overflow_nums = json_config.get("overflow_nums")
|
|
49
52
|
self.check_mode = json_config.get("check_mode")
|
|
53
|
+
self.fuzz_device = json_config.get("fuzz_device")
|
|
54
|
+
self.pert_mode = json_config.get("pert_mode")
|
|
55
|
+
self.handler_type = json_config.get("handler_type")
|
|
56
|
+
self.fuzz_level = json_config.get("fuzz_level")
|
|
57
|
+
self.fuzz_stage = json_config.get("fuzz_stage")
|
|
58
|
+
self.if_preheat = json_config.get("if_preheat")
|
|
59
|
+
self.preheat_step = json_config.get("preheat_step")
|
|
60
|
+
self.max_sample = json_config.get("max_sample")
|
|
50
61
|
|
|
51
62
|
def check_config(self):
|
|
52
63
|
if self.scope is not None and not isinstance(self.scope, list):
|
|
53
|
-
logger.error_log_with_exp("scope is invalid, it should be a list",
|
|
64
|
+
logger.error_log_with_exp("scope is invalid, it should be a list",
|
|
65
|
+
MsprobeException(MsprobeException.INVALID_PARAM_ERROR))
|
|
54
66
|
if self.list is not None and not isinstance(self.list, list):
|
|
55
|
-
logger.error_log_with_exp("list is invalid, it should be a list",
|
|
67
|
+
logger.error_log_with_exp("list is invalid, it should be a list",
|
|
68
|
+
MsprobeException(MsprobeException.INVALID_PARAM_ERROR))
|
|
56
69
|
if self.data_mode is not None and not isinstance(self.data_mode, list):
|
|
57
|
-
logger.error_log_with_exp("data_mode is invalid, it should be a list",
|
|
58
|
-
|
|
70
|
+
logger.error_log_with_exp("data_mode is invalid, it should be a list",
|
|
71
|
+
MsprobeException(MsprobeException.INVALID_PARAM_ERROR))
|