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.
Files changed (249) hide show
  1. {mindstudio_probe-1.0.1.dist-info → mindstudio_probe-1.0.3.dist-info}/METADATA +5 -1
  2. mindstudio_probe-1.0.3.dist-info/RECORD +272 -0
  3. msprobe/README.md +78 -23
  4. msprobe/__init__.py +1 -0
  5. msprobe/config/README.md +182 -40
  6. msprobe/config/config.json +22 -0
  7. msprobe/core/__init__.py +0 -0
  8. msprobe/{pytorch → core}/advisor/advisor.py +3 -3
  9. msprobe/{pytorch → core}/advisor/advisor_result.py +2 -2
  10. msprobe/core/common/const.py +82 -5
  11. msprobe/core/common/exceptions.py +30 -18
  12. msprobe/core/common/file_check.py +19 -1
  13. msprobe/core/common/log.py +15 -1
  14. msprobe/core/common/utils.py +130 -30
  15. msprobe/core/common_config.py +32 -19
  16. msprobe/core/compare/acc_compare.py +299 -0
  17. msprobe/core/compare/check.py +95 -0
  18. msprobe/core/compare/compare_cli.py +49 -0
  19. msprobe/core/compare/highlight.py +222 -0
  20. msprobe/core/compare/multiprocessing_compute.py +149 -0
  21. msprobe/{pytorch → core}/compare/npy_compare.py +55 -4
  22. msprobe/core/compare/utils.py +429 -0
  23. msprobe/core/data_dump/data_collector.py +39 -35
  24. msprobe/core/data_dump/data_processor/base.py +85 -37
  25. msprobe/core/data_dump/data_processor/factory.py +5 -7
  26. msprobe/core/data_dump/data_processor/mindspore_processor.py +198 -0
  27. msprobe/core/data_dump/data_processor/pytorch_processor.py +94 -51
  28. msprobe/core/data_dump/json_writer.py +11 -11
  29. msprobe/core/grad_probe/__init__.py +0 -0
  30. msprobe/core/grad_probe/constant.py +71 -0
  31. msprobe/core/grad_probe/grad_compare.py +175 -0
  32. msprobe/core/grad_probe/utils.py +52 -0
  33. msprobe/doc/grad_probe/grad_probe.md +207 -0
  34. msprobe/doc/grad_probe/img/image-1.png +0 -0
  35. msprobe/doc/grad_probe/img/image-2.png +0 -0
  36. msprobe/doc/grad_probe/img/image-3.png +0 -0
  37. msprobe/doc/grad_probe/img/image-4.png +0 -0
  38. msprobe/doc/grad_probe/img/image.png +0 -0
  39. msprobe/mindspore/api_accuracy_checker/__init__.py +0 -0
  40. msprobe/mindspore/api_accuracy_checker/api_accuracy_checker.py +246 -0
  41. msprobe/mindspore/api_accuracy_checker/api_info.py +69 -0
  42. msprobe/mindspore/api_accuracy_checker/api_runner.py +152 -0
  43. msprobe/mindspore/api_accuracy_checker/base_compare_algorithm.py +197 -0
  44. msprobe/mindspore/api_accuracy_checker/compute_element.py +224 -0
  45. msprobe/mindspore/api_accuracy_checker/main.py +16 -0
  46. msprobe/mindspore/api_accuracy_checker/type_mapping.py +114 -0
  47. msprobe/mindspore/api_accuracy_checker/utils.py +63 -0
  48. msprobe/mindspore/cell_processor.py +34 -0
  49. msprobe/mindspore/common/const.py +87 -0
  50. msprobe/mindspore/common/log.py +38 -0
  51. msprobe/mindspore/common/utils.py +57 -0
  52. msprobe/mindspore/compare/distributed_compare.py +75 -0
  53. msprobe/mindspore/compare/ms_compare.py +117 -0
  54. msprobe/mindspore/compare/ms_graph_compare.py +317 -0
  55. msprobe/mindspore/compare/ms_to_pt_api.yaml +399 -0
  56. msprobe/mindspore/debugger/debugger_config.py +38 -15
  57. msprobe/mindspore/debugger/precision_debugger.py +79 -4
  58. msprobe/mindspore/doc/compare.md +58 -0
  59. msprobe/mindspore/doc/dump.md +158 -6
  60. msprobe/mindspore/dump/dump_tool_factory.py +19 -22
  61. msprobe/mindspore/dump/hook_cell/api_registry.py +104 -0
  62. msprobe/mindspore/dump/hook_cell/hook_cell.py +53 -0
  63. msprobe/mindspore/dump/hook_cell/support_wrap_ops.yaml +925 -0
  64. msprobe/mindspore/dump/hook_cell/wrap_functional.py +91 -0
  65. msprobe/mindspore/dump/hook_cell/wrap_tensor.py +63 -0
  66. msprobe/mindspore/dump/jit_dump.py +56 -0
  67. msprobe/mindspore/dump/kernel_kbyk_dump.py +65 -0
  68. msprobe/mindspore/free_benchmark/__init__.py +0 -0
  69. msprobe/mindspore/free_benchmark/api_pynative_self_check.py +116 -0
  70. msprobe/mindspore/free_benchmark/common/__init__.py +0 -0
  71. msprobe/mindspore/free_benchmark/common/config.py +12 -0
  72. msprobe/mindspore/free_benchmark/common/handler_params.py +17 -0
  73. msprobe/mindspore/free_benchmark/common/utils.py +71 -0
  74. msprobe/mindspore/free_benchmark/data/support_wrap_ops.yaml +842 -0
  75. msprobe/mindspore/free_benchmark/decorator/__init__.py +0 -0
  76. msprobe/mindspore/free_benchmark/decorator/dec_forward.py +42 -0
  77. msprobe/mindspore/free_benchmark/decorator/decorator_factory.py +107 -0
  78. msprobe/mindspore/free_benchmark/handler/__init__.py +0 -0
  79. msprobe/mindspore/free_benchmark/handler/base_handler.py +90 -0
  80. msprobe/mindspore/free_benchmark/handler/check_handler.py +41 -0
  81. msprobe/mindspore/free_benchmark/handler/fix_handler.py +36 -0
  82. msprobe/mindspore/free_benchmark/handler/handler_factory.py +21 -0
  83. msprobe/mindspore/free_benchmark/perturbation/add_noise.py +67 -0
  84. msprobe/mindspore/free_benchmark/perturbation/base_perturbation.py +21 -0
  85. msprobe/mindspore/free_benchmark/perturbation/bit_noise.py +63 -0
  86. msprobe/mindspore/free_benchmark/perturbation/improve_precision.py +34 -0
  87. msprobe/mindspore/free_benchmark/perturbation/no_change.py +12 -0
  88. msprobe/mindspore/free_benchmark/perturbation/perturbation_factory.py +27 -0
  89. msprobe/mindspore/free_benchmark/self_check_tool_factory.py +33 -0
  90. msprobe/mindspore/grad_probe/__init__.py +0 -0
  91. msprobe/mindspore/grad_probe/global_context.py +91 -0
  92. msprobe/mindspore/grad_probe/grad_analyzer.py +231 -0
  93. msprobe/mindspore/grad_probe/grad_monitor.py +27 -0
  94. msprobe/mindspore/grad_probe/grad_stat_csv.py +132 -0
  95. msprobe/mindspore/grad_probe/hook.py +92 -0
  96. msprobe/mindspore/grad_probe/utils.py +29 -0
  97. msprobe/mindspore/ms_config.py +63 -15
  98. msprobe/mindspore/overflow_check/overflow_check_tool_factory.py +17 -15
  99. msprobe/mindspore/runtime.py +4 -0
  100. msprobe/mindspore/service.py +354 -0
  101. msprobe/mindspore/task_handler_factory.py +7 -4
  102. msprobe/msprobe.py +66 -26
  103. msprobe/pytorch/__init__.py +1 -1
  104. msprobe/pytorch/api_accuracy_checker/common/config.py +21 -16
  105. msprobe/pytorch/api_accuracy_checker/common/utils.py +1 -60
  106. msprobe/pytorch/api_accuracy_checker/compare/algorithm.py +2 -5
  107. msprobe/pytorch/api_accuracy_checker/compare/api_precision_compare.py +46 -10
  108. msprobe/pytorch/api_accuracy_checker/compare/compare.py +84 -48
  109. msprobe/pytorch/api_accuracy_checker/compare/compare_utils.py +8 -12
  110. msprobe/pytorch/api_accuracy_checker/config.yaml +7 -1
  111. msprobe/pytorch/api_accuracy_checker/run_ut/data_generate.py +15 -11
  112. msprobe/pytorch/api_accuracy_checker/run_ut/multi_run_ut.py +11 -15
  113. msprobe/pytorch/api_accuracy_checker/run_ut/run_overflow_check.py +16 -9
  114. msprobe/pytorch/api_accuracy_checker/run_ut/run_ut.py +193 -105
  115. msprobe/pytorch/api_accuracy_checker/run_ut/run_ut_utils.py +68 -1
  116. msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/__init__.py +0 -0
  117. msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/attl.py +202 -0
  118. msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/client.py +324 -0
  119. msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/device_dispatch.py +204 -0
  120. msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/server.py +218 -0
  121. msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/ssl_config.py +10 -0
  122. msprobe/pytorch/bench_functions/__init__.py +15 -0
  123. msprobe/pytorch/bench_functions/apply_adam_w.py +28 -0
  124. msprobe/pytorch/bench_functions/confusion_transpose.py +19 -0
  125. msprobe/pytorch/bench_functions/fast_gelu.py +55 -0
  126. msprobe/pytorch/bench_functions/layer_norm_eval.py +6 -0
  127. msprobe/pytorch/bench_functions/linear.py +12 -0
  128. msprobe/pytorch/bench_functions/matmul_backward.py +48 -0
  129. msprobe/pytorch/bench_functions/npu_fusion_attention.py +421 -0
  130. msprobe/pytorch/bench_functions/rms_norm.py +15 -0
  131. msprobe/pytorch/bench_functions/rotary_mul.py +52 -0
  132. msprobe/pytorch/bench_functions/scaled_mask_softmax.py +26 -0
  133. msprobe/pytorch/bench_functions/swiglu.py +55 -0
  134. msprobe/pytorch/common/parse_json.py +3 -1
  135. msprobe/pytorch/common/utils.py +83 -7
  136. msprobe/pytorch/compare/distributed_compare.py +19 -64
  137. msprobe/pytorch/compare/match.py +3 -6
  138. msprobe/pytorch/compare/pt_compare.py +40 -0
  139. msprobe/pytorch/debugger/debugger_config.py +11 -2
  140. msprobe/pytorch/debugger/precision_debugger.py +34 -4
  141. msprobe/pytorch/doc/api_accuracy_checker.md +57 -13
  142. msprobe/pytorch/doc/api_accuracy_checker_online.md +187 -0
  143. msprobe/pytorch/doc/dump.md +73 -20
  144. msprobe/pytorch/doc/ptdbg_ascend_compare.md +75 -11
  145. msprobe/pytorch/doc/ptdbg_ascend_quickstart.md +3 -3
  146. msprobe/pytorch/doc/run_overflow_check.md +1 -1
  147. 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
  148. msprobe/pytorch/free_benchmark/common/constant.py +3 -0
  149. msprobe/pytorch/free_benchmark/common/utils.py +4 -0
  150. msprobe/pytorch/free_benchmark/compare/grad_saver.py +22 -26
  151. msprobe/pytorch/free_benchmark/main.py +7 -4
  152. msprobe/pytorch/free_benchmark/perturbed_layers/npu/add_noise.py +1 -1
  153. msprobe/pytorch/free_benchmark/perturbed_layers/npu/bit_noise.py +1 -1
  154. msprobe/pytorch/free_benchmark/perturbed_layers/npu/change_value.py +1 -1
  155. msprobe/pytorch/free_benchmark/perturbed_layers/npu/improve_precision.py +3 -3
  156. msprobe/pytorch/free_benchmark/perturbed_layers/npu/no_change.py +1 -1
  157. msprobe/pytorch/free_benchmark/perturbed_layers/run_cpu.py +1 -1
  158. msprobe/pytorch/free_benchmark/result_handlers/base_handler.py +43 -29
  159. msprobe/pytorch/free_benchmark/result_handlers/handler_factory.py +0 -1
  160. msprobe/pytorch/function_factory.py +75 -0
  161. msprobe/pytorch/functional/dump_module.py +4 -4
  162. msprobe/pytorch/grad_probe/__init__.py +0 -0
  163. msprobe/pytorch/grad_probe/grad_monitor.py +90 -0
  164. msprobe/pytorch/grad_probe/grad_stat_csv.py +129 -0
  165. msprobe/pytorch/hook_module/hook_module.py +14 -3
  166. msprobe/pytorch/hook_module/support_wrap_ops.yaml +2 -1
  167. msprobe/pytorch/hook_module/utils.py +9 -9
  168. msprobe/pytorch/hook_module/wrap_aten.py +20 -10
  169. msprobe/pytorch/hook_module/wrap_distributed.py +10 -7
  170. msprobe/pytorch/hook_module/wrap_functional.py +4 -7
  171. msprobe/pytorch/hook_module/wrap_npu_custom.py +21 -10
  172. msprobe/pytorch/hook_module/wrap_tensor.py +5 -6
  173. msprobe/pytorch/hook_module/wrap_torch.py +5 -7
  174. msprobe/pytorch/hook_module/wrap_vf.py +6 -8
  175. msprobe/pytorch/module_processer.py +53 -13
  176. msprobe/pytorch/online_dispatch/compare.py +4 -4
  177. msprobe/pytorch/online_dispatch/dispatch.py +39 -41
  178. msprobe/pytorch/online_dispatch/dump_compare.py +17 -47
  179. msprobe/pytorch/online_dispatch/single_compare.py +5 -5
  180. msprobe/pytorch/online_dispatch/utils.py +2 -43
  181. msprobe/pytorch/parse_tool/lib/compare.py +31 -19
  182. msprobe/pytorch/parse_tool/lib/config.py +2 -1
  183. msprobe/pytorch/parse_tool/lib/parse_tool.py +4 -4
  184. msprobe/pytorch/parse_tool/lib/utils.py +34 -80
  185. msprobe/pytorch/parse_tool/lib/visualization.py +4 -3
  186. msprobe/pytorch/pt_config.py +100 -6
  187. msprobe/pytorch/service.py +104 -19
  188. mindstudio_probe-1.0.1.dist-info/RECORD +0 -228
  189. msprobe/mindspore/dump/api_kbk_dump.py +0 -55
  190. msprobe/pytorch/compare/acc_compare.py +0 -1024
  191. msprobe/pytorch/compare/highlight.py +0 -100
  192. msprobe/test/core_ut/common/test_utils.py +0 -345
  193. msprobe/test/core_ut/data_dump/test_data_collector.py +0 -47
  194. msprobe/test/core_ut/data_dump/test_json_writer.py +0 -183
  195. msprobe/test/core_ut/data_dump/test_scope.py +0 -151
  196. msprobe/test/core_ut/test_common_config.py +0 -152
  197. msprobe/test/core_ut/test_file_check.py +0 -218
  198. msprobe/test/core_ut/test_log.py +0 -109
  199. msprobe/test/mindspore_ut/test_api_kbk_dump.py +0 -51
  200. msprobe/test/mindspore_ut/test_debugger_config.py +0 -42
  201. msprobe/test/mindspore_ut/test_dump_tool_factory.py +0 -51
  202. msprobe/test/mindspore_ut/test_kernel_graph_dump.py +0 -66
  203. msprobe/test/mindspore_ut/test_kernel_graph_overflow_check.py +0 -63
  204. msprobe/test/mindspore_ut/test_ms_config.py +0 -69
  205. msprobe/test/mindspore_ut/test_overflow_check_tool_factory.py +0 -51
  206. msprobe/test/mindspore_ut/test_precision_debugger.py +0 -56
  207. msprobe/test/mindspore_ut/test_task_handler_factory.py +0 -58
  208. msprobe/test/pytorch_ut/advisor/test_advisor.py +0 -83
  209. msprobe/test/pytorch_ut/api_accuracy_checker/common/test_common_utils.py +0 -108
  210. msprobe/test/pytorch_ut/api_accuracy_checker/common/test_config.py +0 -39
  211. msprobe/test/pytorch_ut/api_accuracy_checker/compare/test_algorithm.py +0 -112
  212. msprobe/test/pytorch_ut/api_accuracy_checker/compare/test_api_precision_compare.py +0 -77
  213. msprobe/test/pytorch_ut/api_accuracy_checker/compare/test_compare.py +0 -125
  214. msprobe/test/pytorch_ut/api_accuracy_checker/compare/test_compare_column.py +0 -10
  215. msprobe/test/pytorch_ut/api_accuracy_checker/compare/test_compare_utils.py +0 -43
  216. msprobe/test/pytorch_ut/api_accuracy_checker/run_ut/dump.json +0 -179
  217. msprobe/test/pytorch_ut/api_accuracy_checker/run_ut/forward.json +0 -63
  218. msprobe/test/pytorch_ut/api_accuracy_checker/run_ut/test_data_generate.py +0 -99
  219. msprobe/test/pytorch_ut/api_accuracy_checker/run_ut/test_multi_run_ut.py +0 -115
  220. msprobe/test/pytorch_ut/api_accuracy_checker/run_ut/test_run_ut.py +0 -72
  221. msprobe/test/pytorch_ut/compare/test_acc_compare.py +0 -17
  222. msprobe/test/pytorch_ut/free_benchmark/perturbed_layers/test_perturbed_layser.py +0 -105
  223. msprobe/test/pytorch_ut/free_benchmark/result_handlers/test_result_handler.py +0 -121
  224. msprobe/test/pytorch_ut/free_benchmark/test_main.py +0 -101
  225. msprobe/test/pytorch_ut/functional/test_dump_module.py +0 -15
  226. msprobe/test/pytorch_ut/hook_module/test_api_registry.py +0 -130
  227. msprobe/test/pytorch_ut/hook_module/test_hook_module.py +0 -42
  228. msprobe/test/pytorch_ut/hook_module/test_wrap_aten.py +0 -65
  229. msprobe/test/pytorch_ut/hook_module/test_wrap_distributed.py +0 -35
  230. msprobe/test/pytorch_ut/hook_module/test_wrap_functional.py +0 -20
  231. msprobe/test/pytorch_ut/hook_module/test_wrap_tensor.py +0 -35
  232. msprobe/test/pytorch_ut/hook_module/test_wrap_torch.py +0 -43
  233. msprobe/test/pytorch_ut/hook_module/test_wrap_vf.py +0 -11
  234. msprobe/test/pytorch_ut/test_pt_config.py +0 -69
  235. msprobe/test/pytorch_ut/test_service.py +0 -59
  236. msprobe/test/resources/advisor.txt +0 -3
  237. msprobe/test/resources/compare_result_20230703104808.csv +0 -9
  238. msprobe/test/resources/compare_result_without_accuracy.csv +0 -9
  239. msprobe/test/resources/config.yaml +0 -3
  240. msprobe/test/resources/npu_test.pkl +0 -8
  241. msprobe/test/run_test.sh +0 -30
  242. msprobe/test/run_ut.py +0 -58
  243. msprobe/test/test_module_processer.py +0 -64
  244. {mindstudio_probe-1.0.1.dist-info → mindstudio_probe-1.0.3.dist-info}/LICENSE +0 -0
  245. {mindstudio_probe-1.0.1.dist-info → mindstudio_probe-1.0.3.dist-info}/WHEEL +0 -0
  246. {mindstudio_probe-1.0.1.dist-info → mindstudio_probe-1.0.3.dist-info}/entry_points.txt +0 -0
  247. {mindstudio_probe-1.0.1.dist-info → mindstudio_probe-1.0.3.dist-info}/top_level.txt +0 -0
  248. /msprobe/{pytorch → core}/advisor/advisor_const.py +0 -0
  249. /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 MsaccException(CodedException):
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: "[msacc] 无效参数: ",
17
- OVERFLOW_NUMS_ERROR: "[msacc] 超过预设溢出次数 当前溢出次数:"
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: "[msacc] 检测到软链接: ",
31
- FILE_PERMISSION_ERROR: "[msacc] 文件权限错误: ",
32
- INVALID_FILE_ERROR: "[msacc] 无效文件: ",
33
- ILLEGAL_PATH_ERROR: "[msacc] 非法文件路径: ",
34
- ILLEGAL_PARAM_ERROR: "[msacc] 非法打开方式: ",
35
- FILE_TOO_LARGE_ERROR: "[msacc] 文件过大: "
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: "[msacc] Unexpected name in json: ",
44
- InvalidDumpJson: "[msacc] json格式不正确: ",
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: "[msacc] Invalid api_list: ",
54
- InvalidScope: "[msacc] Invalid scope: ",
55
- ArgConflict: "[msacc] Scope and api_list conflict: ",
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: "[msacc] Invalid repair_type: "
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: "[msacc] 错误的step后处理配置: ",
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: "[msacc] Free benchmark get unsupported type: ",
78
- InvalidGrad: "[msacc] Free benchmark gradient invalid: ",
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)
@@ -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()
@@ -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, OverflowConst
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(input_parma, output_path, stack_mode=False, summary_compare=False, md5_compare=False):
152
- if not (isinstance(input_parma, dict) and isinstance(output_path, str)):
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
- check_file_or_directory_path(input_parma.get("npu_json_path"), False)
156
- check_file_or_directory_path(input_parma.get("bench_json_path"), False)
157
- check_file_or_directory_path(input_parma.get("stack_json_path"), False)
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(input_parma.get("npu_dump_data_dir"), True)
160
- check_file_or_directory_path(input_parma.get("bench_dump_data_dir"), True)
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
- with FileOpen(input_parma.get("npu_json_path"), "r") as npu_json, \
163
- FileOpen(input_parma.get("bench_json_path"), "r") as bench_json, \
164
- FileOpen(input_parma.get("stack_json_path"), "r") as stack_json:
165
- check_json_file(input_parma, npu_json, bench_json, stack_json)
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
- npu_json_path = input_param.get("npu_json_path", None)
476
- bench_json_path = input_param.get("bench_json_path", None)
477
- if not npu_json_path or not bench_json_path:
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(npu_json_path, 'r') as npu_f:
487
+ with FileOpen(npu_path, 'r') as npu_f:
481
488
  npu_json_data = json.load(npu_f)
