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.
Files changed (323) hide show
  1. {mindstudio_probe-1.0.1.dist-info → mindstudio_probe-1.0.4.dist-info}/LICENSE +201 -201
  2. {mindstudio_probe-1.0.1.dist-info → mindstudio_probe-1.0.4.dist-info}/METADATA +36 -30
  3. mindstudio_probe-1.0.4.dist-info/RECORD +276 -0
  4. {mindstudio_probe-1.0.1.dist-info → mindstudio_probe-1.0.4.dist-info}/WHEEL +1 -1
  5. {mindstudio_probe-1.0.1.dist-info → mindstudio_probe-1.0.4.dist-info}/entry_points.txt +1 -0
  6. msprobe/README.md +101 -182
  7. msprobe/__init__.py +1 -0
  8. msprobe/{config/config.json → config.json} +49 -27
  9. msprobe/core/__init__.py +0 -0
  10. msprobe/{pytorch → core}/advisor/advisor.py +124 -124
  11. msprobe/{pytorch → core}/advisor/advisor_const.py +59 -59
  12. msprobe/{pytorch → core}/advisor/advisor_result.py +58 -58
  13. msprobe/core/common/const.py +341 -241
  14. msprobe/core/common/exceptions.py +100 -88
  15. msprobe/core/common/{file_check.py → file_utils.py} +478 -265
  16. msprobe/core/common/log.py +76 -55
  17. msprobe/core/common/utils.py +385 -516
  18. msprobe/core/common_config.py +85 -58
  19. msprobe/core/compare/acc_compare.py +300 -0
  20. msprobe/core/compare/check.py +95 -0
  21. msprobe/core/compare/compare_cli.py +49 -0
  22. msprobe/core/compare/highlight.py +223 -0
  23. msprobe/core/compare/multiprocessing_compute.py +149 -0
  24. msprobe/{pytorch → core}/compare/npy_compare.py +295 -244
  25. msprobe/core/compare/utils.py +430 -0
  26. msprobe/core/data_dump/data_collector.py +154 -140
  27. msprobe/core/data_dump/data_processor/base.py +314 -245
  28. msprobe/core/data_dump/data_processor/factory.py +59 -61
  29. msprobe/core/data_dump/data_processor/mindspore_processor.py +186 -0
  30. msprobe/core/data_dump/data_processor/pytorch_processor.py +366 -346
  31. msprobe/core/data_dump/json_writer.py +96 -116
  32. msprobe/core/data_dump/scope.py +178 -178
  33. msprobe/core/grad_probe/__init__.py +0 -0
  34. msprobe/core/grad_probe/constant.py +71 -0
  35. msprobe/core/grad_probe/grad_compare.py +171 -0
  36. msprobe/core/grad_probe/utils.py +64 -0
  37. msprobe/docs/01.installation.md +89 -0
  38. msprobe/docs/02.config_introduction.md +165 -0
  39. msprobe/docs/03.config_examples.md +247 -0
  40. msprobe/docs/04.acl_config_examples.md +76 -0
  41. msprobe/docs/05.data_dump_PyTorch.md +198 -0
  42. msprobe/docs/06.data_dump_MindSpore.md +243 -0
  43. msprobe/docs/07.accuracy_checker_PyTorch.md +274 -0
  44. msprobe/docs/08.accuracy_checker_online_PyTorch.md +198 -0
  45. msprobe/docs/09.accuracy_checker_MindSpore.md +68 -0
  46. msprobe/docs/10.accuracy_compare_PyTorch.md +245 -0
  47. msprobe/docs/11.accuracy_compare_MindSpore.md +202 -0
  48. msprobe/docs/12.overflow_check_PyTorch.md +79 -0
  49. msprobe/docs/13.overflow_check_MindSpore.md +31 -0
  50. msprobe/{pytorch/doc/parse_tool.md → docs/14.data_parse_PyTorch.md} +283 -286
  51. msprobe/docs/15.free_benchmarking_PyTorch.md +164 -0
  52. msprobe/docs/17.grad_probe.md +207 -0
  53. msprobe/docs/FAQ_PyTorch.md +177 -0
  54. msprobe/docs/S02.report_free_benchmarking_validation_performance_baseline.md +146 -0
  55. msprobe/docs/img/free_benchmark_framework.png +0 -0
  56. msprobe/docs/img/grad_probe_image-1.png +0 -0
  57. msprobe/docs/img/grad_probe_image-2.png +0 -0
  58. msprobe/docs/img/grad_probe_image-3.png +0 -0
  59. msprobe/docs/img/grad_probe_image-4.png +0 -0
  60. msprobe/docs/img/grad_probe_image.png +0 -0
  61. msprobe/mindspore/__init__.py +1 -1
  62. msprobe/mindspore/api_accuracy_checker/__init__.py +0 -0
  63. msprobe/mindspore/api_accuracy_checker/api_accuracy_checker.py +255 -0
  64. msprobe/mindspore/api_accuracy_checker/api_info.py +69 -0
  65. msprobe/mindspore/api_accuracy_checker/api_runner.py +156 -0
  66. msprobe/mindspore/api_accuracy_checker/base_compare_algorithm.py +197 -0
  67. msprobe/mindspore/api_accuracy_checker/cmd_parser.py +6 -0
  68. msprobe/mindspore/api_accuracy_checker/compute_element.py +239 -0
  69. msprobe/mindspore/api_accuracy_checker/main.py +9 -0
  70. msprobe/mindspore/api_accuracy_checker/type_mapping.py +114 -0
  71. msprobe/mindspore/api_accuracy_checker/utils.py +80 -0
  72. msprobe/mindspore/cell_processor.py +34 -0
  73. msprobe/mindspore/common/const.py +106 -0
  74. msprobe/mindspore/common/log.py +38 -0
  75. msprobe/mindspore/common/utils.py +81 -0
  76. msprobe/mindspore/compare/distributed_compare.py +75 -0
  77. msprobe/mindspore/compare/ms_compare.py +219 -0
  78. msprobe/mindspore/compare/ms_graph_compare.py +348 -0
  79. msprobe/mindspore/compare/ms_to_pt_api.yaml +399 -0
  80. msprobe/mindspore/debugger/debugger_config.py +66 -51
  81. msprobe/mindspore/debugger/precision_debugger.py +126 -32
  82. msprobe/mindspore/dump/dump_tool_factory.py +35 -38
  83. msprobe/mindspore/dump/hook_cell/api_registry.py +118 -0
  84. msprobe/mindspore/dump/hook_cell/hook_cell.py +55 -0
  85. msprobe/mindspore/dump/hook_cell/support_wrap_ops.yaml +922 -0
  86. msprobe/mindspore/dump/hook_cell/wrap_api.py +113 -0
  87. msprobe/mindspore/dump/jit_dump.py +72 -0
  88. msprobe/mindspore/dump/kernel_graph_dump.py +59 -60
  89. msprobe/mindspore/dump/kernel_kbyk_dump.py +64 -0
  90. msprobe/mindspore/free_benchmark/__init__.py +0 -0
  91. msprobe/mindspore/free_benchmark/api_pynative_self_check.py +116 -0
  92. msprobe/mindspore/free_benchmark/common/__init__.py +0 -0
  93. msprobe/mindspore/free_benchmark/common/config.py +12 -0
  94. msprobe/mindspore/free_benchmark/common/handler_params.py +17 -0
  95. msprobe/mindspore/free_benchmark/common/utils.py +71 -0
  96. msprobe/mindspore/free_benchmark/data/support_wrap_ops.yaml +842 -0
  97. msprobe/mindspore/free_benchmark/decorator/__init__.py +0 -0
  98. msprobe/mindspore/free_benchmark/decorator/dec_forward.py +43 -0
  99. msprobe/mindspore/free_benchmark/decorator/decorator_factory.py +107 -0
  100. msprobe/mindspore/free_benchmark/handler/__init__.py +0 -0
  101. msprobe/mindspore/free_benchmark/handler/base_handler.py +90 -0
  102. msprobe/mindspore/free_benchmark/handler/check_handler.py +41 -0
  103. msprobe/mindspore/free_benchmark/handler/fix_handler.py +36 -0
  104. msprobe/mindspore/free_benchmark/handler/handler_factory.py +21 -0
  105. msprobe/mindspore/free_benchmark/perturbation/add_noise.py +67 -0
  106. msprobe/mindspore/free_benchmark/perturbation/base_perturbation.py +21 -0
  107. msprobe/mindspore/free_benchmark/perturbation/bit_noise.py +63 -0
  108. msprobe/mindspore/free_benchmark/perturbation/exchange_value.py +51 -0
  109. msprobe/mindspore/free_benchmark/perturbation/improve_precision.py +35 -0
  110. msprobe/mindspore/free_benchmark/perturbation/no_change.py +12 -0
  111. msprobe/mindspore/free_benchmark/perturbation/perturbation_factory.py +29 -0
  112. msprobe/mindspore/free_benchmark/self_check_tool_factory.py +33 -0
  113. msprobe/mindspore/grad_probe/__init__.py +0 -0
  114. msprobe/mindspore/grad_probe/global_context.py +90 -0
  115. msprobe/mindspore/grad_probe/grad_analyzer.py +231 -0
  116. msprobe/mindspore/grad_probe/grad_monitor.py +27 -0
  117. msprobe/mindspore/grad_probe/grad_stat_csv.py +132 -0
  118. msprobe/mindspore/grad_probe/hook.py +94 -0
  119. msprobe/mindspore/grad_probe/utils.py +30 -0
  120. msprobe/mindspore/ms_config.py +128 -78
  121. msprobe/mindspore/overflow_check/kernel_graph_overflow_check.py +44 -45
  122. msprobe/mindspore/overflow_check/overflow_check_tool_factory.py +34 -32
  123. msprobe/mindspore/runtime.py +4 -0
  124. msprobe/mindspore/service.py +378 -0
  125. msprobe/mindspore/task_handler_factory.py +24 -21
  126. msprobe/msprobe.py +105 -67
  127. msprobe/pytorch/__init__.py +4 -4
  128. msprobe/pytorch/api_accuracy_checker/common/config.py +53 -50
  129. msprobe/pytorch/api_accuracy_checker/common/utils.py +214 -224
  130. msprobe/pytorch/api_accuracy_checker/compare/algorithm.py +213 -216
  131. msprobe/pytorch/api_accuracy_checker/compare/api_precision_compare.py +606 -545
  132. msprobe/pytorch/api_accuracy_checker/compare/api_precision_standard.yaml +132 -132
  133. msprobe/pytorch/api_accuracy_checker/compare/api_precision_threshold.yaml +390 -390
  134. msprobe/pytorch/api_accuracy_checker/compare/compare.py +386 -345
  135. msprobe/pytorch/api_accuracy_checker/compare/compare_column.py +73 -73
  136. msprobe/pytorch/api_accuracy_checker/compare/compare_utils.py +245 -248
  137. msprobe/pytorch/api_accuracy_checker/config.yaml +10 -4
  138. msprobe/pytorch/api_accuracy_checker/run_ut/data_generate.py +335 -328
  139. msprobe/pytorch/api_accuracy_checker/run_ut/multi_run_ut.py +200 -203
  140. msprobe/pytorch/api_accuracy_checker/run_ut/run_overflow_check.py +133 -127
  141. msprobe/pytorch/api_accuracy_checker/run_ut/run_ut.py +592 -493
  142. msprobe/pytorch/api_accuracy_checker/run_ut/run_ut_utils.py +70 -7
  143. msprobe/pytorch/api_accuracy_checker/run_ut/torch_ut_setting.json +7 -4
  144. msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/__init__.py +0 -0
  145. msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/attl.py +197 -0
  146. msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/client.py +325 -0
  147. msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/device_dispatch.py +204 -0
  148. msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/server.py +219 -0
  149. msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/ssl_config.py +10 -0
  150. msprobe/pytorch/bench_functions/__init__.py +15 -0
  151. msprobe/pytorch/bench_functions/apply_adam_w.py +28 -0
  152. msprobe/pytorch/bench_functions/confusion_transpose.py +19 -0
  153. msprobe/pytorch/bench_functions/fast_gelu.py +55 -0
  154. msprobe/pytorch/bench_functions/layer_norm_eval.py +6 -0
  155. msprobe/pytorch/bench_functions/linear.py +12 -0
  156. msprobe/pytorch/bench_functions/matmul_backward.py +48 -0
  157. msprobe/pytorch/bench_functions/npu_fusion_attention.py +509 -0
  158. msprobe/pytorch/bench_functions/rms_norm.py +15 -0
  159. msprobe/pytorch/bench_functions/rotary_mul.py +52 -0
  160. msprobe/pytorch/bench_functions/scaled_mask_softmax.py +26 -0
  161. msprobe/pytorch/bench_functions/swiglu.py +55 -0
  162. msprobe/pytorch/common/__init__.py +2 -2
  163. msprobe/pytorch/common/compare_script.template +14 -14
  164. msprobe/pytorch/common/log.py +20 -31
  165. msprobe/pytorch/common/parse_json.py +39 -37
  166. msprobe/pytorch/common/utils.py +305 -224
  167. msprobe/pytorch/compare/distributed_compare.py +66 -111
  168. msprobe/pytorch/compare/mapping.yaml +607 -607
  169. msprobe/pytorch/compare/match.py +34 -36
  170. msprobe/pytorch/compare/pt_compare.py +50 -0
  171. msprobe/pytorch/debugger/debugger_config.py +95 -86
  172. msprobe/pytorch/debugger/precision_debugger.py +125 -95
  173. msprobe/pytorch/free_benchmark/__init__.py +8 -8
  174. msprobe/pytorch/free_benchmark/common/constant.py +70 -67
  175. msprobe/pytorch/free_benchmark/common/counter.py +71 -71
  176. msprobe/pytorch/free_benchmark/common/enums.py +37 -37
  177. msprobe/pytorch/free_benchmark/common/params.py +129 -129
  178. msprobe/pytorch/free_benchmark/common/utils.py +102 -98
  179. msprobe/pytorch/free_benchmark/compare/grad_saver.py +179 -183
  180. msprobe/pytorch/free_benchmark/compare/single_benchmark.py +104 -104
  181. msprobe/pytorch/free_benchmark/main.py +105 -102
  182. msprobe/pytorch/free_benchmark/perturbed_layers/base_layer.py +13 -13
  183. msprobe/pytorch/free_benchmark/perturbed_layers/layer_factory.py +41 -41
  184. msprobe/pytorch/free_benchmark/perturbed_layers/npu/add_noise.py +90 -90
  185. msprobe/pytorch/free_benchmark/perturbed_layers/npu/bit_noise.py +104 -104
  186. msprobe/pytorch/free_benchmark/perturbed_layers/npu/change_value.py +63 -63
  187. msprobe/pytorch/free_benchmark/perturbed_layers/npu/improve_precision.py +68 -68
  188. msprobe/pytorch/free_benchmark/perturbed_layers/npu/no_change.py +28 -28
  189. msprobe/pytorch/free_benchmark/perturbed_layers/npu/npu_base_layser.py +45 -45
  190. msprobe/pytorch/free_benchmark/perturbed_layers/run_cpu.py +19 -19
  191. msprobe/pytorch/free_benchmark/result_handlers/base_handler.py +217 -203
  192. msprobe/pytorch/free_benchmark/result_handlers/check_handler.py +39 -39
  193. msprobe/pytorch/free_benchmark/result_handlers/fix_handler.py +23 -23
  194. msprobe/pytorch/free_benchmark/result_handlers/handler_factory.py +30 -31
  195. msprobe/pytorch/free_benchmark/result_handlers/preheat_handler.py +170 -170
  196. msprobe/pytorch/function_factory.py +76 -0
  197. msprobe/pytorch/functional/dump_module.py +39 -39
  198. msprobe/pytorch/grad_probe/__init__.py +0 -0
  199. msprobe/pytorch/grad_probe/grad_monitor.py +91 -0
  200. msprobe/pytorch/grad_probe/grad_stat_csv.py +129 -0
  201. msprobe/pytorch/hook_module/api_registry.py +161 -161
  202. msprobe/pytorch/hook_module/hook_module.py +120 -109
  203. msprobe/pytorch/hook_module/support_wrap_ops.yaml +1879 -1876
  204. msprobe/pytorch/hook_module/utils.py +30 -29
  205. msprobe/pytorch/hook_module/wrap_aten.py +110 -100
  206. msprobe/pytorch/hook_module/wrap_distributed.py +78 -75
  207. msprobe/pytorch/hook_module/wrap_functional.py +105 -108
  208. msprobe/pytorch/hook_module/wrap_npu_custom.py +93 -73
  209. msprobe/pytorch/hook_module/wrap_tensor.py +71 -72
  210. msprobe/pytorch/hook_module/wrap_torch.py +86 -88
  211. msprobe/pytorch/hook_module/wrap_vf.py +62 -64
  212. msprobe/pytorch/module_processer.py +138 -98
  213. msprobe/pytorch/online_dispatch/__init__.py +20 -20
  214. msprobe/pytorch/online_dispatch/compare.py +236 -236
  215. msprobe/pytorch/online_dispatch/dispatch.py +271 -273
  216. msprobe/pytorch/online_dispatch/dump_compare.py +155 -186
  217. msprobe/pytorch/online_dispatch/single_compare.py +391 -391
  218. msprobe/pytorch/online_dispatch/torch_ops_config.yaml +49 -49
  219. msprobe/pytorch/online_dispatch/utils.py +130 -187
  220. msprobe/pytorch/parse.py +4 -4
  221. msprobe/pytorch/parse_tool/cli.py +32 -32
  222. msprobe/pytorch/parse_tool/lib/compare.py +260 -259
  223. msprobe/pytorch/parse_tool/lib/config.py +52 -51
  224. msprobe/pytorch/parse_tool/lib/file_desc.py +31 -31
  225. msprobe/pytorch/parse_tool/lib/interactive_cli.py +102 -102
  226. msprobe/pytorch/parse_tool/lib/parse_exception.py +54 -54
  227. msprobe/pytorch/parse_tool/lib/parse_tool.py +158 -158
  228. msprobe/pytorch/parse_tool/lib/utils.py +316 -367
  229. msprobe/pytorch/parse_tool/lib/visualization.py +85 -90
  230. msprobe/pytorch/pt_config.py +188 -93
  231. msprobe/pytorch/service.py +246 -167
  232. mindstudio_probe-1.0.1.dist-info/RECORD +0 -228
  233. msprobe/config/README.md +0 -397
  234. msprobe/mindspore/doc/dump.md +0 -65
  235. msprobe/mindspore/dump/api_kbk_dump.py +0 -55
  236. msprobe/pytorch/compare/acc_compare.py +0 -1024
  237. msprobe/pytorch/compare/highlight.py +0 -100
  238. msprobe/pytorch/doc/FAQ.md +0 -193
  239. msprobe/pytorch/doc/api_accuracy_checker.md +0 -269
  240. 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
  241. msprobe/pytorch/doc/dump.md +0 -207
  242. msprobe/pytorch/doc/ptdbg_ascend_compare.md +0 -176
  243. msprobe/pytorch/doc/ptdbg_ascend_overview.md +0 -68
  244. msprobe/pytorch/doc/ptdbg_ascend_quickstart.md +0 -381
  245. msprobe/pytorch/doc/run_overflow_check.md +0 -25
  246. 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
  247. msprobe/test/core_ut/common/test_utils.py +0 -345
  248. msprobe/test/core_ut/data_dump/test_data_collector.py +0 -47
  249. msprobe/test/core_ut/data_dump/test_json_writer.py +0 -183
  250. msprobe/test/core_ut/data_dump/test_scope.py +0 -151
  251. msprobe/test/core_ut/test_common_config.py +0 -152
  252. msprobe/test/core_ut/test_file_check.py +0 -218
  253. msprobe/test/core_ut/test_log.py +0 -109
  254. msprobe/test/mindspore_ut/test_api_kbk_dump.py +0 -51
  255. msprobe/test/mindspore_ut/test_debugger_config.py +0 -42
  256. msprobe/test/mindspore_ut/test_dump_tool_factory.py +0 -51
  257. msprobe/test/mindspore_ut/test_kernel_graph_dump.py +0 -66
  258. msprobe/test/mindspore_ut/test_kernel_graph_overflow_check.py +0 -63
  259. msprobe/test/mindspore_ut/test_ms_config.py +0 -69
  260. msprobe/test/mindspore_ut/test_overflow_check_tool_factory.py +0 -51
  261. msprobe/test/mindspore_ut/test_precision_debugger.py +0 -56
  262. msprobe/test/mindspore_ut/test_task_handler_factory.py +0 -58
  263. msprobe/test/pytorch_ut/advisor/test_advisor.py +0 -83
  264. msprobe/test/pytorch_ut/api_accuracy_checker/common/test_common_utils.py +0 -108
  265. msprobe/test/pytorch_ut/api_accuracy_checker/common/test_config.py +0 -39
  266. msprobe/test/pytorch_ut/api_accuracy_checker/compare/test_algorithm.py +0 -112
  267. msprobe/test/pytorch_ut/api_accuracy_checker/compare/test_api_precision_compare.py +0 -77
  268. msprobe/test/pytorch_ut/api_accuracy_checker/compare/test_compare.py +0 -125
  269. msprobe/test/pytorch_ut/api_accuracy_checker/compare/test_compare_column.py +0 -10
  270. msprobe/test/pytorch_ut/api_accuracy_checker/compare/test_compare_utils.py +0 -43
  271. msprobe/test/pytorch_ut/api_accuracy_checker/run_ut/dump.json +0 -179
  272. msprobe/test/pytorch_ut/api_accuracy_checker/run_ut/forward.json +0 -63
  273. msprobe/test/pytorch_ut/api_accuracy_checker/run_ut/test_data_generate.py +0 -99
  274. msprobe/test/pytorch_ut/api_accuracy_checker/run_ut/test_multi_run_ut.py +0 -115
  275. msprobe/test/pytorch_ut/api_accuracy_checker/run_ut/test_run_ut.py +0 -72
  276. msprobe/test/pytorch_ut/compare/test_acc_compare.py +0 -17
  277. msprobe/test/pytorch_ut/free_benchmark/perturbed_layers/test_perturbed_layser.py +0 -105
  278. msprobe/test/pytorch_ut/free_benchmark/result_handlers/test_result_handler.py +0 -121
  279. msprobe/test/pytorch_ut/free_benchmark/test_main.py +0 -101
  280. msprobe/test/pytorch_ut/functional/test_dump_module.py +0 -15
  281. msprobe/test/pytorch_ut/hook_module/test_api_registry.py +0 -130
  282. msprobe/test/pytorch_ut/hook_module/test_hook_module.py +0 -42
  283. msprobe/test/pytorch_ut/hook_module/test_wrap_aten.py +0 -65
  284. msprobe/test/pytorch_ut/hook_module/test_wrap_distributed.py +0 -35
  285. msprobe/test/pytorch_ut/hook_module/test_wrap_functional.py +0 -20
  286. msprobe/test/pytorch_ut/hook_module/test_wrap_tensor.py +0 -35
  287. msprobe/test/pytorch_ut/hook_module/test_wrap_torch.py +0 -43
  288. msprobe/test/pytorch_ut/hook_module/test_wrap_vf.py +0 -11
  289. msprobe/test/pytorch_ut/test_pt_config.py +0 -69
  290. msprobe/test/pytorch_ut/test_service.py +0 -59
  291. msprobe/test/resources/advisor.txt +0 -3
  292. msprobe/test/resources/compare_result_20230703104808.csv +0 -9
  293. msprobe/test/resources/compare_result_without_accuracy.csv +0 -9
  294. msprobe/test/resources/config.yaml +0 -3
  295. msprobe/test/resources/npu_test.pkl +0 -8
  296. msprobe/test/run_test.sh +0 -30
  297. msprobe/test/run_ut.py +0 -58
  298. msprobe/test/test_module_processer.py +0 -64
  299. {mindstudio_probe-1.0.1.dist-info → mindstudio_probe-1.0.4.dist-info}/top_level.txt +0 -0
  300. /msprobe/{pytorch/doc → docs}/img/BLOOM-7B_1.png +0 -0
  301. /msprobe/{pytorch/doc → docs}/img/BLOOM-7B_2.png +0 -0
  302. /msprobe/{pytorch/doc → docs}/img/BLOOM-7B_3.png +0 -0
  303. /msprobe/{pytorch/doc → docs}/img/BLOOM-7B_4.png +0 -0
  304. /msprobe/{pytorch/doc → docs}/img/GPT-3_1.png +0 -0
  305. /msprobe/{pytorch/doc → docs}/img/GPT-3_2.png +0 -0
  306. /msprobe/{pytorch/doc → docs}/img/GPT-3_3.png +0 -0
  307. /msprobe/{pytorch/doc → docs}/img/GPT-3_4.png +0 -0
  308. /msprobe/{pytorch/doc → docs}/img/GPT-3_5.png +0 -0
  309. /msprobe/{pytorch/doc → docs}/img/GPT-3_6.png +0 -0
  310. /msprobe/{pytorch/doc → docs}/img/GPT-3_7.png +0 -0
  311. /msprobe/{pytorch/doc → docs}/img/GPT-3_8.png +0 -0
  312. /msprobe/{pytorch/doc → docs}/img/YOLOV5S_1.png +0 -0
  313. /msprobe/{pytorch/doc → docs}/img/YOLOV5S_2.png +0 -0
  314. /msprobe/{pytorch/doc → docs}/img/accuracy_checking_details.png +0 -0
  315. /msprobe/{pytorch/doc → docs}/img/accuracy_checking_result.png +0 -0
  316. /msprobe/{pytorch/doc → docs}/img/api_precision_compare_details.png +0 -0
  317. /msprobe/{pytorch/doc → docs}/img/api_precision_compare_result.png +0 -0
  318. /msprobe/{pytorch/doc → docs}/img/auto_analyze_log.png +0 -0
  319. /msprobe/{pytorch/doc → docs}/img/compare_result_pkl.png +0 -0
  320. /msprobe/{pytorch/doc → docs}/img/compare_result_pkl_md5.png.png +0 -0
  321. /msprobe/{pytorch/doc → docs}/img/cpu_info.png +0 -0
  322. /msprobe/{config → docs}/img/free_benchmark.png +0 -0
  323. /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 logging
