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,224 +1,305 @@
1
- #!/usr/bin/env python3
2
- # -*- coding: utf-8 -*-
3
- """
4
- # Copyright (C) 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 random
19
- import stat
20
- import torch
21
- import numpy as np
22
- from functools import wraps
23
- from msprobe.core.common.exceptions import DistributedNotInitializedError
24
-
25
- try:
26
- import torch_npu
27
- except ImportError:
28
- is_gpu = True
29
- else:
30
- is_gpu = False
31
-
32
-
33
- torch_without_guard_version_list = ['2.1', '2.2']
34
- for version in torch_without_guard_version_list:
35
- if torch.__version__.startswith(version):
36
- torch_without_guard_version = True
37
- break
38
- else:
39
- torch_without_guard_version = False
40
-
41
- if not is_gpu and not torch_without_guard_version:
42
- from torch_npu.utils.device_guard import torch_device_guard as torch_npu_device_guard
43
-
44
- npu_distributed_api = ['isend', 'irecv']
45
-
46
-
47
- def parameter_adapter(func):
48
-
49
- def handle_masked_select(input_tensor, indices):
50
- masked_select_func = getattr(torch._C._VariableFunctionsClass, "masked_select")
51
- if input_tensor.dtype == torch.bfloat16:
52
- # masked_select在NPU上输入数据dtype类型为bfloat16会报错,提示不支持此类型
53
- return masked_select_func(input_tensor.to(torch.float32), indices).to(torch.bfloat16)
54
- else:
55
- return masked_select_func(input_tensor, indices)
56
-
57
- @wraps(func)
58
- def inner(self, *args, **kwargs):
59
- if self.op_name_ == "__getitem__" and len(args) > 1 and isinstance(args[1], torch.Tensor):
60
- input_tensor = args[0]
61
- indices = args[1]
62
- if indices.dtype == torch.uint8:
63
- indices = indices.bool()
64
- if indices.dtype == torch.bool:
65
- if indices.shape == input_tensor.shape:
66
- return handle_masked_select(input_tensor, indices)
67
- else:
68
- indices = getattr(torch._C._VariableFunctionsClass, "nonzero")(indices, as_tuple=True)
69
- return getattr(torch._C._TensorBase, "__getitem__")(input_tensor, indices)
70
- elif indices.dtype != torch.bool:
71
- if not indices.shape or len(indices.shape) == 1:
72
- return func(self, input_tensor, indices.tolist())
73
- elif len(indices.shape) == 2:
74
- result = [func(self, input_tensor, index) for index in indices.tolist()]
75
- return getattr(torch._C._VariableFunctionsClass, "stack")(result, 0)
76
- else:
77
- res = [input_tensor[tensor_index] for tensor_index in indices]
78
- return getattr(torch._C._VariableFunctionsClass, "stack")(res, 0)
79
- if self.op_name_ == "__eq__" and args[1] is None:
80
- return False
81
- return func(self, *args, **kwargs)
82
- return inner
83
-
84
-
85
- def torch_device_guard(func):
86
- if is_gpu or torch_without_guard_version:
87
- return func
88
- # Parse args/kwargs matched torch.device objects
89
-
90
- @torch_npu_device_guard
91
- def wrapper(*args, **kwargs):
92
- return func(*args, **kwargs)
93
- return wrapper
94
-
95
-
96
- def get_rank_if_initialized():
97
- """
98
- return rank id if it is initialized or raise Exception: DistributedNotInitializedError
99
- """
100
- if torch.distributed.is_initialized():
101
- return torch.distributed.get_rank()
102
- else:
103
- raise DistributedNotInitializedError("torch distributed environment is not initialized")
104
-
105
-
106
- def seed_all(seed=1234, mode=False):
107
- random.seed(seed)
108
- os.environ['PYTHONHASHSEED'] = str(seed)
109
- np.random.seed(seed)
110
- torch.manual_seed(seed)
111
- torch.use_deterministic_algorithms(mode)
112
- if is_gpu:
113
- torch.cuda.manual_seed_all(seed)
114
- torch.cuda.manual_seed(seed)
115
- torch.backends.cudnn.deterministic = True
116
- torch.backends.cudnn.enable = False
117
- torch.backends.cudnn.benchmark = False
118
- else:
119
- torch_npu.npu.manual_seed_all(seed)
120
- torch_npu.npu.manual_seed(seed)
121
-
122
-
123
- class Const:
124
- """
125
- Class for const
126
- """
127
- SEP = "."
128
- MODEL_TYPE = ['.onnx', '.pb', '.om']
129
- DIM_PATTERN = r"^(-?[0-9]+)(,-?[0-9]+)*"
130
- SEMICOLON = ";"
131
- COLON = ":"
132
- EQUAL = "="
133
- COMMA = ","
134
- DOT = "."
135
- DUMP_RATIO_MAX = 100
136
- SUMMERY_DATA_NUMS = 256
137
- FLOAT_EPSILON = np.finfo(float).eps
138
- SUPPORT_DUMP_MODE = ['api', 'acl']
139
- ON = 'ON'
140
- OFF = 'OFF'
141
- KWARGS = 'kwargs'
142
- INPUT = 'input'
143
- OUTPUT = 'output'
144
- BACKWARD = 'backward'
145
- FORWARD = 'forward'
146
- PRE_FORWARD = "pre_forward"
147
- INPUT_ARGS = 'input_args'
148
- INPUT_KWARGS = 'input_kwargs'
149
- GRAD_INPUT = 'grad_input'
150
- GRAD_OUTPUT = 'grad_output'
151
- START = "start"
152
- STOP = "stop"
153
- MAX = 'Max'
154
- MIN = 'Min'
155
-
156
- # dump mode
157
- ALL = "all"
158
- LIST = "list"
159
- RANGE = "range"
160
- STACK = "stack"
161
- ACL = "acl"
162
- API_LIST = "api_list"
163
- API_STACK = "api_stack"
164
- DUMP_MODE = [ALL, LIST, RANGE, STACK, ACL, API_LIST, API_STACK]
165
- AUTO = "auto"
166
- ONLINE_DUMP_MODE = [ALL, LIST, AUTO, OFF]
167
- SUMMARY = "summary"
168
- MD5 = "md5"
169
- SUMMARY_MODE = [ALL, SUMMARY, MD5]
170
-
171
- WRITE_FLAGS = os.O_WRONLY | os.O_CREAT
172
- OVERWRITE_FLAGS = os.O_WRONLY | os.O_CREAT | os.O_TRUNC
173
- WRITE_MODES = stat.S_IWUSR | stat.S_IRUSR
174
-
175
- PKL_SUFFIX = ".pkl"
176
- NUMPY_SUFFIX = ".npy"
177
- ONE_GB = 1 * 1024 * 1024 * 1024
178
- TEN_GB = 10 * 1024 * 1024 * 1024
179
- FILE_PATTERN = r'^[a-zA-Z0-9_./-]+$'
180
- FILE_NAME_LENGTH = 255
181
- DIRECTORY_LENGTH = 4096
182
- DISTRIBUTED_PREFIX_LENGTH = 60
183
- SUMMARY_COLUMN_NUM = 6
184
- STACK_COLUMN_NUM = 2
185
- # env dump path
186
- ASCEND_WORK_PATH = "ASCEND_WORK_PATH"
187
- DUMP_DIR = "dump_data"
188
- DATA = "data"
189
-
190
- ENV_ENABLE = "1"
191
- ENV_DISABLE = "0"
192
-
193
- MAX_SEED_VALUE = 2**32 - 1
194
-
195
- INPLACE_LIST = ["broadcast", "all_reduce", "reduce", "all_gather", "gather", "scatter", "reduce_scatter",
196
- "_reduce_scatter_base", "_all_gather_base", "all_to_all_single"]
197
-
198
- TASK_LIST = ["tensor", "statistics", "overflow_check", "free_benchmark"]
199
- LEVEL_LIST = ["L0", "L1", "L2", "mix"]
200
- STATISTICS = "statistics"
201
- TENSOR = "tensor"
202
- OVERFLOW_CHECK = "overflow_check"
203
- FREE_BENCHMARK = "free_benchmark"
204
-
205
- ATTR_NAME_PREFIX = "wrap_"
206
-
207
- FLOAT_TYPE = [np.half, np.single, float, np.double, np.float64, np.longdouble, np.float32, np.float16]
208
- BOOL_TYPE = [bool, np.uint8]
209
- INT_TYPE = [np.int32, np.int64]
210
- NPU = 'NPU'
211
- DISTRIBUTED = 'Distributed'
212
-
213
- RAISE_PRECISION = {
214
- torch.float16: torch.float32,
215
- torch.bfloat16: torch.float32,
216
- torch.float32: torch.float64
217
- }
218
- CONVERT = {
219
- "int32_to_int64": ["torch.int32", "torch.int64"],
220
- }
221
-
222
- CONVERT_API = {
223
- "int32_to_int64": ["cross_entropy"]
224
- }
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ """
4
+ # Copyright (C) 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 io
18
+ import os
19
+ import random
20
+ import stat
21
+ import torch
22
+ import torch.distributed as dist
23
+ import numpy as np
24
+ from functools import wraps
25
+ from msprobe.core.common.exceptions import DistributedNotInitializedError
26
+ from msprobe.core.common.log import logger
27
+ from msprobe.core.common.file_utils import (FileCheckConst, change_mode,
28
+ check_file_or_directory_path, check_path_before_create)
29
+
30
+
31
+ try:
32
+ import torch_npu
33
+ except ImportError:
34
+ is_gpu = True
35
+ else:
36
+ is_gpu = False
37
+
38
+
39
+ torch_without_guard_version = torch.__version__ >= '2.1'
40
+
41
+
42
+ if not is_gpu and not torch_without_guard_version:
43
+ from torch_npu.utils.device_guard import torch_device_guard as torch_npu_device_guard
44
+
45
+ npu_distributed_api = ['isend', 'irecv']
46
+
47
+
48
+ def parameter_adapter(func):
49
+
50
+ def handle_masked_select(input_tensor, indices):
51
+ masked_select_func = getattr(torch._C._VariableFunctionsClass, "masked_select")
52
+ if input_tensor.dtype == torch.bfloat16:
53
+ # masked_select在NPU上输入数据dtype类型为bfloat16会报错,提示不支持此类型
54
+ return masked_select_func(input_tensor.to(torch.float32), indices).to(torch.bfloat16)
55
+ else:
56
+ return masked_select_func(input_tensor, indices)
57
+
58
+ @wraps(func)
59
+ def inner(self, *args, **kwargs):
60
+ if self.op_name_ == "__getitem__" and len(args) > 1 and isinstance(args[1], torch.Tensor):
61
+ input_tensor = args[0]
62
+ indices = args[1]
63
+ if indices.dtype == torch.uint8:
64
+ indices = indices.bool()
65
+ if indices.dtype == torch.bool:
66
+ if indices.shape == input_tensor.shape:
67
+ return handle_masked_select(input_tensor, indices)
68
+ else:
69
+ indices = getattr(torch._C._VariableFunctionsClass, "nonzero")(indices, as_tuple=True)
70
+ return getattr(torch._C._TensorBase, "__getitem__")(input_tensor, indices)
71
+ elif indices.dtype != torch.bool:
72
+ if not indices.shape or len(indices.shape) == 1:
73
+ return func(self, input_tensor, indices.tolist())
74
+ elif len(indices.shape) == 2:
75
+ result = [func(self, input_tensor, index) for index in indices.tolist()]
76
+ return getattr(torch._C._VariableFunctionsClass, "stack")(result, 0)
77
+ else:
78
+ res = [input_tensor[tensor_index] for tensor_index in indices]
79
+ return getattr(torch._C._VariableFunctionsClass, "stack")(res, 0)
80
+ if self.op_name_ == "__eq__" and args[1] is None:
81
+ return False
82
+ return func(self, *args, **kwargs)
83
+ return inner
84
+
85
+
86
+ def torch_device_guard(func):
87
+ if is_gpu or torch_without_guard_version:
88
+ return func
89
+ # Parse args/kwargs matched torch.device objects
90
+
91
+ @torch_npu_device_guard
92
+ def wrapper(*args, **kwargs):
93
+ return func(*args, **kwargs)
94
+ return wrapper
95
+
96
+
97
+ def get_rank_if_initialized():
98
+ """
99
+ return rank id if it is initialized or raise Exception: DistributedNotInitializedError
100
+ """
101
+ if torch.distributed.is_initialized():
102
+ return torch.distributed.get_rank()
103
+ else:
104
+ raise DistributedNotInitializedError("torch distributed environment is not initialized")
105
+
106
+
107
+ def seed_all(seed=1234, mode=False):
108
+ random.seed(seed)
109
+ os.environ['PYTHONHASHSEED'] = str(seed)
110
+ np.random.seed(seed)
111
+ torch.manual_seed(seed)
112
+ torch.use_deterministic_algorithms(mode)
113
+ if is_gpu:
114
+ torch.cuda.manual_seed_all(seed)
115
+ torch.cuda.manual_seed(seed)
116
+ torch.backends.cudnn.deterministic = True
117
+ torch.backends.cudnn.enable = False
118
+ torch.backends.cudnn.benchmark = False
119
+ else:
120
+ torch_npu.npu.manual_seed_all(seed)
121
+ torch_npu.npu.manual_seed(seed)
122
+
123
+
124
+ class Const:
125
+ """
126
+ Class for const
127
+ """
128
+ SEP = "."
129
+ MODEL_TYPE = ['.onnx', '.pb', '.om']
130
+ DIM_PATTERN = r"^(-?[0-9]+)(,-?[0-9]+)*"
131
+ SEMICOLON = ";"
132
+ COLON = ":"
133
+ EQUAL = "="
134
+ COMMA = ","
135
+ DOT = "."
136
+ DUMP_RATIO_MAX = 100
137
+ SUMMERY_DATA_NUMS = 256
138
+ FLOAT_EPSILON = np.finfo(float).eps
139
+ SUPPORT_DUMP_MODE = ['api', 'acl']
140
+ ON = 'ON'
141
+ OFF = 'OFF'
142
+ KWARGS = 'kwargs'
143
+ INPUT = 'input'
144
+ OUTPUT = 'output'
145
+ BACKWARD = 'backward'
146
+ FORWARD = 'forward'
147
+ PRE_FORWARD = "pre_forward"
148
+ INPUT_ARGS = 'input_args'
149
+ INPUT_KWARGS = 'input_kwargs'
150
+ GRAD_INPUT = 'grad_input'
151
+ GRAD_OUTPUT = 'grad_output'
152
+ START = "start"
153
+ STOP = "stop"
154
+ MAX = 'Max'
155
+ MIN = 'Min'
156
+
157
+ # dump mode
158
+ ALL = "all"
159
+ LIST = "list"
160
+ RANGE = "range"
161
+ STACK = "stack"
162
+ ACL = "acl"
163
+ API_LIST = "api_list"
164
+ API_STACK = "api_stack"
165
+ DUMP_MODE = [ALL, LIST, RANGE, STACK, ACL, API_LIST, API_STACK]
166
+ AUTO = "auto"
167
+ ONLINE_DUMP_MODE = [ALL, LIST, AUTO, OFF]
168
+ SUMMARY = "summary"
169
+ MD5 = "md5"
170
+ SUMMARY_MODE = [ALL, SUMMARY, MD5]
171
+
172
+ WRITE_FLAGS = os.O_WRONLY | os.O_CREAT
173
+ OVERWRITE_FLAGS = os.O_WRONLY | os.O_CREAT | os.O_TRUNC
174
+ WRITE_MODES = stat.S_IWUSR | stat.S_IRUSR
175
+
176
+ PKL_SUFFIX = ".pkl"
177
+ NUMPY_SUFFIX = ".npy"
178
+ ONE_GB = 1 * 1024 * 1024 * 1024
179
+ TEN_GB = 10 * 1024 * 1024 * 1024
180
+ FILE_PATTERN = r'^[a-zA-Z0-9_./-]+$'
181
+ FILE_NAME_LENGTH = 255
182
+ DIRECTORY_LENGTH = 4096
183
+ DISTRIBUTED_PREFIX_LENGTH = 60
184
+ SUMMARY_COLUMN_NUM = 6
185
+ STACK_COLUMN_NUM = 2
186
+ # env dump path
187
+ ASCEND_WORK_PATH = "ASCEND_WORK_PATH"
188
+ DUMP_DIR = "dump_data"
189
+ DATA = "data"
190
+
191
+ ENV_ENABLE = "1"
192
+ ENV_DISABLE = "0"
193
+
194
+ MAX_SEED_VALUE = 2**32 - 1
195
+
196
+ INPLACE_LIST = ["broadcast", "all_reduce", "reduce", "all_gather", "gather", "scatter", "reduce_scatter",
197
+ "_reduce_scatter_base", "_all_gather_base", "all_to_all_single"]
198
+
199
+ TASK_LIST = ["tensor", "statistics", "overflow_check", "free_benchmark"]
200
+ LEVEL_LIST = ["L0", "L1", "L2", "mix"]
201
+ STATISTICS = "statistics"
202
+ TENSOR = "tensor"
203
+ OVERFLOW_CHECK = "overflow_check"
204
+ FREE_BENCHMARK = "free_benchmark"
205
+
206
+ ATTR_NAME_PREFIX = "wrap_"
207
+
208
+ FLOAT_TYPE = [np.half, np.single, float, np.double, np.float64, np.longdouble, np.float32, np.float16]
209
+ BOOL_TYPE = [bool, np.uint8]
210
+ INT_TYPE = [np.int32, np.int64]
211
+ NPU = 'NPU'
212
+ DISTRIBUTED = 'Distributed'
213
+
214
+ RAISE_PRECISION = {
215
+ torch.float16: torch.float32,
216
+ torch.bfloat16: torch.float32,
217
+ torch.float32: torch.float64
218
+ }
219
+ CONVERT = {
220
+ "int32_to_int64": ["torch.int32", "torch.int64"],
221
+ }
222
+
223
+ CONVERT_API = {
224
+ "int32_to_int64": ["cross_entropy"]
225
+ }
226
+
227
+
228
+ def get_tensor_rank(in_feat, out_feat):
229
+ if dist.is_initialized():
230
+ return dist.get_rank()
231
+
232
+ def get_tensor_rank_single(x):
233
+ if isinstance(x, (list, tuple)):
234
+ if len(x) > 0:
235
+ return get_tensor_rank_single(x[0])
236
+ elif isinstance(x, torch.Tensor):
237
+ device = x.device
238
+ if device.type != 'cpu':
239
+ return device.index
240
+ return None
241
+
242
+ in_rank = get_tensor_rank_single(in_feat)
243
+ out_rank = get_tensor_rank_single(out_feat)
244
+ tensor_rank = in_rank if in_rank else out_rank
245
+ return tensor_rank
246
+
247
+
248
+ def get_rank_id():
249
+ if torch.distributed.is_initialized():
250
+ return torch.distributed.get_rank()
251
+ return 0
252
+
253
+
254
+ def print_rank_0(message):
255
+ if dist.is_initialized():
256
+ if dist.get_rank() == 0:
257
+ logger.info(message)
258
+ else:
259
+ logger.info(message)
260
+
261
+
262
+ def load_pt(pt_path, to_cpu=False):
263
+ pt_path = os.path.realpath(pt_path)
264
+ check_file_or_directory_path(pt_path)
265
+ try:
266
+ if to_cpu:
267
+ pt = torch.load(pt_path, map_location=torch.device("cpu"))
268
+ else:
269
+ pt = torch.load(pt_path)
270
+ except Exception as e:
271
+ raise RuntimeError(f"load pt file {pt_path} failed") from e
272
+ return pt
273
+
274
+
275
+ def save_pt(tensor, filepath):
276
+ filepath = os.path.realpath(filepath)
277
+ check_path_before_create(filepath)
278
+ try:
279
+ torch.save(tensor, filepath)
280
+ except Exception as e:
281
+ logger.error("Save pt file failed, please check according possible error causes: "
282
+ "1. out of disk space or disk error, "
283
+ "2. no permission to write files, etc.")
284
+ raise RuntimeError(f"save pt file {filepath} failed") from e
285
+ change_mode(filepath, FileCheckConst.DATA_FILE_AUTHORITY)
286
+
287
+
288
+ def save_api_data(api_data):
289
+ """Save data to io stream"""
290
+ try:
291
+ io_buff = io.BytesIO()
292
+ torch.save(api_data, io_buff)
293
+ except Exception as e:
294
+ raise RuntimeError(f"save api_data to io_buff failed") from e
295
+ return io_buff
296
+
297
+
298
+ def load_api_data(api_data_bytes):
299
+ """Load data from bytes stream"""
300
+ try:
301
+ buffer = io.BytesIO(api_data_bytes)
302
+ buffer = torch.load(buffer, map_location="cpu")
303
+ except Exception as e:
304
+ raise RuntimeError(f"load api_data from bytes failed") from e
305
+ return buffer