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,299 +1,300 @@
1
- import multiprocessing
2
- import os
3
- import json
4
- import pandas as pd
5
- from msprobe.core.common.file_check import FileOpen
6
- from msprobe.core.common.const import CompareConst, Const
7
- from msprobe.core.common.exceptions import FileCheckException
8
- from msprobe.core.common.log import logger
9
- from msprobe.core.common.utils import add_time_with_xlsx, CompareException, check_file_not_exists
10
- from msprobe.core.compare.check import check_graph_mode, check_struct_match, fuzzy_check_op
11
- from msprobe.core.compare.highlight import find_compare_result_error_rows, highlight_rows_xlsx
12
- from msprobe.core.compare.utils import read_op, merge_tensor, CompareException, get_un_match_accuracy, get_accuracy
13
- from msprobe.core.compare.multiprocessing_compute import _handle_multi_process, ComparisonResult, _save_cmp_result
14
- from msprobe.core.compare.npy_compare import compare_ops_apply, get_error_type, reshape_value, get_relative_err, \
15
- get_error_message
16
- from msprobe.core.advisor.advisor import Advisor
17
-
18
-
19
- class Comparator:
20
-
21
- def __init__(self):
22
- pass
23
-
24
- @classmethod
25
- def make_result_table(cls,result, md5_compare, summary_compare, stack_mode):
26
- header = []
27
- if md5_compare:
28
- header = CompareConst.MD5_COMPARE_RESULT_HEADER[:]
29
- elif summary_compare:
30
- header = CompareConst.SUMMARY_COMPARE_RESULT_HEADER[:]
31
- else:
32
- header = CompareConst.COMPARE_RESULT_HEADER[:]
33
-
34
- all_mode_bool = not (summary_compare or md5_compare)
35
- if stack_mode:
36
- if all_mode_bool:
37
- header.append(CompareConst.STACK)
38
- header.append(CompareConst.DATA_NAME)
39
- else:
40
- header.append(CompareConst.STACK)
41
- else:
42
- if all_mode_bool:
43
- for row in result:
44
- del row[-2]
45
- header.append(CompareConst.DATA_NAME)
46
- else:
47
- for row in result:
48
- del row[-1]
49
- result_df = pd.DataFrame(result, columns=header)
50
- return result_df
51
-
52
- @classmethod
53
- def gen_merge_list(self, json_data, op_name,stack_json_data, summary_compare, md5_compare):
54
- op_data = json_data['data'][op_name]
55
- op_parsed_list = read_op(op_data, op_name)
56
- if op_name in stack_json_data:
57
- op_parsed_list.append({'full_op_name': op_name, 'full_info': stack_json_data[op_name]})
58
- else:
59
- op_parsed_list.append({'full_op_name': op_name, 'full_info': None})
60
-
61
- merge_list = merge_tensor(op_parsed_list, summary_compare, md5_compare)
62
- return merge_list
63
-
64
- def check_op(self, npu_dict, bench_dict, fuzzy_match):
65
- a_op_name = npu_dict["op_name"]
66
- b_op_name = bench_dict["op_name"]
67
- graph_mode = check_graph_mode(a_op_name[0], b_op_name[0])
68
-
69
- frame_name = getattr(self,"frame_name")
70
- if frame_name == "PTComparator":
71
- from msprobe.pytorch.compare.match import graph_mapping
72
- if graph_mode:
73
- return graph_mapping.match(a_op_name[0], b_op_name[0])
74
- struct_match = check_struct_match(npu_dict, bench_dict)
75
- if not fuzzy_match:
76
- return a_op_name == b_op_name and struct_match
77
- is_match = True
78
- try:
79
- is_match = fuzzy_check_op(a_op_name, b_op_name)
80
- except Exception as err:
81
- logger.warning("%s and %s can not fuzzy match." % (a_op_name, b_op_name))
82
- is_match = False
83
- return is_match and struct_match
84
-
85
- def match_op(self, npu_queue, bench_queue, fuzzy_match):
86
- for b_index, b_op in enumerate(bench_queue[0: -1]):
87
- if self.check_op(npu_queue[-1], b_op, fuzzy_match):
88
- return len(npu_queue) - 1, b_index
89
- if self.check_op(npu_queue[-1], bench_queue[-1], fuzzy_match):
90
- return len(npu_queue) - 1, len(bench_queue) - 1
91
- for n_index, n_op in enumerate(npu_queue[0: -1]):
92
- if self.check_op(n_op, bench_queue[-1], fuzzy_match):
93
- return n_index, len(bench_queue) - 1
94
- return -1, -1
95
-
96
- def compare_process(self, file_handles, stack_mode, fuzzy_match, summary_compare=False, md5_compare=False):
97
- npu_json_handle, bench_json_handle, stack_json_handle = file_handles
98
- npu_json_data = json.load(npu_json_handle)
99
- bench_json_data = json.load(bench_json_handle)
100
- stack_json_data = json.load(stack_json_handle)
101
-
102
- if fuzzy_match:
103
- logger.warning("This task uses fuzzy matching, which may affect the accuracy of the comparison.")
104
-
105
- npu_ops_queue = []
106
- bench_ops_queue = []
107
- result = []
108
-
109
- ops_npu_iter = iter(npu_json_data['data'])
110
- ops_bench_iter = iter(bench_json_data['data'])
111
- read_err_npu = True
112
- read_err_bench = True
113
- last_npu_ops_len = 0
114
- last_bench_ops_len = 0
115
-
116
- while True:
117
- if not read_err_npu and not read_err_bench:
118
- break
119
- try:
120
- last_npu_ops_len = len(npu_ops_queue)
121
- op_name_npu = next(ops_npu_iter)
122
- read_err_npu = True
123
- npu_merge_list = self.gen_merge_list(npu_json_data,op_name_npu,stack_json_data,summary_compare,md5_compare)
124
- if npu_merge_list:
125
- npu_ops_queue.append(npu_merge_list)
126
- except StopIteration:
127
- read_err_npu = False
128
- try:
129
- last_bench_ops_len = len(bench_ops_queue)
130
- op_name_bench = next(ops_bench_iter)
131
- bench_merge_list = self.gen_merge_list(bench_json_data,op_name_bench,stack_json_data,summary_compare,md5_compare)
132
- if bench_merge_list:
133
- bench_ops_queue.append(bench_merge_list)
134
- except StopIteration:
135
- read_err_bench = False
136
-
137
- # merge all boolean expressions
138
- both_empty = not npu_ops_queue and not bench_ops_queue
139
- no_change = (len(npu_ops_queue) == last_npu_ops_len) and (len(bench_ops_queue) == last_bench_ops_len)
140
- if both_empty or no_change:
141
- continue
142
-
143
- # APIs in NPU and Bench models unconsistent judgment
144
- if bool(npu_ops_queue) ^ bool(bench_ops_queue):
145
- logger.info("Please check whether the number and calls of APIs in NPU and Bench models are consistent.")
146
- break
147
-
148
- n_match_point, b_match_point = self.match_op(npu_ops_queue, bench_ops_queue, fuzzy_match)
149
- if n_match_point == -1 and b_match_point == -1:
150
- continue
151
- n_match_data = npu_ops_queue[n_match_point]
152
- b_match_data = bench_ops_queue[b_match_point]
153
- un_match_data = npu_ops_queue[0: n_match_point]
154
- for npu_data in un_match_data:
155
- get_un_match_accuracy(result, npu_data, md5_compare, summary_compare)
156
- get_accuracy(result, n_match_data, b_match_data, summary_compare, md5_compare)
157
- del npu_ops_queue[0: n_match_point + 1]
158
- del bench_ops_queue[0: b_match_point + 1]
159
- if npu_ops_queue:
160
- for npu_data in npu_ops_queue:
161
- get_un_match_accuracy(result, npu_data, md5_compare, summary_compare)
162
-
163
- result_df = self.make_result_table(result, md5_compare, summary_compare, stack_mode)
164
- return result_df
165
-
166
- def compare_by_op(self, npu_op_name, bench_op_name, op_name_mapping_dict, input_param):
167
- npu_bench_name_list = op_name_mapping_dict[npu_op_name]
168
- data_name = npu_bench_name_list[1]
169
- error_file, relative_err, error_flag = None, None, False
170
- if data_name == '-1' or data_name == -1: # 没有真实数据路径
171
- n_value, b_value = CompareConst.READ_NONE, CompareConst.READ_NONE
172
- error_flag = True
173
- else:
174
- try:
175
- read_npy_data = getattr(self, "read_npy_data")
176
- frame_name = getattr(self, "frame_name")
177
- if frame_name == "MSComparator":
178
- n_value = read_npy_data(input_param.get("npu_dump_data_dir"), npu_op_name + Const.NUMPY_SUFFIX)
179
- if self.cross_frame:
180
- b_value = read_npy_data(input_param.get("bench_dump_data_dir"), bench_op_name + Const.PT_SUFFIX, load_pt_file=True)
181
- else:
182
- b_value = read_npy_data(input_param.get("bench_dump_data_dir"), bench_op_name + Const.NUMPY_SUFFIX)
183
- else:
184
- n_value = read_npy_data(input_param.get("npu_dump_data_dir"), npu_op_name + Const.PT_SUFFIX)
185
- b_value = read_npy_data(input_param.get("bench_dump_data_dir"), bench_op_name + Const.PT_SUFFIX)
186
- except IOError as error:
187
- error_file = error.filename
188
- n_value, b_value = CompareConst.READ_NONE, CompareConst.READ_NONE
189
- error_flag = True
190
- except FileCheckException:
191
- error_file = data_name
192
- n_value, b_value = CompareConst.READ_NONE, CompareConst.READ_NONE
193
- error_flag = True
194
-
195
- n_value, b_value, error_flag = get_error_type(n_value, b_value, error_flag)
196
- if not error_flag:
197
- relative_err = get_relative_err(n_value, b_value)
198
- n_value, b_value = reshape_value(n_value, b_value)
199
-
200
- err_msg = get_error_message(n_value, b_value, npu_op_name, error_flag, error_file=error_file)
201
- result_list, err_msg = compare_ops_apply(n_value, b_value, error_flag, err_msg, relative_err=relative_err)
202
-
203
- if npu_op_name != bench_op_name and bench_op_name != CompareConst.N_A:
204
- err_msg += " Fuzzy matching data, the comparison accuracy may be affected."
205
- result_list.append(err_msg)
206
- return result_list
207
-
208
- def compare_core(self, input_parma, output_path, **kwargs):
209
- """
210
- Compares data from multiple JSON files and generates a comparison report.
211
-
212
- Args:
213
- input_parma (dict): A dictionary containing paths to JSON files ("npu_path", "bench_path",
214
- "stack_path").
215
- output_path (str): The path where the output Excel report will be saved.
216
- **kwargs: Additional keyword arguments including:
217
- - stack_mode (bool, optional): Enables stack mode comparison. Defaults to False.
218
- - auto_analyze (bool, optional): If True, triggers automatic analysis after comparison. Defaults to True.
219
- - suffix (str, optional): Suffix to append to the output file name. Defaults to ''.
220
- - fuzzy_match (bool, optional): Enables fuzzy matching during comparison. Defaults to False.
221
- - summary_compare (bool, optional): Enables summary comparison mode. Defaults to False.
222
- - md5_compare (bool, optional): Enables MD5 comparison. Defaults to False.
223
-
224
- Returns:
225
- """
226
- # get kwargs or set default value
227
- stack_mode = kwargs.get('stack_mode', False)
228
- auto_analyze = kwargs.get('auto_analyze', True)
229
- suffix = kwargs.get('suffix', '')
230
- fuzzy_match = kwargs.get('fuzzy_match', False)
231
- summary_compare = kwargs.get('summary_compare', False)
232
- md5_compare = kwargs.get('md5_compare', False)
233
-
234
- logger.info("Please check whether the input data belongs to you. If not, there may be security risks.")
235
- file_name = add_time_with_xlsx("compare_result" + suffix)
236
- file_path = os.path.join(os.path.realpath(output_path), file_name)
237
- check_file_not_exists(file_path)
238
- highlight_dict = {'red_rows': [], 'yellow_rows': []}
239
-
240
- with FileOpen(input_parma.get("npu_json_path"), "r") as npu_json, \
241
- FileOpen(input_parma.get("bench_json_path"), "r") as bench_json, \
242
- FileOpen(input_parma.get("stack_json_path"), "r") as stack_json:
243
- result_df = self.compare_process([npu_json, bench_json, stack_json], stack_mode, fuzzy_match,
244
- summary_compare, md5_compare)
245
-
246
- if not md5_compare and not summary_compare:
247
- result_df = self._do_multi_process(input_parma, result_df)
248
- find_compare_result_error_rows(result_df, highlight_dict, summary_compare, md5_compare)
249
- highlight_rows_xlsx(result_df, highlight_dict, file_path)
250
- if auto_analyze:
251
- advisor = Advisor(result_df, output_path)
252
- advisor.analysis()
253
-
254
- def compare_ops(self, idx, dump_path_dict, result_df, lock, input_param):
255
- cos_result = []
256
- max_err_result = []
257
- max_relative_err_result = []
258
- err_mess = []
259
- one_thousand_err_ratio_result = []
260
- five_thousand_err_ratio_result = []
261
- is_print_compare_log = input_param.get("is_print_compare_log")
262
- for i in range(len(result_df)):
263
- npu_op_name = result_df.iloc[i, 0]
264
- bench_op_name = result_df.iloc[i, 1]
265
- if is_print_compare_log:
266
- logger.info("start compare: {}".format(npu_op_name))
267
- cos_sim, max_abs_err, max_relative_err, one_thousand_err_ratio, five_thousand_err_ratio, err_msg = self.compare_by_op(
268
- npu_op_name, bench_op_name, dump_path_dict, input_param)
269
- if is_print_compare_log:
270
- logger.info(
271
- "[{}] Compare result: cosine {}, max_abs_err {}, max_relative_err {}, {}, one_thousand_err_ratio {}, "
272
- "five_thousand_err_ratio {}".format(npu_op_name, cos_sim, max_abs_err, max_relative_err, err_msg,
273
- one_thousand_err_ratio, five_thousand_err_ratio))
274
- cos_result.append(cos_sim)
275
- max_err_result.append(max_abs_err)
276
- max_relative_err_result.append(max_relative_err)
277
- err_mess.append(err_msg)
278
- one_thousand_err_ratio_result.append(one_thousand_err_ratio)
279
- five_thousand_err_ratio_result.append(five_thousand_err_ratio)
280
-
281
- cr = ComparisonResult(
282
- cos_result=cos_result,
283
- max_err_result=max_err_result,
284
- max_relative_err_result=max_relative_err_result,
285
- err_msgs=err_mess,
286
- one_thousand_err_ratio_result=one_thousand_err_ratio_result,
287
- five_thousand_err_ratio_result=five_thousand_err_ratio_result
288
- )
289
-
290
- return _save_cmp_result(idx, cr, result_df, lock)
291
-
292
- def _do_multi_process(self,input_parma, result_df):
293
- try:
294
- result_df = _handle_multi_process(self.compare_ops, input_parma, result_df, multiprocessing.Manager().RLock())
295
- return result_df
296
- except ValueError as e:
297
- logger.error('result dataframe is not found.')
298
- raise CompareException(CompareException.INVALID_DATA_ERROR) from e
1
+ import multiprocessing
2
+ import os
3
+ import json
4
+ import pandas as pd
5
+ from msprobe.core.common.file_utils import FileOpen
6
+ from msprobe.core.common.const import CompareConst, Const
7
+ from msprobe.core.common.exceptions import FileCheckException
8
+ from msprobe.core.common.log import logger
9
+ from msprobe.core.common.utils import add_time_with_xlsx, CompareException
10
+ from msprobe.core.common.file_utils import remove_path
11
+ from msprobe.core.compare.check import check_graph_mode, check_struct_match, fuzzy_check_op
12
+ from msprobe.core.compare.highlight import find_compare_result_error_rows, highlight_rows_xlsx
13
+ from msprobe.core.compare.utils import read_op, merge_tensor, get_un_match_accuracy, get_accuracy
14
+ from msprobe.core.compare.multiprocessing_compute import _handle_multi_process, ComparisonResult, _save_cmp_result
15
+ from msprobe.core.compare.npy_compare import compare_ops_apply, get_error_type, reshape_value, get_relative_err, \
16
+ get_error_message
17
+ from msprobe.core.advisor.advisor import Advisor
18
+
19
+
20
+ class Comparator:
21
+
22
+ def __init__(self):
23
+ pass
24
+
25
+ @classmethod
26
+ def make_result_table(cls,result, md5_compare, summary_compare, stack_mode):
27
+ header = []
28
+ if md5_compare:
29
+ header = CompareConst.MD5_COMPARE_RESULT_HEADER[:]
30
+ elif summary_compare:
31
+ header = CompareConst.SUMMARY_COMPARE_RESULT_HEADER[:]
32
+ else:
33
+ header = CompareConst.COMPARE_RESULT_HEADER[:]
34
+
35
+ all_mode_bool = not (summary_compare or md5_compare)
36
+ if stack_mode:
37
+ if all_mode_bool:
38
+ header.append(CompareConst.STACK)
39
+ header.append(CompareConst.DATA_NAME)
40
+ else:
41
+ header.append(CompareConst.STACK)
42
+ else:
43
+ if all_mode_bool:
44
+ for row in result:
45
+ del row[-2]
46
+ header.append(CompareConst.DATA_NAME)
47
+ else:
48
+ for row in result:
49
+ del row[-1]
50
+ result_df = pd.DataFrame(result, columns=header)
51
+ return result_df
52
+
53
+ @classmethod
54
+ def gen_merge_list(self, json_data, op_name,stack_json_data, summary_compare, md5_compare):
55
+ op_data = json_data['data'][op_name]
56
+ op_parsed_list = read_op(op_data, op_name)
57
+ if op_name in stack_json_data:
58
+ op_parsed_list.append({'full_op_name': op_name, 'full_info': stack_json_data[op_name]})
59
+ else:
60
+ op_parsed_list.append({'full_op_name': op_name, 'full_info': None})
61
+
62
+ merge_list = merge_tensor(op_parsed_list, summary_compare, md5_compare)
63
+ return merge_list
64
+
65
+ def check_op(self, npu_dict, bench_dict, fuzzy_match):
66
+ a_op_name = npu_dict["op_name"]
67
+ b_op_name = bench_dict["op_name"]
68
+ graph_mode = check_graph_mode(a_op_name[0], b_op_name[0])
69
+
70
+ frame_name = getattr(self,"frame_name")
71
+ if frame_name == "PTComparator":
72
+ from msprobe.pytorch.compare.match import graph_mapping
73
+ if graph_mode:
74
+ return graph_mapping.match(a_op_name[0], b_op_name[0])
75
+ struct_match = check_struct_match(npu_dict, bench_dict)
76
+ if not fuzzy_match:
77
+ return a_op_name == b_op_name and struct_match
78
+ is_match = True
79
+ try:
80
+ is_match = fuzzy_check_op(a_op_name, b_op_name)
81
+ except Exception as err:
82
+ logger.warning("%s and %s can not fuzzy match." % (a_op_name, b_op_name))
83
+ is_match = False
84
+ return is_match and struct_match
85
+
86
+ def match_op(self, npu_queue, bench_queue, fuzzy_match):
87
+ for b_index, b_op in enumerate(bench_queue[0: -1]):
88
+ if self.check_op(npu_queue[-1], b_op, fuzzy_match):
89
+ return len(npu_queue) - 1, b_index
90
+ if self.check_op(npu_queue[-1], bench_queue[-1], fuzzy_match):
91
+ return len(npu_queue) - 1, len(bench_queue) - 1
92
+ for n_index, n_op in enumerate(npu_queue[0: -1]):
93
+ if self.check_op(n_op, bench_queue[-1], fuzzy_match):
94
+ return n_index, len(bench_queue) - 1
95
+ return -1, -1
96
+
97
+ def compare_process(self, file_handles, stack_mode, fuzzy_match, summary_compare=False, md5_compare=False):
98
+ npu_json_handle, bench_json_handle, stack_json_handle = file_handles
99
+ npu_json_data = json.load(npu_json_handle)
100
+ bench_json_data = json.load(bench_json_handle)
101
+ stack_json_data = json.load(stack_json_handle)
102
+
103
+ if fuzzy_match:
104
+ logger.warning("This task uses fuzzy matching, which may affect the accuracy of the comparison.")
105
+
106
+ npu_ops_queue = []
107
+ bench_ops_queue = []
108
+ result = []
109
+
110
+ ops_npu_iter = iter(npu_json_data['data'])
111
+ ops_bench_iter = iter(bench_json_data['data'])
112
+ read_err_npu = True
113
+ read_err_bench = True
114
+ last_npu_ops_len = 0
115
+ last_bench_ops_len = 0
116
+
117
+ while True:
118
+ if not read_err_npu and not read_err_bench:
119
+ break
120
+ try:
121
+ last_npu_ops_len = len(npu_ops_queue)
122
+ op_name_npu = next(ops_npu_iter)
123
+ read_err_npu = True
124
+ npu_merge_list = self.gen_merge_list(npu_json_data,op_name_npu,stack_json_data,summary_compare,md5_compare)
125
+ if npu_merge_list:
126
+ npu_ops_queue.append(npu_merge_list)
127
+ except StopIteration:
128
+ read_err_npu = False
129
+ try:
130
+ last_bench_ops_len = len(bench_ops_queue)
131
+ op_name_bench = next(ops_bench_iter)
132
+ bench_merge_list = self.gen_merge_list(bench_json_data,op_name_bench,stack_json_data,summary_compare,md5_compare)
133
+ if bench_merge_list:
134
+ bench_ops_queue.append(bench_merge_list)
135
+ except StopIteration:
136
+ read_err_bench = False
137
+
138
+ # merge all boolean expressions
139
+ both_empty = not npu_ops_queue and not bench_ops_queue
140
+ no_change = (len(npu_ops_queue) == last_npu_ops_len) and (len(bench_ops_queue) == last_bench_ops_len)
141
+ if both_empty or no_change:
142
+ continue
143
+
144
+ # APIs in NPU and Bench models unconsistent judgment
145
+ if bool(npu_ops_queue) ^ bool(bench_ops_queue):
146
+ logger.info("Please check whether the number and calls of APIs in NPU and Bench models are consistent.")
147
+ break
148
+
149
+ n_match_point, b_match_point = self.match_op(npu_ops_queue, bench_ops_queue, fuzzy_match)
150
+ if n_match_point == -1 and b_match_point == -1:
151
+ continue
152
+ n_match_data = npu_ops_queue[n_match_point]
153
+ b_match_data = bench_ops_queue[b_match_point]
154
+ un_match_data = npu_ops_queue[0: n_match_point]
155
+ for npu_data in un_match_data:
156
+ get_un_match_accuracy(result, npu_data, md5_compare, summary_compare)
157
+ get_accuracy(result, n_match_data, b_match_data, summary_compare, md5_compare)
158
+ del npu_ops_queue[0: n_match_point + 1]
159
+ del bench_ops_queue[0: b_match_point + 1]
160
+ if npu_ops_queue:
161
+ for npu_data in npu_ops_queue:
162
+ get_un_match_accuracy(result, npu_data, md5_compare, summary_compare)
163
+
164
+ result_df = self.make_result_table(result, md5_compare, summary_compare, stack_mode)
165
+ return result_df
166
+
167
+ def compare_by_op(self, npu_op_name, bench_op_name, op_name_mapping_dict, input_param):
168
+ npu_bench_name_list = op_name_mapping_dict[npu_op_name]
169
+ data_name = npu_bench_name_list[1]
170
+ error_file, relative_err, error_flag = None, None, False
171
+ if data_name == '-1' or data_name == -1: # 没有真实数据路径
172
+ n_value, b_value = CompareConst.READ_NONE, CompareConst.READ_NONE
173
+ error_flag = True
174
+ else:
175
+ try:
176
+ read_npy_data = getattr(self, "read_npy_data")
177
+ frame_name = getattr(self, "frame_name")
178
+ if frame_name == "MSComparator":
179
+ n_value = read_npy_data(input_param.get("npu_dump_data_dir"), npu_op_name + Const.NUMPY_SUFFIX)
180
+ if self.cross_frame:
181
+ b_value = read_npy_data(input_param.get("bench_dump_data_dir"), bench_op_name + Const.PT_SUFFIX, load_pt_file=True)
182
+ else:
183
+ b_value = read_npy_data(input_param.get("bench_dump_data_dir"), bench_op_name + Const.NUMPY_SUFFIX)
184
+ else:
185
+ n_value = read_npy_data(input_param.get("npu_dump_data_dir"), npu_op_name + Const.PT_SUFFIX)
186
+ b_value = read_npy_data(input_param.get("bench_dump_data_dir"), bench_op_name + Const.PT_SUFFIX)
187
+ except IOError as error:
188
+ error_file = error.filename
189
+ n_value, b_value = CompareConst.READ_NONE, CompareConst.READ_NONE
190
+ error_flag = True
191
+ except FileCheckException:
192
+ error_file = data_name
193
+ n_value, b_value = CompareConst.READ_NONE, CompareConst.READ_NONE
194
+ error_flag = True
195
+
196
+ n_value, b_value, error_flag = get_error_type(n_value, b_value, error_flag)
197
+ if not error_flag:
198
+ relative_err = get_relative_err(n_value, b_value)
199
+ n_value, b_value = reshape_value(n_value, b_value)
200
+
201
+ err_msg = get_error_message(n_value, b_value, npu_op_name, error_flag, error_file=error_file)
202
+ result_list, err_msg = compare_ops_apply(n_value, b_value, error_flag, err_msg, relative_err=relative_err)
203
+
204
+ if npu_op_name != bench_op_name and bench_op_name != CompareConst.N_A:
205
+ err_msg += " Fuzzy matching data, the comparison accuracy may be affected."
206
+ result_list.append(err_msg)
207
+ return result_list
208
+
209
+ def compare_core(self, input_parma, output_path, **kwargs):
210
+ """
211
+ Compares data from multiple JSON files and generates a comparison report.
212
+
213
+ Args:
214
+ input_parma (dict): A dictionary containing paths to JSON files ("npu_path", "bench_path",
215
+ "stack_path").
216
+ output_path (str): The path where the output Excel report will be saved.
217
+ **kwargs: Additional keyword arguments including:
218
+ - stack_mode (bool, optional): Enables stack mode comparison. Defaults to False.
219
+ - auto_analyze (bool, optional): If True, triggers automatic analysis after comparison. Defaults to True.
220
+ - suffix (str, optional): Suffix to append to the output file name. Defaults to ''.
221
+ - fuzzy_match (bool, optional): Enables fuzzy matching during comparison. Defaults to False.
222
+ - summary_compare (bool, optional): Enables summary comparison mode. Defaults to False.
223
+ - md5_compare (bool, optional): Enables MD5 comparison. Defaults to False.
224
+
225
+ Returns:
226
+ """
227
+ # get kwargs or set default value
228
+ stack_mode = kwargs.get('stack_mode', False)
229
+ auto_analyze = kwargs.get('auto_analyze', True)
230
+ suffix = kwargs.get('suffix', '')
231
+ fuzzy_match = kwargs.get('fuzzy_match', False)
232
+ summary_compare = kwargs.get('summary_compare', False)
233
+ md5_compare = kwargs.get('md5_compare', False)
234
+
235
+ logger.info("Please check whether the input data belongs to you. If not, there may be security risks.")
236
+ file_name = add_time_with_xlsx("compare_result" + suffix)
237
+ file_path = os.path.join(os.path.realpath(output_path), file_name)
238
+ remove_path(file_path)
239
+ highlight_dict = {'red_rows': [], 'yellow_rows': []}
240
+
241
+ with FileOpen(input_parma.get("npu_json_path"), "r") as npu_json, \
242
+ FileOpen(input_parma.get("bench_json_path"), "r") as bench_json, \
243
+ FileOpen(input_parma.get("stack_json_path"), "r") as stack_json:
244
+ result_df = self.compare_process([npu_json, bench_json, stack_json], stack_mode, fuzzy_match,
245
+ summary_compare, md5_compare)
246
+
247
+ if not md5_compare and not summary_compare:
248
+ result_df = self._do_multi_process(input_parma, result_df)
249
+ find_compare_result_error_rows(result_df, highlight_dict, summary_compare, md5_compare)
250
+ highlight_rows_xlsx(result_df, highlight_dict, file_path)
251
+ if auto_analyze:
252
+ advisor = Advisor(result_df, output_path)
253
+ advisor.analysis()
254
+
255
+ def compare_ops(self, idx, dump_path_dict, result_df, lock, input_param):
256
+ cos_result = []
257
+ max_err_result = []
258
+ max_relative_err_result = []
259
+ err_mess = []
260
+ one_thousand_err_ratio_result = []
261
+ five_thousand_err_ratio_result = []
262
+ is_print_compare_log = input_param.get("is_print_compare_log")
263
+ for i in range(len(result_df)):
264
+ npu_op_name = result_df.iloc[i, 0]
265
+ bench_op_name = result_df.iloc[i, 1]
266
+ if is_print_compare_log:
267
+ logger.info("start compare: {}".format(npu_op_name))
268
+ cos_sim, max_abs_err, max_relative_err, one_thousand_err_ratio, five_thousand_err_ratio, err_msg = self.compare_by_op(
269
+ npu_op_name, bench_op_name, dump_path_dict, input_param)
270
+ if is_print_compare_log:
271
+ logger.info(
272
+ "[{}] Compare result: cosine {}, max_abs_err {}, max_relative_err {}, {}, one_thousand_err_ratio {}, "
273
+ "five_thousand_err_ratio {}".format(npu_op_name, cos_sim, max_abs_err, max_relative_err, err_msg,
274
+ one_thousand_err_ratio, five_thousand_err_ratio))
275
+ cos_result.append(cos_sim)
276
+ max_err_result.append(max_abs_err)
277
+ max_relative_err_result.append(max_relative_err)
278
+ err_mess.append(err_msg)
279
+ one_thousand_err_ratio_result.append(one_thousand_err_ratio)
280
+ five_thousand_err_ratio_result.append(five_thousand_err_ratio)
281
+
282
+ cr = ComparisonResult(
283
+ cos_result=cos_result,
284
+ max_err_result=max_err_result,
285
+ max_relative_err_result=max_relative_err_result,
286
+ err_msgs=err_mess,
287
+ one_thousand_err_ratio_result=one_thousand_err_ratio_result,
288
+ five_thousand_err_ratio_result=five_thousand_err_ratio_result
289
+ )
290
+
291
+ return _save_cmp_result(idx, cr, result_df, lock)
292
+
293
+ def _do_multi_process(self,input_parma, result_df):
294
+ try:
295
+ result_df = _handle_multi_process(self.compare_ops, input_parma, result_df, multiprocessing.Manager().RLock())
296
+ return result_df
297
+ except ValueError as e:
298
+ logger.error('result dataframe is not found.')
299
+ raise CompareException(CompareException.INVALID_DATA_ERROR) from e
299
300