mindstudio-probe 1.1.1__py3-none-any.whl → 1.2.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 (197) hide show
  1. {mindstudio_probe-1.1.1.dist-info → mindstudio_probe-1.2.1.dist-info}/METADATA +3 -2
  2. {mindstudio_probe-1.1.1.dist-info → mindstudio_probe-1.2.1.dist-info}/RECORD +196 -141
  3. msprobe/CMakeLists.txt +5 -0
  4. msprobe/README.md +14 -19
  5. msprobe/config.json +1 -0
  6. msprobe/core/common/const.py +155 -6
  7. msprobe/core/common/exceptions.py +3 -1
  8. msprobe/core/common/file_utils.py +33 -7
  9. msprobe/core/common/inplace_ops.yaml +3 -0
  10. msprobe/core/common/utils.py +28 -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 +18 -7
  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 +380 -0
  20. msprobe/core/compare/merge_result/merge_result_cli.py +31 -0
  21. msprobe/core/compare/multiprocessing_compute.py +2 -2
  22. msprobe/core/compare/npy_compare.py +109 -147
  23. msprobe/core/compare/utils.py +189 -69
  24. msprobe/core/data_dump/data_collector.py +51 -21
  25. msprobe/core/data_dump/data_processor/base.py +38 -20
  26. msprobe/core/data_dump/data_processor/factory.py +5 -3
  27. msprobe/core/data_dump/data_processor/mindspore_processor.py +154 -20
  28. msprobe/core/data_dump/data_processor/pytorch_processor.py +118 -58
  29. msprobe/core/data_dump/json_writer.py +29 -1
  30. msprobe/core/data_dump/scope.py +19 -18
  31. msprobe/core/overflow_check/abnormal_scene.py +9 -5
  32. msprobe/core/overflow_check/checker.py +1 -1
  33. msprobe/core/overflow_check/utils.py +1 -1
  34. msprobe/docs/01.installation.md +96 -17
  35. msprobe/docs/02.config_introduction.md +5 -5
  36. msprobe/docs/05.data_dump_PyTorch.md +91 -61
  37. msprobe/docs/06.data_dump_MindSpore.md +57 -19
  38. msprobe/docs/07.accuracy_checker_PyTorch.md +18 -18
  39. msprobe/docs/09.accuracy_checker_MindSpore.md +4 -4
  40. msprobe/docs/10.accuracy_compare_PyTorch.md +99 -41
  41. msprobe/docs/11.accuracy_compare_MindSpore.md +249 -48
  42. msprobe/docs/12.overflow_check_PyTorch.md +1 -1
  43. msprobe/docs/19.monitor.md +120 -27
  44. msprobe/docs/21.visualization_PyTorch.md +115 -35
  45. msprobe/docs/22.visualization_MindSpore.md +138 -41
  46. msprobe/docs/23.generate_operator_PyTorch.md +107 -0
  47. msprobe/docs/24.code_mapping_Mindspore.md +28 -0
  48. msprobe/docs/{23.tool_function_introduction.md → 25.tool_function_introduction.md} +1 -0
  49. msprobe/docs/26.data_dump_PyTorch_baseline.md +37 -0
  50. msprobe/docs/27.dump_json_instruction.md +521 -0
  51. msprobe/docs/FAQ.md +26 -2
  52. msprobe/docs/accuracy_checker_MindSpore/accuracy_checker_MindSpore_baseline.md +14 -0
  53. msprobe/docs/data_dump_MindSpore/data_dump_MindSpore_baseline.md +22 -0
  54. msprobe/docs/img/merge_result.png +0 -0
  55. msprobe/docs/img/visualization/fuzzy_match_ms.png +0 -0
  56. msprobe/docs/img/visualization/fuzzy_match_pt.png +0 -0
  57. msprobe/docs/img/visualization/tensorboard_1.png +0 -0
  58. msprobe/docs/img/visualization/tensorboard_2.png +0 -0
  59. msprobe/docs/img/visualization/vis_browser_1.png +0 -0
  60. msprobe/docs/img/visualization/vis_browser_2.png +0 -0
  61. msprobe/docs/img/visualization/vis_precision_info.png +0 -0
  62. msprobe/docs/img/visualization/vis_search_info.png +0 -0
  63. msprobe/docs/img/visualization/vis_show_info.png +0 -0
  64. msprobe/docs/img/visualization/vis_showcase.png +0 -0
  65. msprobe/docs/img/visualization/vis_unmatch_info.png +0 -0
  66. msprobe/docs/visualization/GPTModel.png +0 -0
  67. msprobe/docs/visualization/ParallelMLP.png +0 -0
  68. msprobe/docs/visualization/layer_mapping_example.md +132 -0
  69. msprobe/docs/visualization/mapping.png +0 -0
  70. msprobe/docs/visualization/mapping1.png +0 -0
  71. msprobe/docs/visualization/module_name.png +0 -0
  72. msprobe/docs/visualization/module_name1.png +0 -0
  73. msprobe/docs/visualization/no_mapping.png +0 -0
  74. msprobe/docs/visualization/no_mapping1.png +0 -0
  75. msprobe/docs/visualization/no_mapping_analyze.png +0 -0
  76. msprobe/docs/visualization/top_layer.png +0 -0
  77. msprobe/mindspore/__init__.py +10 -0
  78. msprobe/mindspore/api_accuracy_checker/api_accuracy_checker.py +57 -25
  79. msprobe/mindspore/api_accuracy_checker/cmd_parser.py +2 -1
  80. msprobe/mindspore/api_accuracy_checker/compute_element.py +5 -7
  81. msprobe/mindspore/api_accuracy_checker/data_manager.py +37 -0
  82. msprobe/mindspore/api_accuracy_checker/main.py +1 -0
  83. msprobe/mindspore/api_accuracy_checker/multi_api_accuracy_checker.py +12 -6
  84. msprobe/mindspore/api_accuracy_checker/multi_data_manager.py +3 -1
  85. msprobe/mindspore/code_mapping/bind.py +264 -0
  86. msprobe/mindspore/code_mapping/cmd_parser.py +40 -0
  87. msprobe/mindspore/code_mapping/graph.py +49 -0
  88. msprobe/mindspore/code_mapping/graph_parser.py +226 -0
  89. msprobe/mindspore/code_mapping/main.py +24 -0
  90. msprobe/mindspore/code_mapping/processor.py +34 -0
  91. msprobe/mindspore/common/const.py +3 -1
  92. msprobe/mindspore/common/utils.py +50 -5
  93. msprobe/mindspore/compare/distributed_compare.py +0 -2
  94. msprobe/mindspore/compare/ms_compare.py +105 -63
  95. msprobe/mindspore/compare/ms_graph_compare.py +14 -5
  96. msprobe/mindspore/debugger/debugger_config.py +3 -0
  97. msprobe/mindspore/debugger/precision_debugger.py +81 -12
  98. msprobe/mindspore/dump/hook_cell/api_registry.py +83 -16
  99. msprobe/mindspore/dump/hook_cell/hook_cell.py +60 -38
  100. msprobe/mindspore/dump/hook_cell/primitive_hooks.py +33 -15
  101. msprobe/mindspore/dump/hook_cell/support_wrap_ops.yaml +11 -1
  102. msprobe/mindspore/dump/hook_cell/wrap_api.py +92 -1
  103. msprobe/mindspore/dump/kernel_dump/kernel_config.py +33 -0
  104. msprobe/mindspore/dump/kernel_graph_dump.py +7 -0
  105. msprobe/mindspore/free_benchmark/api_pynative_self_check.py +13 -4
  106. msprobe/mindspore/free_benchmark/perturbation/bit_noise.py +2 -2
  107. msprobe/mindspore/grad_probe/grad_analyzer.py +24 -12
  108. msprobe/mindspore/grad_probe/hook.py +13 -4
  109. msprobe/mindspore/mindtorch/__init__.py +18 -0
  110. msprobe/mindspore/mindtorch/mindtorch_adaptor.py +255 -0
  111. msprobe/mindspore/ms_config.py +5 -1
  112. msprobe/mindspore/overflow_check/kernel_graph_overflow_check.py +7 -0
  113. msprobe/mindspore/service.py +267 -101
  114. msprobe/msprobe.py +24 -3
  115. msprobe/pytorch/__init__.py +7 -6
  116. msprobe/pytorch/api_accuracy_checker/common/utils.py +31 -16
  117. msprobe/pytorch/api_accuracy_checker/compare/algorithm.py +41 -8
  118. msprobe/pytorch/api_accuracy_checker/compare/api_precision_compare.py +100 -267
  119. msprobe/pytorch/api_accuracy_checker/compare/api_precision_standard.yaml +4 -1
  120. msprobe/pytorch/api_accuracy_checker/compare/compare.py +69 -68
  121. msprobe/pytorch/api_accuracy_checker/compare/compare_column.py +54 -0
  122. msprobe/pytorch/api_accuracy_checker/compare/compare_input.py +51 -0
  123. msprobe/pytorch/api_accuracy_checker/compare/compare_utils.py +2 -4
  124. msprobe/pytorch/api_accuracy_checker/generate_op_script/op_generator.py +54 -30
  125. msprobe/pytorch/api_accuracy_checker/precision_standard/absolute_threshold.py +106 -0
  126. msprobe/pytorch/api_accuracy_checker/precision_standard/accumulative_error_compare.py +107 -0
  127. msprobe/pytorch/api_accuracy_checker/precision_standard/base_standard.py +151 -0
  128. msprobe/pytorch/api_accuracy_checker/precision_standard/benchmark_compare.py +226 -0
  129. msprobe/pytorch/api_accuracy_checker/precision_standard/binary_consistency.py +68 -0
  130. msprobe/pytorch/api_accuracy_checker/precision_standard/standard_config.py +218 -0
  131. msprobe/pytorch/api_accuracy_checker/precision_standard/standard_register.py +104 -0
  132. msprobe/pytorch/api_accuracy_checker/precision_standard/thousandth_standard.py +63 -0
  133. msprobe/pytorch/api_accuracy_checker/precision_standard/ulp_compare.py +200 -0
  134. msprobe/pytorch/api_accuracy_checker/run_ut/data_generate.py +57 -1
  135. msprobe/pytorch/api_accuracy_checker/run_ut/multi_run_ut.py +2 -1
  136. msprobe/pytorch/api_accuracy_checker/run_ut/run_overflow_check.py +42 -14
  137. msprobe/pytorch/api_accuracy_checker/run_ut/run_ut.py +64 -19
  138. msprobe/pytorch/api_accuracy_checker/run_ut/run_ut_utils.py +34 -4
  139. msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/device_dispatch.py +5 -3
  140. msprobe/pytorch/bench_functions/npu_fusion_attention.py +42 -10
  141. msprobe/pytorch/common/parse_json.py +2 -1
  142. msprobe/pytorch/common/utils.py +45 -2
  143. msprobe/pytorch/compare/distributed_compare.py +17 -29
  144. msprobe/pytorch/compare/pt_compare.py +40 -20
  145. msprobe/pytorch/debugger/debugger_config.py +27 -12
  146. msprobe/pytorch/debugger/precision_debugger.py +42 -12
  147. msprobe/pytorch/dump/module_dump/__init__.py +0 -0
  148. msprobe/pytorch/dump/module_dump/module_dump.py +86 -0
  149. msprobe/pytorch/{module_processer.py → dump/module_dump/module_processer.py} +80 -6
  150. msprobe/pytorch/free_benchmark/common/params.py +2 -1
  151. msprobe/pytorch/free_benchmark/common/utils.py +3 -0
  152. msprobe/pytorch/free_benchmark/compare/grad_saver.py +0 -2
  153. msprobe/pytorch/free_benchmark/result_handlers/base_handler.py +31 -47
  154. msprobe/pytorch/free_benchmark/result_handlers/preheat_handler.py +0 -4
  155. msprobe/pytorch/hook_module/__init__.py +1 -1
  156. msprobe/pytorch/hook_module/hook_module.py +14 -11
  157. msprobe/pytorch/hook_module/register_optimizer_hook.py +59 -0
  158. msprobe/pytorch/hook_module/support_wrap_ops.yaml +34 -0
  159. msprobe/pytorch/hook_module/wrap_distributed.py +6 -8
  160. msprobe/pytorch/hook_module/wrap_functional.py +0 -40
  161. msprobe/pytorch/monitor/anomaly_analyse.py +1 -1
  162. msprobe/pytorch/monitor/anomaly_detect.py +107 -22
  163. msprobe/pytorch/monitor/csv2tb.py +166 -0
  164. msprobe/pytorch/monitor/distributed/wrap_distributed.py +25 -14
  165. msprobe/pytorch/monitor/features.py +3 -3
  166. msprobe/pytorch/monitor/module_hook.py +483 -277
  167. msprobe/pytorch/monitor/module_metric.py +27 -48
  168. msprobe/pytorch/monitor/module_spec_verifier.py +3 -1
  169. msprobe/pytorch/monitor/optimizer_collect.py +52 -14
  170. msprobe/pytorch/monitor/unittest/test_monitor.py +24 -9
  171. msprobe/pytorch/monitor/utils.py +77 -6
  172. msprobe/pytorch/online_dispatch/dispatch.py +8 -2
  173. msprobe/pytorch/parse_tool/lib/compare.py +10 -10
  174. msprobe/pytorch/parse_tool/lib/config.py +5 -7
  175. msprobe/pytorch/parse_tool/lib/file_desc.py +15 -1
  176. msprobe/pytorch/parse_tool/lib/interactive_cli.py +10 -10
  177. msprobe/pytorch/parse_tool/lib/parse_exception.py +7 -7
  178. msprobe/pytorch/parse_tool/lib/parse_tool.py +11 -10
  179. msprobe/pytorch/parse_tool/lib/utils.py +18 -19
  180. msprobe/pytorch/parse_tool/lib/visualization.py +9 -10
  181. msprobe/pytorch/service.py +176 -106
  182. msprobe/visualization/builder/graph_builder.py +62 -5
  183. msprobe/visualization/builder/msprobe_adapter.py +24 -2
  184. msprobe/visualization/compare/graph_comparator.py +64 -14
  185. msprobe/visualization/compare/mode_adapter.py +1 -15
  186. msprobe/visualization/graph/base_node.py +12 -17
  187. msprobe/visualization/graph/distributed_analyzer.py +318 -0
  188. msprobe/visualization/graph/graph.py +9 -0
  189. msprobe/visualization/graph_service.py +97 -23
  190. msprobe/visualization/utils.py +14 -29
  191. msprobe/pytorch/functional/module_dump.py +0 -84
  192. {mindstudio_probe-1.1.1.dist-info → mindstudio_probe-1.2.1.dist-info}/LICENSE +0 -0
  193. {mindstudio_probe-1.1.1.dist-info → mindstudio_probe-1.2.1.dist-info}/WHEEL +0 -0
  194. {mindstudio_probe-1.1.1.dist-info → mindstudio_probe-1.2.1.dist-info}/entry_points.txt +0 -0
  195. {mindstudio_probe-1.1.1.dist-info → mindstudio_probe-1.2.1.dist-info}/top_level.txt +0 -0
  196. /msprobe/docs/{data_dump_Mindspore → data_dump_MindSpore}/dynamic_graph_quick_start_example.md +0 -0
  197. /msprobe/{pytorch/functional → mindspore/code_mapping}/__init__.py +0 -0
