mindstudio-probe 1.0.1__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 (228) hide show
  1. mindstudio_probe-1.0.1.dist-info/LICENSE +201 -0
  2. mindstudio_probe-1.0.1.dist-info/METADATA +30 -0
  3. mindstudio_probe-1.0.1.dist-info/RECORD +228 -0
  4. mindstudio_probe-1.0.1.dist-info/WHEEL +5 -0
  5. mindstudio_probe-1.0.1.dist-info/entry_points.txt +2 -0
  6. mindstudio_probe-1.0.1.dist-info/top_level.txt +1 -0
  7. msprobe/README.md +182 -0
  8. msprobe/__init__.py +0 -0
  9. msprobe/config/README.md +397 -0
  10. msprobe/config/config.json +28 -0
  11. msprobe/config/img/free_benchmark.png +0 -0
  12. msprobe/core/common/const.py +241 -0
  13. msprobe/core/common/exceptions.py +88 -0
  14. msprobe/core/common/file_check.py +265 -0
  15. msprobe/core/common/log.py +55 -0
  16. msprobe/core/common/utils.py +516 -0
  17. msprobe/core/common_config.py +58 -0
  18. msprobe/core/data_dump/data_collector.py +140 -0
  19. msprobe/core/data_dump/data_processor/base.py +245 -0
  20. msprobe/core/data_dump/data_processor/factory.py +61 -0
  21. msprobe/core/data_dump/data_processor/pytorch_processor.py +346 -0
  22. msprobe/core/data_dump/json_writer.py +116 -0
  23. msprobe/core/data_dump/scope.py +178 -0
  24. msprobe/mindspore/__init__.py +1 -0
  25. msprobe/mindspore/debugger/__init__.py +0 -0
  26. msprobe/mindspore/debugger/debugger_config.py +51 -0
  27. msprobe/mindspore/debugger/precision_debugger.py +32 -0
  28. msprobe/mindspore/doc/dump.md +65 -0
  29. msprobe/mindspore/dump/__init__.py +0 -0
  30. msprobe/mindspore/dump/api_kbk_dump.py +55 -0
  31. msprobe/mindspore/dump/dump_tool_factory.py +38 -0
  32. msprobe/mindspore/dump/kernel_graph_dump.py +60 -0
  33. msprobe/mindspore/ms_config.py +78 -0
  34. msprobe/mindspore/overflow_check/__init__.py +0 -0
  35. msprobe/mindspore/overflow_check/kernel_graph_overflow_check.py +45 -0
  36. msprobe/mindspore/overflow_check/overflow_check_tool_factory.py +32 -0
  37. msprobe/mindspore/task_handler_factory.py +21 -0
  38. msprobe/msprobe.py +67 -0
  39. msprobe/pytorch/__init__.py +4 -0
  40. msprobe/pytorch/advisor/advisor.py +124 -0
  41. msprobe/pytorch/advisor/advisor_const.py +59 -0
  42. msprobe/pytorch/advisor/advisor_result.py +58 -0
  43. msprobe/pytorch/api_accuracy_checker/.keep +0 -0
  44. msprobe/pytorch/api_accuracy_checker/__init__.py +0 -0
  45. msprobe/pytorch/api_accuracy_checker/common/.keep +0 -0
  46. msprobe/pytorch/api_accuracy_checker/common/__init__.py +0 -0
  47. msprobe/pytorch/api_accuracy_checker/common/config.py +50 -0
  48. msprobe/pytorch/api_accuracy_checker/common/utils.py +224 -0
  49. msprobe/pytorch/api_accuracy_checker/compare/__init__.py +0 -0
  50. msprobe/pytorch/api_accuracy_checker/compare/algorithm.py +216 -0
  51. msprobe/pytorch/api_accuracy_checker/compare/api_precision_compare.py +545 -0
  52. msprobe/pytorch/api_accuracy_checker/compare/api_precision_standard.yaml +133 -0
  53. msprobe/pytorch/api_accuracy_checker/compare/api_precision_threshold.yaml +390 -0
  54. msprobe/pytorch/api_accuracy_checker/compare/compare.py +345 -0
  55. msprobe/pytorch/api_accuracy_checker/compare/compare_column.py +74 -0
  56. msprobe/pytorch/api_accuracy_checker/compare/compare_utils.py +249 -0
  57. msprobe/pytorch/api_accuracy_checker/config.yaml +4 -0
  58. msprobe/pytorch/api_accuracy_checker/run_ut/.keep +0 -0
  59. msprobe/pytorch/api_accuracy_checker/run_ut/__init__.py +0 -0
  60. msprobe/pytorch/api_accuracy_checker/run_ut/data_generate.py +328 -0
  61. msprobe/pytorch/api_accuracy_checker/run_ut/multi_run_ut.py +203 -0
  62. msprobe/pytorch/api_accuracy_checker/run_ut/run_overflow_check.py +127 -0
  63. msprobe/pytorch/api_accuracy_checker/run_ut/run_ut.py +493 -0
  64. msprobe/pytorch/api_accuracy_checker/run_ut/run_ut_utils.py +7 -0
  65. msprobe/pytorch/api_accuracy_checker/run_ut/torch_ut_setting.json +5 -0
  66. msprobe/pytorch/common/__init__.py +2 -0
  67. msprobe/pytorch/common/compare_script.template +14 -0
  68. msprobe/pytorch/common/log.py +32 -0
  69. msprobe/pytorch/common/parse_json.py +37 -0
  70. msprobe/pytorch/common/utils.py +224 -0
  71. msprobe/pytorch/compare/acc_compare.py +1024 -0
  72. msprobe/pytorch/compare/distributed_compare.py +111 -0
  73. msprobe/pytorch/compare/highlight.py +100 -0
  74. msprobe/pytorch/compare/mapping.yaml +607 -0
  75. msprobe/pytorch/compare/match.py +36 -0
  76. msprobe/pytorch/compare/npy_compare.py +244 -0
  77. msprobe/pytorch/debugger/__init__.py +0 -0
  78. msprobe/pytorch/debugger/debugger_config.py +86 -0
  79. msprobe/pytorch/debugger/precision_debugger.py +95 -0
  80. msprobe/pytorch/doc/FAQ.md +193 -0
  81. msprobe/pytorch/doc/api_accuracy_checker.md +269 -0
  82. 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 +182 -0
  83. msprobe/pytorch/doc/dump.md +207 -0
  84. msprobe/pytorch/doc/img/BLOOM-7B_1.png +0 -0
  85. msprobe/pytorch/doc/img/BLOOM-7B_2.png +0 -0
  86. msprobe/pytorch/doc/img/BLOOM-7B_3.png +0 -0
  87. msprobe/pytorch/doc/img/BLOOM-7B_4.png +0 -0
  88. msprobe/pytorch/doc/img/GPT-3_1.png +0 -0
  89. msprobe/pytorch/doc/img/GPT-3_2.png +0 -0
  90. msprobe/pytorch/doc/img/GPT-3_3.png +0 -0
  91. msprobe/pytorch/doc/img/GPT-3_4.png +0 -0
  92. msprobe/pytorch/doc/img/GPT-3_5.png +0 -0
  93. msprobe/pytorch/doc/img/GPT-3_6.png +0 -0
  94. msprobe/pytorch/doc/img/GPT-3_7.png +0 -0
  95. msprobe/pytorch/doc/img/GPT-3_8.png +0 -0
  96. msprobe/pytorch/doc/img/YOLOV5S_1.png +0 -0
  97. msprobe/pytorch/doc/img/YOLOV5S_2.png +0 -0
  98. msprobe/pytorch/doc/img/accuracy_checking_details.png +0 -0
  99. msprobe/pytorch/doc/img/accuracy_checking_result.png +0 -0
  100. msprobe/pytorch/doc/img/api_precision_compare_details.png +0 -0
  101. msprobe/pytorch/doc/img/api_precision_compare_result.png +0 -0
  102. msprobe/pytorch/doc/img/auto_analyze_log.png +0 -0
  103. msprobe/pytorch/doc/img/compare_result_pkl.png +0 -0
  104. msprobe/pytorch/doc/img/compare_result_pkl_md5.png.png +0 -0
  105. msprobe/pytorch/doc/img/cpu_info.png +0 -0
  106. msprobe/pytorch/doc/img/module_compare.png +0 -0
  107. msprobe/pytorch/doc/parse_tool.md +286 -0
  108. msprobe/pytorch/doc/ptdbg_ascend_compare.md +176 -0
  109. msprobe/pytorch/doc/ptdbg_ascend_overview.md +68 -0
  110. msprobe/pytorch/doc/ptdbg_ascend_quickstart.md +381 -0
  111. msprobe/pytorch/doc/run_overflow_check.md +25 -0
  112. 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 +90 -0
  113. msprobe/pytorch/free_benchmark/__init__.py +8 -0
  114. msprobe/pytorch/free_benchmark/common/__init__.py +0 -0
  115. msprobe/pytorch/free_benchmark/common/constant.py +67 -0
  116. msprobe/pytorch/free_benchmark/common/counter.py +72 -0
  117. msprobe/pytorch/free_benchmark/common/enums.py +37 -0
  118. msprobe/pytorch/free_benchmark/common/params.py +129 -0
  119. msprobe/pytorch/free_benchmark/common/utils.py +98 -0
  120. msprobe/pytorch/free_benchmark/compare/grad_saver.py +183 -0
  121. msprobe/pytorch/free_benchmark/compare/single_benchmark.py +104 -0
  122. msprobe/pytorch/free_benchmark/main.py +102 -0
  123. msprobe/pytorch/free_benchmark/perturbed_layers/__init__.py +0 -0
  124. msprobe/pytorch/free_benchmark/perturbed_layers/base_layer.py +13 -0
  125. msprobe/pytorch/free_benchmark/perturbed_layers/layer_factory.py +41 -0
  126. msprobe/pytorch/free_benchmark/perturbed_layers/npu/__init__.py +0 -0
  127. msprobe/pytorch/free_benchmark/perturbed_layers/npu/add_noise.py +90 -0
  128. msprobe/pytorch/free_benchmark/perturbed_layers/npu/bit_noise.py +104 -0
  129. msprobe/pytorch/free_benchmark/perturbed_layers/npu/change_value.py +63 -0
  130. msprobe/pytorch/free_benchmark/perturbed_layers/npu/improve_precision.py +68 -0
  131. msprobe/pytorch/free_benchmark/perturbed_layers/npu/no_change.py +28 -0
  132. msprobe/pytorch/free_benchmark/perturbed_layers/npu/npu_base_layser.py +45 -0
  133. msprobe/pytorch/free_benchmark/perturbed_layers/run_cpu.py +19 -0
  134. msprobe/pytorch/free_benchmark/result_handlers/__init__.py +0 -0
  135. msprobe/pytorch/free_benchmark/result_handlers/base_handler.py +203 -0
  136. msprobe/pytorch/free_benchmark/result_handlers/check_handler.py +39 -0
  137. msprobe/pytorch/free_benchmark/result_handlers/fix_handler.py +24 -0
  138. msprobe/pytorch/free_benchmark/result_handlers/handler_factory.py +31 -0
  139. msprobe/pytorch/free_benchmark/result_handlers/preheat_handler.py +170 -0
  140. msprobe/pytorch/functional/__init__.py +0 -0
  141. msprobe/pytorch/functional/data_processor.py +0 -0
  142. msprobe/pytorch/functional/dump_module.py +39 -0
  143. msprobe/pytorch/hook_module/__init__.py +1 -0
  144. msprobe/pytorch/hook_module/api_registry.py +161 -0
  145. msprobe/pytorch/hook_module/hook_module.py +109 -0
  146. msprobe/pytorch/hook_module/support_wrap_ops.yaml +1876 -0
  147. msprobe/pytorch/hook_module/utils.py +29 -0
  148. msprobe/pytorch/hook_module/wrap_aten.py +100 -0
  149. msprobe/pytorch/hook_module/wrap_distributed.py +75 -0
  150. msprobe/pytorch/hook_module/wrap_functional.py +108 -0
  151. msprobe/pytorch/hook_module/wrap_npu_custom.py +73 -0
  152. msprobe/pytorch/hook_module/wrap_tensor.py +72 -0
  153. msprobe/pytorch/hook_module/wrap_torch.py +88 -0
  154. msprobe/pytorch/hook_module/wrap_vf.py +64 -0
  155. msprobe/pytorch/module_processer.py +98 -0
  156. msprobe/pytorch/online_dispatch/__init__.py +20 -0
  157. msprobe/pytorch/online_dispatch/compare.py +236 -0
  158. msprobe/pytorch/online_dispatch/dispatch.py +274 -0
  159. msprobe/pytorch/online_dispatch/dump_compare.py +186 -0
  160. msprobe/pytorch/online_dispatch/single_compare.py +391 -0
  161. msprobe/pytorch/online_dispatch/torch_ops_config.yaml +50 -0
  162. msprobe/pytorch/online_dispatch/utils.py +187 -0
  163. msprobe/pytorch/parse.py +4 -0
  164. msprobe/pytorch/parse_tool/__init__.py +0 -0
  165. msprobe/pytorch/parse_tool/cli.py +32 -0
  166. msprobe/pytorch/parse_tool/lib/__init__.py +0 -0
  167. msprobe/pytorch/parse_tool/lib/compare.py +259 -0
  168. msprobe/pytorch/parse_tool/lib/config.py +51 -0
  169. msprobe/pytorch/parse_tool/lib/file_desc.py +31 -0
  170. msprobe/pytorch/parse_tool/lib/interactive_cli.py +102 -0
  171. msprobe/pytorch/parse_tool/lib/parse_exception.py +54 -0
  172. msprobe/pytorch/parse_tool/lib/parse_tool.py +158 -0
  173. msprobe/pytorch/parse_tool/lib/utils.py +367 -0
  174. msprobe/pytorch/parse_tool/lib/visualization.py +90 -0
  175. msprobe/pytorch/pt_config.py +93 -0
  176. msprobe/pytorch/service.py +167 -0
  177. msprobe/test/core_ut/common/test_utils.py +345 -0
  178. msprobe/test/core_ut/data_dump/test_data_collector.py +47 -0
  179. msprobe/test/core_ut/data_dump/test_json_writer.py +183 -0
  180. msprobe/test/core_ut/data_dump/test_scope.py +151 -0
  181. msprobe/test/core_ut/test_common_config.py +152 -0
  182. msprobe/test/core_ut/test_file_check.py +218 -0
  183. msprobe/test/core_ut/test_log.py +109 -0
  184. msprobe/test/mindspore_ut/test_api_kbk_dump.py +51 -0
  185. msprobe/test/mindspore_ut/test_debugger_config.py +42 -0
  186. msprobe/test/mindspore_ut/test_dump_tool_factory.py +51 -0
  187. msprobe/test/mindspore_ut/test_kernel_graph_dump.py +66 -0
  188. msprobe/test/mindspore_ut/test_kernel_graph_overflow_check.py +63 -0
  189. msprobe/test/mindspore_ut/test_ms_config.py +69 -0
  190. msprobe/test/mindspore_ut/test_overflow_check_tool_factory.py +51 -0
  191. msprobe/test/mindspore_ut/test_precision_debugger.py +56 -0
  192. msprobe/test/mindspore_ut/test_task_handler_factory.py +58 -0
  193. msprobe/test/pytorch_ut/advisor/test_advisor.py +83 -0
  194. msprobe/test/pytorch_ut/api_accuracy_checker/common/test_common_utils.py +108 -0
  195. msprobe/test/pytorch_ut/api_accuracy_checker/common/test_config.py +39 -0
  196. msprobe/test/pytorch_ut/api_accuracy_checker/compare/test_algorithm.py +112 -0
  197. msprobe/test/pytorch_ut/api_accuracy_checker/compare/test_api_precision_compare.py +77 -0
  198. msprobe/test/pytorch_ut/api_accuracy_checker/compare/test_compare.py +125 -0
  199. msprobe/test/pytorch_ut/api_accuracy_checker/compare/test_compare_column.py +10 -0
  200. msprobe/test/pytorch_ut/api_accuracy_checker/compare/test_compare_utils.py +43 -0
  201. msprobe/test/pytorch_ut/api_accuracy_checker/run_ut/dump.json +179 -0
  202. msprobe/test/pytorch_ut/api_accuracy_checker/run_ut/forward.json +63 -0
  203. msprobe/test/pytorch_ut/api_accuracy_checker/run_ut/test_data_generate.py +99 -0
  204. msprobe/test/pytorch_ut/api_accuracy_checker/run_ut/test_multi_run_ut.py +115 -0
  205. msprobe/test/pytorch_ut/api_accuracy_checker/run_ut/test_run_ut.py +72 -0
  206. msprobe/test/pytorch_ut/compare/test_acc_compare.py +17 -0
  207. msprobe/test/pytorch_ut/free_benchmark/perturbed_layers/test_perturbed_layser.py +105 -0
  208. msprobe/test/pytorch_ut/free_benchmark/result_handlers/test_result_handler.py +121 -0
  209. msprobe/test/pytorch_ut/free_benchmark/test_main.py +101 -0
  210. msprobe/test/pytorch_ut/functional/test_dump_module.py +15 -0
  211. msprobe/test/pytorch_ut/hook_module/test_api_registry.py +130 -0
  212. msprobe/test/pytorch_ut/hook_module/test_hook_module.py +42 -0
  213. msprobe/test/pytorch_ut/hook_module/test_wrap_aten.py +65 -0
  214. msprobe/test/pytorch_ut/hook_module/test_wrap_distributed.py +35 -0
  215. msprobe/test/pytorch_ut/hook_module/test_wrap_functional.py +20 -0
  216. msprobe/test/pytorch_ut/hook_module/test_wrap_tensor.py +35 -0
  217. msprobe/test/pytorch_ut/hook_module/test_wrap_torch.py +43 -0
  218. msprobe/test/pytorch_ut/hook_module/test_wrap_vf.py +11 -0
  219. msprobe/test/pytorch_ut/test_pt_config.py +69 -0
  220. msprobe/test/pytorch_ut/test_service.py +59 -0
  221. msprobe/test/resources/advisor.txt +3 -0
  222. msprobe/test/resources/compare_result_20230703104808.csv +9 -0
  223. msprobe/test/resources/compare_result_without_accuracy.csv +9 -0
  224. msprobe/test/resources/config.yaml +3 -0
  225. msprobe/test/resources/npu_test.pkl +8 -0
  226. msprobe/test/run_test.sh +30 -0
  227. msprobe/test/run_ut.py +58 -0
  228. msprobe/test/test_module_processer.py +64 -0
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,286 @@
1
+ # **数据解析工具**
2
+
3
+ 数据解析工具(parse_tool)提供命令行交互式界面,提供更多的数据解析功能并且展示结果。
4
+
5
+ 使用场景:本工具主要用于精度比对前后两次NPU kernel层级dump数据的一致性。
6
+
7
+ ## 进入parse交互式界面
8
+
9
+ 安装msprobe工具后(详见《[MindStudio精度调试工具](../../README.md)》的“工具安装”章节),可以通过使用命令 **msprobe -f pytorch parse** 进入交互式界面,如下所示:
10
+
11
+ ```bash
12
+ msprobe -f pytorch parse
13
+ Parse >>>
14
+ ```
15
+
16
+ 可在parse的界面中执行Shell命令,以及如下场景的相关解析命令:
17
+
18
+ - 支持指定kernel层级算子数据比对。
19
+ - 支持指定kernel层级算子数据转换及展示。
20
+ - 支持交互式指定pkl文件中API对应dump数据查看。
21
+ - 支持API进行可选层级比对和打印(统计级和像素级)。
22
+
23
+ Ctrl+C可以退出parse交互式界面。不退出parse交互式界面若需要执行非该界面下的内置Shell命令,且命令与parse交互式界面命令冲突时,非该界面命令需要使用run命令,在相关命令前加上run前缀,如下示例:
24
+
25
+ ```bash
26
+ msprobe -f pytorch parse
27
+ Parse >>> run vim cli.py
28
+ Parse >>> vim cli.py
29
+ ```
30
+
31
+ 以上各场景详细介绍请参见下文章节。
32
+
33
+ ## kernel层级算子数据批量转换
34
+
35
+ 本功能会将原有待比对dump数据目录下的dump数据按照算子名和时间戳进行梳理并分类,之后再将dump数据转为为npy文件。
36
+
37
+ 依赖:CANN包中的msaccucmp工具,需要安装Ascend-CANN-toolkit,详见《[CANN 软件安装指南](https://gitee.com/link?target=https%3A%2F%2Fwww.hiascend.com%2Fdocument%2Fdetail%2Fzh%2Fcanncommercial%2F700%2Fenvdeployment%2Finstg%2Finstg_0001.html)》。
38
+
39
+ 输入以下比对命令进行数据转换。
40
+
41
+ ```bash
42
+ cad -m my_dump_path [-out output_path] [-asc msaccucmp_path]
43
+ ```
44
+
45
+ | 参数名称 | 说明 | 是否必选 |
46
+ | -------- | ------------------------------------------------------------ | -------- |
47
+ | -m | 待转换kernel dump数据目录。需要指定到kernel dump数据的deviceid级目录。 | 是 |
48
+ | -out | 结果输出目录,须指定已存在的目录,默认为./parse_data/acl_batch_convert。未指定时保存在默认路径下,比对结束后会打印log提示输出结果存放路径。 | 否 |
49
+ | -asc | 指定msaccucmp路径,默认路径为:/usr/local/Ascend/ascend-toolkit/latest/tools/operator_cmp/compare/msaccucmp.py。 | 否 |
50
+
51
+ **示例**
52
+
53
+ ```
54
+ # 传入待比对数据目录
55
+ Parse >>> cad -m /home/xxx/my_dump_path/20000124003856/0
56
+ # 转换结果打印
57
+ ......
58
+ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────────╮
59
+ # 转换前的dump文件
60
+ │ SrcFile: /home/xxx/my_dump_path/20000124003856/0/272/TransData.trans_TransData_22.112.21.948645536672764 │
61
+ # 转换后的npy文件
62
+ │ - TransData.trans_TransData_22.112.21.948645536672764.output.0.npy │
63
+ │ - TransData.trans_TransData_22.112.21.948645536672764.input.0.npy │
64
+ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────╯
65
+ ......
66
+ [INFO] The comparison result have been written to "./parse_data/acl_batch_convert".
67
+ ```
68
+
69
+ 输出结果:
70
+
71
+ 原dump数据目录:
72
+
73
+ ```
74
+ ├── /home/xxx/my_dump_path/20000124003856/0/
75
+ │ ├── 272
76
+ │ │ ├── {op_type}.{op_name}.{task_id}.{stream_id}.{timestamp}
77
+ │ │ ...
78
+ │ ├── 512
79
+ │ ...
80
+ ```
81
+
82
+ 转换后:
83
+
84
+ ```
85
+ ├── ./parse_data/acl_batch_convert/{timestamp}
86
+ │ ├── {op_name1}
87
+ │ │ ├── {timestamp1}
88
+ │ │ | ├── {op_type}.{op_name}.{task_id}.{stream_id}.{timestamp}.{input/output}.{参数序号}.npy
89
+ │ │ | │ ...
90
+ │ │ ├── {timestamp2}
91
+ │ │ | ...
92
+ │ ├── {op_name2}
93
+ │ ├── ...
94
+ ```
95
+
96
+ ## kernel层级算子数据比对
97
+
98
+ 本功能主要用于比对前后两次NPU kernel层级dump数据的一致性。
99
+
100
+ 本功能支持批量比对,若需要进行批量比对,需要先将两份待比对的NPU kernel层级dump数据进行“**kernel层级算子数据批量转换**”,可以使两份数据更好的匹配;若直接进行dump数据的比对,建议只比对单个dump数据文件。
101
+
102
+ 输入以下比对命令进行数据比对。
103
+
104
+ ```bash
105
+ vc -m my_dump_path -g golden_dump_path [-out output_path] [-cmp_path msaccucmp_path]
106
+ ```
107
+
108
+ | 参数名称 | 说明 | 是否必选 |
109
+ | --------- | ------------------------------------------------------------ | -------- |
110
+ | -m | 待比对kernel dump数据目录。如果比对单个算子,需要指定到kernel dump数据的model_id级目录;如果批量比对,则指定到cad转换后的timestamp级目录。 | 是 |
111
+ | -g | 标杆kernel dump数据目录。如果比对单个算子,需要指定到kernel dump数据的model_id级目录;如果批量比对,则指定到cad转换后的timestamp级目录。 | 是 |
112
+ | -out | 结果输出目录,须指定已存在的目录,默认为./parse_data/acl_batch_comapre。未指定时保存在默认路径下,比对结束后会打印log提示输出结果存放路径。 | 否 |
113
+ | -cmp_path | 指定msaccucmp路径,默认路径为:/usr/local/Ascend/ascend-toolkit/latest/tools/operator_cmp/compare/msaccucmp.py | 否 |
114
+
115
+ 输出结果:batch_compare_{timestamp}.csv文件。
116
+
117
+ **示例**
118
+
119
+ ```bash
120
+ # 传入待比对数据目录以及标杆数据目录
121
+ Parse >>> vc -m ./my_dump_path -g ./golden_data_path
122
+ [INFO]Compare result is saved in : parse_data/acl_batch_comapre/batch_compare_1707271118.csv
123
+ ```
124
+
125
+ ## kernel算子数据的npy转换
126
+
127
+ 依赖:CANN包中的msaccucmp工具,需要安装Ascend-CANN-toolkit,详见《[CANN 软件安装指南](https://gitee.com/link?target=https%3A%2F%2Fwww.hiascend.com%2Fdocument%2Fdetail%2Fzh%2Fcanncommercial%2F700%2Fenvdeployment%2Finstg%2Finstg_0001.html)》。
128
+
129
+ 输入以下转换命令进行数据转换, 将kernel级别dump数据转为npy文件。
130
+
131
+ ```bash
132
+ dc -n file_name/file_path [-f format] [-out output_path]
133
+ ```
134
+
135
+ | 参数名称 | 说明 | 是否必选 |
136
+ | --------- | ------------------------------------------------------------ | -------- |
137
+ | -n | 需转换的dump数据文件或dump数据文件目录。 | 是 |
138
+ | -f | 开启format转换,指定该参数时需要配置format格式。当前内置的Format转换支持如下类型: FRACTAL_NZ转换NCHW FRACTAL_NZ转换成NHWC FRACTAL_NZ转换ND HWCN转换FRACTAL_Z HWCN转换成NCHW HWCN转换成NHWC NC1HWC0转换成HWCN NC1HWC0转换成NCHW NC1HWC0转换成NHWC NCHW转换成FRACTAL_Z NCHW转换成NHWC NHWC转换成FRACTAL_Z NHWC转换成HWCN NHWC转换成NCHW NDC1HWC0转换成NCDHW | 否 |
139
+ | -out | 结果输出目录。 | 否 |
140
+ | -cmp_path | 指定msaccucmp路径,默认路径为:/usr/local/Ascend/ascend-toolkit/latest/tools/operator_cmp/compare/msaccucmp.py | 否 |
141
+
142
+ - 输出结果:npy文件。
143
+
144
+ - 若指定-out参数需要用户传入输出路径,并且路径需要已存在。
145
+
146
+ - 若未指定输出目录, 则比对结束后将结果保存在默认目录 “./parse_data/convert_result”中,比对结束后会打印log提示输出结果存放路径及转换结果。
147
+
148
+ - 输入以下命令,展示npy数据统计信息。
149
+
150
+ ```bash
151
+ pt -n file_path
152
+ ```
153
+
154
+ | 参数名称 | 说明 | 是否必选 |
155
+ | -------- | ------------- | -------- |
156
+ | -n | npy文件路径。 | 是 |
157
+
158
+ 打印统计信息:shape, dtype, max, min和mean。默认在npy文件路径下将该数据保存为txt文件。
159
+
160
+ **示例1**
161
+
162
+ ```bash
163
+ # 传入需转换的dump文件目录
164
+ Parse >>> dc -n ./dump_data/
165
+ ......
166
+ # 转换结果
167
+ ╭──────────────────────────────────────────────────────────────────────────────────────────────────────╮
168
+ │ SrcFile: ./dump_data/
169
+ │ - Add.fp32_vars_add_2fp32_vars_Relu_9.31.5.1636595794731103.input.0.npy │
170
+ │ - Add.fp32_vars_add_1fp32_vars_Relu_6.24.5.1636595794631347.output.0.npy │
171
+ │ - Add.fp32_vars_add_2fp32_vars_Relu_9.31.5.1636595794731103.input.1.npy │
172
+ │ - Add.fp32_vars_add_1fp32_vars_Relu_6.24.5.1636595794631347.input.1.npy │
173
+ │ - Add.fp32_vars_add_3fp32_vars_Relu_12.40.5.1636595794846124.input.1.npy │
174
+ │ - Add.fp32_vars_add_1fp32_vars_Relu_6.24.5.1636595794631347.input.0.npy │
175
+ │ - Add.fp32_vars_add_3fp32_vars_Relu_12.40.5.1636595794846124.input.0.npy │
176
+ │ - Add.fp32_vars_add_2fp32_vars_Relu_9.31.5.1636595794731103.output.0.npy │
177
+ │ - Add.fp32_vars_add_3fp32_vars_Relu_12.40.5.1636595794846124.output.0.npy │
178
+ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────╯
179
+ ```
180
+
181
+ **示例2**
182
+
183
+ ```bash
184
+ # 查看某个dump数据块的数据信息
185
+ # 默认会将数据中的tensor保存成 txt
186
+ Parse >>> pt -n ./parse_data/dump_convert/Add.fp32_vars_add_1fp32_vars_Relu_6.24.5.1636595794631347.output.0.npy
187
+ ......
188
+ # 打印统计信息
189
+ [Shape: (1, 16, 56, 56, 16)] [Dtype: float16] [Max: 452.0] [Min: -408.5] [Mean: -3.809]
190
+ Path: ./parse_data/dump_convert/Add.fp32_vars_add_1fp32_vars_Relu_6.24.5.1636595794631347.input.0.npy
191
+ TextFile:./parse_data/dump_convert/Add.fp32_vars_add_1fp32_vars_Relu_6.24.5.1636595794631347.input.0.npy.txt
192
+ ```
193
+
194
+ ## dump.json文件中指定API的dump数据信息查看(暂不支持)
195
+
196
+ 输入以下命令,解析并输出dump.json文件中指定API的统计信息。
197
+
198
+ ```bash
199
+ pk -f pkl_path -n api_name
200
+ ```
201
+
202
+ | 参数名称 | 说明 | 是否必选 |
203
+ | -------- | ----------------------- | -------- |
204
+ | -f | 指定dump.json文件路径。 | 是 |
205
+ | -n | 指定API名称。 | 是 |
206
+
207
+ - 输出结果:打印统计信息(shape, dtype, max和min mean)。
208
+ - 若pkl文件中存在相应的堆栈信息,则会打印堆栈信息。
209
+
210
+ **示例**
211
+
212
+ ```bash
213
+ # 传入pkl文件及api名称
214
+ Parse >>> pk -f ./torch_dump/xxx/rank0/dump.json -n Functional_conv2d_0_forward
215
+ ......
216
+ # 打印统计信息及堆栈(pkl文件不包含堆栈则不会打印堆栈)
217
+
218
+ Statistic Info:
219
+ [Functional_conv2d_0_forward_input.0][dtype: torch.float32][shape: [2, 1, 2, 2]][max: 1.576936960220337][min: -0.9757485389709473][mean: 0.4961632490158081]
220
+ [Functional_conv2d_0_forward_input.1][dtype: torch.float32][shape: [2, 1, 2, 2]][max: 0.20064473152160645][min: -0.47102075815200806][mean: -0.20796933770179749]
221
+ [Functional_conv2d_0_forward_input.2][dtype: torch.float32][shape: [2]][max: 0.17380613088607788][min: -0.16853803396224976][mean: 0.0026340484619140625]
222
+ [Functional_conv2d_0_forward_output][dtype: torch.float32][shape: [2, 2, 1, 1]][max: 0.02364911139011383][min: -1.762906551361084][mean: -0.6710853576660156]
223
+ ```
224
+
225
+ ## API可选层级比对
226
+
227
+ 输入以下命令, 进行统计级和像素级比对。
228
+
229
+ ```bash
230
+ cn -m my_data*.npy -g gloden*.npy [-p num] [-al atol] [-rl rtol]
231
+ ```
232
+
233
+ - 统计级比对:对tensor整体进行余弦值及相对误差的计算。
234
+ - 像素级比对:对输入的两个npy文件进行逐元素比对。若两个tensor对应元素的相对误差或绝对误差大于**误差阈值**(-al和-rl配置)则被标记为错误数据。
235
+
236
+ | 参数名称 | 说明 | 是否必选 |
237
+ | -------- | ----------------------------------------------- | -------- |
238
+ | -m | 待比对数据。 | 是 |
239
+ | -g | 标杆数据。 | 是 |
240
+ | -p | 设置比对结束后打印错误元素的个数,默认值20。 | 否 |
241
+ | -al | 判定数据存在精度问题的绝对误差阈值,默认0.001。 | 否 |
242
+ | -rl | 判定数据存在精度问题的相对误差阈值,默认0.001。 | 否 |
243
+ | -s | 将npy文件保存成txt文件,用于查看,默认开启。 | 否 |
244
+
245
+ 输出结果:
246
+
247
+ - 统计级比对结果。
248
+ - 两个文件的统计信息(shape, dtype, max, min和mean)。
249
+ - 错误数据打印表格。
250
+
251
+ **示例**
252
+
253
+ ```bash
254
+ # 对比两个tensor的数据
255
+ Parse >>> cn -m Add.InceptionV3_InceptionV3_Mixed_7a_Branch_0_add_3.323.1619494134703053.output.0.npy -g InceptionV3_InceptionV3_Mixed_7a_Branch_0_add_3.0.1619492699305998.npy -p 10 -s -al 0.002 -rl 0.005
256
+ Error Item Table Top Item Table
257
+ ┏━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┓ ┏━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
258
+ ┃ Index ┃ Left ┃ Right ┃ Diff ┃ ┃ Index ┃ Left ┃ Right ┃ Diff ┃
259
+ ┡━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━┩ ┡━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
260
+ │ 155 │ 0.024600908 │ 0.022271132 │ 0.002329776 │ │ 0 │ -0.9206961 │ -0.9222216 │ 0.0015255213 │
261
+ │ 247 │ 0.015752593 │ 0.017937578 │ 0.0021849852 │ │ 1 │ -0.6416973 │ -0.64051837 │ 0.0011789203 │
262
+ │ 282 │ -0.0101207765 │ -0.007852031 │ 0.0022687456 │ │ 2 │ -0.35383835 │ -0.35433492 │ 0.0004965663 │
263
+ │ 292 │ 0.019581757 │ 0.02240482 │ 0.0028230622 │ │ 3 │ -0.18851271 │ -0.18883198 │ 0.00031927228 │
264
+ │ 640 │ -0.06593232 │ -0.06874806 │ 0.0028157383 │ │ 4 │ -0.43508735 │ -0.43534422 │ 0.00025686622 │
265
+ │ 1420 │ 0.09293677 │ 0.09586689 │ 0.0029301196 │ │ 5 │ 1.4447614 │ 1.4466647 │ 0.0019032955 │
266
+ │ 1462 │ -0.085207745 │ -0.088047795 │ 0.0028400496 │ │ 6 │ -0.3455438 │ -0.3444429 │ 0.0011008978 │
267
+ │ 1891 │ -0.03433288 │ -0.036525503 │ 0.002192624 │ │ 7 │ -0.6560242 │ -0.6564579 │ 0.0004336834 │
268
+ │ 2033 │ 0.06828873 │ 0.07139922 │ 0.0031104907 │ │ 8 │ -2.6964858 │ -2.6975214 │ 0.0010356903 │
269
+ │ 2246 │ -0.06376442 │ -0.06121233 │ 0.002552092 │ │ 9 │ -0.73746175 │ -0.73650354 │ 0.00095820427 │
270
+ └───────┴───────────────┴──────────────┴──────────────┘ └───────┴─────────────┴─────────────┴───────────────┘
271
+ ╭───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
272
+ │ Left: |
273
+ │ |- NpyFile: ./dump/temp/decode/Add.InceptionV3_InceptionV3_Mixed_7a_Branch_0_add_3.323.1619494134703053.output.0.npy |
274
+ │ |- TxtFile: ./dump/temp/decode/Add.InceptionV3_InceptionV3_Mixed_7a_Branch_0_add_3.323.1619494134703053.output.0.npy.txt |
275
+ │ |- NpySpec: [Shape: (32, 8, 8, 320)] [Dtype: float32] [Max: 5.846897] [Min: -8.368301] [Mean: -0.72565556] |
276
+ │ DstFile: │
277
+ │ |- NpyFile: ./dump/cpu/InceptionV3_InceptionV3_Mixed_7a_Branch_0_add_3.0.1619492699305998.npy |
278
+ │ |- TxtFile: ./dump/cpu/InceptionV3_InceptionV3_Mixed_7a_Branch_0_add_3.0.1619492699305998.npy.txt |
279
+ │ |- NpySpec: [Shape: (32, 8, 8, 320)] [Dtype: float32] [Max: 5.8425903] [Min: -8.374472] [Mean: -0.7256237] │
280
+ │ NumCnt: 655360 │
281
+ │ AllClose: False │
282
+ │ CosSim: 0.99999493 │
283
+ │ ErrorPer: 0.023504638671875 (rl= 0.005, al= 0.002) │
284
+ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
285
+ ```
286
+
@@ -0,0 +1,176 @@
1
+ # **精度比对工具**
2
+
3
+ ## CPU或GPU与NPU精度数据比对
4
+
5
+ ### 总体说明
6
+
7
+ - 本节主要介绍CPU或GPU与NPU精度数据比对的函数以及示例,执行精度比对操作前需要先完成CPU或GPU与NPU的精度数据dump,详见《[精度数据采集](./dump.md)》。
8
+
9
+ - 比对函数均通过单独创建精度比对脚本执行,可支持单卡和多卡场景的精度数据比对。
10
+
11
+ - 工具性能:比对数据量较小时(参考值单份文件小于10GB),参考比对速度0.1GB/s;比对数据量较大时,参考比对速度0.3GB/s。 推荐环境配置:独占环境,CPU核心数192,固态硬盘(IO速度参考:固态硬盘 > 500MB/s,机械硬盘60 ~ 170MB/s)。
12
+
13
+ 用户环境性能弱于标准约束或非独占使用的比对速度酌情向下浮动。比对速度的计算方式:两份比对文件大小/比对耗时。
14
+
15
+ ### 约束
16
+
17
+ - NPU自研API,在CPU或GPU若没有对应的API,该API的dump数据不比对。
18
+ - NPU与CPU或GPU的计算结果误差可能会随着模型的执行不断累积,最终会出现同一个API因为输入的数据差异较大而无法比对的情况。
19
+ - CPU或GPU与NPU中两个相同的API会因为调用次数不同导致无法比对或比对到错误的API,不影响整体运行,该API忽略。
20
+
21
+ ### compare_distributed
22
+
23
+ **功能说明**
24
+
25
+ 将CPU或GPU与NPU的dump文件进行比对,支持单卡和多卡,可同时比对多卡的dump数据。多机场景需要每个设备单独执行比对操作。可自动检索和匹配对应卡和进程所dump的数据文件,再调用compare进行比对。单机单卡时与compare函数二选一。
26
+
27
+ **函数原型**
28
+
29
+ ```Python
30
+ compare_distributed(npu_dump_dir, bench_dump_dir, output_path, **kwargs)
31
+ ```
32
+
33
+ **参数说明**
34
+
35
+ | 参数名 | 说明 | 是否必选 |
36
+ | -------------- | ------------------------------------------------------------ | -------- |
37
+ | npu_dump_dir | 配置NPU环境下的dump目录。dump数据目录须指定到step级。参数示例:'./npu_dump/step0'。数据类型:str。 | 是 |
38
+ | bench_dump_dir | 配置CPU、GPU或NPU环境下的dump目录。参数示例:'./gpu_dump/step0'。数据类型:str。 | 是 |
39
+ | output_path | 配置比对结果文件存盘目录。需要预先创建output_path目录。参数示例:'./output'。文件名称基于时间戳自动生成,格式为:`compare_result_rank{npu_ID}-rank{cpu/gpu/npu_ID}_{timestamp}.xlsx`。数据类型:str。 | 是 |
40
+ | **kwargs | 支持compare的所有可选参数。 | 否 |
41
+
42
+ **函数示例**
43
+
44
+ 创建比对脚本,例如compare_distributed.py,拷贝如下代码,具体参数请根据实际环境修改。
45
+
46
+ ```Python
47
+ from msprobe.pytorch import *
48
+ compare_distributed('./npu_dump/step0', './gpu_dump/step0', './output')
49
+ ```
50
+
51
+ dump数据目录须指定到step级。
52
+
53
+ ### compare
54
+
55
+ **功能说明**
56
+
57
+ 将CPU或GPU与NPU的dump文件进行比对,仅支持单机单卡。
58
+
59
+ **函数原型**
60
+
61
+ ```Python
62
+ compare(input_param, output_path, stack_mode=False, auto_analyze=True, fuzzy_match=False)
63
+ ```
64
+
65
+ **参数说明**
66
+
67
+ | 参数名 | 说明 | 是否必选 |
68
+ | ------------ | ------------------------------------------------------------ | -------- |
69
+ | input_param | 配置dump数据文件及目录。数据类型:dict。配置参数包括:<br> "npu_json_path":指定NPU dump目录下的dump.json文件。参数示例:"npu_json_path": "./npu_dump/dump.json"。必选。<br/> "bench_json_path":指定CPU、GPU或NPU dump目录下的dump.json文件。参数示例:"bench_json_path": "./gpu_dump/dump.json"。必选。<br/> "stack_json_path":指定NPU dump目录下的stack.json文件。参数示例:"stack_json_path": "./npu_dump/stack.json"。可选。<br/> "is_print_compare_log":配置是否开启日志打屏。可取值True或False。可选。 | 是 |
70
+ | output_path | 配置比对结果文件存盘目录。参数示例:'./output'。文件名称基于时间戳自动生成,格式为:`compare_result_{timestamp}.xlsx`。数据类型:str。 | 是 |
71
+ | stack_mode | 配置stack_mode的开关。仅当配置"stack_json_path"需要开启。可取值True或False,参数示例:stack_mode=True,默认为False。数据类型:bool。 | 否 |
72
+ | auto_analyze | 自动精度分析,开启后工具自动针对比对结果进行分析,识别到第一个精度不达标节点(在比对结果文件中的“Accuracy Reached or Not”列显示为No),并给出问题可能产生的原因(打屏展示并生成advisor_{timestamp}.txt文件)。可取值True或False,参数示例:auto_analyze=False,默认为True。数据类型:bool。 | 否 |
73
+ | fuzzy_match | 模糊匹配。开启后,对于网络中同一层级且命名仅调用次数不同的API,可匹配并进行比对。可取值True或False,参数示例:fuzzy_match=True,默认为False。数据类型:bool。 | 否 |
74
+
75
+ **函数示例**
76
+
77
+ 单机单卡场景下创建比对脚本,例如compare.py,拷贝如下代码,具体参数请根据实际环境修改。
78
+
79
+ ```Python
80
+ from msprobe.pytorch import compare
81
+ dump_result_param={
82
+ "npu_json_path": "./npu_dump/dump.json",
83
+ "bench_json_path": "./gpu_dump/dump.json",
84
+ "stack_json_path": "./npu_dump/stack.json",
85
+ "is_print_compare_log": True
86
+ }
87
+ compare(dump_result_param, output_path="./output", stack_mode=True)
88
+ ```
89
+
90
+ ### 统计量比对
91
+
92
+ 若使用**compare**或**compare_distributed**函数创建的比对脚本中,在[config.json](../../config/config.json)文件中配置"task": "statistics"方式dump时,可以进行统计量比对,此时比对dump.json文件中的统计信息,开启后的比对结果文件生成Max diff、Min diff、Mean diff和L2norm diff,表示NPU dump数据中API的输入或输出与标杆数据输入或输出的最大值、最小值、平均值以及L2范数的差。可以通过该值判断API是否存在精度问题:当某个API的输入和输出的Max diff、Min diff、Mean diff和L2norm diff均为0或无限趋于0,那么可以判断该API无精度问题,反之则可能存在精度问题。
93
+
94
+ **比对脚本示例**
95
+
96
+ 以compare.py为例。
97
+
98
+ ```Python
99
+ from msprobe.pytorch import compare
100
+ dump_result_param={
101
+ "npu_json_path": "./npu_dump/dump.json",
102
+ "bench_json_path": "./gpu_dump/dump.json",
103
+ "stack_json_path": "./npu_dump/stack.json",
104
+ "is_print_compare_log": True
105
+ }
106
+ compare(dump_result_param, output_path="./output", stack_mode=True)
107
+ ```
108
+
109
+ **比对结果**
110
+
111
+ 数据量比对同样生成`compare_result_{timestamp}.xlsx`和`advisor_{timestamp}.txt`文件。其中`advisor_{timestamp}.txt`主要对`compare_result_{timestamp}.xlsx`中可能存在精度问题(Result为Waring)的API提出定位建议;`compare_result_{timestamp}.xlsx`主要有如下两种情况:
112
+
113
+ - "summary_mode": "statistics"时比对dump.json文件:
114
+
115
+ ![compare_result_pkl](img/compare_result_pkl.png)
116
+
117
+ 上图是对dump.json文件中NPU及标杆API的统计信息进行比对,判断可能存在精度问题的API,文件中记录NPU及标杆API的基本信息和统计信息,其中需要关注Result列,包含结果:Waring(NPU与标杆统计信息的比对中存在相对误差大于0.5,则需要重点检查该API);为空(相对误差小于等于0.5,可以不需要重点关注,但不代表不存在精度问题);Nan(表示统计信息数据没有匹配上)。
118
+
119
+ - "summary_mode": "md5"时比对dump.json文件:
120
+
121
+ ![compare_result_pkl_md5.png](img/compare_result_pkl_md5.png.png)
122
+
123
+ 上图是对dump.json文件中NPU及标杆API的MD5信息进行比对,判断API数据的完整性,文件中记录NPU及标杆API的基本信息和MD5信息,其中需要关注Result列,包含结果:Pass(表示NPU与标杆的MD5值一致,即API数据完整);Different(表示NPU与标杆的MD5值不一致,即API数据不完全一致,可以通过NPU_Stack_Info列API调用栈查询该API的详细信息);Nan(表示MD5信息数据没有匹配上)。
124
+
125
+ ## 比对结果分析
126
+
127
+ PyTorch精度比对是以CPU或GPU的计算结果为标杆,通过计算精度评价指标判断API在运行时是否存在精度问题。
128
+
129
+ - `advisor_{timestamp}.txt`文件中给出了可能存在精度问题的API的专家建议,可直接打开查看。
130
+
131
+ - `compare_result_{timestamp}.xlsx`文件列出了所有执行精度比对的API详细信息和比对结果,如下示例:
132
+
133
+ ![compare_result](https://gitee.com/cai-weiwei1989/att_ptdbg/raw/master/debug/accuracy_tools/ptdbg_ascend/doc/img/compare_result.png)
134
+
135
+ 可以从该结果文件中进行“**判断计算精度达标情况**”、“**计算精度评价指标分析**”以及“**异常信息识别**”等分析动作。
136
+
137
+ ### **判断计算精度达标情况**
138
+
139
+ 精度比对结果`compare_result_{timestamp}.xlsx`文件中只需要通过Accuracy Reached or Not来判断计算精度是否达标,判断标准如下:
140
+
141
+ 1. Cosine < 0.99 且 MaxAbsError > 0.001时,精度不达标,标记为“No”。
142
+ 2. Cosine < 0.9,精度不达标,标记为“No”。
143
+ 3. MaxAbsError > 1,精度不达标,标记为“No”。
144
+ 4. 其余情况下记为精度达标,标记为“Yes”。
145
+
146
+ ### **计算精度评价指标分析**
147
+
148
+ 1. Cosine:通过计算两个向量的余弦值来判断其相似度,数值越接近于1说明计算出的两个张量越相似,实际可接受阈值为大于0.99。在计算中可能会存在nan,主要由于可能会出现其中一个向量为0。
149
+
150
+ 2. MaxAbsErr:当最大绝对误差越接近0表示其计算的误差越小,实际可接受阈值为小于0.001。
151
+
152
+ 3. MaxRelativeErr:当最大相对误差越接近0表示其计算的误差越小。
153
+
154
+ 当dump数据中存在0或Nan时,比对结果中最大相对误差则出现inf或Nan的情况,属于正常现象。
155
+
156
+ 4. One Thousandth Err Ratio(双千分之一)、Five Thousandths Err Ratio(双千分之五)精度指标:是指NPU的Tensor中的元素逐个与对应的标杆数据对比,相对误差大于千分之一、千分之五的比例占总元素个数的比例小于千分之一、千分之五。该数据仅作为精度下降趋势的参考,并不参与计算精度是否通过的判定。
157
+
158
+ ### **异常信息识别**
159
+
160
+ 精度比对结果`compare_result_{timestamp}.xlsx`文件中对于存在异常信息的API会进行高亮处理:
161
+
162
+ - 红色可能出现的情况有:
163
+ - NPU max或NPU min信息中存在nan/inf
164
+ - Max diff存在大于1e+10的值
165
+ - 统计数据中output的Max diff除以max(0.01, Bench max) > 0.5
166
+ - 真实数据中One Thousandth Err Ratio的input > 0.9同时output < 0.6
167
+ - 黄色可能出现的情况有:
168
+ - Max diff的input与output都大于1,同时output比input大一个数量级以上
169
+ - 统计数据Max diff除以max(0.01, Bench max)的output > 0.1同时input < 0.01
170
+ - 真实数据One Thousandth Err Ratio的input - output > 0.1
171
+ - 真实数据Cosine的input - output > 0.1
172
+
173
+ # FAQ
174
+
175
+ [FAQ](./FAQ.md)
176
+
@@ -0,0 +1,68 @@
1
+ # **精度比对工具**
2
+
3
+ ## 简介
4
+
5
+ 在PyTorch训练网络,对同一模型或API调试过程中,遇到API相关的计算精度问题,定位时费时费力。
6
+
7
+ msprobe的精度比对工具,用来进行PyTorch整网API粒度的数据dump、精度比对和溢出检测,从而定位PyTorch训练场景下的精度问题。
8
+
9
+ **使用场景**
10
+
11
+ 主要的使用场景包括:
12
+
13
+ - 同一模型,从CPU或GPU移植到NPU中存在精度下降问题,对比NPU芯片中的API计算数值与CPU或GPU芯片中的API计算数值,进行问题定位。
14
+ - 同一模型,进行迭代(模型、框架版本升级或设备硬件升级)时存在的精度下降问题,对比相同模型在迭代前后版本的API计算数值,进行问题定位。
15
+
16
+ ## 原理介绍
17
+
18
+ 精度对比工具,通过在PyTorch模型中注册hook,跟踪计算图中API的前向传播与反向传播时的输入与输出,排查存在计算精度误差,进行问题的精准定位。
19
+
20
+ **精度比对流程**
21
+
22
+ 1. 当模型在CPU或GPU上进行正向和反向传播时,分别dump每一层的数值输入与输出。
23
+
24
+ 2. 当模型在NPU中进行计算时,采用相同的方式dump下相应的数据。
25
+
26
+ 3. 通过对比dump出的数值,计算余弦相似度和最大绝对误差的方式,定位和排查NPU API存在的计算精度问题。如下图所示。
27
+
28
+ 精度比对逻辑图
29
+
30
+ ![module_compare](img/module_compare.png)
31
+
32
+ **API匹配条件**
33
+
34
+ 进行精度比对时,需要判断CPU或GPU的API与NPU的API是否相同可比对,须满足以下匹配条件:
35
+
36
+ - 两个API的名称相同,API命名规则:`{api_type}.{api_name}.{api调用次数}.{正反向}.{输入输出}.index`,如:Functional.conv2d.1.backward.input.0。
37
+ - 两个API的输入输出Tensor数量和各个Tensor的Shape相同。
38
+
39
+ 通常满足以上两个条件,工具就认为是同一个API,成功进行API的匹配,后续进行相应的计算精度比对。
40
+
41
+ ## 精度比对总体流程
42
+
43
+ 1. 准备CPU或GPU训练工程。
44
+
45
+ 2. 在环境下安装msprobe工具。详见《[MindStudio精度调试工具](../../README.md)》的“工具安装”章节。
46
+
47
+ 3. 在训练脚本内添加msprobe工具dump接口PrecisionDebugger采集标杆数据。详见《[精度数据采集](./dump.md)》。
48
+
49
+ 4. 执行训练dump数据。
50
+
51
+ 5. 将CPU或GPU训练工程迁移为NPU训练工程。详见《[PyTorch模型迁移调优指南](https://www.hiascend.com/document/detail/zh/Pytorch/60RC1/ptmoddevg/trainingmigrguide/PT_LMTMOG_0003.html)》。
52
+
53
+ 6. 在NPU环境下安装msprobe工具。详见《[MindStudio精度调试工具](../../README.md)》的“工具安装”章节。
54
+
55
+ 7. 在NPU训练脚本内添加msprobe工具dump接口PrecisionDebugger采集标杆数据。详见《[精度数据采集](./dump.md)》。
56
+
57
+ 8. NPU环境下执行训练dump数据。
58
+
59
+ 9. 执行精度比对。
60
+
61
+ 1. 创建并配置精度比对脚本,例如compare.py。
62
+
63
+ 2. 执行CPU或GPU dump与NPU dump数据的精度比对。
64
+
65
+ 3. 比对结果分析。
66
+
67
+ 详见《[CPU或GPU与NPU精度数据比对](./ptdbg_ascend_compare.md)》。
68
+