482
- with FileOpen(bench_json_path, 'r') as bench_f:
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'] = npu_json_data['dump_data_dir']
500
- input_param['bench_dump_data_dir'] = bench_json_data['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)
@@ -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 MsaccException
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
- "task is invalid, it should be one of {}".format(Const.TASK_LIST), MsaccException(MsaccException.INVALID_PARAM_ERROR))
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", MsaccException(MsaccException.INVALID_PARAM_ERROR))
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", MsaccException(MsaccException.INVALID_PARAM_ERROR))
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
- "level is invalid, it should be one of {}".format(Const.LEVEL_LIST), MsaccException(MsaccException.INVALID_PARAM_ERROR))
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", MsaccException(MsaccException.INVALID_PARAM_ERROR))
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
- "is_deterministic is invalid, it should be a boolean", MsaccException(MsaccException.INVALID_PARAM_ERROR))
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
- "enable_dataloader is invalid, it should be a boolean", MsaccException(MsaccException.INVALID_PARAM_ERROR))
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 = json_config.get("summary_mode")
48
- self.overflow_num = json_config.get("overflow_num")
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", MsaccException(MsaccException.INVALID_PARAM_ERROR))
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", MsaccException(MsaccException.INVALID_PARAM_ERROR))
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", MsaccException(MsaccException.INVALID_PARAM_ERROR))
58
-
70
+ logger.error_log_with_exp("data_mode is invalid, it should be a list",
71
+ MsprobeException(MsprobeException.INVALID_PARAM_ERROR))