18
- import os
19
- import io
20
- import re
21
- import sys
22
- import subprocess
23
- import hashlib
24
- import csv
25
- import time
26
- import numpy as np
27
- from collections import namedtuple
28
- from msprobe.pytorch.parse_tool.lib.config import Const
29
- from msprobe.pytorch.parse_tool.lib.file_desc import DumpDecodeFileDesc, FileDesc
30
- from msprobe.pytorch.parse_tool.lib.parse_exception import ParseException
31
- from msprobe.core.common.file_check import change_mode, check_other_user_writable,\
32
- check_path_executable, check_path_owner_consistent
33
- from msprobe.core.common.const import FileCheckConst
34
- from msprobe.core.common.file_check import FileOpen
35
- from msprobe.core.common.utils import check_file_or_directory_path
36
- from msprobe.pytorch.common.log import logger
37
-
38
-
39
- try:
40
- from rich.traceback import install
41
- from rich.panel import Panel
42
- from rich.table import Table
43
- from rich import print as rich_print
44
- from rich.columns import Columns
45
-
46
- install()
47
- except ImportError as err:
48
- install = None
49
- Panel = None
50
- Table = None
51
- Columns = None
52
- rich_print = None
53
- logger.warning(
54
- "Failed to import rich, Some features may not be available. Please run 'pip install rich' to fix it.")
55
-
56
-
57
- class Util:
58
- def __init__(self):
59
- self.ms_accu_cmp = None
60
- logging.basicConfig(
61
- level=Const.LOG_LEVEL,
62
- format="%(asctime)s (%(process)d) -[%(levelname)s]%(message)s",
63
- datefmt="%Y-%m-%d %H:%M:%S"
64
- )
65
- self.log = logging.getLogger()
66
- self.python = sys.executable
67
-
68
- @staticmethod
69
- def print(content):
70
- rich_print(content)
71
-
72
- @staticmethod
73
- def path_strip(path):
74
- return path.strip("'").strip('"')
75
-
76
- @staticmethod
77
- def check_executable_file(path):
78
- check_path_owner_consistent(path)
79
- check_other_user_writable(path)
80
- check_path_executable(path)
81
-
82
- @staticmethod
83
- def get_subdir_count(self, directory):
84
- subdir_count = 0
85
- for _, dirs, _ in os.walk(directory):
86
- subdir_count += len(dirs)
87
- break
88
- return subdir_count
89
-
90
- @staticmethod
91
- def get_subfiles_count(self, directory):
92
- file_count = 0
93
- for _, _, files in os.walk(directory):
94
- file_count += len(files)
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 write_csv(self, data, filepath):
133
- need_change_mode = False
134
- if not os.path.exists(filepath):
135
- need_change_mode = True
136
- with FileOpen(filepath, 'a') as f:
137
- writer = csv.writer(f)
138
- writer.writerows(data)
139
- if need_change_mode:
140
- change_mode(filepath, FileCheckConst.DATA_FILE_AUTHORITY)
141
-
142
- @staticmethod
143
- def deal_with_dir_or_file_inconsistency(self, output_path):
144
- if os.path.exists(output_path):
145
- os.remove(output_path)
146
- raise ParseException("Inconsistent directory structure or file.")
147
-
148
- @staticmethod
149
- def deal_with_value_if_has_zero(self, data):
150
- if data.dtype in Const.FLOAT_TYPE:
151
- zero_mask = (data == 0)
152
- # 给0的地方加上eps防止除0
153
- data[zero_mask] += np.finfo(data.dtype).eps
154
- else:
155
- # int type + float eps 会报错,所以这里要强转
156
- data = data.astype(float)
157
- zero_mask = (data == 0)
158
- data[zero_mask] += np.finfo(float).eps
159
- return data
160
-
161
- @staticmethod
162
- def dir_contains_only(self, path, endfix):
163
- for _, _, files in os.walk(path):
164
- for file in files:
165
- if not file.endswith(endfix):
166
- return False
167
- return True
168
-
169
- @staticmethod
170
- def localtime_str(self):
171
- return time.strftime("%Y%m%d%H%M%S", time.localtime())
172
-
173
- @staticmethod
174
- def change_filemode_safe(self, path):
175
- change_mode(path, FileCheckConst.DATA_FILE_AUTHORITY)
176
-
177
- @staticmethod
178
- def _gen_npu_dump_convert_file_info(name, match, dir_path):
179
- return DumpDecodeFileDesc(name, dir_path, int(match.groups()[-4]), op_name=match.group(2),
180
- op_type=match.group(1), task_id=int(match.group(3)), anchor_type=match.groups()[-3],
181
- anchor_idx=int(match.groups()[-2]))
182
-
183
- @staticmethod
184
- def _gen_numpy_file_info(name, math, dir_path):
185
- return FileDesc(name, dir_path)
186
-
187
- def execute_command(self, cmd):
188
- if not cmd:
189
- self.log.error("Commond is None")
190
- return -1
191
- self.log.debug("[RUN CMD]: %s", cmd)
192
- cmd = cmd.split(" ")
193
- complete_process = subprocess.run(cmd, shell=False)
194
- return complete_process.returncode
195
-
196
- def print_panel(self, content, title='', fit=True):
197
- if not Panel:
198
- self.print(content)
199
- return
200
- if fit:
201
- self.print(Panel.fit(content, title=title))
202
- else:
203
- self.print(Panel(content, title=title))
204
-
205
- def check_msaccucmp(self, target_file):
206
- if os.path.split(target_file)[-1] != Const.MS_ACCU_CMP_FILE_NAME:
207
- self.log.error(
208
- "Check msaccucmp failed in dir %s. This is not a correct msaccucmp file" % target_file)
209
- raise ParseException(ParseException.PARSE_MSACCUCMP_ERROR)
210
- result = subprocess.run(
211
- [self.python, target_file, "--help"], stdout=subprocess.PIPE)
212
- if result.returncode == 0:
213
- self.log.info("Check [%s] success.", target_file)
214
- else:
215
- self.log.error("Check msaccucmp failed in dir %s" % target_file)
216
- self.log.error("Please specify a valid msaccucmp.py path or install the cann package")
217
- raise ParseException(ParseException.PARSE_MSACCUCMP_ERROR)
218
- return target_file
219
-
220
- def create_dir(self, path):
221
- path = self.path_strip(path)
222
- if os.path.exists(path):
223
- return
224
- self.check_path_name(path)
225
- try:
226
- os.makedirs(path, mode=FileCheckConst.DATA_DIR_AUTHORITY)
227
- except OSError as e:
228
- self.log.error("Failed to create %s.", path)
229
- raise ParseException(ParseException.PARSE_INVALID_PATH_ERROR) from e
230
-
231
- def gen_npy_info_txt(self, source_data):
232
- (shape, dtype, max_data, min_data, mean) = \
233
- self.npy_info(source_data)
234
- return \
235
- '[Shape: %s] [Dtype: %s] [Max: %s] [Min: %s] [Mean: %s]' % (shape, dtype, max_data, min_data, mean)
236
-
237
- def save_npy_to_txt(self, data, dst_file='', align=0):
238
- if os.path.exists(dst_file):
239
- self.log.info("Dst file %s exists, will not save new one.", dst_file)
240
- return
241
- shape = data.shape
242
- data = data.flatten()
243
- if align == 0:
244
- align = 1 if len(shape) == 0 else shape[-1]
245
- elif data.size % align != 0:
246
- pad_array = np.zeros((align - data.size % align,))
247
- data = np.append(data, pad_array)
248
- np.savetxt(dst_file, data.reshape((-1, align)), delimiter=' ', fmt='%g')
249
- change_mode(dst_file, FileCheckConst.DATA_FILE_AUTHORITY)
250
-
251
- def list_convert_files(self, path, external_pattern=""):
252
- return self.list_file_with_pattern(
253
- path, Const.OFFLINE_DUMP_CONVERT_PATTERN, external_pattern, self._gen_npu_dump_convert_file_info
254
- )
255
-
256
- def list_numpy_files(self, path, extern_pattern=''):
257
- return self.list_file_with_pattern(path, Const.NUMPY_PATTERN, extern_pattern,
258
- self._gen_numpy_file_info)
259
-
260
- def create_columns(self, content):
261
- if not Columns:
262
- self.log.error("No module named rich, please install it")
263
- raise ParseException(ParseException.PARSE_NO_MODULE_ERROR)
264
- return Columns(content)
265
-
266
- def create_table(self, title, columns):
267
- if not Table:
268
- self.log.error("No module named rich, please install it and restart parse tool")
269
- raise ParseException(ParseException.PARSE_NO_MODULE_ERROR)
270
- table = Table(title=title)
271
- for column_name in columns:
272
- table.add_column(column_name, overflow='fold')
273
- return table
274
-
275
- def check_path_valid(self, path):
276
- path = self.path_strip(path)
277
- if not path or not os.path.exists(path):
278
- self.log.error("The path %s does not exist." % path)
279
- raise ParseException(ParseException.PARSE_INVALID_PATH_ERROR)
280
- if os.path.islink(path):
281
- self.log.error('The file path {} is a soft link.'.format(path))
282
- raise ParseException(ParseException.PARSE_INVALID_PATH_ERROR)
283
- if len(os.path.realpath(path)) > Const.DIRECTORY_LENGTH or len(os.path.basename(path)) > \
284
- Const.FILE_NAME_LENGTH:
285
- self.log.error('The file path length exceeds limit.')
286
- raise ParseException(ParseException.PARSE_INVALID_PATH_ERROR)
287
- if not re.match(Const.FILE_PATTERN, os.path.realpath(path)):
288
- self.log.error('The file path {} contains special characters.'.format(path))
289
- raise ParseException(ParseException.PARSE_INVALID_PATH_ERROR)
290
- if os.path.isfile(path):
291
- file_size = os.path.getsize(path)
292
- if path.endswith(Const.PKL_SUFFIX) and file_size > Const.ONE_GB:
293
- self.log.error('The file {} size is greater than 1GB.'.format(path))
294
- raise ParseException(ParseException.PARSE_INVALID_PATH_ERROR)
295
- if path.endswith(Const.NPY_SUFFIX) and file_size > Const.TEN_GB:
296
- self.log.error('The file {} size is greater than 10GB.'.format(path))
297
- raise ParseException(ParseException.PARSE_INVALID_PATH_ERROR)
298
- return True
299
-
300
- def check_files_in_path(self, path):
301
- if os.path.isdir(path) and len(os.listdir(path)) == 0:
302
- self.log.error("No files in %s." % path)
303
- raise ParseException(ParseException.PARSE_INVALID_PATH_ERROR)
304
-
305
- def npy_info(self, source_data):
306
- if isinstance(source_data, np.ndarray):
307
- data = source_data
308
- else:
309
- self.log.error("Invalid data, data is not ndarray")
310
- raise ParseException(ParseException.PARSE_INVALID_DATA_ERROR)
311
- if data.dtype == 'object':
312
- self.log.error("Invalid data, data is object.")
313
- raise ParseException(ParseException.PARSE_INVALID_DATA_ERROR)
314
- if np.size(data) == 0:
315
- self.log.error("Invalid data, data is empty")
316
- raise ParseException(ParseException.PARSE_INVALID_DATA_ERROR)
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