@@ -9,10 +9,12 @@
9
9
  - [权重梯度监控](#权重梯度监控)
10
10
  - [激活值监控](#激活值监控)
11
11
  - [优化器状态监控](#优化器状态监控)
12
+ - [csv格式数据转tensorboard可视化显示](#csv格式数据转tensorboard可视化显示)
12
13
  - [详细配置](#详细配置)
13
14
 
14
15
  ## 安装
15
16
  参见[msprobe安装](./01.installation.md)
17
+ 要求torch版本不低于2.0。
16
18
 
17
19
  ## 快速上手
18
20
  根据需求监控相应对象。比如在loss上扬,grad norm正常的异常训练过程中,优先考虑监控模型前向过程;在grad norm异常的训练过程中,监控权重和激活值的梯度。
@@ -42,7 +44,9 @@ monitor.monitor_gnorm_with_ad(
42
44
  grad_acc_steps=args.global_batch_size//args.data_parallel_size//args.micro_batch_size,
43
45
  optimizer=None,
44
46
  dp_group=None,
45
- tp_group=None)
47
+ tp_group=None,
48
+ start_iteration=0
49
+ )
46
50
 
47
51
 
48
52
  # optional
@@ -52,7 +56,9 @@ reduced, unreduced = monitor.generate_wgrad_metrics()
52
56
  actv, actv_grad = monitor.generate_xy_metrics()
53
57
  ```
54
58
 
55
- 补充deepspeed下常用框架的使能位置,提供参考
59
+ 补充deepspeed下常用框架的使能位置,提供参考。
60
+
61
+ 注意deepspeed与megaton的区别在于optimizer的传值不同,`optimizer=optimizer.optimizer`。若未使用deepspeed,则直接传optimizer,`optimizer=optimizer`。
56
62
 
57
63
  - accelerate
58
64
 
@@ -81,10 +87,10 @@ class Trainer:
81
87
 
82
88
  ### 指定监控对象
83
89
 
84
- 工具支持对nn.Module(**激活值监控**)和nn.Parameter(**梯度监控、优化器监控**)对象实现相应的监控行为,在配置文件的"targets"(dict)字段指定,targets格式为{module_name/param_name: {filed: format}}。
90
+ 工具支持对nn.Module(**激活值监控**)和nn.Parameter(**权重监控**、**权重梯度监控、优化器监控**)对象实现相应的监控行为,在配置文件的"targets"(dict)字段指定,targets格式为{module_name/param_name: {filed: format}}。
85
91
 
86
92
  - 打印模型结构
87
- 工具提供可选项"print_struct"打印模型结构,帮助配置targets。工具会在在第一个step后打印结构并停止训练进程。
93
+ 工具提供可选项"print_struct"打印模型结构,帮助配置targets。工具会在在第一个step后打印结构并停止训练进程,模型结构默认打印在`$MONITOR_OUTPUT_DIR/module_struct.json`。
88
94
  ```json
89
95
  {
90
96
  "print_struct": true
@@ -134,7 +140,7 @@ class Trainer:
134
140
  }
135
141
  }
136
142
  ```
137
- **Module全量监控**:工具提供简便的全量module监控方式。
143
+ **Module全量监控**:工具提供简便的全量module监控方式。或不配置targets、all_xy字段,同样表示全量监控。
138
144
 
139
145
  ```json
140
146
  {
@@ -159,11 +165,11 @@ class Trainer:
159
165
  }
160
166
  ```
161
167
 
162
- **Parameter全量监控**:工具提供简便的全量parameter监控方式。
168
+ **Parameter全量监控**:工具提供简便的全量parameter监控方式。或不配置targets,同样表示全量监控。
163
169
 
164
170
  ```json
165
171
  {
166
- "targets": {"":{}}
172
+ "targets": {}
167
173
  }
168
174
  ```
169
175
 
@@ -203,7 +209,7 @@ export MONITOR_OUTPUT_DIR=/xxx/output_dir
203
209
  监控结果不落盘,在训练过程中可以通过`generate_wgrad_metrics`、`generate_xy_metrics`等接口获取。
204
210
 
205
211
  - 统计量
206
- 通过必选配置项"ops"指定。可以是["norm", "min", "max", "mean", "nans","zeros"]。其中"nans"统计tensor中nan的数量,"zeros"统计tensor中数值小于"eps"的比例。
212
+ 通过配置项"ops"指定。可以是["norm", "min", "max", "mean", "nans","zeros"]。其中"nans"统计tensor中nan的数量,"zeros"统计tensor中数值小于"eps"的比例。
207
213
 
208
214
  ### 权重监控
209
215
  - 工具配置示例:
@@ -262,7 +268,7 @@ monitor.monitor_gnorm_with_ad(
262
268
  ### 梯度异常时序判断
263
269
  1. 训练前配置相关参数
264
270
 
265
- 工具支持自动判断训练过程中的梯度异常,需要在配置文件中设置alert相关字段。"AnomalyTurbulence"会将当前数值与历史均值比较,如果相对偏差超过阈值,会在打屏信息中提示用户。如果打开"dump"选项,则会将异常梯度相关信息落盘到目录`monitor_output/anomaly_detected`,用于后续时序判断。
271
+ 工具支持自动判断训练过程中的梯度异常,需要在配置文件中设置alert相关字段。"AnomalyTurbulence"会将当前数值与历史均值比较,如果相对偏差超过阈值,会在打屏信息中提示用户。如果打开"`dump`"选项,则会将异常梯度相关信息落盘到目录`monitor_output/anomaly_detected`,用于后续时序判断。
266
272
  ```json
267
273
  "alert": {
268
274
  "rules": [{"rule_name": "AnomalyTurbulence", "args": {"threshold": 0.5}}],
@@ -273,22 +279,40 @@ monitor.monitor_gnorm_with_ad(
273
279
  ```python
274
280
  monitor = TrainerMon("./monitor_config.json", process_group=mpu.get_pipeline_model_parallel_group(), params_have_main_grad=True)
275
281
  ```
276
- 照常开始训练
282
+ 训练过程中,检测到异常后打屏提示,并将异常信息按照rank分组写入json文件,文件路径默认为`monitor_output/anomaly_detected`,异常信息示例如下:
283
+
284
+ ```json
285
+ {
286
+ "0:1.self_attention.core_attention_flash_0/rank0/input_grad_step_1_call_112": {
287
+ "rank": 0,
288
+ "step": 1,
289
+ "micro_step": 0,
290
+ "pp_stage": 0,
291
+ "vpp_stage": 0,
292
+ "call_id": 112,
293
+ "tag_name": "0:1.self_attention.core_attention_flash_0/rank0/input_grad",
294
+ "message": "Rule AnomalyTurbulence reports anomaly signal in ('0:1.self_attention.core_attention_flash_0/rank0/input_grad', 'min') at step 1.",
295
+ "group_mates": [0, 1]
296
+ },
297
+ ...
298
+ }
299
+ ```
300
+
301
+ 3. 异常事件排序
277
302
 
278
- 3. 启动异常分析脚本:
303
+ 当模型训练过程中出现较多异常数据,需要对异常事件排序。工具提供topk的异常排序能力,按照api的执行顺序进行排序,便于定界首次异常点。异常分析命令示例:
279
304
 
280
305
  ```shell
281
306
  python3 -m msprobe.pytorch.monitor.anomaly_analyse -d $MONITOR_OUTPUT_DIR/anomaly_detected
282
307
  ```
283
- 支持以下参数配置
284
- | 字段名 | 解释 | 是否必选 |
285
- | ------ | -------- | -------- |
286
- |-d 或 --data_path| 指定梯度异常落盘文件夹,梯度监控功能输出,一般为$MONITOR_OUTPUT_DIR/anomaly_detected。|是 |
287
- |-o 或 --out_path| 排序后的异常落盘文件地址,默认在--data_path路径下落盘一个anomaly_analyse.json文件| 否 |
288
- |-k 或 --topk| 指定保留前topk个异常,默认为8| 否 |
289
- |-s 或 --step_list| 指定分析的step范围,默认为[]| 否 |
290
-
308
+ 异常事件分析结束,将topk事件写入文件`anomaly_detected/anomaly_analyse.json`。异常分析支持以下参数配置:
291
309
 
310
+ | 字段名 | 解释 | 是否必选 |
311
+ | ------ | -------- | -------- |
312
+ |-d 或 --data_path| 指定梯度异常落盘文件夹,梯度监控功能输出,一般为$MONITOR_OUTPUT_DIR/anomaly_detected。|是 |
313
+ |-o 或 --out_path| 排序后的异常落盘文件地址,默认在--data_path路径下落盘一个anomaly_analyse.json文件。 | 否 |
314
+ |-k 或 --topk| 指定保留前topk个异常,默认为8。 | 否 |
315
+ |-s 或 --step_list| 指定分析的step范围,默认为[]。 | 否 |
292
316
 
293
317
  ### 激活值监控
294
318
 
@@ -368,6 +392,50 @@ monitor.monitor_gnorm_with_ad(
368
392
  model, grad_acc_steps=model.grad_acc_steps, optimizer=optimizer)
369
393
  ```
370
394
 
395
+ ### csv格式数据转tensorboard可视化显示
396
+
397
+ 将csv数据转换为tensorboard格式数据。
398
+
399
+ ```python
400
+ from msprobe.pytorch.monitor.csv2tb import csv2tensorboard_by_step
401
+ # 前三个参数用来指定需要转换的一批文件,指定monitor输出目录及一个时间范围,会对这个范围内的文件进行转换
402
+ # process_num指定拉起的进程个数,默认为1,更多的进程个数可以加速转换
403
+ # data_type_list是一个列表,指定需要转换的数据类型, 数据类型应来自输出件文件前缀,所有类型数据:
404
+ # ["actv", "actv_grad", "exp_avg", "exp_avg_sq", "grad_unreduced", "grad_reduced", "param"]
405
+ # 不指定就转换全部数据
406
+ # output_dirpath可指定输出目录, 不传值时保存到"{curtime}_csv2tensorboard_by_step"文件夹,其中curtime为自动获取的当前时间戳
407
+ csv2tensorboard_by_step(
408
+ monitor_path="~/monitor_output",
409
+ time_start="Dec03_21-34-40",
410
+ time_end="Dec03_21-34-42",
411
+ process_num=8,
412
+ data_type_list=["param"]
413
+ )
414
+ ```
415
+
416
+ ### 动态启停
417
+ 动态启停模式:支持用户在训练过程中随时启动/更新监控。
418
+
419
+ 用户可在训练开始前通过配置环境变量DYNAMIC_MONITOR=True来确认开启动态启停模式,该模式下需要配合config.json文件中的switch字段来使用。
420
+
421
+ 在动态启停模式下,启动和停止分别由如下控制:
422
+
423
+ - 启动:
424
+ 首次监控:config.json文件中switch字段为true,代表是否需要开启监控。
425
+ 非首次监控:config文件时间戳更新且config.json文件中switch字段为true。
426
+ - 停止:
427
+ 到达collect_times之后自动停止并改config.json文件中switch字段为false,可再通过上述操作重启。
428
+
429
+ 大部分情况下,用户可在看到异常趋势后再手动更新config.json文件并打开switch开关;此外,使用时若想要在一开始就启动监控,可直接打开switch开关做基础配置的监测(首次不要求时间戳更新)
430
+
431
+ 注意事项:
432
+
433
+ - 默认监控启动皆统一在配置初始化或查询到更新后的下一步,也就是若第n步挂上hook则第n+1步才启动采集,如需采集第0步数据请用静态模式。
434
+ - config中途修改出错时,若此时不在监控就不生效,若在监控则用原配置继续。
435
+ - 达到collect_times之后会自动将该值置为false待下次改true重启。
436
+
437
+
438
+
371
439
  ## 公开接口
372
440
 
373
441
  ```python
@@ -379,10 +447,10 @@ TrainerMon.__init__(config_file_path, process_group=None, params_have_main_grad=
379
447
  | config_file_path |json配置文件路径。 | 是 |
380
448
  | process_group | 传入ProcessGroup对象,用以确定pipeline并行不同rank异常间时序,megatron下通过core.parallel_state.get_pipeline_model_parallel_group()获得。 | 否 |
381
449
  | params_have_main_grad |权重是否使用main_grad,通常megatron为True,deepspeed为False。默认为True。 | 否 |
382
- | opt_ty |优化器类型,默认为None。<br>-Megatron_DistributedOptimizer:megatron分布式优化器;<br/>-Megatron_Float16OptimizerWithFloat16Params:megatron混合精度优化器;<br/>-DeepSpeedZeroOptimizer_Stage1_or_2:DeepSpeed Zero1和Zero2;<br/>-DeepSpeedZeroOptimizer_Stage3:DeepSpeed Zero3。 | 否 |
450
+ | opt_ty |优化器类型,默认为None。<br>-Megatron_DistributedOptimizer:megatron分布式优化器;<br/>-Megatron_Float16OptimizerWithFloat16Params:megatron混合精度优化器;<br/>-Megatron_ChainedDistributedOptimizer:megatron分布式优化器序列;<br/>-Megatron_ChainedFloat16OptimizerWithFloat16Params:megatron混合精度优化器序列;<br/>-DeepSpeedZeroOptimizer_Stage1_or_2:DeepSpeed Zero1和Zero2;<br/>-DeepSpeedZeroOptimizer_Stage3:DeepSpeed Zero3。 | 否 |
383
451
 
384
452
  ```python
385
- TrainerMon.monitor_gnorm_with_ad(model, grad_acc_steps, optimizer, dp_group, tp_group) -> None
453
+ TrainerMon.monitor_gnorm_with_ad(model, grad_acc_steps, optimizer, dp_group, tp_group, start_iteration) -> None
386
454
  ```
387
455
  | 参数 | 说明 | 是否必选 |
388
456
  | ----- | -------------------- | -------- |
@@ -391,6 +459,7 @@ TrainerMon.monitor_gnorm_with_ad(model, grad_acc_steps, optimizer, dp_group, tp_
391
459
  | optimizer | 需要patch的优化器 | 否 |
392
460
  | dp_group | 数据并行的通信组。<br>dp域通信后,且没有使用分布式优化器时,group内所有rank的梯度相同,落盘数据冗余。<br>提供dp_group后,工具仅保留每个dp_group的第一个rank的梯度。 | 否 |
393
461
  | tp_group | 张量并行的通信组。<br/>tp域通信后,group内部分参数所有rank的梯度相同,落盘数据冗余。<br/>提供tp_group后,工具仅保留每个tp_group中冗余参数在第一个rank的梯度。<br/>当前适配Megatron core_v0.6.0, 通过权重属性"tensor_model_parallel"判断是否冗余。 | 否 |
462
+ | start_iteration | 训练的起始iteration,影响工具计数 | 否 |
394
463
 
395
464
 
396
465
  ```python
@@ -401,6 +470,17 @@ TrainerMon.set_wrapped_optimizer(_wrapped_optimizer) -> None
401
470
  | ----- | -------------------- | -------- |
402
471
  | _wrapped_optimizer |megatron、deepspeed创建好的混合精度优化器。 | 是 |
403
472
 
473
+ ```python
474
+ csv2tensorboard_by_step(monitor_path, time_start, time_end, process_num=1, data_type_list=None) -> None
475
+ ```
476
+ | 参数 | 说明 | 是否必选 |
477
+ | ----- | -------------------- | -------- |
478
+ | monitor_path | 待转换的csv存盘目录。 | 是 |
479
+ | time_start | 起始时间戳。搭配time_end一起使用。指定一个时间范围,会对这个范围内的文件进行转换。左闭右闭的区间。 | 是 |
480
+ | time_end | 结束时间戳。搭配time_start一起使用。指定一个时间范围,会对这个范围内的文件进行转换。左闭右闭的区间。 | 是 |
481
+ | process_num | 指定拉起的进程个数,默认为1,更多的进程个数可以加速转换。 | 否 |
482
+ | data_type_list | 指定需要转换的数据类型, 数据类型应来自输出件文件前缀,所有类型数据:<br/> ["actv", "actv_grad", "exp_avg", "exp_avg_sq", "grad_unreduced", "grad_reduced", "param"]。<br/>不指定就转换全部数据。 | 否 |
483
+
404
484
  ```python
405
485
  TrainerMon.generate_wgrad_metrics() -> tuple[dict[dict]]
406
486
  ```
@@ -410,6 +490,7 @@ TrainerMon.generate_xy_metrics() -> tuple[dict[dict]]
410
490
  ```
411
491
 
412
492
 
493
+
413
494
  ## 详细配置
414
495
 
415
496
  ```json
@@ -417,6 +498,10 @@ TrainerMon.generate_xy_metrics() -> tuple[dict[dict]]
417
498
  "targets": {
418
499
  "language_model.encoder.layers.0": {"input": "tuple[2]:0", "output": "tensor", "input_grad":"tuple[2]:0", "output_grad":"tuple[1]:0"}
419
500
  },
501
+ "switch": false,
502
+ "start_step": 0,
503
+ "collect_times": 100000000,
504
+ "step_interval": 1,
420
505
  "print_struct": false,
421
506
  "module_ranks": [0,1,2,3],
422
507
  "ur_distribution": true,
@@ -436,7 +521,9 @@ TrainerMon.generate_xy_metrics() -> tuple[dict[dict]]
436
521
  "ops": ["min", "max", "norm", "zeros", "nans", "mean"],
437
522
  "eps": 1e-8,
438
523
  "ndigits": 12,
439
- "step_count_per_record": 1
524
+ "step_count_per_record": 1,
525
+ "append_output": [],
526
+ "squash_name": true
440
527
  }
441
528
  ```
442
529
 
@@ -444,25 +531,31 @@ TrainerMon.generate_xy_metrics() -> tuple[dict[dict]]
444
531
 
445
532
  | 字段名字 | 是否必选 | 解释 |
446
533
  | ------------------------------------------------------------ | -------- | -------- |
447
- |"targets"| 必选 |指定需要监控的模型层, 例如transformer的第0层language_model.encoder.layers.0。如果不清楚模型结构, 可以将 "print_struct" 字段设置为 true, 监控工具会打印模型中torch module的名字和详细结构,并在第1个step后退出。|
534
+ |"targets"| 可选 |指定需要监控的模型层和监控对象, 例如transformer的第0层language_model.encoder.layers.0,可选择监控input、output、input_grad、output_grad。如果不清楚模型结构, 可以将 "print_struct" 字段设置为 true, 监控工具会打印模型中torch module的名字和详细结构,并在第1个step后退出。未配置时默认为全量监控。|
448
535
  |"input"| 可选 |"tuple[2]:0"的意思是目标module的前向input参数为长度为2的tuple, 我们关心的是tuple第0个元素。|
449
536
  |"output"| 必选 |"tensor"的意思是目标module的前向output参数类型为tensor|
450
537
  |"input_grad"| 可选 |"tuple[2]:0"的意思是目标module的后向input_grad参数是长度为2的tuple, 我们关心的是tuple的第0个元素。|
451
538
  |"output_grad"| 必选 |"tuple[1]:0"的意思是目标module的后向input_grad参数是长度为1的tuple, 我们关心的是tuple的第0个元素。|
539
+ |"switch"| 可选 | 在动态启停时使用,true代表打开监控,false代表关闭监控,默认值为false,且达到collect_times之后会自动将该值置为false待下次改true重启。|
540
+ |"collect_times"| 可选 | 设置采集次数,达到该次数后停止监控,默认值为100000000,目的是一直采集。|
541
+ |"start_step"| 可选 | 设置开始采集step,模型训练达到start_step后开始监控采集,默认值为0,表示从step0开始监控采集。|
542
+ |"step_interval"| 可选 | 设置采集step间隔,默认值为1,表示每个step均采集监控数据。|
452
543
  |"print_struct"| 可选 |设置为true后监控工具会打印模型中torch module的名字和详细结构,并在第1个step后退出。不填默认为false。|
453
544
  |"module_ranks"| 可选 |用于在分布式训练场景中希望控制在哪些rank开启module监控。如果不填,则默认在所有rank开启。|
454
545
  |"ur_distribution"| 可选 |若为true则会统计adam优化器指定模块(targets中指定)参数的update和ratio向量的数值分布,并展示在heatmap里,默认为false,同时format字段必须设置为tensorboard。<br/>依赖histc算子, 需要CANN8.0.rc2以上版本, 否则会有严重的性能问题。 |
455
546
  |"xy_distribution"| 可选 |若为true则会监控指定module(targets中指定)的输入输出张量。 默认为false。|
456
- |"all_xy"| 可选 |开启xy_distribution后生效,若为true,监控所有module。默认为false。|
547
+ |"all_xy"| 可选 |开启xy_distribution后生效,若为true,监控所有module。默认为false。<br/>与targets同时生效,all_xy配置为true时,若targets配置module_xx和指定对象,则module_xx按targets配置生效,其他module则监控全部对象,包含input、output、input_grad、output_grad。|
457
548
  |"forward_only"| 可选 |开启xy_distribution后生效,若为true,仅监控指定module的前向,targets中的input_grad、output_grad不生效。默认为false。|
458
549
  |"backward_only"| 可选 |开启xy_distribution后生效,若为true,仅监控指定module的反向,targets中的input、output不生效。默认为false。|
459
- |"mv_distribution"| 可选 |若为true则会监控指定模块中的参数的优化器状态, 默认为false。需要在TrainerMon构造函数正确指定opt_ty。 目前支持megatron和Deepspeed的分布式优化器。<br/>-Megatron_DistributedOptimizer:megatron分布式优化器;<br/>-Megatron_Float16OptimizerWithFloat16Params:megatron混合精度优化器;<br/>-DeepSpeedZeroOptimizer_Stage0:DeepSpeed Zero0<br/>-DeepSpeedZeroOptimizer_Stage1_or_2:DeepSpeed Zero1和Zero2;<br/>-DeepSpeedZeroOptimizer_Stage3:DeepSpeed Zero3 |
550
+ |"mv_distribution"| 可选 |若为true则会监控指定模块中的参数的优化器状态, 默认为false。需要在TrainerMon构造函数正确指定opt_ty。 目前支持megatron和Deepspeed的分布式优化器。<br/>-Megatron_DistributedOptimizer:megatron分布式优化器;<br/>-Megatron_Float16OptimizerWithFloat16Params:megatron混合精度优化器;<br/>-Megatron_ChainedDistributedOptimizer:megatron分布式优化器序列;<br/>-Megatron_ChainedFloat16OptimizerWithFloat16Params:megatron混合精度优化器序列;<br/>-DeepSpeedZeroOptimizer_Stage0:DeepSpeed Zero0<br/>-DeepSpeedZeroOptimizer_Stage1_or_2:DeepSpeed Zero1和Zero2;<br/>-DeepSpeedZeroOptimizer_Stage3:DeepSpeed Zero3。<br/>未使用megatron和deepspeed框架时,opt_ty默认为None,无需传入。 |
460
551
  |"wg_distribution"| 可选 |若为true则会监控指定模块的参数梯度, 默认为false。 |
461
552
  |"param_distribution"| 可选 |若为true则会监控指定模块的参数, 默认为false。 |
462
553
  |"alert"| 可选 | "rules": 指定自动报警的异常检测机制及其相应的阈值。目前实现的异常检测是AnomalyTurbulence, 如果统计标量超出历史均值的指定浮动范围(threshold 0.5意味着上浮或者下浮50%)则在控制台打印报警信息。当"dump"字段配置为true表示异常事件写入文件,默认为false。 |
463
554
  |"cc_distribution"| 可选 |其中"enable"字段控制通信监控模块的开关;需要监控通信算子时,务必尽量早地实例化`TrainerMon`, 因为监控通过劫持原始func后挂hook实现,部分加速库初始化时会保存原始function,避免监控失效。"cc_codeline"字段指定监控的代码行,如:`train.py\\[23\\]`,默认为空列表,不特别指定;"cc_pre_hook"字段控制是否监控通信前的数据; 模块会在第二个optimize.step之前打印通信日志,包括通信api的调用栈、输入dtype、通信group。 "cc_log_only"为true时,仅打印日志,不监控通信的输入输出,并在打印后中断训练。可以根据通信日志设置"cc_codeline",规避与训练过程不相关的通信,比如一些时间、metrics的同步。|
464
555
  |"format"| 可选 | 数据落盘格式,默认为tensorboard,可选 \["tensorboard", "csv", "api"\]。 |
465
- |"ops"| 必选 |类型为list,与ur_distribution、xy_distribution、mv_distribution、wg_distribution、mg_direction、cc_distribution配合,监控所选张量的统计指标,目前支持"min"、"max"、"norm"、"mean"、"zeros"、"nans"。其中,zeros代表监控所选张量的元素小于eps的比例,nans代表张量中nan的数量。|
556
+ |"ops"| 可选 |类型为list,与ur_distribution、xy_distribution、mv_distribution、wg_distribution、mg_direction、cc_distribution配合,监控所选张量的统计指标,目前支持"min"、"max"、"norm"、"mean"、"zeros"、"nans"。其中,zeros代表监控所选张量的元素小于eps的比例,nans代表张量中nan的数量。当ops中无有效指标时,默认监控norm指标。|
466
557
  |"eps"| 可选 |若ops里包含"zeros"则需要配置,默认为1e-8。|
467
- |"ndigits"| 可选 |"format"为"api"时,设置落盘文件中的小数位数,默认为6。|
558
+ |"ndigits"| 可选 |"format"为"csv"时,设置落盘文件中的小数位数,默认为6。|
468
559
  |"step_count_per_record"| 可选 | "format"为"csv"时生效,每个csv记录多少个step的数据,默认为1。|
560
+ |"append_output"| 可选 | 适用于断点续训场景。多卡场景下生效,指定两个时间戳,将输出续写到这两个时间戳范围间的输出件中,不在范围内的rank不被续写。时间戳应来自原有输出件目录前缀,例如["Dec03_21-34-40", "Dec03_21-34-41"]。默认为[],不续写。 |
561
+ |"squash_name"| 可选 | 是否简化参数名/模块名,多模态场景建议关闭,默认为True |
@@ -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是调用次数
58
+
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一致
46
68
 
47
- **溢出等级说明**
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
  {
@@ -282,31 +304,58 @@ msprobe -f pytorch graph -i ./compare.json -o ./output
282
304
 
283
305
  ## 4.启动tensorboard
284
306
 
307
+ ### 4.1 可直连的服务器
308
+
285
309
  将生成vis文件的路径**out_path**传入--logdir
286
310
 
287
311
  ```
288
312
  tensorboard --logdir out_path --bind_all --port [可选,端口号]
289
313
  ```
314
+ 启动后会打印日志:
315
+
316
+ ![tensorboard_1](./img/visualization/tensorboard_1.png)
317
+
318
+ ubuntu是机器地址,6008是端口号。
290
319
 
291
- 启动后会打印日志。
292
- ``TensorBoard 2.15.1 at http://localhost.localdomain:6008/ (Press CTRL+C to quit)``
293
- localhost.localdomain是机器地址,6008是端口号。
320
+ **注意,ubuntu需要替换为真实的服务器地址,例如真实的服务器地址为10.123.456.78,则需要在浏览器窗口输入http://10.123.456.78:6008**
294
321
 
295
- **如果链接打不开,可以尝试使用vscode连接服务器,在vscode终端输入:**
322
+ ### 4.2 不可直连的服务器
323
+ **如果链接打不开(服务器无法直连需要挂vpn才能连接等场景),可以尝试使用vscode连接服务器,在vscode终端输入:**
296
324
 
297
325
  ```
298
326
  tensorboard --logdir out_path
299
327
  ```
328
+ ![tensorboard_2](./img/visualization/tensorboard_2.png)
300
329
 
301
- CTRL+C点击链接即可
330
+ 按住CTRL点击链接即可
302
331
 
303
332
  ## 5.浏览器查看
304
333
 
305
- 推荐使用谷歌浏览器,在浏览器中输入机器地址+端口号回车,出现TensorBoard页面,右上方选择GRAPHS_ASCEND即可展示模型结构图。
334
+ ### 5.1 浏览器打开图
335
+ 推荐使用谷歌浏览器,在浏览器中输入机器地址+端口号回车,出现TensorBoard页面,其中/#graph_ascend会自动拼接。
336
+ ![vis_browser_1](./img/visualization/vis_browser_1.png)
337
+ 如果您切换了TensorBoard的其他功能,此时想回到模型分级可视化页面,可以点击左上方的**GRAPH_ASCEND**
338
+ ![vis_browser_2](./img/visualization/vis_browser_2.png)
339
+
340
+ ### 5.2 查看图
341
+ ![vis_show_info.png](./img/visualization/vis_show_info.png)
342
+
343
+ ### 5.3 名称搜索
344
+ ![vis_search_info.png](./img/visualization/vis_search_info.png)
306
345
 
307
- 节点需要双击打开。
346
+ ### 5.4 精度筛选
347
+ ![vis_precision_info.png](./img/visualization/vis_precision_info.png)
308
348
 
309
- 键盘WS可放大缩小,AD可左右移动,鼠标滚轮可上下移动。
349
+ ### 5.5 未匹配节点筛选
350
+ 节点匹配规则:
351
+
352
+ 1.名称一致
353
+
354
+ 2.节点输入输出参数数量一致,参数type、shape一致
355
+
356
+ 3.节点的层级一致(父节点们一致)
357
+
358
+ ![vis_unmatch_info.png](./img/visualization/vis_unmatch_info.png)
310
359
 
311
360
  ## 6.图比对说明
312
361
 
@@ -326,20 +375,6 @@ CTRL+C点击链接即可
326
375
 
327
376
  ``相对误差:abs((npu统计值 - bench统计值) / bench统计值)``
328
377
 
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
378
  #### md5模式
344
379
  节点中任意输入输出的md5值不同。
345
380
 
@@ -384,3 +419,48 @@ yaml文件中只需配置待调试侧与标杆侧模型代码中功能一致但
384
419
  模型代码示例:
385
420
 
386
421
  ![ms_dump](./img/ms_layer.png)
422
+
423
+ ### 7.2 堆栈信息说明
424
+
425
+ **精简堆栈**
426
+
427
+ 保留一条当前模块或api的调用信息
428
+
429
+ ```json
430
+ {
431
+ "Module.layer1.0.bn1.BatchNorm2d.forward.0": [
432
+ "File /home/torchvision/models/resnet.py, line 93, in forward, \n out = self.bn1(out)"
433
+ ]
434
+ }
435
+ ```
436
+
437
+ **完整堆栈**
438
+
439
+ 当前模块或api完整的调用信息
440
+
441
+ ```json
442
+ {
443
+ "Module.layer1.0.bn1.BatchNorm2d.forward.0": [
444
+ "File /home/torchvision/models/resnet.py, line 93, in forward, \n out = self.bn1(out)",
445
+ "File /home/torch/nn/modules/module.py, line 1568, in _call_impl, \n result = forward_call(*args, **kwargs)",
446
+ "File /home/torch/nn/modules/module.py, line 1518, in _wrapped_call_impl, \n return self._call_impl(*args, **kwargs)",
447
+ "File /home/torch/nn/modules/container.py, line 215, in forward, \n input = module(input)",
448
+ "File /home/torch/nn/modules/module.py, line 1568, in _call_impl, \n result = forward_call(*args, **kwargs)",
449
+ "File /home/torch/nn/modules/module.py, line 1518, in _wrapped_call_impl, \n return self._call_impl(*args, **kwargs)",
450
+ "File /home/torchvision/models/resnet.py, line 273, in _forward_impl, \n x = self.layer1(x)",
451
+ "File /home/torchvision/models/resnet.py, line 285, in forward, \n return self._forward_impl(x)",
452
+ "File /home/torch/nn/modules/module.py, line 1527, in _call_impl, \n return forward_call(*args, **kwargs)",
453
+ "File /home/torch/nn/modules/module.py, line 1518, in _wrapped_call_impl, \n return self._call_impl(*args, **kwargs)",
454
+ "File /home/visualization/resnet18.py, line 40, in <module>, \n outputs = model(inputs)"
455
+ ]
456
+ }
457
+
458
+ ```
459
+ # FAQ
460
+ 1. 图比对场景,节点呈现灰色,且没有精度比对数据,怎么处理?
461
+
462
+ 节点呈现灰色,代表左边待调试侧节点与右边标杆侧节点没有匹配上,可能有以下几点原因:
463
+
464
+ - **标杆侧确实没有能与待调试侧匹配上的节点**,属于代码实现上的差异,请确认此差异是否正常,是否会影响到整网精度。
465
+ - **节点的输入或输出type、shape不一致,参数个数不一致,节点所在层级的父层级不一致**,导致节点无法匹配,具体匹配规则见[匹配说明](#311-匹配说明),可尝试使用模糊匹配功能,如何使用此功能请参考[构图命令行说明](#31-构图命令行说明)。如果是参数shape不一致,即使是模糊匹配功能也无法让节点匹配上,请检查参数shape不一致是否合理。
466
+ - **节点名称不一致**,导致节点无法匹配,可使用layer mapping功能,如何使用此功能请参考[构图命令行说明](#31-构图命令行说明),如何自定义映射文件请参考[模型分级可视化如何配置layer mapping映射文件](./visualization/layer_mapping_example.md)。