mindstudio-probe 1.0.3__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 (262) hide show
  1. {mindstudio_probe-1.0.3.dist-info → mindstudio_probe-1.0.4.dist-info}/LICENSE +201 -201
  2. {mindstudio_probe-1.0.3.dist-info → mindstudio_probe-1.0.4.dist-info}/METADATA +36 -34
  3. mindstudio_probe-1.0.4.dist-info/RECORD +276 -0
  4. {mindstudio_probe-1.0.3.dist-info → mindstudio_probe-1.0.4.dist-info}/WHEEL +1 -1
  5. {mindstudio_probe-1.0.3.dist-info → mindstudio_probe-1.0.4.dist-info}/entry_points.txt +1 -0
  6. msprobe/README.md +101 -237
  7. msprobe/{config/config.json → config.json} +49 -49
  8. msprobe/core/advisor/advisor.py +124 -124
  9. msprobe/core/advisor/advisor_const.py +59 -59
  10. msprobe/core/advisor/advisor_result.py +58 -58
  11. msprobe/core/common/const.py +341 -318
  12. msprobe/core/common/exceptions.py +99 -99
  13. msprobe/core/common/{file_check.py → file_utils.py} +478 -283
  14. msprobe/core/common/log.py +76 -69
  15. msprobe/core/common/utils.py +385 -616
  16. msprobe/core/common_config.py +85 -71
  17. msprobe/core/compare/acc_compare.py +299 -298
  18. msprobe/core/compare/check.py +95 -95
  19. msprobe/core/compare/compare_cli.py +49 -49
  20. msprobe/core/compare/highlight.py +223 -222
  21. msprobe/core/compare/multiprocessing_compute.py +149 -149
  22. msprobe/core/compare/npy_compare.py +295 -295
  23. msprobe/core/compare/utils.py +430 -429
  24. msprobe/core/data_dump/data_collector.py +154 -144
  25. msprobe/core/data_dump/data_processor/base.py +314 -293
  26. msprobe/core/data_dump/data_processor/factory.py +59 -59
  27. msprobe/core/data_dump/data_processor/mindspore_processor.py +186 -198
  28. msprobe/core/data_dump/data_processor/pytorch_processor.py +366 -389
  29. msprobe/core/data_dump/json_writer.py +96 -116
  30. msprobe/core/data_dump/scope.py +178 -178
  31. msprobe/core/grad_probe/constant.py +70 -70
  32. msprobe/core/grad_probe/grad_compare.py +171 -175
  33. msprobe/core/grad_probe/utils.py +64 -52
  34. msprobe/docs/01.installation.md +89 -0
  35. msprobe/docs/02.config_introduction.md +165 -0
  36. msprobe/docs/03.config_examples.md +247 -0
  37. msprobe/docs/04.acl_config_examples.md +76 -0
  38. msprobe/docs/05.data_dump_PyTorch.md +198 -0
  39. msprobe/docs/06.data_dump_MindSpore.md +243 -0
  40. msprobe/docs/07.accuracy_checker_PyTorch.md +274 -0
  41. msprobe/docs/08.accuracy_checker_online_PyTorch.md +198 -0
  42. msprobe/docs/09.accuracy_checker_MindSpore.md +68 -0
  43. msprobe/docs/10.accuracy_compare_PyTorch.md +245 -0
  44. msprobe/docs/11.accuracy_compare_MindSpore.md +202 -0
  45. msprobe/docs/12.overflow_check_PyTorch.md +79 -0
  46. msprobe/docs/13.overflow_check_MindSpore.md +31 -0
  47. msprobe/{pytorch/doc/parse_tool.md → docs/14.data_parse_PyTorch.md} +283 -286
  48. msprobe/docs/15.free_benchmarking_PyTorch.md +164 -0
  49. msprobe/{doc/grad_probe/grad_probe.md → docs/17.grad_probe.md} +207 -207
  50. msprobe/docs/FAQ_PyTorch.md +177 -0
  51. msprobe/docs/S02.report_free_benchmarking_validation_performance_baseline.md +146 -0
  52. msprobe/docs/img/free_benchmark_framework.png +0 -0
  53. msprobe/mindspore/__init__.py +1 -1
  54. msprobe/mindspore/api_accuracy_checker/api_accuracy_checker.py +254 -245
  55. msprobe/mindspore/api_accuracy_checker/api_info.py +69 -69
  56. msprobe/mindspore/api_accuracy_checker/api_runner.py +155 -151
  57. msprobe/mindspore/api_accuracy_checker/base_compare_algorithm.py +196 -196
  58. msprobe/mindspore/api_accuracy_checker/cmd_parser.py +6 -0
  59. msprobe/mindspore/api_accuracy_checker/compute_element.py +238 -223
  60. msprobe/mindspore/api_accuracy_checker/main.py +8 -15
  61. msprobe/mindspore/api_accuracy_checker/type_mapping.py +113 -113
  62. msprobe/mindspore/api_accuracy_checker/utils.py +79 -62
  63. msprobe/mindspore/cell_processor.py +34 -34
  64. msprobe/mindspore/common/const.py +106 -87
  65. msprobe/mindspore/common/log.py +37 -37
  66. msprobe/mindspore/common/utils.py +81 -57
  67. msprobe/mindspore/compare/distributed_compare.py +75 -75
  68. msprobe/mindspore/compare/ms_compare.py +219 -117
  69. msprobe/mindspore/compare/ms_graph_compare.py +348 -317
  70. msprobe/mindspore/compare/ms_to_pt_api.yaml +399 -399
  71. msprobe/mindspore/debugger/debugger_config.py +66 -74
  72. msprobe/mindspore/debugger/precision_debugger.py +126 -107
  73. msprobe/mindspore/dump/dump_tool_factory.py +35 -35
  74. msprobe/mindspore/dump/hook_cell/api_registry.py +118 -104
  75. msprobe/mindspore/dump/hook_cell/hook_cell.py +55 -53
  76. msprobe/mindspore/dump/hook_cell/support_wrap_ops.yaml +922 -925
  77. msprobe/mindspore/dump/hook_cell/wrap_api.py +113 -0
  78. msprobe/mindspore/dump/jit_dump.py +72 -56
  79. msprobe/mindspore/dump/kernel_graph_dump.py +59 -60
  80. msprobe/mindspore/dump/kernel_kbyk_dump.py +64 -65
  81. msprobe/mindspore/free_benchmark/api_pynative_self_check.py +116 -116
  82. msprobe/mindspore/free_benchmark/common/config.py +12 -12
  83. msprobe/mindspore/free_benchmark/common/handler_params.py +17 -17
  84. msprobe/mindspore/free_benchmark/common/utils.py +71 -71
  85. msprobe/mindspore/free_benchmark/data/support_wrap_ops.yaml +842 -842
  86. msprobe/mindspore/free_benchmark/decorator/dec_forward.py +43 -42
  87. msprobe/mindspore/free_benchmark/decorator/decorator_factory.py +107 -107
  88. msprobe/mindspore/free_benchmark/handler/base_handler.py +90 -90
  89. msprobe/mindspore/free_benchmark/handler/check_handler.py +41 -41
  90. msprobe/mindspore/free_benchmark/handler/fix_handler.py +36 -36
  91. msprobe/mindspore/free_benchmark/handler/handler_factory.py +21 -21
  92. msprobe/mindspore/free_benchmark/perturbation/add_noise.py +67 -67
  93. msprobe/mindspore/free_benchmark/perturbation/base_perturbation.py +21 -21
  94. msprobe/mindspore/free_benchmark/perturbation/bit_noise.py +63 -63
  95. msprobe/mindspore/free_benchmark/perturbation/exchange_value.py +51 -0
  96. msprobe/mindspore/free_benchmark/perturbation/improve_precision.py +35 -34
  97. msprobe/mindspore/free_benchmark/perturbation/no_change.py +12 -12
  98. msprobe/mindspore/free_benchmark/perturbation/perturbation_factory.py +29 -27
  99. msprobe/mindspore/free_benchmark/self_check_tool_factory.py +33 -33
  100. msprobe/mindspore/grad_probe/global_context.py +90 -91
  101. msprobe/mindspore/grad_probe/grad_analyzer.py +231 -231
  102. msprobe/mindspore/grad_probe/grad_monitor.py +27 -27
  103. msprobe/mindspore/grad_probe/grad_stat_csv.py +131 -131
  104. msprobe/mindspore/grad_probe/hook.py +94 -92
  105. msprobe/mindspore/grad_probe/utils.py +29 -28
  106. msprobe/mindspore/ms_config.py +128 -126
  107. msprobe/mindspore/overflow_check/kernel_graph_overflow_check.py +44 -45
  108. msprobe/mindspore/overflow_check/overflow_check_tool_factory.py +34 -34
  109. msprobe/mindspore/runtime.py +4 -4
  110. msprobe/mindspore/service.py +378 -354
  111. msprobe/mindspore/task_handler_factory.py +24 -24
  112. msprobe/msprobe.py +105 -107
  113. msprobe/pytorch/__init__.py +3 -3
  114. msprobe/pytorch/api_accuracy_checker/common/config.py +53 -55
  115. msprobe/pytorch/api_accuracy_checker/common/utils.py +214 -165
  116. msprobe/pytorch/api_accuracy_checker/compare/algorithm.py +213 -213
  117. msprobe/pytorch/api_accuracy_checker/compare/api_precision_compare.py +606 -581
  118. msprobe/pytorch/api_accuracy_checker/compare/api_precision_standard.yaml +132 -132
  119. msprobe/pytorch/api_accuracy_checker/compare/api_precision_threshold.yaml +390 -390
  120. msprobe/pytorch/api_accuracy_checker/compare/compare.py +386 -381
  121. msprobe/pytorch/api_accuracy_checker/compare/compare_column.py +73 -73
  122. msprobe/pytorch/api_accuracy_checker/compare/compare_utils.py +245 -244
  123. msprobe/pytorch/api_accuracy_checker/config.yaml +10 -10
  124. msprobe/pytorch/api_accuracy_checker/run_ut/data_generate.py +335 -332
  125. msprobe/pytorch/api_accuracy_checker/run_ut/multi_run_ut.py +200 -199
  126. msprobe/pytorch/api_accuracy_checker/run_ut/run_overflow_check.py +133 -134
  127. msprobe/pytorch/api_accuracy_checker/run_ut/run_ut.py +592 -581
  128. msprobe/pytorch/api_accuracy_checker/run_ut/run_ut_utils.py +70 -74
  129. msprobe/pytorch/api_accuracy_checker/run_ut/torch_ut_setting.json +7 -4
  130. msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/attl.py +197 -202
  131. msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/client.py +325 -324
  132. msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/device_dispatch.py +204 -204
  133. msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/server.py +219 -218
  134. msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/ssl_config.py +10 -10
  135. msprobe/pytorch/bench_functions/__init__.py +15 -15
  136. msprobe/pytorch/bench_functions/apply_adam_w.py +28 -28
  137. msprobe/pytorch/bench_functions/confusion_transpose.py +19 -19
  138. msprobe/pytorch/bench_functions/fast_gelu.py +55 -55
  139. msprobe/pytorch/bench_functions/layer_norm_eval.py +6 -6
  140. msprobe/pytorch/bench_functions/linear.py +12 -12
  141. msprobe/pytorch/bench_functions/matmul_backward.py +48 -48
  142. msprobe/pytorch/bench_functions/npu_fusion_attention.py +509 -421
  143. msprobe/pytorch/bench_functions/rms_norm.py +15 -15
  144. msprobe/pytorch/bench_functions/rotary_mul.py +52 -52
  145. msprobe/pytorch/bench_functions/scaled_mask_softmax.py +26 -26
  146. msprobe/pytorch/bench_functions/swiglu.py +55 -55
  147. msprobe/pytorch/common/__init__.py +2 -2
  148. msprobe/pytorch/common/compare_script.template +14 -14
  149. msprobe/pytorch/common/log.py +20 -31
  150. msprobe/pytorch/common/parse_json.py +39 -39
  151. msprobe/pytorch/common/utils.py +305 -300
  152. msprobe/pytorch/compare/distributed_compare.py +66 -66
  153. msprobe/pytorch/compare/mapping.yaml +607 -607
  154. msprobe/pytorch/compare/match.py +34 -33
  155. msprobe/pytorch/compare/pt_compare.py +50 -40
  156. msprobe/pytorch/debugger/debugger_config.py +95 -95
  157. msprobe/pytorch/debugger/precision_debugger.py +125 -125
  158. msprobe/pytorch/free_benchmark/__init__.py +8 -8
  159. msprobe/pytorch/free_benchmark/common/constant.py +70 -70
  160. msprobe/pytorch/free_benchmark/common/counter.py +71 -71
  161. msprobe/pytorch/free_benchmark/common/enums.py +37 -37
  162. msprobe/pytorch/free_benchmark/common/params.py +129 -129
  163. msprobe/pytorch/free_benchmark/common/utils.py +102 -102
  164. msprobe/pytorch/free_benchmark/compare/grad_saver.py +179 -179
  165. msprobe/pytorch/free_benchmark/compare/single_benchmark.py +104 -104
  166. msprobe/pytorch/free_benchmark/main.py +105 -105
  167. msprobe/pytorch/free_benchmark/perturbed_layers/base_layer.py +13 -13
  168. msprobe/pytorch/free_benchmark/perturbed_layers/layer_factory.py +41 -41
  169. msprobe/pytorch/free_benchmark/perturbed_layers/npu/add_noise.py +90 -90
  170. msprobe/pytorch/free_benchmark/perturbed_layers/npu/bit_noise.py +104 -104
  171. msprobe/pytorch/free_benchmark/perturbed_layers/npu/change_value.py +63 -63
  172. msprobe/pytorch/free_benchmark/perturbed_layers/npu/improve_precision.py +68 -68
  173. msprobe/pytorch/free_benchmark/perturbed_layers/npu/no_change.py +28 -28
  174. msprobe/pytorch/free_benchmark/perturbed_layers/npu/npu_base_layser.py +45 -45
  175. msprobe/pytorch/free_benchmark/perturbed_layers/run_cpu.py +19 -19
  176. msprobe/pytorch/free_benchmark/result_handlers/base_handler.py +217 -217
  177. msprobe/pytorch/free_benchmark/result_handlers/check_handler.py +39 -39
  178. msprobe/pytorch/free_benchmark/result_handlers/fix_handler.py +23 -23
  179. msprobe/pytorch/free_benchmark/result_handlers/handler_factory.py +30 -30
  180. msprobe/pytorch/free_benchmark/result_handlers/preheat_handler.py +170 -170
  181. msprobe/pytorch/function_factory.py +76 -75
  182. msprobe/pytorch/functional/dump_module.py +39 -39
  183. msprobe/pytorch/grad_probe/grad_monitor.py +91 -90
  184. msprobe/pytorch/grad_probe/grad_stat_csv.py +128 -128
  185. msprobe/pytorch/hook_module/api_registry.py +161 -161
  186. msprobe/pytorch/hook_module/hook_module.py +120 -120
  187. msprobe/pytorch/hook_module/support_wrap_ops.yaml +1879 -1877
  188. msprobe/pytorch/hook_module/utils.py +30 -29
  189. msprobe/pytorch/hook_module/wrap_aten.py +110 -110
  190. msprobe/pytorch/hook_module/wrap_distributed.py +78 -78
  191. msprobe/pytorch/hook_module/wrap_functional.py +105 -105
  192. msprobe/pytorch/hook_module/wrap_npu_custom.py +93 -84
  193. msprobe/pytorch/hook_module/wrap_tensor.py +71 -71
  194. msprobe/pytorch/hook_module/wrap_torch.py +86 -86
  195. msprobe/pytorch/hook_module/wrap_vf.py +62 -62
  196. msprobe/pytorch/module_processer.py +138 -138
  197. msprobe/pytorch/online_dispatch/__init__.py +20 -20
  198. msprobe/pytorch/online_dispatch/compare.py +236 -236
  199. msprobe/pytorch/online_dispatch/dispatch.py +271 -271
  200. msprobe/pytorch/online_dispatch/dump_compare.py +155 -156
  201. msprobe/pytorch/online_dispatch/single_compare.py +391 -391
  202. msprobe/pytorch/online_dispatch/torch_ops_config.yaml +49 -49
  203. msprobe/pytorch/online_dispatch/utils.py +130 -146
  204. msprobe/pytorch/parse.py +4 -4
  205. msprobe/pytorch/parse_tool/cli.py +32 -32
  206. msprobe/pytorch/parse_tool/lib/compare.py +260 -271
  207. msprobe/pytorch/parse_tool/lib/config.py +52 -52
  208. msprobe/pytorch/parse_tool/lib/file_desc.py +31 -31
  209. msprobe/pytorch/parse_tool/lib/interactive_cli.py +102 -102
  210. msprobe/pytorch/parse_tool/lib/parse_exception.py +54 -54
  211. msprobe/pytorch/parse_tool/lib/parse_tool.py +158 -158
  212. msprobe/pytorch/parse_tool/lib/utils.py +316 -321
  213. msprobe/pytorch/parse_tool/lib/visualization.py +85 -91
  214. msprobe/pytorch/pt_config.py +188 -187
  215. msprobe/pytorch/service.py +246 -252
  216. mindstudio_probe-1.0.3.dist-info/RECORD +0 -272
  217. msprobe/config/README.md +0 -539
  218. msprobe/mindspore/doc/compare.md +0 -58
  219. msprobe/mindspore/doc/dump.md +0 -217
  220. msprobe/mindspore/dump/hook_cell/wrap_functional.py +0 -91
  221. msprobe/mindspore/dump/hook_cell/wrap_tensor.py +0 -63
  222. msprobe/pytorch/doc/FAQ.md +0 -193
  223. msprobe/pytorch/doc/api_accuracy_checker.md +0 -313
  224. msprobe/pytorch/doc/api_accuracy_checker_online.md +0 -187
  225. msprobe/pytorch/doc/dump.md +0 -260
  226. msprobe/pytorch/doc/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 -182
  227. msprobe/pytorch/doc/ptdbg_ascend_compare.md +0 -240
  228. msprobe/pytorch/doc/ptdbg_ascend_overview.md +0 -68
  229. msprobe/pytorch/doc/ptdbg_ascend_quickstart.md +0 -381
  230. msprobe/pytorch/doc/run_overflow_check.md +0 -25
  231. 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
  232. 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 +0 -151
  233. {mindstudio_probe-1.0.3.dist-info → mindstudio_probe-1.0.4.dist-info}/top_level.txt +0 -0
  234. /msprobe/{pytorch/doc → docs}/img/BLOOM-7B_1.png +0 -0
  235. /msprobe/{pytorch/doc → docs}/img/BLOOM-7B_2.png +0 -0
  236. /msprobe/{pytorch/doc → docs}/img/BLOOM-7B_3.png +0 -0
  237. /msprobe/{pytorch/doc → docs}/img/BLOOM-7B_4.png +0 -0
  238. /msprobe/{pytorch/doc → docs}/img/GPT-3_1.png +0 -0
  239. /msprobe/{pytorch/doc → docs}/img/GPT-3_2.png +0 -0
  240. /msprobe/{pytorch/doc → docs}/img/GPT-3_3.png +0 -0
  241. /msprobe/{pytorch/doc → docs}/img/GPT-3_4.png +0 -0
  242. /msprobe/{pytorch/doc → docs}/img/GPT-3_5.png +0 -0
  243. /msprobe/{pytorch/doc → docs}/img/GPT-3_6.png +0 -0
  244. /msprobe/{pytorch/doc → docs}/img/GPT-3_7.png +0 -0
  245. /msprobe/{pytorch/doc → docs}/img/GPT-3_8.png +0 -0
  246. /msprobe/{pytorch/doc → docs}/img/YOLOV5S_1.png +0 -0
  247. /msprobe/{pytorch/doc → docs}/img/YOLOV5S_2.png +0 -0
  248. /msprobe/{pytorch/doc → docs}/img/accuracy_checking_details.png +0 -0
  249. /msprobe/{pytorch/doc → docs}/img/accuracy_checking_result.png +0 -0
  250. /msprobe/{pytorch/doc → docs}/img/api_precision_compare_details.png +0 -0
  251. /msprobe/{pytorch/doc → docs}/img/api_precision_compare_result.png +0 -0
  252. /msprobe/{pytorch/doc → docs}/img/auto_analyze_log.png +0 -0
  253. /msprobe/{pytorch/doc → docs}/img/compare_result_pkl.png +0 -0
  254. /msprobe/{pytorch/doc → docs}/img/compare_result_pkl_md5.png.png +0 -0
  255. /msprobe/{pytorch/doc → docs}/img/cpu_info.png +0 -0
  256. /msprobe/{config → docs}/img/free_benchmark.png +0 -0
  257. /msprobe/{doc/grad_probe/img/image-1.png → docs/img/grad_probe_image-1.png} +0 -0
  258. /msprobe/{doc/grad_probe/img/image-2.png → docs/img/grad_probe_image-2.png} +0 -0
  259. /msprobe/{doc/grad_probe/img/image-3.png → docs/img/grad_probe_image-3.png} +0 -0
  260. /msprobe/{doc/grad_probe/img/image-4.png → docs/img/grad_probe_image-4.png} +0 -0
  261. /msprobe/{doc/grad_probe/img/image.png → docs/img/grad_probe_image.png} +0 -0
  262. /msprobe/{pytorch/doc → docs}/img/module_compare.png +0 -0
