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,245 +1,314 @@
1
- import os
2
- import inspect
3
- from dataclasses import dataclass
4
- from typing import Tuple, Dict, Optional, Any
5
- import numpy as np
6
- from msprobe.core.common.log import logger
7
- from msprobe.core.common.utils import convert_tuple
8
- from msprobe.core.common.const import Const
9
-
10
-
11
- @dataclass
12
- class ModuleForwardInputsOutputs:
13
- args: Optional[Tuple]
14
- kwargs: Optional[Dict]
15
- output: Any
16
-
17
- @property
18
- def args_tuple(self):
19
- return convert_tuple(self.args)
20
-
21
- @property
22
- def output_tuple(self):
23
- return convert_tuple(self.output)
24
-
25
- def concat_args_and_kwargs(self):
26
- args = self.args + tuple(self.kwargs.values())
27
- return args
28
-
29
-
30
- @dataclass
31
- class ModuleBackwardInputsOutputs:
32
- grad_output: Optional[Tuple]
33
- grad_input: Optional[Tuple]
34
-
35
- @property
36
- def grad_input_tuple(self):
37
- return convert_tuple(self.grad_input)
38
-
39
- @property
40
- def grad_output_tuple(self):
41
- return convert_tuple(self.grad_output)
42
-
43
-
44
- class TensorStatInfo:
45
- def __init__(self, max_val=None, min_val=None, mean_val=None, norm_val=None):
46
- self.max = max_val
47
- self.min = min_val
48
- self.mean = mean_val
49
- self.norm = norm_val
50
-
51
-
52
- class BaseDataProcessor:
53
- _recursive_key_stack = []
54
- special_type = (np.integer, np.floating, np.bool_, np.complexfloating, np.str_, np.byte, np.unicode_,
55
- bool, int, float, str, slice)
56
-
57
- def __init__(self, config, data_writer):
58
- self.data_writer = data_writer
59
- self.config = config
60
- self.api_info_struct = {}
61
- self.stack_info_struct = {}
62
- self.current_api_or_module_name = None
63
- self.api_data_category = None
64
- self.has_overflow = False
65
- self.current_iter = 0
66
- self._return_forward_new_output = False
67
- self._forward_new_output = None
68
-
69
- @property
70
- def data_path(self):
71
- return self.data_writer.dump_tensor_data_dir
72
-
73
- @staticmethod
74
- def analyze_api_call_stack(name):
75
- stack_str = []
76
- for (_, path, line, func, code, _) in inspect.stack()[5:]:
77
- if not code:
78
- continue
79
- stack_line = " ".join([
80
- "File", ", ".join([
81
- path,
82
- " ".join(["line", str(line)]),
83
- " ".join(["in", func]),
84
- " ".join(["\n", code[0].strip()])
85
- ])
86
- ])
87
- stack_str.append(stack_line)
88
- stack_info_struct = {name: stack_str}
89
- return stack_info_struct
90
-
91
- @staticmethod
92
- def _convert_numpy_to_builtin(arg):
93
- type_mapping = {
94
- np.integer: int,
95
- np.floating: float,
96
- np.bool_: bool,
97
- np.complexfloating: complex,
98
- np.str_: str,
99
- np.byte: bytes,
100
- np.unicode_: str
101
- }
102
- for numpy_type, builtin_type in type_mapping.items():
103
- if isinstance(arg, numpy_type):
104
- return builtin_type(arg), type(arg).__name__
105
- return arg, ''
106
-
107
- @staticmethod
108
- def _analyze_numpy(value, numpy_type):
109
- return {"type": numpy_type, "value": value}
110
-
111
- @staticmethod
112
- def _analyze_builtin(arg):
113
- single_arg = {}
114
- if isinstance(arg, slice):
115
- single_arg.update({"type": "slice"})
116
- single_arg.update({"value": [arg.start, arg.stop, arg.step]})
117
- else:
118
- single_arg.update({"type": type(arg).__name__})
119
- single_arg.update({"value": arg})
120
- return single_arg
121
-
122
- @classmethod
123
- def get_special_types(cls):
124
- return cls.special_type
125
-
126
- @classmethod
127
- def recursive_apply_transform(cls, args, transform):
128
- if isinstance(args, cls.get_special_types()):
129
- arg_transform = transform(args, cls._recursive_key_stack)
130
- return arg_transform
131
- elif isinstance(args, (list, tuple)):
132
- result_list = []
133
- for i, arg in enumerate(args):
134
- cls._recursive_key_stack.append(str(i))
135
- result_list.append(cls.recursive_apply_transform(arg, transform))
136
- cls._recursive_key_stack.pop()
137
- return type(args)(result_list)
138
- elif isinstance(args, dict):
139
- resutl_dict = {}
140
- for k, arg in args.items():
141
- cls._recursive_key_stack.append(str(k))
142
- resutl_dict[k] = cls.recursive_apply_transform(arg, transform)
143
- cls._recursive_key_stack.pop()
144
- return resutl_dict
145
- elif args is not None:
146
- logger.warning(f"Data type {type(args)} is not supported.")
147
- return None
148
- else:
149
- return None
150
-
151
- def if_return_forward_new_output(self):
152
- return self._return_forward_new_output
153
-
154
- def get_forward_new_output(self):
155
- self._return_forward_new_output = False
156
- return self._forward_new_output
157
-
158
- def update_iter(self, current_iter):
159
- self.current_iter = current_iter
160
-
161
- def visit_and_clear_overflow_status(self, api_or_module_name):
162
- if self.current_api_or_module_name != api_or_module_name:
163
- self.current_api_or_module_name = api_or_module_name
164
- self.has_overflow = False
165
-
166
- def is_dump_for_data_mode(self, forward_backward, input_output):
167
- """
168
- Compare the parameters with data_mode to determine whether to dump.
169
-
170
- Args:
171
- forward_backward(str): The forward or backward mode to check.
172
- input_output(str): The input or output mode to check.
173
-
174
- Return:
175
- bool: True if the parameters are in data_mode or data_mode is all, False otherwise.
176
- """
177
- return (Const.ALL in self.config.data_mode or
178
- forward_backward in self.config.data_mode or
179
- input_output in self.config.data_mode)
180
-
181
- def analyze_pre_forward(self, name, module,module_input_output: ModuleForwardInputsOutputs):
182
- pass
183
-
184
- def analyze_forward(self, name, module, module_input_output: ModuleForwardInputsOutputs):
185
- api_info_struct = {}
186
- if self.is_dump_for_data_mode(Const.FORWARD, Const.INPUT): # check whether data_mode contains forward or input
187
- api_info_struct[name] = {}
188
- self.api_data_category = Const.INPUT
189
- args_info_list = self.analyze_element(module_input_output.args_tuple)
190
- api_info_struct[name][Const.INPUT_ARGS] = args_info_list
191
- self.api_data_category = Const.KWARGS
192
- kwargs_info_list = self.analyze_element(module_input_output.kwargs)
193
- api_info_struct[name][Const.INPUT_KWARGS] = kwargs_info_list
194
-
195
- if self.is_dump_for_data_mode(Const.FORWARD, Const.OUTPUT): # check whether data_mode contains forward or output
196
- api_info_struct[name] = api_info_struct.get(name, {})
197
- self.api_data_category = Const.OUTPUT
198
- output_info_list = self.analyze_element(module_input_output.output_tuple)
199
- api_info_struct[name][Const.OUTPUT] = output_info_list
200
- return api_info_struct
201
-
202
- def analyze_pre_forward_inplace(self, name, module_input_output: ModuleForwardInputsOutputs):
203
- api_info_struct = {}
204
- if self.is_dump_for_data_mode(Const.FORWARD, Const.INPUT):
205
- api_info_struct[name] = {}
206
- self.api_data_category = Const.INPUT
207
- args_info_list = self.analyze_element(module_input_output.args_tuple)
208
- api_info_struct[name][Const.INPUT_ARGS] = args_info_list
209
- self.api_data_category = Const.KWARGS
210
- kwargs_info_list = self.analyze_element(module_input_output.kwargs)
211
- api_info_struct[name][Const.INPUT_KWARGS] = kwargs_info_list
212
- return api_info_struct
213
-
214
- def analyze_forward_inplace(self, name, module_input_output: ModuleForwardInputsOutputs):
215
- concat_args = module_input_output.concat_args_and_kwargs()
216
- api_info_struct = {}
217
- if self.is_dump_for_data_mode(Const.FORWARD, Const.OUTPUT):
218
- api_info_struct[name] = {}
219
- self.api_data_category = Const.OUTPUT
220
- output_info_list = self.analyze_element(concat_args)
221
- api_info_struct[name][Const.OUTPUT] = output_info_list
222
- return api_info_struct
223
-
224
- def analyze_backward(self, name, module, module_input_output: ModuleBackwardInputsOutputs):
225
- api_info_struct = {}
226
- if self.is_dump_for_data_mode(Const.BACKWARD, Const.OUTPUT):
227
- api_info_struct[name] = {}
228
- self.api_data_category = Const.OUTPUT
229
- input_info_list = self.analyze_element(module_input_output.grad_input_tuple)
230
- api_info_struct[name][Const.GRAD_INPUT] = input_info_list
231
-
232
- if self.is_dump_for_data_mode(Const.BACKWARD, Const.INPUT):
233
- api_info_struct[name] = api_info_struct.get(name, {})
234
- self.api_data_category = Const.INPUT
235
- output_info_list = self.analyze_element(module_input_output.grad_output_tuple)
236
- api_info_struct[name][Const.GRAD_OUTPUT] = output_info_list
237
-
238
- return api_info_struct
239
-
240
- def get_save_file_path(self, suffix):
241
- file_format = "pt" if self.config.framework == Const.PT_FRAMEWORK else "npy"
242
- dump_data_name = (self.current_api_or_module_name + Const.SEP + self.api_data_category + Const.SEP +
243
- suffix + Const.SEP + file_format)
244
- file_path = os.path.join(self.data_writer.dump_tensor_data_dir, dump_data_name)
245
- return dump_data_name, file_path
1
+ import os
2
+ import inspect
3
+ from dataclasses import dataclass
4
+ from typing import Tuple, Dict, Optional, Any
5
+ import numpy as np
6
+ from msprobe.core.common.log import logger
7
+ from msprobe.core.common.utils import convert_tuple
8
+ from msprobe.core.common.const import Const
9
+
10
+
11
+ @dataclass
12
+ class ModuleForwardInputsOutputs:
13
+ args: Optional[Tuple]
14
+ kwargs: Optional[Dict]
15
+ output: Any
16
+
17
+ @property
18
+ def args_tuple(self):
19
+ return convert_tuple(self.args)
20
+
21
+ @property
22
+ def output_tuple(self):
23
+ return convert_tuple(self.output)
24
+
25
+ def concat_args_and_kwargs(self):
26
+ args = self.args + tuple(self.kwargs.values())
27
+ return args
28
+
29
+
30
+ @dataclass
31
+ class ModuleBackwardInputsOutputs:
32
+ grad_output: Optional[Tuple]
33
+ grad_input: Optional[Tuple]
34
+
35
+ @property
36
+ def grad_input_tuple(self):
37
+ return convert_tuple(self.grad_input)
38
+
39
+ @property
40
+ def grad_output_tuple(self):
41
+ return convert_tuple(self.grad_output)
42
+
43
+
44
+ @dataclass
45
+ class ModuleBackwardInputs:
46
+ grad_input: Optional[Tuple]
47
+
48
+ @property
49
+ def grad_input_tuple(self):
50
+ return convert_tuple(self.grad_input)
51
+
52
+
53
+ @dataclass
54
+ class ModuleBackwardOutputs:
55
+ grad_output: Optional[Tuple]
56
+
57
+ @property
58
+ def grad_output_tuple(self):
59
+ return convert_tuple(self.grad_output)
60
+
61
+
62
+ class TensorStatInfo:
63
+ def __init__(self, max_val=None, min_val=None, mean_val=None, norm_val=None):
64
+ self.max = max_val
65
+ self.min = min_val
66
+ self.mean = mean_val
67
+ self.norm = norm_val
68
+
69
+
70
+ class BaseDataProcessor:
71
+ _recursive_key_stack = []
72
+ special_type = (np.integer, np.floating, np.bool_, np.complexfloating, np.str_, np.byte, np.unicode_,
73
+ bool, int, float, str, slice, type(Ellipsis))
74
+
75
+ def __init__(self, config, data_writer):
76
+ self.data_writer = data_writer
77
+ self.config = config
78
+ self.api_info_struct = {}
79
+ self.stack_info_struct = {}
80
+ self.current_api_or_module_name = None
81
+ self.api_data_category = None
82
+ self.current_iter = 0
83
+ self._return_forward_new_output = False
84
+ self._forward_new_output = None
85
+
86
+ @property
87
+ def data_path(self):
88
+ return self.data_writer.dump_tensor_data_dir
89
+
90
+ @property
91
+ def is_terminated(self):
92
+ return False
93
+
94
+ @staticmethod
95
+ def analyze_api_call_stack(name):
96
+ stack_str = []
97
+ for (_, path, line, func, code, _) in inspect.stack()[5:]:
98
+ if not code:
99
+ continue
100
+ stack_line = " ".join([
101
+ "File", ", ".join([
102
+ path,
103
+ " ".join(["line", str(line)]),
104
+ " ".join(["in", func]),
105
+ " ".join(["\n", code[0].strip()])
106
+ ])
107
+ ])
108
+ stack_str.append(stack_line)
109
+ stack_info_struct = {name: stack_str}
110
+ return stack_info_struct
111
+
112
+ @staticmethod
113
+ def transfer_type(data):
114
+ dtype = str(type(data))
115
+ if 'int' in dtype:
116
+ return int(data)
117
+ elif 'float' in dtype:
118
+ return float(data)
119
+ else:
120
+ return data
121
+
122
+ @staticmethod
123
+ def _convert_numpy_to_builtin(arg):
124
+ type_mapping = {
125
+ np.integer: int,
126
+ np.floating: float,
127
+ np.bool_: bool,
128
+ np.complexfloating: complex,
129
+ np.str_: str,
130
+ np.byte: bytes,
131
+ np.unicode_: str
132
+ }
133
+ for numpy_type, builtin_type in type_mapping.items():
134
+ if isinstance(arg, numpy_type):
135
+ return builtin_type(arg), type(arg).__name__
136
+ return arg, ''
137
+
138
+ @staticmethod
139
+ def _analyze_builtin(arg):
140
+ single_arg = {}
141
+ if isinstance(arg, slice):
142
+ # The slice parameter may be of the tensor, numpy or other types.
143
+ # It needs to be converted to the Python value type before JSON serialization
144
+ single_arg.update({"type": "slice"})
145
+ values = []
146
+ for value in [arg.start, arg.stop, arg.step]:
147
+ if value is not None:
148
+ try:
149
+ value = int(value)
150
+ except ValueError:
151
+ logger.warning(f"The data type {type(value)} cannot be converted to int type.")
152
+ value = None
153
+ values.append(value)
154
+ single_arg.update({"value": values})
155
+ else:
156
+ single_arg.update({"type": type(arg).__name__})
157
+ # When arg is Ellipsis(...) type, it needs to be converted to str("...") type
158
+ single_arg.update({"value": arg if arg is not Ellipsis else "..."})
159
+ return single_arg
160
+
161
+ @staticmethod
162
+ def _analyze_numpy(value, numpy_type):
163
+ return {"type": numpy_type, "value": value}
164
+
165
+ @classmethod
166
+ def get_special_types(cls):
167
+ return cls.special_type
168
+
169
+ @classmethod
170
+ def recursive_apply_transform(cls, args, transform):
171
+ if isinstance(args, cls.get_special_types()):
172
+ arg_transform = transform(args, cls._recursive_key_stack)
173
+ return arg_transform
174
+ elif isinstance(args, (list, tuple)):
175
+ result_list = []
176
+ for i, arg in enumerate(args):
177
+ cls._recursive_key_stack.append(str(i))
178
+ result_list.append(cls.recursive_apply_transform(arg, transform))
179
+ cls._recursive_key_stack.pop()
180
+ return type(args)(result_list)
181
+ elif isinstance(args, dict):
182
+ result_dict = {}
183
+ for k, arg in args.items():
184
+ cls._recursive_key_stack.append(str(k))
185
+ result_dict[k] = cls.recursive_apply_transform(arg, transform)
186
+ cls._recursive_key_stack.pop()
187
+ return result_dict
188
+ elif args is not None:
189
+ logger.warning(f"Data type {type(args)} is not supported.")
190
+ return None
191
+ else:
192
+ return None
193
+
194
+ def if_return_forward_new_output(self):
195
+ return self._return_forward_new_output
196
+
197
+ def get_forward_new_output(self):
198
+ self._return_forward_new_output = False
199
+ return self._forward_new_output
200
+
201
+ def update_iter(self, current_iter):
202
+ self.current_iter = current_iter
203
+
204
+ def update_api_or_module_name(self, api_or_module_name):
205
+ if self.current_api_or_module_name != api_or_module_name:
206
+ self.current_api_or_module_name = api_or_module_name
207
+
208
+ def is_dump_for_data_mode(self, forward_backward, input_output):
209
+ """
210
+ Compare the parameters with data_mode to determine whether to dump.
211
+
212
+ Args:
213
+ forward_backward(str): The forward or backward mode to check.
214
+ input_output(str): The input or output mode to check.
215
+
216
+ Return:
217
+ bool: True if the parameters are in data_mode or data_mode is all, False otherwise.
218
+ """
219
+ return (Const.ALL in self.config.data_mode or
220
+ forward_backward in self.config.data_mode or
221
+ input_output in self.config.data_mode)
222
+
223
+ def analyze_pre_forward(self, name, module, module_input_output: ModuleForwardInputsOutputs):
224
+ pass
225
+
226
+ def analyze_element(self, element):
227
+ return self.recursive_apply_transform(element, self.analyze_single_element)
228
+
229
+ def analyze_forward(self, name, module, module_input_output: ModuleForwardInputsOutputs):
230
+ api_info_struct = {}
231
+ # check whether data_mode contains forward or input
232
+ if self.is_dump_for_data_mode(Const.FORWARD, Const.INPUT):
233
+ api_info_struct[name] = {}
234
+ self.api_data_category = Const.INPUT
235
+ args_info_list = self.analyze_element(module_input_output.args_tuple)
236
+ api_info_struct[name][Const.INPUT_ARGS] = args_info_list
237
+ self.api_data_category = Const.KWARGS
238
+ kwargs_info_list = self.analyze_element(module_input_output.kwargs)
239
+ api_info_struct[name][Const.INPUT_KWARGS] = kwargs_info_list
240
+
241
+ # check whether data_mode contains forward or output
242
+ if self.is_dump_for_data_mode(Const.FORWARD, Const.OUTPUT):
243
+ api_info_struct[name] = api_info_struct.get(name, {})
244
+ self.api_data_category = Const.OUTPUT
245
+ output_info_list = self.analyze_element(module_input_output.output_tuple)
246
+ api_info_struct[name][Const.OUTPUT] = output_info_list
247
+ return api_info_struct
248
+
249
+ def analyze_pre_forward_inplace(self, name, module_input_output: ModuleForwardInputsOutputs):
250
+ api_info_struct = {}
251
+ if self.is_dump_for_data_mode(Const.FORWARD, Const.INPUT):
252
+ api_info_struct[name] = {}
253
+ self.api_data_category = Const.INPUT
254
+ args_info_list = self.analyze_element(module_input_output.args_tuple)
255
+ api_info_struct[name][Const.INPUT_ARGS] = args_info_list
256
+ self.api_data_category = Const.KWARGS
257
+ kwargs_info_list = self.analyze_element(module_input_output.kwargs)
258
+ api_info_struct[name][Const.INPUT_KWARGS] = kwargs_info_list
259
+ return api_info_struct
260
+
261
+ def analyze_forward_inplace(self, name, module_input_output: ModuleForwardInputsOutputs):
262
+ concat_args = module_input_output.concat_args_and_kwargs()
263
+ api_info_struct = {}
264
+ if self.is_dump_for_data_mode(Const.FORWARD, Const.OUTPUT):
265
+ api_info_struct[name] = {}
266
+ self.api_data_category = Const.OUTPUT
267
+ output_info_list = self.analyze_element(concat_args)
268
+ api_info_struct[name][Const.OUTPUT] = output_info_list
269
+ return api_info_struct
270
+
271
+ def analyze_backward(self, name, module, module_input_output: ModuleBackwardInputsOutputs):
272
+ api_info_struct = {}
273
+ if self.is_dump_for_data_mode(Const.BACKWARD, Const.INPUT):
274
+ api_info_struct[name] = {}
275
+ self.api_data_category = Const.INPUT
276
+ input_info_list = self.analyze_element(module_input_output.grad_input_tuple)
277
+ api_info_struct[name][Const.INPUT] = input_info_list
278
+
279
+ if self.is_dump_for_data_mode(Const.BACKWARD, Const.OUTPUT):
280
+ api_info_struct[name] = api_info_struct.get(name, {})
281
+ self.api_data_category = Const.OUTPUT
282
+ output_info_list = self.analyze_element(module_input_output.grad_output_tuple)
283
+ api_info_struct[name][Const.OUTPUT] = output_info_list
284
+
285
+ return api_info_struct
286
+
287
+ def analyze_backward_input(self, name, module,
288
+ module_input_output: ModuleBackwardInputs):
289
+ api_info_struct = {}
290
+ if self.is_dump_for_data_mode(Const.BACKWARD, Const.INPUT):
291
+ api_info_struct[name] = {}
292
+ self.api_data_category = Const.INPUT
293
+
294
+ input_info_list = self.analyze_element(module_input_output.grad_input_tuple)
295
+ api_info_struct[name][Const.INPUT] = input_info_list
296
+ return api_info_struct
297
+
298
+ def analyze_backward_output(self, name, module,
299
+ module_input_output: ModuleBackwardOutputs):
300
+ api_info_struct = {}
301
+ if self.is_dump_for_data_mode(Const.BACKWARD, Const.OUTPUT):
302
+ api_info_struct[name] = {}
303
+ self.api_data_category = Const.OUTPUT
304
+
305
+ output_info_list = self.analyze_element(module_input_output.grad_output_tuple)
306
+ api_info_struct[name][Const.OUTPUT] = output_info_list
307
+ return api_info_struct
308
+
309
+ def get_save_file_path(self, suffix):
310
+ file_format = Const.PT_SUFFIX if self.config.framework == Const.PT_FRAMEWORK else Const.NUMPY_SUFFIX
311
+ dump_data_name = (self.current_api_or_module_name + Const.SEP + self.api_data_category + Const.SEP +
312
+ suffix + file_format)
313
+ file_path = os.path.join(self.data_writer.dump_tensor_data_dir, dump_data_name)
314
+ return dump_data_name, file_path