mindstudio-probe 1.1.1__py3-none-any.whl → 1.2.2__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 (226) hide show
  1. {mindstudio_probe-1.1.1.dist-info → mindstudio_probe-1.2.2.dist-info}/METADATA +3 -2
  2. mindstudio_probe-1.2.2.dist-info/RECORD +415 -0
  3. msprobe/CMakeLists.txt +5 -0
  4. msprobe/README.md +16 -21
  5. msprobe/config.json +1 -0
  6. msprobe/core/common/const.py +185 -11
  7. msprobe/core/common/exceptions.py +3 -1
  8. msprobe/core/common/file_utils.py +33 -7
  9. msprobe/core/common/inplace_ops.yaml +4 -0
  10. msprobe/core/common/utils.py +42 -14
  11. msprobe/core/common_config.py +6 -0
  12. msprobe/core/compare/acc_compare.py +139 -128
  13. msprobe/core/compare/check.py +31 -29
  14. msprobe/core/compare/compare_cli.py +17 -16
  15. msprobe/core/compare/highlight.py +186 -99
  16. msprobe/core/compare/layer_mapping/data_scope_parser.py +19 -8
  17. msprobe/core/compare/layer_mapping/layer_mapping.py +21 -14
  18. msprobe/core/compare/layer_mapping/postprocess_pass.py +4 -3
  19. msprobe/core/compare/merge_result/merge_result.py +381 -0
  20. msprobe/core/compare/merge_result/merge_result_cli.py +31 -0
  21. msprobe/core/compare/merge_result/utils.py +81 -0
  22. msprobe/core/compare/multiprocessing_compute.py +2 -2
  23. msprobe/core/compare/npy_compare.py +109 -147
  24. msprobe/core/compare/utils.py +199 -69
  25. msprobe/core/data_dump/data_collector.py +100 -25
  26. msprobe/core/data_dump/data_processor/base.py +130 -28
  27. msprobe/core/data_dump/data_processor/factory.py +8 -3
  28. msprobe/core/data_dump/data_processor/mindspore_processor.py +170 -23
  29. msprobe/core/data_dump/data_processor/pytorch_processor.py +175 -64
  30. msprobe/core/data_dump/json_writer.py +54 -8
  31. msprobe/core/data_dump/scope.py +19 -18
  32. msprobe/core/overflow_check/abnormal_scene.py +9 -5
  33. msprobe/core/overflow_check/checker.py +1 -1
  34. msprobe/core/overflow_check/utils.py +1 -1
  35. msprobe/docs/01.installation.md +121 -17
  36. msprobe/docs/02.config_introduction.md +18 -16
  37. msprobe/docs/03.config_examples.md +24 -0
  38. msprobe/docs/05.data_dump_PyTorch.md +107 -58
  39. msprobe/docs/06.data_dump_MindSpore.md +95 -34
  40. msprobe/docs/07.accuracy_checker_PyTorch.md +18 -18
  41. msprobe/docs/09.accuracy_checker_MindSpore.md +8 -6
  42. msprobe/docs/10.accuracy_compare_PyTorch.md +99 -41
  43. msprobe/docs/11.accuracy_compare_MindSpore.md +249 -48
  44. msprobe/docs/12.overflow_check_PyTorch.md +1 -1
  45. msprobe/docs/19.monitor.md +310 -220
  46. msprobe/docs/21.visualization_PyTorch.md +125 -35
  47. msprobe/docs/22.visualization_MindSpore.md +149 -41
  48. msprobe/docs/23.generate_operator_PyTorch.md +107 -0
  49. msprobe/docs/24.code_mapping_Mindspore.md +28 -0
  50. msprobe/docs/{23.tool_function_introduction.md → 25.tool_function_introduction.md} +1 -0
  51. msprobe/docs/26.data_dump_PyTorch_baseline.md +37 -0
  52. msprobe/docs/27.dump_json_instruction.md +525 -0
  53. msprobe/docs/28.debugger_save_instruction.md +94 -0
  54. msprobe/docs/28.kernel_dump_MindSpore.md +69 -0
  55. msprobe/docs/FAQ.md +26 -2
  56. msprobe/docs/accuracy_checker_MindSpore/accuracy_checker_MindSpore_baseline.md +14 -0
  57. msprobe/docs/data_dump_MindSpore/data_dump_MindSpore_baseline.md +22 -0
  58. msprobe/docs/img/merge_result.png +0 -0
  59. msprobe/docs/img/monitor/step_count_per_record.png +0 -0
  60. msprobe/docs/img/visualization/fuzzy_match_ms.png +0 -0
  61. msprobe/docs/img/visualization/fuzzy_match_pt.png +0 -0
  62. msprobe/docs/img/visualization/tensorboard_1.png +0 -0
  63. msprobe/docs/img/visualization/tensorboard_2.png +0 -0
  64. msprobe/docs/img/visualization/vis_browser_1.png +0 -0
  65. msprobe/docs/img/visualization/vis_browser_2.png +0 -0
  66. msprobe/docs/img/visualization/vis_precision_info.png +0 -0
  67. msprobe/docs/img/visualization/vis_search_info.png +0 -0
  68. msprobe/docs/img/visualization/vis_show_info.png +0 -0
  69. msprobe/docs/img/visualization/vis_showcase.png +0 -0
  70. msprobe/docs/img/visualization/vis_unmatch_info.png +0 -0
  71. msprobe/docs/visualization/GPTModel.png +0 -0
  72. msprobe/docs/visualization/ParallelMLP.png +0 -0
  73. msprobe/docs/visualization/layer_mapping_example.md +132 -0
  74. msprobe/docs/visualization/mapping.png +0 -0
  75. msprobe/docs/visualization/mapping1.png +0 -0
  76. msprobe/docs/visualization/module_name.png +0 -0
  77. msprobe/docs/visualization/module_name1.png +0 -0
  78. msprobe/docs/visualization/no_mapping.png +0 -0
  79. msprobe/docs/visualization/no_mapping1.png +0 -0
  80. msprobe/docs/visualization/no_mapping_analyze.png +0 -0
  81. msprobe/docs/visualization/top_layer.png +0 -0
  82. msprobe/mindspore/__init__.py +11 -0
  83. msprobe/mindspore/api_accuracy_checker/api_accuracy_checker.py +80 -28
  84. msprobe/mindspore/api_accuracy_checker/api_runner.py +54 -16
  85. msprobe/mindspore/api_accuracy_checker/cmd_parser.py +2 -1
  86. msprobe/mindspore/api_accuracy_checker/compute_element.py +52 -8
  87. msprobe/mindspore/api_accuracy_checker/data_manager.py +37 -0
  88. msprobe/mindspore/api_accuracy_checker/main.py +1 -0
  89. msprobe/mindspore/api_accuracy_checker/multi_api_accuracy_checker.py +12 -6
  90. msprobe/mindspore/api_accuracy_checker/multi_data_manager.py +3 -1
  91. msprobe/mindspore/api_accuracy_checker/torch_mindtorch_importer.py +129 -0
  92. msprobe/mindspore/api_accuracy_checker/type_mapping.py +24 -1
  93. msprobe/mindspore/api_accuracy_checker/utils.py +6 -1
  94. msprobe/mindspore/code_mapping/bind.py +264 -0
  95. msprobe/mindspore/code_mapping/cmd_parser.py +40 -0
  96. msprobe/mindspore/code_mapping/graph.py +49 -0
  97. msprobe/mindspore/code_mapping/graph_parser.py +226 -0
  98. msprobe/mindspore/code_mapping/main.py +24 -0
  99. msprobe/mindspore/code_mapping/processor.py +34 -0
  100. msprobe/mindspore/common/const.py +3 -1
  101. msprobe/mindspore/common/utils.py +68 -5
  102. msprobe/mindspore/compare/distributed_compare.py +0 -2
  103. msprobe/mindspore/compare/ms_compare.py +105 -63
  104. msprobe/mindspore/compare/ms_graph_compare.py +14 -5
  105. msprobe/mindspore/debugger/debugger_config.py +28 -2
  106. msprobe/mindspore/debugger/precision_debugger.py +100 -12
  107. msprobe/mindspore/dump/hook_cell/api_registry.py +85 -16
  108. msprobe/mindspore/dump/hook_cell/hook_cell.py +60 -38
  109. msprobe/mindspore/dump/hook_cell/primitive_hooks.py +33 -15
  110. msprobe/mindspore/dump/hook_cell/support_wrap_ops.yaml +11 -1
  111. msprobe/mindspore/dump/hook_cell/wrap_api.py +92 -1
  112. msprobe/mindspore/dump/jit_dump.py +7 -6
  113. msprobe/mindspore/dump/kernel_dump/kernel_config.py +33 -0
  114. msprobe/mindspore/dump/kernel_graph_dump.py +7 -0
  115. msprobe/mindspore/free_benchmark/api_pynative_self_check.py +13 -4
  116. msprobe/mindspore/free_benchmark/perturbation/bit_noise.py +2 -2
  117. msprobe/mindspore/grad_probe/grad_analyzer.py +24 -12
  118. msprobe/mindspore/grad_probe/hook.py +13 -4
  119. msprobe/mindspore/mindtorch/__init__.py +18 -0
  120. msprobe/mindspore/mindtorch/mindtorch_adaptor.py +255 -0
  121. msprobe/mindspore/monitor/anomaly_detect.py +404 -0
  122. msprobe/mindspore/monitor/distributed/__init__.py +0 -0
  123. msprobe/mindspore/monitor/distributed/distributed_ops.yaml +15 -0
  124. msprobe/mindspore/monitor/distributed/stack_blacklist.yaml +5 -0
  125. msprobe/mindspore/monitor/distributed/wrap_distributed.py +300 -0
  126. msprobe/mindspore/monitor/features.py +63 -0
  127. msprobe/mindspore/monitor/module_hook.py +821 -0
  128. msprobe/mindspore/monitor/module_spec_verifier.py +94 -0
  129. msprobe/mindspore/monitor/utils.py +267 -0
  130. msprobe/mindspore/ms_config.py +13 -3
  131. msprobe/mindspore/overflow_check/kernel_graph_overflow_check.py +7 -0
  132. msprobe/mindspore/service.py +347 -107
  133. msprobe/msprobe.py +24 -3
  134. msprobe/pytorch/__init__.py +7 -7
  135. msprobe/pytorch/api_accuracy_checker/common/utils.py +31 -16
  136. msprobe/pytorch/api_accuracy_checker/compare/algorithm.py +41 -8
  137. msprobe/pytorch/api_accuracy_checker/compare/api_precision_compare.py +100 -267
  138. msprobe/pytorch/api_accuracy_checker/compare/api_precision_standard.yaml +4 -1
  139. msprobe/pytorch/api_accuracy_checker/compare/compare.py +69 -68
  140. msprobe/pytorch/api_accuracy_checker/compare/compare_column.py +54 -0
  141. msprobe/pytorch/api_accuracy_checker/compare/compare_input.py +51 -0
  142. msprobe/pytorch/api_accuracy_checker/compare/compare_utils.py +2 -4
  143. msprobe/pytorch/api_accuracy_checker/generate_op_script/op_generator.py +55 -31
  144. msprobe/pytorch/api_accuracy_checker/precision_standard/absolute_threshold.py +106 -0
  145. msprobe/pytorch/api_accuracy_checker/precision_standard/accumulative_error_compare.py +107 -0
  146. msprobe/pytorch/api_accuracy_checker/precision_standard/base_standard.py +151 -0
  147. msprobe/pytorch/api_accuracy_checker/precision_standard/benchmark_compare.py +226 -0
  148. msprobe/pytorch/api_accuracy_checker/precision_standard/binary_consistency.py +68 -0
  149. msprobe/pytorch/api_accuracy_checker/precision_standard/standard_config.py +218 -0
  150. msprobe/pytorch/api_accuracy_checker/precision_standard/standard_register.py +104 -0
  151. msprobe/pytorch/api_accuracy_checker/precision_standard/thousandth_standard.py +63 -0
  152. msprobe/pytorch/api_accuracy_checker/precision_standard/ulp_compare.py +200 -0
  153. msprobe/pytorch/api_accuracy_checker/run_ut/data_generate.py +57 -1
  154. msprobe/pytorch/api_accuracy_checker/run_ut/multi_run_ut.py +2 -1
  155. msprobe/pytorch/api_accuracy_checker/run_ut/run_overflow_check.py +42 -14
  156. msprobe/pytorch/api_accuracy_checker/run_ut/run_ut.py +64 -19
  157. msprobe/pytorch/api_accuracy_checker/run_ut/run_ut_utils.py +34 -4
  158. msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/device_dispatch.py +5 -3
  159. msprobe/pytorch/bench_functions/apply_adam.py +215 -0
  160. msprobe/pytorch/bench_functions/group_norm_silu.py +27 -0
  161. msprobe/pytorch/bench_functions/mish.py +21 -0
  162. msprobe/pytorch/bench_functions/moe_gating_top_k_softmax.py +44 -0
  163. msprobe/pytorch/bench_functions/npu_fusion_attention.py +42 -10
  164. msprobe/pytorch/bench_functions/sort_v2.py +21 -0
  165. msprobe/pytorch/common/parse_json.py +2 -1
  166. msprobe/pytorch/common/utils.py +116 -2
  167. msprobe/pytorch/compare/distributed_compare.py +17 -29
  168. msprobe/pytorch/compare/pt_compare.py +40 -20
  169. msprobe/pytorch/debugger/debugger_config.py +42 -17
  170. msprobe/pytorch/debugger/precision_debugger.py +56 -12
  171. msprobe/pytorch/dump/module_dump/__init__.py +0 -0
  172. msprobe/pytorch/dump/module_dump/module_dump.py +86 -0
  173. msprobe/pytorch/dump/module_dump/module_processer.py +204 -0
  174. msprobe/pytorch/free_benchmark/common/params.py +2 -1
  175. msprobe/pytorch/free_benchmark/common/utils.py +3 -0
  176. msprobe/pytorch/free_benchmark/compare/grad_saver.py +0 -2
  177. msprobe/pytorch/free_benchmark/result_handlers/base_handler.py +31 -47
  178. msprobe/pytorch/free_benchmark/result_handlers/preheat_handler.py +0 -4
  179. msprobe/pytorch/function_factory.py +7 -1
  180. msprobe/pytorch/hook_module/__init__.py +1 -1
  181. msprobe/pytorch/hook_module/hook_module.py +14 -11
  182. msprobe/pytorch/hook_module/register_optimizer_hook.py +59 -0
  183. msprobe/pytorch/hook_module/support_wrap_ops.yaml +36 -1
  184. msprobe/pytorch/hook_module/wrap_distributed.py +10 -8
  185. msprobe/pytorch/hook_module/wrap_functional.py +0 -40
  186. msprobe/pytorch/monitor/anomaly_analyse.py +1 -1
  187. msprobe/pytorch/monitor/anomaly_detect.py +98 -28
  188. msprobe/pytorch/monitor/csv2tb.py +164 -0
  189. msprobe/pytorch/monitor/distributed/wrap_distributed.py +25 -14
  190. msprobe/pytorch/monitor/features.py +3 -3
  191. msprobe/pytorch/monitor/module_hook.py +543 -318
  192. msprobe/pytorch/monitor/module_metric.py +27 -48
  193. msprobe/pytorch/monitor/module_spec_verifier.py +3 -1
  194. msprobe/pytorch/monitor/optimizer_collect.py +76 -56
  195. msprobe/pytorch/monitor/unittest/test_monitor.py +24 -9
  196. msprobe/pytorch/monitor/utils.py +84 -48
  197. msprobe/pytorch/online_dispatch/dispatch.py +8 -2
  198. msprobe/pytorch/parse_tool/lib/compare.py +10 -10
  199. msprobe/pytorch/parse_tool/lib/config.py +5 -7
  200. msprobe/pytorch/parse_tool/lib/file_desc.py +15 -1
  201. msprobe/pytorch/parse_tool/lib/interactive_cli.py +10 -10
  202. msprobe/pytorch/parse_tool/lib/parse_exception.py +7 -7
  203. msprobe/pytorch/parse_tool/lib/parse_tool.py +11 -10
  204. msprobe/pytorch/parse_tool/lib/utils.py +18 -19
  205. msprobe/pytorch/parse_tool/lib/visualization.py +9 -10
  206. msprobe/pytorch/pt_config.py +19 -22
  207. msprobe/pytorch/service.py +264 -115
  208. msprobe/visualization/builder/graph_builder.py +93 -10
  209. msprobe/visualization/builder/msprobe_adapter.py +30 -6
  210. msprobe/visualization/compare/graph_comparator.py +64 -14
  211. msprobe/visualization/compare/mode_adapter.py +1 -15
  212. msprobe/visualization/graph/base_node.py +15 -19
  213. msprobe/visualization/graph/distributed_analyzer.py +395 -0
  214. msprobe/visualization/graph/graph.py +9 -0
  215. msprobe/visualization/graph/node_op.py +4 -2
  216. msprobe/visualization/graph_service.py +100 -27
  217. msprobe/visualization/utils.py +24 -31
  218. mindstudio_probe-1.1.1.dist-info/RECORD +0 -341
  219. msprobe/pytorch/functional/module_dump.py +0 -84
  220. msprobe/pytorch/module_processer.py +0 -150
  221. {mindstudio_probe-1.1.1.dist-info → mindstudio_probe-1.2.2.dist-info}/LICENSE +0 -0
  222. {mindstudio_probe-1.1.1.dist-info → mindstudio_probe-1.2.2.dist-info}/WHEEL +0 -0
  223. {mindstudio_probe-1.1.1.dist-info → mindstudio_probe-1.2.2.dist-info}/entry_points.txt +0 -0
  224. {mindstudio_probe-1.1.1.dist-info → mindstudio_probe-1.2.2.dist-info}/top_level.txt +0 -0
  225. /msprobe/docs/{data_dump_Mindspore → data_dump_MindSpore}/dynamic_graph_quick_start_example.md +0 -0
  226. /msprobe/{pytorch/functional → mindspore/code_mapping}/__init__.py +0 -0