@@ -1,321 +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, FileChecker
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
- self.log = logger
61
- self.python = sys.executable
62
-
63
- @staticmethod
64
- def print(content):
65
- rich_print(content)
66
-
67
- @staticmethod
68
- def path_strip(path):
69
- return path.strip("'").strip('"')
70
-
71
- @staticmethod
72
- def check_executable_file(path):
73
- check_path_owner_consistent(path)
74
- check_other_user_writable(path)
75
- check_path_executable(path)
76
-
77
- @staticmethod
78
- def get_subdir_count(self, directory):
79
- subdir_count = 0
80
- path_checker = FileChecker(directory)
81
- path_checker.common_check()
82
- for _, dirs, _ in os.walk(directory):
83
- subdir_count += len(dirs)
84
- break
85
- return subdir_count
86
-
87
- @staticmethod
88
- def get_subfiles_count(self, directory):
89
- file_count = 0
90
- for root, _, files in os.walk(directory, topdown=True):
91
- path_checker = FileChecker(root)
92
- path_checker.common_check()
93
- file_count += len(files)
94
- path_depth = root.count(os.sep)
95
- if path_depth <= Const.MAX_TRAVERSAL_DEPTH:
96
- yield root, _, files
97
- else:
98
- _[:] = []
99
- return file_count
100
-
101
- @staticmethod
102
- def get_sorted_subdirectories_names(self, directory):
103
- subdirectories = []
104
- for item in os.listdir(directory):
105
- item_path = os.path.join(directory, item)
106
- if os.path.isdir(item_path):
107
- subdirectories.append(item)
108
- return sorted(subdirectories)
109
-
110
- @staticmethod
111
- def get_sorted_files_names(self, directory):
112
- files = []
113
- for item in os.listdir(directory):
114
- item_path = os.path.join(directory, item)
115
- if os.path.isfile(item_path):
116
- files.append(item)
117
- return sorted(files)
118
-
119
- @staticmethod
120
- def check_npy_files_valid_in_dir(self, dir_path):
121
- for file_name in os.listdir(dir_path):
122
- file_path = os.path.join(dir_path, file_name)
123
- check_file_or_directory_path(file_path)
124
- _, file_extension = os.path.splitext(file_path)
125
- if not file_extension == '.npy':
126
- return False
127
- return True
128
-
129
- @staticmethod
130
- def get_md5_for_numpy(self, obj):
131
- np_bytes = obj.tobytes()
132
- md5_hash = hashlib.md5(np_bytes)
133
- return md5_hash.hexdigest()
134
-
135
- @staticmethod
136
- def deal_with_dir_or_file_inconsistency(self, output_path):
137
- if os.path.exists(output_path):
138
- os.remove(output_path)
139
- raise ParseException("Inconsistent directory structure or file.")
140
-
141
- @staticmethod
142
- def deal_with_value_if_has_zero(self, data):
143
- if data.dtype in Const.FLOAT_TYPE:
144
- zero_mask = (data == 0)
145
- # 0的地方加上eps防止除0
146
- data[zero_mask] += np.finfo(data.dtype).eps
147
- else:
148
- # int type + float eps 会报错,所以这里要强转
149
- data = data.astype(float)
150
- zero_mask = (data == 0)
151
- data[zero_mask] += np.finfo(float).eps
152
- return data
153
-
154
- @staticmethod
155
- def dir_contains_only(self, path, endfix):
156
- for root, _, files in os.walk(path, topdown=True):
157
- path_checker = FileChecker(root)
158
- path_checker.common_check()
159
- for file in files:
160
- if not file.endswith(endfix):
161
- return False
162
- path_depth = root.count(os.sep)
163
- if path_depth <= Const.MAX_TRAVERSAL_DEPTH:
164
- yield root, _, files
165
- else:
166
- _[:] = []
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.info("[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, shell=False)
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 gen_npy_info_txt(self, source_data):
221
- (shape, dtype, max_data, min_data, mean) = \
222
- self.npy_info(source_data)
223
- return \
224
- '[Shape: %s] [Dtype: %s] [Max: %s] [Min: %s] [Mean: %s]' % (shape, dtype, max_data, min_data, mean)
225
-
226
- def list_convert_files(self, path, external_pattern=""):
227
- return self.list_file_with_pattern(
228
- path, Const.OFFLINE_DUMP_CONVERT_PATTERN, external_pattern, self._gen_npu_dump_convert_file_info
229
- )
230
-
231
- def list_numpy_files(self, path, extern_pattern=''):
232
- return self.list_file_with_pattern(path, Const.NUMPY_PATTERN, extern_pattern,
233
- self._gen_numpy_file_info)
234
-
235
- def create_columns(self, content):
236
- if not Columns:
237
- self.log.error("No module named rich, please install it")
238
- raise ParseException(ParseException.PARSE_NO_MODULE_ERROR)
239
- return Columns(content)
240
-
241
- def create_table(self, title, columns):
242
- if not Table:
243
- self.log.error("No module named rich, please install it and restart parse tool")
244
- raise ParseException(ParseException.PARSE_NO_MODULE_ERROR)
245
- table = Table(title=title)
246
- for column_name in columns:
247
- table.add_column(column_name, overflow='fold')
248
- return table
249
-
250
- def check_path_valid(self, path):
251
- path = self.path_strip(path)
252
- path_checker = FileChecker(path)
253
- path_checker.common_check()
254
- return True
255
-
256
- def check_files_in_path(self, path):
257
- if os.path.isdir(path) and len(os.listdir(path)) == 0:
258
- self.log.error("No files in %s." % path)
259
- raise ParseException(ParseException.PARSE_INVALID_PATH_ERROR)
260
-
261
- def npy_info(self, source_data):
262
- if isinstance(source_data, np.ndarray):
263
- data = source_data
264
- else:
265
- self.log.error("Invalid data, data is not ndarray")
266
- raise ParseException(ParseException.PARSE_INVALID_DATA_ERROR)
267
- if data.dtype == 'object':
268
- self.log.error("Invalid data, data is object.")
269
- raise ParseException(ParseException.PARSE_INVALID_DATA_ERROR)
270
- if np.size(data) == 0:
271
- self.log.error("Invalid data, data is empty")
272
- raise ParseException(ParseException.PARSE_INVALID_DATA_ERROR)
273
- npu_info_result = namedtuple('npu_info_result', ['shape', 'dtype', 'max', 'min', 'mean'])
274
- res = npu_info_result(data.shape, data.dtype, data.max(), data.min(), data.mean())
275
- return res
276
-
277
- def list_file_with_pattern(self, path, pattern, extern_pattern, gen_info_func):
278
- self.check_path_valid(path)
279
- file_list = {}
280
- re_pattern = re.compile(pattern)
281
- for dir_path, _, file_names in os.walk(path, topdown=True):
282
- path_checker = FileChecker(dir)
283
- path_checker.common_check()
284
- for name in file_names:
285
- match = re_pattern.match(name)
286
- if not match:
287
- continue
288
- if extern_pattern != '' and re_pattern.match(extern_pattern) and not re.match(extern_pattern, name):
289
- continue
290
- file_list[name] = gen_info_func(name, match, dir_path)
291
- path_depth = dir_path.count(os.sep)
292
- if path_depth <= Const.MAX_TRAVERSAL_DEPTH:
293
- yield dir_path, _, file_names
294
- else:
295
- _[:] = []
296
- return file_list
297
-
298
- def check_file_path_format(self, path, suffix):
299
- if os.path.isfile(path):
300
- if not path.endswith(suffix):
301
- self.log.error("%s is not a %s file." % (path, suffix))
302
- raise ParseException(ParseException.PARSE_INVALID_FILE_FORMAT_ERROR)
303
- elif os.path.isdir(path):
304
- self.log.error("Please specify a single file path")
305
- raise ParseException(ParseException.PARSE_INVALID_PATH_ERROR)
306
- else:
307
- self.log.error("The file path %s is invalid" % path)
308
- raise ParseException(ParseException.PARSE_INVALID_PATH_ERROR)
309
-
310
- def check_str_param(self, param):
311
- if len(param) > Const.FILE_NAME_LENGTH:
312
- self.log.error('The parameter length exceeds limit')
313
- raise ParseException(ParseException.PARSE_INVALID_PARAM_ERROR)
314
- if not re.match(Const.FILE_PATTERN, param):
315
- self.log.error('The parameter {} contains special characters.'.format(param))
316
- raise ParseException(ParseException.PARSE_INVALID_PARAM_ERROR)
317
-
318
- def is_subdir_count_equal(self, dir1, dir2):
319
- dir1_count = self.get_subdir_count(dir1)
320
- dir2_count = self.get_subdir_count(dir2)
321
- 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