@@ -4,23 +4,29 @@
4
4
 
5
5
  工具支持PyTorch版本:2.1/2.2
6
6
 
7
+ ## 展示示例
8
+
9
+ 支持重建模型的层级结构;
10
+
11
+ 支持两个模型的结构差异比对;
12
+
13
+ 支持两个模型的精度数据比对,支持疑似有精度问题节点的快速搜索,自动跳转展开节点所在的层级。
14
+
15
+ ![vis_show](./img/visualization/vis_showcase.png)
16
+
7
17
  ## 1.依赖安装
8
18
 
9
19
  分级可视化工具依赖**msprobe工具**和**tensorboard。**
10
20
 
11
21
  ### 1.1 安装msprobe工具
12
22
 
13
- 现阶段分级可视化工具还未集成在已发布的msprobe工具中,需要从源码安装,请参考从源码安装章节。
14
-
15
23
  [msprobe工具安装](https://gitee.com/ascend/mstt/blob/master/debug/accuracy_tools/msprobe/docs/01.installation.md)
16
24
 
17
25
  ### 1.2 安装tb_graph_ascend
18
26
 
19
27
  **请安装tb_graph_ascend,否则无法解析构图结果。**
20
28
 
21
- [tb_graph_ascend下载](https://mindstudio-sample.obs.cn-north-4.myhuaweicloud.com/GRAPH_ASCEND/tb_graph_ascend-0.1.0-py3-none-any.whl)
22
-
23
- ``pip3 install``即可。
29
+ ``pip3 install tb-graph-ascend``即可。
24
30
 
25
31
  ## 2.模型结构数据采集
26
32
  [PyTorch场景的数据采集](https://gitee.com/ascend/mstt/blob/master/debug/accuracy_tools/msprobe/docs/05.data_dump_PyTorch.md)
@@ -37,19 +43,35 @@ msprobe -f pytorch graph -i ./compare.json -o ./output
37
43
  ```
38
44
  **命令行参数说明**:
39
45
 
40
- | 参数名 | 说明 | 是否必选 |
41
- |------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------|
42
- | -i 或 --input_path | 指定比对文件,str 类型。 | 是 |
43
- | -o 或 --output_path | 配置比对结果文件存盘目录,str 类型。文件名称基于时间戳自动生成,格式为:`compare_{timestamp}.vis`。 | 是 |
44
- | -lm 或 --layer_mapping | 跨套件比对,例如同一个模型分别使用了DeepSpeed和Megatron套件的比对场景。配置该参数时表示开启跨套件Layer层的比对功能,指定模型代码中的Layer层后,可以识别对应dump数据中的模块或API。需要指定自定义映射文件*.yaml。自定义映射文件的格式请参见[自定义映射文件(Layer)](#71-自定义映射文件layer)。 | 否 |
45
- | -oc 或 --overflow_check | 是否开启溢出检测模式,开启后会在输出vis文件中(`compare_{timestamp}.vis`)对每个溢出节点进行标记溢出等级,溢出等级说明参考如下 | 否 |
46
+ | 参数名 | 说明 | 是否必选 |
47
+ |------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------|
48
+ | -i 或 --input_path | 指定比对文件,参考[比对文件说明](#313-比对文件说明) | 是 |
49
+ | -o 或 --output_path | 配置比对结果文件存盘目录,str 类型。文件名称基于时间戳自动生成,格式为:`compare_{timestamp}.vis或build_{timestamp}.vis`。 | 是 |
50
+ | -lm 或 --layer_mapping | 跨套件比对,例如同一个模型分别使用了DeepSpeed和Megatron套件的比对场景。配置该参数时表示开启跨套件Layer层的比对功能,指定模型代码中的Layer层后,可以识别对应dump数据中的模块或API。需要指定自定义映射文件*.yaml。自定义映射文件的格式请参见[自定义映射文件(Layer)](#71-自定义映射文件layer),如何配置自定义映射文件请参考[模型分级可视化如何配置layer mapping映射文件](./visualization/layer_mapping_example.md)。 | 否 |
51
+ | -oc 或 --overflow_check | 是否开启溢出检测模式,开启后会在输出vis文件中(`compare_{timestamp}.vis或build_{timestamp}.vis`)对每个溢出节点进行标记溢出等级,溢出等级说明参考[溢出等级说明](#312-溢出等级说明) | 否 |
52
+ | -f 或 --fuzzy_match | 是否开启模糊匹配,bool类型。模糊匹配说明参考[匹配说明](#311-匹配说明) | 否 |
53
+ | -cs 或 --complete_stack | 是否使用完整的堆栈信息,bool类型。默认使用精简的堆栈信息,数据量小有助于增加流畅度。完整堆栈和精简堆栈信息参考[堆栈信息说明](#72-堆栈信息说明) | 否 |
54
+
55
+ #### 3.1.1 匹配说明
56
+
57
+ **注:dump名称 = 名称 + 调用次数**,例如Torch.matmul.2.forward,matmul是名称,2是调用次数
46
58
 
47
- **溢出等级说明**
59
+ 1.默认匹配
60
+ - 所有节点dump名称一致
61
+ - 节点输入输出参数数量一致,参数type、shape一致
62
+ - 节点的层级一致(父节点们一致)
63
+
64
+ 2.模糊匹配
65
+ - Module节点dump名称一致,两个匹配上的Module节点, 忽略各自节点下所有api的dump调用次数,按照名称一致+Module节点内的调用顺序进行匹配
66
+ - ![fuzzy_match_pt.png](./img/visualization/fuzzy_match_pt.png)
67
+ - 参数shape一致
68
+
69
+ #### 3.1.2 溢出等级说明
48
70
  - medium:输入异常,输出正常场景
49
71
  - high:输入异常,输出异常;输出norm值相较于输入存在异常增大情况
50
72
  - critical:输入正常,输出异常场景
51
73
 
52
- **比对文件说明**:
74
+ #### 3.1.3 比对文件说明
53
75
  以在当前目录创建 ./compare.json 为例。
54
76
  ```
55
77
  {
@@ -280,33 +302,70 @@ msprobe -f pytorch graph -i ./compare.json -o ./output
280
302
  ├── compare_stepn_rankn_{timestamp}.vis
281
303
  ```
282
304
 
305
+ #### 3.2.4 仅模型结构比对
306
+
307
+ 适用场景:**主要关注模型结构而非训练过程数据**。例如,在模型迁移过程中,确保迁移前后模型结构的一致性,或在排查精度差异时,判断是否由模型结构差异所引起。
308
+
309
+ 使用msprobe工具对模型数据进行采集时,**可选择仅采集模型结构(task配置为structure)**,此配置将避免采集模型训练过程的数据,从而显著减少采集所需的时间。
310
+
311
+ dump配置请参考[dump配置示例](./03.config_examples.md#16-task-配置为-structure)
312
+
313
+ 得到dump数据后,若需比较特定两个rank之间的数据,请参考[3.2.2 双图比对](#322-双图比对);若需进行多个rank或多个step的数据批量比对,请参考[3.2.3 批量构建或比对](#323-批量构建或比对)。
314
+
283
315
  ## 4.启动tensorboard
284
316
 
317
+ ### 4.1 可直连的服务器
318
+
285
319
  将生成vis文件的路径**out_path**传入--logdir
286
320
 
287
321
  ```
288
322
  tensorboard --logdir out_path --bind_all --port [可选,端口号]
289
323
  ```
324
+ 启动后会打印日志:
325
+
326
+ ![tensorboard_1](./img/visualization/tensorboard_1.png)
290
327
 
291
- 启动后会打印日志。
292
- ``TensorBoard 2.15.1 at http://localhost.localdomain:6008/ (Press CTRL+C to quit)``
293
- localhost.localdomain是机器地址,6008是端口号。
328
+ ubuntu是机器地址,6008是端口号。
294
329
 
295
- **如果链接打不开,可以尝试使用vscode连接服务器,在vscode终端输入:**
330
+ **注意,ubuntu需要替换为真实的服务器地址,例如真实的服务器地址为10.123.456.78,则需要在浏览器窗口输入http://10.123.456.78:6008**
331
+
332
+ ### 4.2 不可直连的服务器
333
+ **如果链接打不开(服务器无法直连需要挂vpn才能连接等场景),可以尝试使用vscode连接服务器,在vscode终端输入:**
296
334
 
297
335
  ```
298
336
  tensorboard --logdir out_path
299
337
  ```
338
+ ![tensorboard_2](./img/visualization/tensorboard_2.png)
300
339
 
301
- CTRL+C点击链接即可
340
+ 按住CTRL点击链接即可
302
341
 
303
342
  ## 5.浏览器查看
304
343
 
305
- 推荐使用谷歌浏览器,在浏览器中输入机器地址+端口号回车,出现TensorBoard页面,右上方选择GRAPHS_ASCEND即可展示模型结构图。
344
+ ### 5.1 浏览器打开图
345
+ 推荐使用谷歌浏览器,在浏览器中输入机器地址+端口号回车,出现TensorBoard页面,其中/#graph_ascend会自动拼接。
346
+ ![vis_browser_1](./img/visualization/vis_browser_1.png)
347
+ 如果您切换了TensorBoard的其他功能,此时想回到模型分级可视化页面,可以点击左上方的**GRAPH_ASCEND**
348
+ ![vis_browser_2](./img/visualization/vis_browser_2.png)
349
+
350
+ ### 5.2 查看图
351
+ ![vis_show_info.png](./img/visualization/vis_show_info.png)
352
+
353
+ ### 5.3 名称搜索
354
+ ![vis_search_info.png](./img/visualization/vis_search_info.png)
355
+
356
+ ### 5.4 精度筛选
357
+ ![vis_precision_info.png](./img/visualization/vis_precision_info.png)
358
+
359
+ ### 5.5 未匹配节点筛选
360
+ 节点匹配规则:
306
361
 
307
- 节点需要双击打开。
362
+ 1.名称一致
308
363
 
309
- 键盘WS可放大缩小,AD可左右移动,鼠标滚轮可上下移动。
364
+ 2.节点输入输出参数数量一致,参数type、shape一致
365
+
366
+ 3.节点的层级一致(父节点们一致)
367
+
368
+ ![vis_unmatch_info.png](./img/visualization/vis_unmatch_info.png)
310
369
 
311
370
  ## 6.图比对说明
312
371
 
@@ -326,20 +385,6 @@ CTRL+C点击链接即可
326
385
 
327
386
  ``相对误差:abs((npu统计值 - bench统计值) / bench统计值)``
328
387
 
329
- 其中小值不使用相对误差来判断精度差异,而是使用**绝对误差**来判断精度差异
330
-
331
- **判定为小值的阈值:**
332
-
333
- - torch.float32:e-6
334
- - torch.float16:e-3
335
- - torch.bfloat16:e-3
336
-
337
- **小值域的绝对误差阈值:**
338
-
339
- - torch.float32:e-6
340
- - torch.float16:e-3
341
- - torch.bfloat16:e-3
342
-
343
388
  #### md5模式
344
389
  节点中任意输入输出的md5值不同。
345
390
 
@@ -384,3 +429,48 @@ yaml文件中只需配置待调试侧与标杆侧模型代码中功能一致但
384
429
  模型代码示例:
385
430
 
386
431
  ![ms_dump](./img/ms_layer.png)
432
+
433
+ ### 7.2 堆栈信息说明
434
+
435
+ **精简堆栈**
436
+
437
+ 保留一条当前模块或api的调用信息
438
+
439
+ ```json
440
+ {
441
+ "Module.layer1.0.bn1.BatchNorm2d.forward.0": [
442
+ "File /home/torchvision/models/resnet.py, line 93, in forward, \n out = self.bn1(out)"
443
+ ]
444
+ }
445
+ ```
446
+
447
+ **完整堆栈**
448
+
449
+ 当前模块或api完整的调用信息
450
+
451
+ ```json
452
+ {
453
+ "Module.layer1.0.bn1.BatchNorm2d.forward.0": [
454
+ "File /home/torchvision/models/resnet.py, line 93, in forward, \n out = self.bn1(out)",
455
+ "File /home/torch/nn/modules/module.py, line 1568, in _call_impl, \n result = forward_call(*args, **kwargs)",
456
+ "File /home/torch/nn/modules/module.py, line 1518, in _wrapped_call_impl, \n return self._call_impl(*args, **kwargs)",
457
+ "File /home/torch/nn/modules/container.py, line 215, in forward, \n input = module(input)",
458
+ "File /home/torch/nn/modules/module.py, line 1568, in _call_impl, \n result = forward_call(*args, **kwargs)",
459
+ "File /home/torch/nn/modules/module.py, line 1518, in _wrapped_call_impl, \n return self._call_impl(*args, **kwargs)",
460
+ "File /home/torchvision/models/resnet.py, line 273, in _forward_impl, \n x = self.layer1(x)",
461
+ "File /home/torchvision/models/resnet.py, line 285, in forward, \n return self._forward_impl(x)",
462
+ "File /home/torch/nn/modules/module.py, line 1527, in _call_impl, \n return forward_call(*args, **kwargs)",
463
+ "File /home/torch/nn/modules/module.py, line 1518, in _wrapped_call_impl, \n return self._call_impl(*args, **kwargs)",
464
+ "File /home/visualization/resnet18.py, line 40, in <module>, \n outputs = model(inputs)"
465
+ ]
466
+ }
467
+
468
+ ```
469
+ # FAQ
470
+ 1. 图比对场景,节点呈现灰色,且没有精度比对数据,怎么处理?
471
+
472
+ 节点呈现灰色,代表左边待调试侧节点与右边标杆侧节点没有匹配上,可能有以下几点原因:
473
+
474
+ - **标杆侧确实没有能与待调试侧匹配上的节点**,属于代码实现上的差异,请确认此差异是否正常,是否会影响到整网精度。
475
+ - **节点的输入或输出type、shape不一致,参数个数不一致,节点所在层级的父层级不一致**,导致节点无法匹配,具体匹配规则见[匹配说明](#311-匹配说明),可尝试使用模糊匹配功能,如何使用此功能请参考[构图命令行说明](#31-构图命令行说明)。如果是参数shape不一致,即使是模糊匹配功能也无法让节点匹配上,请检查参数shape不一致是否合理。
476
+ - **节点名称不一致**,导致节点无法匹配,可使用layer mapping功能,如何使用此功能请参考[构图命令行说明](#31-构图命令行说明),如何自定义映射文件请参考[模型分级可视化如何配置layer mapping映射文件](./visualization/layer_mapping_example.md)。
@@ -4,23 +4,29 @@
4
4
 
5
5
  工具支持MindSpore版本:2.4.0
6
6
 
7
+ ## 展示示例
8
+
9
+ 支持重建模型的层级结构;
10
+
11
+ 支持两个模型的结构差异比对;
12
+
13
+ 支持两个模型的精度数据比对,支持疑似有精度问题节点的快速搜索,自动跳转展开节点所在的层级。
14
+
15
+ ![vis_show](./img/visualization/vis_showcase.png)
16
+
7
17
  ## 1.依赖安装
8
18
 
9
19
  分级可视化工具依赖**msprobe工具**和**tensorboard。**
10
20
 
11
21
  ### 1.1 安装msprobe工具
12
22
 
13
- 现阶段分级可视化工具还未集成在已发布的msprobe工具中,需要从源码安装,请参考从源码安装章节。
14
-
15
23
  [msprobe工具安装](https://gitee.com/ascend/mstt/blob/master/debug/accuracy_tools/msprobe/docs/01.installation.md)
16
24
 
17
25
  ### 1.2 安装tb_graph_ascend
18
26
 
19
27
  **请安装tb_graph_ascend,否则无法解析构图结果。**
20
28
 
21
- [tb_graph_ascend下载](https://mindstudio-sample.obs.cn-north-4.myhuaweicloud.com/GRAPH_ASCEND/tb_graph_ascend-0.1.0-py3-none-any.whl)
22
-
23
- ``pip3 install``即可。
29
+ ``pip3 install tb-graph-ascend``即可。
24
30
 
25
31
  ## 2.模型结构数据采集
26
32
  [MindSpore场景的精度数据采集](https://gitee.com/ascend/mstt/blob/master/debug/accuracy_tools/msprobe/docs/06.data_dump_MindSpore.md)
@@ -37,13 +43,36 @@ msprobe -f mindspore graph -i ./compare.json -o ./output
37
43
  ```
38
44
  **命令行参数说明**:
39
45
 
40
- | 参数名 | 说明 | 是否必选 |
41
- |-------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------| -------- |
42
- | -i 或 --input_path | 指定比对文件,str 类型。 | 是 |
43
- | -o 或 --output_path | 配置比对结果文件存盘目录,str 类型。文件名称基于时间戳自动生成,格式为:`compare_{timestamp}.vis`。 | 是 |
44
- | -lm 或 --layer_mapping| 跨框架比对,MindSpore和PyTorch的比对场景。配置该参数时表示开启跨框架Layer层的比对功能,指定模型代码中的Layer层后,可以识别对应dump数据中的模块或API。需要指定自定义映射文件*.yaml。自定义映射文件的格式请参见[自定义映射文件(Layer)](#71-自定义映射文件layer)。 | 否 |
46
+ | 参数名 | 说明 | 是否必选 |
47
+ |-------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -------- |
48
+ | -i 或 --input_path | 指定比对文件,参考[比对文件说明](#313-比对文件说明) | 是 |
49
+ | -o 或 --output_path | 配置比对结果文件存盘目录,str 类型。文件名称基于时间戳自动生成,格式为:`compare_{timestamp}.vis或build_{timestamp}.vis`。 | 是 |
50
+ | -lm 或 --layer_mapping| 跨框架比对,MindSpore和PyTorch的比对场景。配置该参数时表示开启跨框架Layer层的比对功能,指定模型代码中的Layer层后,可以识别对应dump数据中的模块或API。需要指定自定义映射文件*.yaml。自定义映射文件的格式请参见[自定义映射文件(Layer)](#71-自定义映射文件layer), 如何配置自定义映射文件请参考[模型分级可视化如何配置layer mapping映射文件](./visualization/layer_mapping_example.md)。 | 否 |
51
+ | -oc 或 --overflow_check | 是否开启溢出检测模式,开启后会在输出vis文件中(`compare_{timestamp}.vis或build_{timestamp}.vis`)对每个溢出节点进行标记溢出等级,溢出等级说明参考[溢出等级说明](#312-溢出等级说明) | 否 |
52
+ | -f 或 --fuzzy_match | 是否开启模糊匹配,bool类型。模糊匹配说明参考[匹配说明](#311-匹配说明) | 否 |
53
+ | -cs 或 --complete_stack | 是否使用完整的堆栈信息,bool类型。默认使用精简的堆栈信息,数据量小有助于增加流畅度。完整堆栈和精简堆栈信息参考[堆栈信息说明](#72-堆栈信息说明) | 否 |
54
+
55
+ #### 3.1.1 匹配说明
56
+
57
+ **注:dump名称 = 名称 + 调用次数**,例如Functional.matmul.2.forward,matmul是名称,2是调用次数
58
+
59
+ 1.默认匹配
60
+ - 所有节点dump名称一致
61
+ - 节点输入输出参数数量一致,参数type、shape一致
62
+ - 节点的层级一致(父节点们一致)
63
+
64
+ 2.模糊匹配
65
+ - Cell节点dump名称一致,两个匹配上的Cell节点, 忽略各自节点下所有api的dump调用次数,按照名称一致+Cell节点内的调用顺序进行匹配
66
+ - ![fuzzy_match_ms.png](./img/visualization/fuzzy_match_ms.png)
67
+ - 参数shape一致
68
+
69
+ #### 3.1.2 溢出等级说明
70
+ - medium:输入异常,输出正常场景
71
+ - high:输入异常,输出异常;输出norm值相较于输入存在异常增大情况
72
+ - critical:输入正常,输出异常场景
73
+
74
+ #### 3.1.3 比对文件说明
45
75
 
46
- **比对文件说明**:
47
76
  以在当前目录创建 ./compare.json 为例。
48
77
  ```
49
78
  {
@@ -274,35 +303,71 @@ msprobe -f mindspore graph -i ./compare.json -o ./output
274
303
  ├── compare_stepn_rankn_{timestamp}.vis
275
304
  ```
276
305
 
306
+ #### 3.2.4 仅模型结构比对
307
+
308
+ 适用场景:**主要关注模型结构而非训练过程数据**。例如,在模型迁移过程中,确保迁移前后模型结构的一致性,或在排查精度差异时,判断是否由模型结构差异所引起。
309
+
310
+ 使用msprobe工具对模型数据进行采集时,**可选择仅采集模型结构(task配置为structure)**,此配置将避免采集模型训练过程的数据,从而显著减少采集所需的时间。
311
+
312
+ dump配置请参考[dump配置示例](./03.config_examples.md#35-task-配置为-structure)
313
+
314
+ 得到dump数据后,若需比较特定两个rank之间的数据,请参考[3.2.2 双图比对](#322-双图比对);若需进行多个rank或多个step的数据批量比对,请参考[3.2.3 批量构建或比对](#323-批量构建或比对)。
315
+
316
+
277
317
  ## 4.启动tensorboard
278
318
 
319
+ ### 4.1 可直连的服务器
320
+
279
321
  将生成vis文件的路径**out_path**传入--logdir
280
322
 
281
323
  ```
282
324
  tensorboard --logdir out_path --bind_all --port [可选,端口号]
283
325
  ```
326
+ 启动后会打印日志:
327
+
328
+ ![tensorboard_1](./img/visualization/tensorboard_1.png)
284
329
 
285
- 启动后会打印日志。
286
- ``TensorBoard 2.15.1 at http://localhost.localdomain:6008/#graphs (Press CTRL+C to quit)``
287
- localhost.localdomain是机器地址,6008是端口号。
330
+ ubuntu是机器地址,6008是端口号。
288
331
 
289
- **注意,localhost.localdomain需要替换为真实的服务器地址,例如真实的服务器地址为10.123.456.78,则需要在浏览器窗口输入http://10.123.456.78:6008/#graphs**
332
+ **注意,ubuntu需要替换为真实的服务器地址,例如真实的服务器地址为10.123.456.78,则需要在浏览器窗口输入http://10.123.456.78:6008**
290
333
 
291
- **如果链接打不开(例如服务器无法直连需要挂vpn才能连接的场景),可以尝试使用vscode连接服务器,在vscode终端输入:**
334
+ ### 4.2 不可直连的服务器
335
+ **如果链接打不开(服务器无法直连需要挂vpn才能连接等场景),可以尝试使用vscode连接服务器,在vscode终端输入:**
292
336
 
293
337
  ```
294
338
  tensorboard --logdir out_path
295
339
  ```
340
+ ![tensorboard_2](./img/visualization/tensorboard_2.png)
296
341
 
297
- CTRL+C点击链接即可
342
+ 按住CTRL点击链接即可
298
343
 
299
344
  ## 5.浏览器查看
300
345
 
301
- 推荐使用谷歌浏览器,在浏览器中输入机器地址+端口号回车,出现TensorBoard页面,右上方选择GRAPHS_ASCEND即可展示模型结构图。
346
+ ### 5.1 浏览器打开图
347
+ 推荐使用谷歌浏览器,在浏览器中输入机器地址+端口号回车,出现TensorBoard页面,其中/#graph_ascend会自动拼接。
348
+ ![vis_browser_1](./img/visualization/vis_browser_1.png)
349
+ 如果您切换了TensorBoard的其他功能,此时想回到模型分级可视化页面,可以点击左上方的**GRAPH_ASCEND**
350
+ ![vis_browser_2](./img/visualization/vis_browser_2.png)
351
+
352
+ ### 5.2 查看图
353
+ ![vis_show_info.png](./img/visualization/vis_show_info.png)
354
+
355
+ ### 5.3 名称搜索
356
+ ![vis_search_info.png](./img/visualization/vis_search_info.png)
357
+
358
+ ### 5.4 精度筛选
359
+ ![vis_precision_info.png](./img/visualization/vis_precision_info.png)
302
360
 
303
- 节点需要双击打开。
361
+ ### 5.5 未匹配节点筛选
362
+ 节点匹配规则:
304
363
 
305
- 键盘WS可放大缩小,AD可左右移动,鼠标滚轮可上下移动。
364
+ 1.名称一致
365
+
366
+ 2.节点输入输出参数数量一致,参数type、shape一致
367
+
368
+ 3.节点的层级一致(父节点们一致)
369
+
370
+ ![vis_unmatch_info.png](./img/visualization/vis_unmatch_info.png)
306
371
 
307
372
  ## 6.图比对说明
308
373
 
@@ -322,20 +387,6 @@ CTRL+C点击链接即可
322
387
 
323
388
  ``相对误差:abs((npu统计值 - bench统计值) / bench统计值)``
324
389
 
325
- 其中小值不使用相对误差来判断精度差异,而是使用**绝对误差**来判断精度差异
326
-
327
- **判定为小值的阈值:**
328
-
329
- - float32:e-6
330
- - float16:e-3
331
- - bfloat16:e-3
332
-
333
- **小值域的绝对误差阈值:**
334
-
335
- - float32:e-6
336
- - float16:e-3
337
- - bfloat16:e-3
338
-
339
390
  #### md5模式
340
391
  节点中任意输入输出的md5值不同。
341
392
 
@@ -366,13 +417,6 @@ PipelineCell:
366
417
 
367
418
  Cell:
368
419
  network_with_loss: module
369
-
370
- layers: # 手动映射MindSpore与PyTorch模型代码中的Layer层序号
371
- '5': '0'
372
- '6': '1'
373
- '7': '2'
374
- '8': '3'
375
- '9': '4'
376
420
  ```
377
421
 
378
422
  Layer层名称需要从模型代码中获取。
@@ -382,3 +426,67 @@ yaml文件中只需配置MindSpore与PyTorch模型代码中功能一致但名称
382
426
  模型代码示例:
383
427
 
384
428
  ![ms_dump](./img/ms_layer.png)
429
+
430
+ ### 7.2 堆栈信息说明
431
+
432
+ **精简堆栈**
433
+
434
+ 保留一条当前模块或api的调用信息
435
+
436
+ ```json
437
+ {
438
+ "Cell.model.language_model.embedding.word_embeddings.reduce_scatter_to_sp_region.ReduceScatterToSequenceParallelRegion.forward.0": [
439
+ "File /home/mindformers/experimental/distri_cores/tensor_parallel/layers.py, line 770, in construct, \n output = self.reduce_scatter_to_sp_region(output_parallel)"
440
+ ]
441
+ }
442
+ ```
443
+
444
+ **完整堆栈**
445
+
446
+ 当前模块或api完整的调用信息
447
+
448
+ ```json
449
+ {
450
+ "Cell.model.language_model.embedding.word_embeddings.reduce_scatter_to_sp_region.ReduceScatterToSequenceParallelRegion.forward.0": [
451
+ "File /home/mindspore/nn/cell.py, line 507, in _run_construct, \n output = self._run_forward_hook(inputs, output)",
452
+ "File /home/mindspore/nn/cell.py, line 759, in _complex_call, \n output = self._run_construct(*args, **kwargs)",
453
+ "File /home/mindspore/nn/cell.py, line 747, in __call__, \n return self._complex_call(*args, **kwargs)",
454
+ "File /home/mindformers/experimental/distri_cores/tensor_parallel/layers.py, line 770, in construct, \n output = self.reduce_scatter_to_sp_region(output_parallel)",
455
+ "File /home/mindspore/nn/cell.py, line 2462, in _backward_hook_construct, \n outputs = self.construct(outputs, **kwargs)",
456
+ "File /home/mindspore/nn/cell.py, line 498, in _run_construct, \n output = self._backward_hook_construct(*inputs, **kwargs)",
457
+ "File /home/mindspore/nn/cell.py, line 745, in __call__, \n return self._run_construct(*args, **kwargs)",
458
+ "File /home/mindformers/experimental/distri_cores/transformer/language_model.py, line 151, in construct, \n embeddings = self.word_embeddings(input_ids)",
459
+ "File /home/mindspore/nn/cell.py, line 2460, in _backward_hook_construct, \n outputs = self.construct(*outputs, **kwargs)",
460
+ "File /home/mindspore/nn/cell.py, line 498, in _run_construct, \n output = self._backward_hook_construct(*inputs, **kwargs)",
461
+ "File /home/mindspore/nn/cell.py, line 745, in __call__, \n return self._run_construct(*args, **kwargs)",
462
+ "File /home/mindformers/experimental/distri_cores/transformer/language_model.py, line 391, in construct, \n text_embedding_out = self.embedding(enc_input_ids, enc_position_ids,",
463
+ "File /home/mindspore/nn/cell.py, line 2460, in _backward_hook_construct, \n outputs = self.construct(*outputs, **kwargs)",
464
+ "File /home/mindspore/nn/cell.py, line 498, in _run_construct, \n output = self._backward_hook_construct(*inputs, **kwargs)",
465
+ "File /home/mindspore/nn/cell.py, line 745, in __call__, \n return self._run_construct(*args, **kwargs)",
466
+ "File /home/model/gpt_model.py, line 104, in construct, \n lm_output = self.language_model(tokens,",
467
+ "File /home/mindspore/nn/cell.py, line 2460, in _backward_hook_construct, \n outputs = self.construct(*outputs, **kwargs)",
468
+ "File /home/mindspore/nn/cell.py, line 498, in _run_construct, \n output = self._backward_hook_construct(*inputs, **kwargs)",
469
+ "File /home/mindspore/nn/cell.py, line 745, in __call__, \n return self._run_construct(*args, **kwargs)",
470
+ "File /home/mindformers/experimental/distri_cores/pipeline_parallel/pipeline_cell.py, line 429, in construct, \n return self.model(*inputs)",
471
+ "File /home/mindspore/nn/cell.py, line 757, in _complex_call, \n output = self.construct(*args, **kwargs)",
472
+ "File /home/mindspore/nn/cell.py, line 747, in __call__, \n return self._complex_call(*args, **kwargs)",
473
+ "File /home/mindformers/experimental/distri_cores/pipeline_parallel/schedules.py, line 121, in run_forward, \n output_tensor = model(*input_data, recv_data=None)",
474
+ "File /home/mindformers/experimental/distri_cores/pipeline_parallel/schedules.py, line 735, in forward_backward_pipelining_without_interleaving, \n micro_input_data = run_forward(*micro_input_data,",
475
+ "File /home/mindformers/experimental/distri_cores/training.py, line 409, in forward_backward_with_pipelining, \n loss, logits, grads = forward_backward_pipelining_without_interleaving(",
476
+ "File /home/mindformers/experimental/distri_cores/training.py, line 533, in construct, \n (loss, _), grads = self.forward_backward_func(*inputs_tuple, loss_scale=current_step_loss_scale, **inputs_dict)",
477
+ "File /home/mindspore/nn/cell.py, line 757, in _complex_call, \n output = self.construct(*args, **kwargs)",
478
+ "File /home/mindspore/nn/cell.py, line 747, in __call__, \n return self._complex_call(*args, **kwargs)",
479
+ "File /home/mindformers/experimental/distri_cores/training.py, line 655, in train, \n loss, is_finite, loss_scale, learning_rate = train_one_step_cell(**data)",
480
+ "File /home/model/pretrain_gpt.py, line 303, in main, \n train(",
481
+ "File /home/model/pretrain_gpt.py, line 316, in <module>, \n main()"
482
+ ]
483
+ }
484
+ ```
485
+ # FAQ
486
+ 1. 图比对场景,节点呈现灰色,且没有精度比对数据,怎么处理?
487
+
488
+ 节点呈现灰色,代表左边待调试侧节点与右边标杆侧节点没有匹配上,可能有以下几点原因:
489
+
490
+ - **标杆侧确实没有能与待调试侧匹配上的节点**,属于代码实现上的差异,请确认此差异是否正常,是否会影响到整网精度。
491
+ - **节点的输入或输出type、shape不一致,参数个数不一致,节点所在层级的父层级不一致**,导致节点无法匹配,具体匹配规则见[匹配说明](#311-匹配说明),可尝试使用模糊匹配功能,如何使用此功能请参考[构图命令行说明](#31-构图命令行说明)。如果是参数shape不一致,即使是模糊匹配功能也无法让节点匹配上,请检查参数shape不一致是否合理。
492
+ - **节点名称不一致**,导致节点无法匹配,可使用layer mapping功能,如何使用此功能请参考[构图命令行说明](#31-构图命令行说明),如何自定义映射文件请参考[模型分级可视化如何配置layer mapping映射文件](./visualization/layer_mapping_example.md)。
@@ -0,0 +1,107 @@
1
+ # 单算子API自动生成脚本
2
+
3
+ ## 1 简介
4
+
5
+ 单算子API自动生成脚本通过提取dump数据中的可疑算子,对其进行单API复现,输出单API精度的比对结果。具体而言,该工具可以从dump数据中提取可疑API的前反向信息,根据前反向数据生成单API的前反向过程,最后通过**新精度标准比对法**<sup>a</sup>将 NPU/GPU 和 CPU 的结果进行比对,从而给出不同比对方法下的比对结果。本工具支持**随机生成模式和真实数据模式**<sup>b</sup>。
6
+
7
+ a. 依据新精度标准,对不同的API采取不同的比对算法(包括绝对阈值法、标杆比对法、二进制一致法、ULP误差比对法和双千指标法),最终给定比对结果;
8
+
9
+ b. 在生成单API脚本时可以选择由工具构造随机数获得 dump 数据或选择真实输入的数据进行单API复现。随机生成模式(对应 task: "statistics")执行效率高,可以快速获得结果,但数据精度低,只能大致判断精度问题;真实数据模式(对应 task: "tensor")执行效率略低于随机生成模式,但是数据精度高,可以准确判断精度问题。
10
+
11
+ ## 2 使用方式
12
+
13
+ ### 前提
14
+ 1. 安装 msprobe。详见[ msprobe 安装](./01.installation.md)章节。
15
+ 2. 已完成对训练过程的dump,获得dump.json文件。
16
+ [PyTorch场景的数据采集](https://gitee.com/ascend/mstt/blob/master/debug/accuracy_tools/msprobe/docs/05.data_dump_PyTorch.md)
17
+
18
+ **目前仅支持复现API级的数据,故dump时level可选择L0(API信息)或者mix(module信息+API信息)。如需复现真实数据场景的API脚本,dump时task应选择tensor,如需复现随机数据场景的API脚本,dump时task选择statistics**。
19
+ 3. 发现某个算子疑似存在精度问题,并得知算子名,如Functional.softmax.3、Tensor.add.0、Torch.matmul.5等
20
+
21
+ ### 2.1 配置config_op.json
22
+ 单API复现参数配置如下(以复现softmax算子为例):
23
+ ```
24
+ {
25
+ "dump_json_path": "./dump.json",
26
+ "api_name": "Functional.softmax.0",
27
+ "extract_api_path": "./Functional.softmax.0.json",
28
+ "propagation": "forward",
29
+ "data_mode": "random_data",
30
+ "random_seed": 1234,
31
+ "iter_times": 1
32
+ }
33
+ ```
34
+ **配置文件参数说明**
35
+
36
+ | 参数名称 | 解释 | 是否必选 |
37
+ | ---------------------------- | ------------------------------------------------------------ | ---------------------------------- |
38
+ | dump_json_path | dump.json的文件路径,包含所有dump算子的信息;如果已经提取了可疑算子并保存可以不指定。 | 否 |
39
+ | api_name | 算子名,如Functional.softmax.3、Tensor.add.0、Torch.matmul.5等。如果已经提取了可疑算子并保存可以不指定 | 否 |
40
+ | extract_api_path | 提取可疑算子的json文件路径 | 是 |
41
+ | propagation | 选择复现算子的forward还是backward,默认为forward | 否 |
42
+ | data_mode | 选择复现算子的随机数据(random_data)还是真实数据(real_data)模式,默认为random_data | 否 |
43
+ | random_seed | 仅random_data模式有效,表示手动设定的随机种子,默认为1234 | 否 |
44
+ | iter_times | 仅random_data模式有效,表示单API运行的次数 | 否 |
45
+
46
+ ### 2.2 运行命令生成单API脚本
47
+ config_op.json配置好后,运行如下命令:
48
+ ```
49
+ msprobe -f pytorch op_generate -i ./config.json -o ./
50
+ ```
51
+ 或者
52
+
53
+ 进入到mstt的generate_op_script文件夹
54
+ ```
55
+ cd mstt/debug/accuracy_tools/msprobe/pytorch/api_accuracy_checker/generate_op_script
56
+ ```
57
+ 运行
58
+ ```
59
+ python op_generator.py -i ./config_op.json -o ./
60
+ ```
61
+ **参数说明**
62
+ | 参数名称 | 解释 | 是否必选 |
63
+ | ---------------------------- | ------------------------------------------------------------ | ---------------------------------- |
64
+ | -i 或 --config_input | config_op.json的路径 | 是 |
65
+ | -o 或 --api_output_path | 单API脚本的输出路径 | 是 |
66
+
67
+ ### 2.3 运行单API脚本
68
+ 运行完op_generator.py后,会在指定路径下生成api_name.py的单API脚本,例如Functional.softmax.3.backward.py、Tensor.add.0.forward.py、Torch.matmul.5.backward.py
69
+
70
+ 运行单API脚本即可获得不同比对方法下的比对结果
71
+ ```
72
+ python api_name.py
73
+ ```
74
+
75
+ **运行结果参数说明**
76
+ | 字段 | 含义 |
77
+ | ------------------- | ------------------------------------------------------------ |
78
+ | Shape | 单API输出结果的shape |
79
+ | Dtype of out_device | NPU 或 GPU 数据的 API 数据类型。 |
80
+ | Dtype of out_bench | 标杆数据的 API 数据类型。 |
81
+ | Compare Standard | 比对方法(包括绝对阈值法,标杆比对法、二进制一致法、ULP误差比对法和双千指标法 |
82
+ | Relative Error Ratio | 相对误差错误率。NPU 与标杆的正常值计算相对误差,其大于错误阈值的元素个数占正常值元素个数的比例。绝对阈值法指标。 |
83
+ | 相对误差判定结果 | 相对误差错误率判定结果,等于 0 标记为 pass,其余情况标记为 error。 |
84
+ | Absolute Error Ratio | 绝对误差错误率。NPU 与标杆的小值计算绝对误差,其大于错误阈值的元素个数占小值元素个数的比例。绝对阈值法指标。NPU 或 GPU 数据与标杆数据的最大绝对误差。 |
85
+ | 绝对误差判定结果 | 绝对误差错误率判定结果,等于 0 标记为 pass,其余情况标记为 error。 |
86
+ | Small Value Error Proportion | 小值域错误比值。NPU 与 CPU 的小值域的错误比率 / GPU 与 CPU 的小值域的错误比率。标杆比对法指标。 |
87
+ | 小值域错误判定结果 | 小值域错误比值小于等于 1 标记为 pass,1 ~ 2 之间标记为 warning,大于 2 标记为 error。 |
88
+ | Maximum Relative Error | 相对误差最大值比值。NPU 与 CPU 的相对误差最大值 / GPU 与 CPU 的相对误差最大值。标杆比对法指标。 |
89
+ | 相对误差最大值判定结果 | 相对误差最大值比值小于等于 1 标记为 pass,1 ~ 10 之间标记为 warning,大于 10 标记为 error。 |
90
+ | Mean Relative Error | 相对误差平均值比值。NPU 与 CPU 的相对误差的平均值 / GPU 与 CPU 的相对误差的平均值。标杆比对法指标。 |
91
+ | 相对误差平均值判定结果 | 相对误差平均值比值小于等于 1 标记为 pass,1 ~ 2 之间标记为 warning,大于 2 标记为 error。 |
92
+ | Root Mean Squared Error | 均方根误差比值。NPU 与 CPU 的均方根误差 / GPU 与 CPU 的均方根误差。标杆比对法指标。 |
93
+ | 均方根误差判定结果 | 均方根误差比值小于等于 1 标记为 pass,1~2 之间标记为 warning,大于 2 标记为 error。 |
94
+ | Error Balance | 误差均衡性比值。NPU 与 CPU 的误差均衡性 / GPU 与 CPU 的误差均衡性。标杆比对法指标。 |
95
+ | 误差均衡性判定结果 | 误差均衡性比值小于等于 1 标记为 pass,1 ~ 2 之间标记为 warning,大于 2 标记为 error。 |
96
+ | Error Rate | 二进制一致错误率。NPU 或 GPU 数据中每个 Tensor 精度不一致的数值的数量与 Tensor 中数值数量的比值。只有数据是 builtin 类型(bool、int、float、str)、torch.bool 和 torch 的 int 类型或者在新精度标准中使用二进制一致算法进行比对的 API 才会展示。二进制一致法指标。 |
97
+ | 二进制一致错误率判定结果 | 二进制一致错误率判定结果,等于 0 标记为 pass,其余情况标记为 error。 |
98
+ | Maximum ULP Error | ULP 误差最大值<sup>a</sup>。NPU 数据与标杆数据 ULP 误差的最大值(取绝对值后)。 |
99
+ | Mean ULP Error | ULP 误差平均值<sup>a</sup>。NPU 数据与标杆数据 ULP 误差的平均值(取绝对值后)。 |
100
+ | ULP Error Proportion |ULP 误差大于阈值占比比值<sup>a</sup>。NPU 与 CPU 的 ULP 误差大于阈值占比 / GPU 与 CPU 的 ULP 误差大于阈值占比。 |
101
+ | ULP 误差判定结果 | ULP 误差判定结果。<br/> 当 NPU 或 GPU 数据类型是 float16 或 bfloat16 时,以下两条标准满足其一标记为 pass,否则标记为 error:<br> NPU ULP 误差大于阈值占比小于 0.001;<br/> NPU ULP 误差大于阈值占比小于 GPU ULP 误差大于阈值占比。<br/> 当 NPU 或 GPU 数据类型是 float32 时,以下三条标准满足其一标记为 pass,否则标记为 error:<br/> NPU ULP 误差平均值小于 64;<br/> NPU ULP 误差大于阈值占比小于 0.05;<br/> NPU ULP 误差大于阈值占比小于 GPU ULP 误差大于阈值占比。 |
102
+ | Thousandth ratio |双千精度指标。是指 NPU 的 Tensor 中的元素逐个与对应的标杆数据对比,相对误差小于千分之一的个数占总元素个数的比例。测试通过标准为相对误差大于千分之一的个数占总元素个数的比例小于千分之一。仅 conv1d 和 conv2d 使用该指标。双千指标法指标。 |
103
+ | 双千指标判定结果 | 双千指标判定结果。双千指标大于 0.999 标记为 pass,否则标记为 error。 |
104
+
105
+ a:误差比对法指标。
106
+
107
+ 最终判定单API是否符合精度标准由开发者通过**算子精度标准**判断。
@@ -0,0 +1,28 @@
1
+ # MindSpore 场景的数码关联工具
2
+
3
+ 数码关联工具,用于 MindSpore 静态图场景下将IR图与dump数据进行关联,获取 dump 数据和代码调用栈的关联关系。
4
+
5
+ ## 安装
6
+
7
+ 请参见[《msprobe 工具安装指南》](./01.installation.md)。
8
+
9
+
10
+ ## 功能说明
11
+
12
+ 数码关联是指数据和代码调用栈的关联,数据一般意义上指静态图`O0`,`O1`,`O2`下dump下来的数据。
13
+
14
+ IR图使用推荐:IR图推荐使用`anf_after_graph_build`图。
15
+
16
+ 命令格式:
17
+
18
+ ```
19
+ msprobe -f mindspore code_mapping --ir <ir_file> --dump_data <dump_data> [--output <output_path>]
20
+ ```
21
+
22
+
23
+ | 参数名称 | 说明 |参数类型 | 是否必选 |
24
+ | ---------------------------- |-------------------------------------------------------------------------------------------------------------------------------------------|---------------------- | ---------------------------------- |
25
+ | --ir | 指定 MindSpore 静态图运行时生成的IR图文件。 | str | 是 |
26
+ | --dump_data | 指定dump数据文件(支持tensor或statistic模式的dump数据)。可指定单个dump数据 文件或dump数据文件的父目录,指定父目录表示关联目录下的所有dump数据文件。 | str | 是 |
27
+ | --output | 关联结果输出目录,默认为"./",只在tensor模式时生效,会把数据文件路径和代码调用栈的关联关系存到output路径下的code_mapping_{时间戳}.csv中。如果关联的是statistic模式,则会把statistic.csv中每个条目加上该条目对应的代码栈。 | str | 否 |
28
+
@@ -15,6 +15,7 @@
15
15
  | [在线精度比对<br>(online_dispatch)](./18.online_dispatch.md) | 训练过程中直接完成NPU和CPU的精度比对并输出比对结果。 | 1、执行一次就可获取NPU和CPU分别执行后的精度比对结果 | 暂无 |
16
16
  | [训练状态监控<br>(monitor)](./19.monitor.md) | 收集模型训练过程中的激活值、梯度和优化器状态,助力分析计算、通信、优化器各部分异常情况。 | 1、通过监控模块级统计量指标,快速定位异常模块位置,如loss出现nan | 1、仅支持模块级别统计量指标分析<br>2、仅支持megatron、deepspeed框架<br>3、少量增加时间和显存膨胀 |
17
17
  | [可视化比对<br>(visualization) ](./21.visualization_PyTorch.md) | 解析dump的精度数据,还原模型图结构,比对各层级精度数据,助力理解模型结构、分析精度问题。 | 1、整网精度比对定位可疑算子,通过浏览器展示比对结果,支持快速搜索到可疑算子<br>2、支持查看模型层级结果,比对模型层级结构差异 | 1、由于使用整网dump数据,定位的可疑算子受累计误差影响<br>2、当模型规模较大时,比对所需时间较长 |
18
+ | [单API自动生成脚本<br>(generate_operator) ](./23.generate_operator_PyTorch.md) | 解析dump的精度数据,提取可疑的API算子,自动生成单API复现脚本,并根据不同的API采用不同的比对算法,给定最终比对结果数据;帮助开发者分析算子精度问题。 | 1、该工具支持从整网dump下来的数据中提取可疑算子,并自动生成单API脚本<br>2、除了支持复现单API的前反向过程,同时会根据不同的API选择不同的比对方法,并给出比对结果 |1、不支持通信算子<br>2、融合算子需手动修改脚本进行适配<br>3、目前比对的标杆均为和CPU进行比对,暂不支持直接NPU和GPU比对
18
19
 
19
20
  ## 2 MindSpore框架
20
21