mindstudio-probe 1.2.1__py3-none-any.whl → 1.3.0__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 (177) hide show
  1. {mindstudio_probe-1.2.1.dist-info → mindstudio_probe-1.3.0.dist-info}/METADATA +3 -3
  2. {mindstudio_probe-1.2.1.dist-info → mindstudio_probe-1.3.0.dist-info}/RECORD +168 -150
  3. msprobe/README.md +27 -22
  4. msprobe/core/common/const.py +129 -60
  5. msprobe/core/common/decorator.py +50 -0
  6. msprobe/core/common/exceptions.py +3 -1
  7. msprobe/core/common/file_utils.py +25 -2
  8. msprobe/core/common/inplace_ops.yaml +1 -0
  9. msprobe/core/common/utils.py +43 -33
  10. msprobe/core/compare/acc_compare.py +43 -74
  11. msprobe/core/compare/check.py +2 -6
  12. msprobe/core/compare/highlight.py +2 -0
  13. msprobe/core/compare/layer_mapping/data_scope_parser.py +1 -1
  14. msprobe/core/compare/layer_mapping/layer_mapping.py +2 -1
  15. msprobe/core/compare/merge_result/merge_result.py +16 -9
  16. msprobe/core/compare/merge_result/utils.py +81 -0
  17. msprobe/core/compare/multiprocessing_compute.py +19 -12
  18. msprobe/core/compare/npy_compare.py +30 -12
  19. msprobe/core/compare/utils.py +30 -10
  20. msprobe/core/data_dump/api_registry.py +176 -0
  21. msprobe/core/data_dump/data_collector.py +58 -13
  22. msprobe/core/data_dump/data_processor/base.py +94 -10
  23. msprobe/core/data_dump/data_processor/factory.py +3 -0
  24. msprobe/core/data_dump/data_processor/mindspore_processor.py +33 -33
  25. msprobe/core/data_dump/data_processor/pytorch_processor.py +99 -18
  26. msprobe/core/data_dump/json_writer.py +61 -40
  27. msprobe/core/grad_probe/constant.py +1 -0
  28. msprobe/core/grad_probe/grad_compare.py +1 -1
  29. msprobe/core/overflow_check/abnormal_scene.py +2 -0
  30. msprobe/docs/01.installation.md +27 -1
  31. msprobe/docs/02.config_introduction.md +27 -23
  32. msprobe/docs/03.config_examples.md +24 -0
  33. msprobe/docs/05.data_dump_PyTorch.md +103 -16
  34. msprobe/docs/06.data_dump_MindSpore.md +76 -32
  35. msprobe/docs/07.accuracy_checker_PyTorch.md +11 -1
  36. msprobe/docs/08.accuracy_checker_online_PyTorch.md +3 -1
  37. msprobe/docs/09.accuracy_checker_MindSpore.md +5 -3
  38. msprobe/docs/10.accuracy_compare_PyTorch.md +59 -33
  39. msprobe/docs/11.accuracy_compare_MindSpore.md +40 -16
  40. msprobe/docs/12.overflow_check_PyTorch.md +3 -1
  41. msprobe/docs/13.overflow_check_MindSpore.md +4 -2
  42. msprobe/docs/14.data_parse_PyTorch.md +1 -7
  43. msprobe/docs/18.online_dispatch.md +1 -1
  44. msprobe/docs/19.monitor.md +332 -273
  45. msprobe/docs/21.visualization_PyTorch.md +42 -13
  46. msprobe/docs/22.visualization_MindSpore.md +43 -13
  47. msprobe/docs/23.generate_operator_PyTorch.md +9 -9
  48. msprobe/docs/27.dump_json_instruction.md +301 -27
  49. msprobe/docs/28.debugger_save_instruction.md +94 -0
  50. msprobe/docs/28.kernel_dump_MindSpore.md +69 -0
  51. msprobe/docs/29.data_dump_MSAdapter.md +229 -0
  52. msprobe/docs/30.overflow_check_MSAdapter.md +31 -0
  53. msprobe/docs/FAQ.md +3 -11
  54. msprobe/docs/img/compare_result.png +0 -0
  55. msprobe/docs/img/merge_result.png +0 -0
  56. msprobe/docs/img/monitor/step_count_per_record.png +0 -0
  57. msprobe/docs/img/visualization/vis_browser_1.png +0 -0
  58. msprobe/docs/img/visualization/vis_match_info.png +0 -0
  59. msprobe/docs/img/visualization/vis_precision_info.png +0 -0
  60. msprobe/docs/img/visualization/vis_search_info.png +0 -0
  61. msprobe/docs/img/visualization/vis_show_info.png +0 -0
  62. msprobe/docs/img/visualization/vis_showcase.png +0 -0
  63. msprobe/docs/img/visualization/vis_unmatch_info.png +0 -0
  64. msprobe/mindspore/__init__.py +4 -2
  65. msprobe/mindspore/api_accuracy_checker/api_accuracy_checker.py +32 -7
  66. msprobe/mindspore/api_accuracy_checker/api_runner.py +70 -22
  67. msprobe/mindspore/api_accuracy_checker/base_compare_algorithm.py +2 -1
  68. msprobe/mindspore/api_accuracy_checker/bench_functions/flash_attention_score.py +602 -0
  69. msprobe/mindspore/api_accuracy_checker/bench_functions/fusion_operator.py +41 -0
  70. msprobe/mindspore/api_accuracy_checker/compute_element.py +47 -1
  71. msprobe/mindspore/api_accuracy_checker/data_manager.py +2 -1
  72. msprobe/mindspore/api_accuracy_checker/multi_api_accuracy_checker.py +2 -1
  73. msprobe/mindspore/api_accuracy_checker/torch_mindtorch_importer.py +130 -0
  74. msprobe/mindspore/api_accuracy_checker/type_mapping.py +24 -1
  75. msprobe/mindspore/api_accuracy_checker/utils.py +6 -1
  76. msprobe/mindspore/common/const.py +61 -0
  77. msprobe/mindspore/common/utils.py +48 -18
  78. msprobe/mindspore/compare/ms_compare.py +27 -19
  79. msprobe/mindspore/compare/ms_graph_compare.py +6 -5
  80. msprobe/mindspore/debugger/debugger_config.py +31 -6
  81. msprobe/mindspore/debugger/precision_debugger.py +45 -14
  82. msprobe/mindspore/dump/dump_tool_factory.py +5 -3
  83. msprobe/mindspore/dump/hook_cell/api_register.py +142 -0
  84. msprobe/mindspore/dump/hook_cell/hook_cell.py +9 -10
  85. msprobe/mindspore/dump/hook_cell/support_wrap_ops.yaml +24 -26
  86. msprobe/mindspore/dump/jit_dump.py +21 -15
  87. msprobe/mindspore/dym_loader/hook_dynamic_loader.cc +22 -56
  88. msprobe/mindspore/dym_loader/hook_dynamic_loader.h +0 -1
  89. msprobe/mindspore/free_benchmark/api_pynative_self_check.py +10 -6
  90. msprobe/mindspore/free_benchmark/perturbation/perturbation_factory.py +4 -2
  91. msprobe/mindspore/free_benchmark/self_check_tool_factory.py +6 -3
  92. msprobe/mindspore/grad_probe/global_context.py +2 -0
  93. msprobe/mindspore/grad_probe/grad_analyzer.py +2 -1
  94. msprobe/mindspore/grad_probe/hook.py +2 -4
  95. msprobe/mindspore/monitor/anomaly_detect.py +404 -0
  96. msprobe/mindspore/monitor/distributed/__init__.py +0 -0
  97. msprobe/mindspore/monitor/distributed/distributed_ops.yaml +15 -0
  98. msprobe/mindspore/monitor/distributed/stack_blacklist.yaml +5 -0
  99. msprobe/mindspore/monitor/distributed/wrap_distributed.py +300 -0
  100. msprobe/mindspore/monitor/features.py +63 -0
  101. msprobe/mindspore/monitor/module_hook.py +873 -0
  102. msprobe/mindspore/monitor/module_spec_verifier.py +94 -0
  103. msprobe/mindspore/monitor/utils.py +309 -0
  104. msprobe/mindspore/ms_config.py +8 -2
  105. msprobe/mindspore/overflow_check/overflow_check_tool_factory.py +5 -3
  106. msprobe/mindspore/service.py +114 -34
  107. msprobe/pytorch/__init__.py +0 -1
  108. msprobe/pytorch/api_accuracy_checker/compare/api_precision_compare.py +3 -6
  109. msprobe/pytorch/api_accuracy_checker/generate_op_script/op_generator.py +12 -7
  110. msprobe/pytorch/api_accuracy_checker/generate_op_script/operator_replication.template +2 -2
  111. msprobe/pytorch/api_accuracy_checker/run_ut/multi_run_ut.py +4 -5
  112. msprobe/pytorch/api_accuracy_checker/run_ut/run_overflow_check.py +5 -5
  113. msprobe/pytorch/api_accuracy_checker/run_ut/run_ut.py +25 -6
  114. msprobe/pytorch/api_accuracy_checker/run_ut/run_ut_utils.py +28 -19
  115. msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/attl.py +3 -1
  116. msprobe/pytorch/bench_functions/apply_adam.py +215 -0
  117. msprobe/pytorch/bench_functions/group_norm_silu.py +27 -0
  118. msprobe/pytorch/{parse.py → bench_functions/mish.py} +6 -4
  119. msprobe/pytorch/bench_functions/moe_gating_top_k_softmax.py +50 -0
  120. msprobe/pytorch/bench_functions/sort_v2.py +21 -0
  121. msprobe/pytorch/common/utils.py +97 -4
  122. msprobe/pytorch/debugger/debugger_config.py +19 -9
  123. msprobe/pytorch/debugger/precision_debugger.py +24 -1
  124. msprobe/pytorch/dump/module_dump/module_dump.py +4 -3
  125. msprobe/pytorch/dump/module_dump/module_processer.py +21 -35
  126. msprobe/pytorch/free_benchmark/common/utils.py +1 -1
  127. msprobe/pytorch/free_benchmark/compare/single_benchmark.py +1 -1
  128. msprobe/pytorch/free_benchmark/perturbed_layers/npu/add_noise.py +3 -3
  129. msprobe/pytorch/free_benchmark/perturbed_layers/npu/bit_noise.py +3 -3
  130. msprobe/pytorch/free_benchmark/perturbed_layers/npu/change_value.py +1 -1
  131. msprobe/pytorch/free_benchmark/perturbed_layers/npu/improve_precision.py +1 -1
  132. msprobe/pytorch/free_benchmark/result_handlers/check_handler.py +1 -1
  133. msprobe/pytorch/function_factory.py +8 -2
  134. msprobe/pytorch/grad_probe/grad_monitor.py +2 -2
  135. msprobe/pytorch/hook_module/api_register.py +131 -0
  136. msprobe/pytorch/hook_module/hook_module.py +19 -14
  137. msprobe/pytorch/hook_module/register_optimizer_hook.py +2 -1
  138. msprobe/pytorch/hook_module/support_wrap_ops.yaml +173 -75
  139. msprobe/pytorch/monitor/anomaly_detect.py +14 -29
  140. msprobe/pytorch/monitor/csv2tb.py +18 -14
  141. msprobe/pytorch/monitor/distributed/wrap_distributed.py +8 -2
  142. msprobe/pytorch/monitor/module_hook.py +238 -193
  143. msprobe/pytorch/monitor/module_metric.py +9 -6
  144. msprobe/pytorch/monitor/optimizer_collect.py +100 -67
  145. msprobe/pytorch/monitor/unittest/test_monitor.py +1 -1
  146. msprobe/pytorch/monitor/utils.py +76 -44
  147. msprobe/pytorch/online_dispatch/compare.py +0 -2
  148. msprobe/pytorch/online_dispatch/dispatch.py +9 -0
  149. msprobe/pytorch/online_dispatch/dump_compare.py +3 -0
  150. msprobe/pytorch/online_dispatch/utils.py +3 -0
  151. msprobe/pytorch/parse_tool/lib/interactive_cli.py +1 -6
  152. msprobe/pytorch/parse_tool/lib/utils.py +2 -1
  153. msprobe/pytorch/pt_config.py +30 -29
  154. msprobe/pytorch/service.py +114 -32
  155. msprobe/visualization/builder/graph_builder.py +75 -10
  156. msprobe/visualization/builder/msprobe_adapter.py +7 -6
  157. msprobe/visualization/compare/graph_comparator.py +42 -38
  158. msprobe/visualization/compare/mode_adapter.py +0 -19
  159. msprobe/visualization/graph/base_node.py +11 -3
  160. msprobe/visualization/graph/distributed_analyzer.py +71 -3
  161. msprobe/visualization/graph/graph.py +0 -11
  162. msprobe/visualization/graph/node_op.py +4 -3
  163. msprobe/visualization/graph_service.py +4 -5
  164. msprobe/visualization/utils.py +12 -35
  165. msprobe/mindspore/dump/hook_cell/api_registry.py +0 -205
  166. msprobe/mindspore/dump/hook_cell/wrap_api.py +0 -212
  167. msprobe/pytorch/hook_module/api_registry.py +0 -166
  168. msprobe/pytorch/hook_module/wrap_distributed.py +0 -75
  169. msprobe/pytorch/hook_module/wrap_functional.py +0 -66
  170. msprobe/pytorch/hook_module/wrap_npu_custom.py +0 -85
  171. msprobe/pytorch/hook_module/wrap_tensor.py +0 -69
  172. msprobe/pytorch/hook_module/wrap_torch.py +0 -84
  173. msprobe/pytorch/hook_module/wrap_vf.py +0 -60
  174. {mindstudio_probe-1.2.1.dist-info → mindstudio_probe-1.3.0.dist-info}/LICENSE +0 -0
  175. {mindstudio_probe-1.2.1.dist-info → mindstudio_probe-1.3.0.dist-info}/WHEEL +0 -0
  176. {mindstudio_probe-1.2.1.dist-info → mindstudio_probe-1.3.0.dist-info}/entry_points.txt +0 -0
  177. {mindstudio_probe-1.2.1.dist-info → mindstudio_probe-1.3.0.dist-info}/top_level.txt +0 -0
@@ -4,20 +4,32 @@
4
4
 
5
5
  工具支持PyTorch版本:2.1/2.2
6
6
 
7
- ## 展示示例
7
+ ## 更新通知
8
8
 
9
- 支持重建模型的层级结构;
9
+ 请注意,tb_graph_ascend插件已于2025/3/12更新到1.0.0版本,如果当前环境已安装旧版本插件,推荐升级。
10
10
 
11
- 支持两个模型的结构差异比对;
11
+ 更新内容如下:
12
12
 
13
- 支持两个模型的精度数据比对,支持疑似有精度问题节点的快速搜索,自动跳转展开节点所在的层级。
13
+ - 优化了信息栏,使用了更人性化、更美观的展示界面;
14
+ - 提升了节点渲染和搜索性能;
15
+ - 双图比对场景画布分离,操作左图时不会影响到右图;
16
+ - 新增浏览器匹配节点功能,双图比对场景有未匹配节点时,可通过在浏览器页面手动选中调试侧和标杆侧的未匹配节点进行精度比对;
17
+ - 新增颜色图例可配置功能。
18
+
19
+ ## 工具特性
20
+
21
+ - 支持重建模型的层级结构;
22
+ - 支持两个模型的结构差异比对;
23
+ - 支持两个模型的精度数据比对;
24
+ - 支持模型数据的溢出检测;
25
+ - 支持多卡场景的批量构图,能够关联各卡的通信节点,分析各卡之间的数据传递;
26
+ - 支持节点名称搜索,按精度比对结果筛选节点,按溢出检测结果筛选节点,支持自动跳转展开节点所在的层级;
27
+ - 支持跨套件、跨框架的模型比对。
14
28
 
15
29
  ![vis_show](./img/visualization/vis_showcase.png)
16
30
 
17
31
  ## 1.依赖安装
18
32
 
19
- 分级可视化工具依赖**msprobe工具**和**tensorboard。**
20
-
21
33
  ### 1.1 安装msprobe工具
22
34
 
23
35
  [msprobe工具安装](https://gitee.com/ascend/mstt/blob/master/debug/accuracy_tools/msprobe/docs/01.installation.md)
@@ -28,6 +40,8 @@
28
40
 
29
41
  ``pip3 install tb-graph-ascend``即可。
30
42
 
43
+ 如需升级工具,请先``pip3 uninstall tb-graph-ascend``再``pip3 install tb-graph-ascend``即可。
44
+
31
45
  ## 2.模型结构数据采集
32
46
  [PyTorch场景的数据采集](https://gitee.com/ascend/mstt/blob/master/debug/accuracy_tools/msprobe/docs/05.data_dump_PyTorch.md)
33
47
 
@@ -302,6 +316,16 @@ msprobe -f pytorch graph -i ./compare.json -o ./output
302
316
  ├── compare_stepn_rankn_{timestamp}.vis
303
317
  ```
304
318
 
319
+ #### 3.2.4 仅模型结构比对
320
+
321
+ 适用场景:**主要关注模型结构而非训练过程数据**。例如,在模型迁移过程中,确保迁移前后模型结构的一致性,或在排查精度差异时,判断是否由模型结构差异所引起。
322
+
323
+ 使用msprobe工具对模型数据进行采集时,**可选择仅采集模型结构(task配置为structure)**,此配置将避免采集模型训练过程的数据,从而显著减少采集所需的时间。
324
+
325
+ dump配置请参考[dump配置示例](./03.config_examples.md#16-task-配置为-structure)
326
+
327
+ 得到dump数据后,若需比较特定两个rank之间的数据,请参考[3.2.2 双图比对](#322-双图比对);若需进行多个rank或多个step的数据批量比对,请参考[3.2.3 批量构建或比对](#323-批量构建或比对)。
328
+
305
329
  ## 4.启动tensorboard
306
330
 
307
331
  ### 4.1 可直连的服务器
@@ -347,15 +371,16 @@ tensorboard --logdir out_path
347
371
  ![vis_precision_info.png](./img/visualization/vis_precision_info.png)
348
372
 
349
373
  ### 5.5 未匹配节点筛选
350
- 节点匹配规则:
351
374
 
352
- 1.名称一致
375
+ 参考[匹配说明](#311-匹配说明) ,不符合匹配规则的节点为无匹配节点,颜色标灰。适用于排查两个模型结构差异的场景。
353
376
 
354
- 2.节点输入输出参数数量一致,参数type、shape一致
377
+ ![vis_unmatch_info.png](./img/visualization/vis_unmatch_info.png)
355
378
 
356
- 3.节点的层级一致(父节点们一致)
379
+ ### 5.6 手动选择节点匹配
357
380
 
358
- ![vis_unmatch_info.png](./img/visualization/vis_unmatch_info.png)
381
+ 可通过浏览器界面,通过鼠标选择两个待匹配的灰色节点进行匹配。当前暂不支持真实数据模式。
382
+
383
+ ![vis_match_info.png](./img/visualization/vis_match_info.png)
359
384
 
360
385
  ## 6.图比对说明
361
386
 
@@ -462,5 +487,9 @@ yaml文件中只需配置待调试侧与标杆侧模型代码中功能一致但
462
487
  节点呈现灰色,代表左边待调试侧节点与右边标杆侧节点没有匹配上,可能有以下几点原因:
463
488
 
464
489
  - **标杆侧确实没有能与待调试侧匹配上的节点**,属于代码实现上的差异,请确认此差异是否正常,是否会影响到整网精度。
465
- - **节点的输入或输出type、shape不一致,参数个数不一致,节点所在层级的父层级不一致**,导致节点无法匹配,具体匹配规则见[匹配说明](#311-匹配说明),可尝试使用模糊匹配功能,如何使用此功能请参考[构图命令行说明](#31-构图命令行说明)。如果是参数shape不一致,即使是模糊匹配功能也无法让节点匹配上,请检查参数shape不一致是否合理。
466
- - **节点名称不一致**,导致节点无法匹配,可使用layer mapping功能,如何使用此功能请参考[构图命令行说明](#31-构图命令行说明),如何自定义映射文件请参考[模型分级可视化如何配置layer mapping映射文件](./visualization/layer_mapping_example.md)
490
+ - **节点名称一致,但节点的输入或输出type、shape不一致,参数个数不一致,节点所在层级的父层级不一致,导致节点无法匹配**
491
+ - 具体匹配规则见[匹配说明](#311-匹配说明),可尝试使用模糊匹配功能,如何使用此功能请参考[构图命令行说明](#31-构图命令行说明)
492
+ - 如果是参数shape不一致,即使是模糊匹配功能也无法让节点匹配上,请检查参数shape不一致是否合理。
493
+ - **节点名称不一致**,导致节点无法匹配,目前提供两种方法,选其一即可
494
+ - 可使用layer mapping功能,如何使用此功能请参考[构图命令行说明](#31-构图命令行说明),如何自定义映射文件请参考[模型分级可视化如何配置layer mapping映射文件](./visualization/layer_mapping_example.md);
495
+ - 可通过浏览器页面手动选择未匹配节点进行匹配,请参考[手动选择节点匹配](#56-手动选择节点匹配)。
@@ -4,20 +4,32 @@
4
4
 
5
5
  工具支持MindSpore版本:2.4.0
6
6
 
7
- ## 展示示例
7
+ ## 更新通知
8
8
 
9
- 支持重建模型的层级结构;
9
+ 请注意,tb_graph_ascend插件已于2025/3/12更新到1.0.0版本,如果当前环境已安装旧版本插件,推荐升级。
10
10
 
11
- 支持两个模型的结构差异比对;
11
+ 更新内容如下:
12
12
 
13
- 支持两个模型的精度数据比对,支持疑似有精度问题节点的快速搜索,自动跳转展开节点所在的层级。
13
+ - 优化了信息栏,使用了更人性化、更美观的展示界面;
14
+ - 提升了节点渲染和搜索性能;
15
+ - 双图比对场景画布分离,操作左图时不会影响到右图;
16
+ - 新增浏览器匹配节点功能,双图比对场景有未匹配节点时,可通过在浏览器页面手动选中调试侧和标杆侧的未匹配节点进行精度比对;
17
+ - 新增颜色图例可配置功能。
18
+
19
+ ## 工具特性
20
+
21
+ - 支持重建模型的层级结构;
22
+ - 支持两个模型的结构差异比对;
23
+ - 支持两个模型的精度数据比对;
24
+ - 支持模型数据的溢出检测;
25
+ - 支持多卡场景的批量构图,能够关联各卡的通信节点,分析各卡之间的数据传递;
26
+ - 支持节点名称搜索,按精度比对结果筛选节点,按溢出检测结果筛选节点,支持自动跳转展开节点所在的层级;
27
+ - 支持跨套件、跨框架的模型比对。
14
28
 
15
29
  ![vis_show](./img/visualization/vis_showcase.png)
16
30
 
17
31
  ## 1.依赖安装
18
32
 
19
- 分级可视化工具依赖**msprobe工具**和**tensorboard。**
20
-
21
33
  ### 1.1 安装msprobe工具
22
34
 
23
35
  [msprobe工具安装](https://gitee.com/ascend/mstt/blob/master/debug/accuracy_tools/msprobe/docs/01.installation.md)
@@ -28,6 +40,8 @@
28
40
 
29
41
  ``pip3 install tb-graph-ascend``即可。
30
42
 
43
+ 如需升级工具,请先``pip3 uninstall tb-graph-ascend``再``pip3 install tb-graph-ascend``即可。
44
+
31
45
  ## 2.模型结构数据采集
32
46
  [MindSpore场景的精度数据采集](https://gitee.com/ascend/mstt/blob/master/debug/accuracy_tools/msprobe/docs/06.data_dump_MindSpore.md)
33
47
 
@@ -303,6 +317,17 @@ msprobe -f mindspore graph -i ./compare.json -o ./output
303
317
  ├── compare_stepn_rankn_{timestamp}.vis
304
318
  ```
305
319
 
320
+ #### 3.2.4 仅模型结构比对
321
+
322
+ 适用场景:**主要关注模型结构而非训练过程数据**。例如,在模型迁移过程中,确保迁移前后模型结构的一致性,或在排查精度差异时,判断是否由模型结构差异所引起。
323
+
324
+ 使用msprobe工具对模型数据进行采集时,**可选择仅采集模型结构(task配置为structure)**,此配置将避免采集模型训练过程的数据,从而显著减少采集所需的时间。
325
+
326
+ dump配置请参考[dump配置示例](./03.config_examples.md#35-task-配置为-structure)
327
+
328
+ 得到dump数据后,若需比较特定两个rank之间的数据,请参考[3.2.2 双图比对](#322-双图比对);若需进行多个rank或多个step的数据批量比对,请参考[3.2.3 批量构建或比对](#323-批量构建或比对)。
329
+
330
+
306
331
  ## 4.启动tensorboard
307
332
 
308
333
  ### 4.1 可直连的服务器
@@ -348,15 +373,16 @@ tensorboard --logdir out_path
348
373
  ![vis_precision_info.png](./img/visualization/vis_precision_info.png)
349
374
 
350
375
  ### 5.5 未匹配节点筛选
351
- 节点匹配规则:
352
376
 
353
- 1.名称一致
377
+ 参考[匹配说明](#311-匹配说明) ,不符合匹配规则的节点为无匹配节点,颜色标灰。适用于排查两个模型结构差异的场景。
354
378
 
355
- 2.节点输入输出参数数量一致,参数type、shape一致
379
+ ![vis_unmatch_info.png](./img/visualization/vis_unmatch_info.png)
356
380
 
357
- 3.节点的层级一致(父节点们一致)
381
+ ### 5.6 手动选择节点匹配
358
382
 
359
- ![vis_unmatch_info.png](./img/visualization/vis_unmatch_info.png)
383
+ 可通过浏览器界面,通过鼠标选择两个待匹配的灰色节点进行匹配。当前暂不支持真实数据模式。
384
+
385
+ ![vis_match_info.png](./img/visualization/vis_match_info.png)
360
386
 
361
387
  ## 6.图比对说明
362
388
 
@@ -477,5 +503,9 @@ yaml文件中只需配置MindSpore与PyTorch模型代码中功能一致但名称
477
503
  节点呈现灰色,代表左边待调试侧节点与右边标杆侧节点没有匹配上,可能有以下几点原因:
478
504
 
479
505
  - **标杆侧确实没有能与待调试侧匹配上的节点**,属于代码实现上的差异,请确认此差异是否正常,是否会影响到整网精度。
480
- - **节点的输入或输出type、shape不一致,参数个数不一致,节点所在层级的父层级不一致**,导致节点无法匹配,具体匹配规则见[匹配说明](#311-匹配说明),可尝试使用模糊匹配功能,如何使用此功能请参考[构图命令行说明](#31-构图命令行说明)。如果是参数shape不一致,即使是模糊匹配功能也无法让节点匹配上,请检查参数shape不一致是否合理。
481
- - **节点名称不一致**,导致节点无法匹配,可使用layer mapping功能,如何使用此功能请参考[构图命令行说明](#31-构图命令行说明),如何自定义映射文件请参考[模型分级可视化如何配置layer mapping映射文件](./visualization/layer_mapping_example.md)
506
+ - **节点名称一致,但节点的输入或输出type、shape不一致,参数个数不一致,节点所在层级的父层级不一致,导致节点无法匹配**
507
+ - 具体匹配规则见[匹配说明](#311-匹配说明),可尝试使用模糊匹配功能,如何使用此功能请参考[构图命令行说明](#31-构图命令行说明)
508
+ - 如果是参数shape不一致,即使是模糊匹配功能也无法让节点匹配上,请检查参数shape不一致是否合理。
509
+ - **节点名称不一致**,导致节点无法匹配,目前提供两种方法,选其一即可
510
+ - 可使用layer mapping功能,如何使用此功能请参考[构图命令行说明](#31-构图命令行说明),如何自定义映射文件请参考[模型分级可视化如何配置layer mapping映射文件](./visualization/layer_mapping_example.md);
511
+ - 可通过浏览器页面手动选择未匹配节点进行匹配,请参考[手动选择节点匹配](#56-手动选择节点匹配)。
@@ -33,15 +33,15 @@ b. 在生成单API脚本时可以选择由工具构造随机数获得 dump 数
33
33
  ```
34
34
  **配置文件参数说明**
35
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运行的次数 | 否 |
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运行的次数,由于安全相关原因,最大支持设置为1000 | 否 |
45
45
 
46
46
  ### 2.2 运行命令生成单API脚本
47
47
  config_op.json配置好后,运行如下命令:
@@ -1,16 +1,18 @@
1
1
  # dump.json文件说明及示例
2
2
 
3
- ## 1. dump.json文件介绍(Pytorch)
3
+ ## 1. PyTorch 场景下的 dump.json 文件
4
4
 
5
- ### 1.1 L0级别
6
- L0级别的dump.json文件包括模块的前反向的输入输出,以及模块的参数和参数梯度。以Pytorch的Conv2d模块为例,网络中模块调用代码为:
7
- `output = torch.nn.Conv2d(64, 128, 5, padding=2, bias=True)(input)`
5
+ ### 1.1 L0 级别
6
+ L0级别的dump.json文件包括模块的前反向的输入输出,以及模块的参数和参数梯度。以PyTorch的Conv2d模块为例,网络中模块调用代码为:
7
+ `output = self.conv2(input) # self.conv2 = torch.nn.Conv2d(64, 128, 5, padding=2, bias=True)`
8
8
 
9
- dump.json文件中包含以下字段:
9
+ dump.json文件中包含以下数据名称:
10
10
 
11
- 1. `Module.conv2.Conv2d.forward.0`为模块的前向数据,其中input_args为模块的输入数据(位置参数),input_kwargs为模块的输入数据(关键字参数),output为模块的输出数据,parameters为模块的参数数据,包括权重(weight)和偏置(bias)。
12
- 2. `Module.conv2.Conv2d.parameters_grad`为模块的参数梯度数据,包括权重(weight)和偏置(bias)的梯度。
13
- 3. `Module.conv2.Conv2d.backward.0`为模块的反向数据,其中input为模块反向的输入梯度(对应前向输出的梯度),output为模块的反向输出梯度(对应前向输入的梯度)。
11
+ - `Module.conv2.Conv2d.forward.0`:模块的前向数据,其中input_args为模块的输入数据(位置参数),input_kwargs为模块的输入数据(关键字参数),output为模块的输出数据,parameters为模块的参数数据,包括权重(weight)和偏置(bias)。
12
+ - `Module.conv2.Conv2d.parameters_grad`:模块的参数梯度数据,包括权重(weight)和偏置(bias)的梯度。
13
+ - `Module.conv2.Conv2d.backward.0`:模块的反向数据,其中input为模块反向的输入梯度(对应前向输出的梯度),output为模块的反向输出梯度(对应前向输入的梯度)。
14
+
15
+ **说明**:当dump时传入的model参数为List[torch.nn.Module]或Tuple[torch.nn.Module]时,模块级数据的命名中包含该模块在列表中的索引index,命名格式为`{Module}.{index}.*`,*表示以上三种模块级数据的命名格式,例如:`Module.0.conv1.Conv2d.forward.0`。
14
16
 
15
17
  ```json
16
18
  {
@@ -166,13 +168,13 @@ dump.json文件中包含以下字段:
166
168
  }
167
169
  ```
168
170
 
169
- ### 1.2 L1级别
170
- L1级别的dump.json文件包括API的前反向的输入输出。以Pytorch的relu函数为例,网络中API调用代码为:
171
- `output = torch.nn.functional.relu(input)`
171
+ ### 1.2 L1 级别
172
+ L1级别的dump.json文件包括API的前反向的输入输出。以PyTorch的relu函数为例,网络中API调用代码为:
173
+ `output = torch.nn.functional.relu(input)`
172
174
 
173
- dump.json文件中包含以下字段:
174
- 1. `Functional.relu.0.forward`为API的前向数据,其中input_args为API的输入数据(位置参数),input_kwargs为API的输入数据(关键字参数),output为API的输出数据。
175
- 2. `Functional.relu.0.backward`为API的反向数据,其中input为API的反向输入梯度(对应前向输出的梯度),output为API的反向输出梯度(对应前向输入的梯度)。
175
+ dump.json文件中包含以下数据名称:
176
+ - `Functional.relu.0.forward`:API的前向数据,其中input_args为API的输入数据(位置参数),input_kwargs为API的输入数据(关键字参数),output为API的输出数据。
177
+ - `Functional.relu.0.backward`:API的反向数据,其中input为API的反向输入梯度(对应前向输出的梯度),output为API的反向输出梯度(对应前向输入的梯度)。
176
178
 
177
179
  ```json
178
180
  {
@@ -262,22 +264,24 @@ dump.json文件中包含以下字段:
262
264
  }
263
265
  ```
264
266
 
265
- ### 1.3 mix级别
267
+ ### 1.3 mix 级别
266
268
 
267
269
  mix级别的dump.json文件同时包括L0和L1级别的dump数据,文件格式与上述示例相同。
268
270
 
269
- ## 2. dump.json文件示例(MindSpore)
271
+ ## 2. MindSpore 场景下的 dump.json 文件
270
272
 
271
- ### 2.1 L0级别
273
+ ### 2.1 L0 级别
272
274
 
273
275
  L0级别的dump.json文件包括模块的前反向的输入输出,以及模块的参数和参数梯度。
274
276
  以MindSpore的Conv2d模块为例,dump.json文件中使用的模块调用代码为:
275
- `output = mindspore.nn.Conv2d(64, 128, 5, pad_mode='same', has_bias=True)(input)`
277
+ `output = self.conv2(input) # self.conv2 = mindspore.nn.Conv2d(64, 128, 5, pad_mode='same', has_bias=True)`
278
+
279
+ dump.json文件中包含以下数据名称:
280
+ - `Cell.conv2.Conv2d.forward.0`:模块的前向数据,其中input_args为模块的输入数据(位置参数),input_kwargs为模块的输入数据(关键字参数),output为模块的输出数据,parameters为模块的参数数据,包括权重(weight)和偏置(bias)。
281
+ - `Cell.conv2.Conv2d.parameters_grad`:模块的参数梯度数据,包括权重(weight)和偏置(bias)的梯度。
282
+ - `Cell.conv2.Conv2d.backward.0`:模块的反向数据,其中input为模块反向的输入梯度(对应前向输出的梯度),output为模块的反向输出梯度(对应前向输入的梯度)。
276
283
 
277
- dump.json文件中包含以下字段:
278
- 1. `Cell.conv2.Conv2d.forward.0`为模块的前向数据,其中input_args为模块的输入数据(位置参数),input_kwargs为模块的输入数据(关键字参数),output为模块的输出数据,parameters为模块的参数数据,包括权重(weight)和偏置(bias)。
279
- 2. `Cell.conv2.Conv2d.parameters_grad`为模块的参数梯度数据,包括权重(weight)和偏置(bias)的梯度。
280
- 3. `Cell.conv2.Conv2d.backward.0`为模块的反向数据,其中input为模块反向的输入梯度(对应前向输出的梯度),output为模块的反向输出梯度(对应前向输入的梯度)。
284
+ **说明**:当dump时传入的model参数为List[mindspore.nn.Cell]或Tuple[mindspore.nn.Cell]时,模块级数据的命名中包含该模块在列表中的索引index,命名格式为`{Cell}.{index}.*`,*表示以上三种模块级数据的命名格式,例如:`Cell.0.conv2.Conv2d.forward.0`。
281
285
 
282
286
  ```json
283
287
  {
@@ -425,13 +429,13 @@ dump.json文件中包含以下字段:
425
429
  }
426
430
  ```
427
431
 
428
- ### 2.2 L1级别
432
+ ### 2.2 L1 级别
429
433
  L1级别的dump.json文件包括API的前反向的输入输出,以MindSpore的relu函数为例,网络中API调用代码为:
430
434
  `output = mindspore.ops.relu(input)`
431
435
 
432
- dump.json文件中包含以下字段:
433
- 1. `Functional.relu.0.forward`为API的前向数据,其中input_args为API的输入数据(位置参数),input_kwargs为API的输入数据(关键字参数),output为API的输出数据。
434
- 2. `Functional.relu.0.backward`为API的反向数据,其中input为API的反向输入梯度(对应前向输出的梯度),output为API的反向输出梯度(对应前向输入的梯度)。
436
+ dump.json文件中包含以下数据名称:
437
+ - `Functional.relu.0.forward`:API的前向数据,其中input_args为API的输入数据(位置参数),input_kwargs为API的输入数据(关键字参数),output为API的输出数据。
438
+ - `Functional.relu.0.backward`:API的反向数据,其中input为API的反向输入梯度(对应前向输出的梯度),output为API的反向输出梯度(对应前向输入的梯度)。
435
439
 
436
440
  ```json
437
441
  {
@@ -517,5 +521,275 @@ L1级别的dump.json文件包括API的前反向的输入输出,以MindSpore的
517
521
  }
518
522
  ```
519
523
 
520
- ### 2.3 mix级别
524
+ ### 2.3 mix 级别
525
+
521
526
  mix级别的dump.json文件同时包括L0和L1级别的dump数据,文件格式与上述示例相同。
527
+
528
+ ## 3. MSAdapter 场景下的 dump.json 文件
529
+
530
+ ### 3.1 L0 级别
531
+
532
+ L0 级别的 dump.json 文件包括模块的前反向的输入输出,以及模块的参数和参数梯度。以 Conv2d 模块为例,网络中模块调用代码为:
533
+ `output = self.conv2(input) # self.conv2 = torch.nn.Conv2d(64, 128, 5, padding=2, bias=True)`
534
+
535
+ dump.json文件中包含以下数据名称:
536
+
537
+ - `Module.conv2.Conv2d.forward.0`:模块的前向数据,其中input_args为模块的输入数据(位置参数),input_kwargs为模块的输入数据(关键字参数),output为模块的输出数据,parameters为模块的参数数据,包括权重(weight)和偏置(bias)。
538
+ - `Module.conv2.Conv2d.parameters_grad`:模块的参数梯度数据,包括权重(weight)和偏置(bias)的梯度。
539
+ - `Module.conv2.Conv2d.backward.0`:模块的反向数据,其中input为模块反向的输入梯度(对应前向输出的梯度),output为模块的反向输出梯度(对应前向输入的梯度)。
540
+
541
+ **说明**:当dump时传入的model参数为List[torch.nn.Module]或Tuple[torch.nn.Module]时,模块级数据的命名中包含该模块在列表中的索引index,命名格式为`{Module}.{index}.*`,*表示以上三种模块级数据的命名格式,例如:`Module.0.conv1.Conv2d.forward.0`。
542
+
543
+ ```json
544
+ {
545
+ "task": "tensor",
546
+ "level": "L0",
547
+ "framework": "mindtorch",
548
+ "dump_data_dir": "/dump/path",
549
+ "data": {
550
+ "Module.conv2.Conv2d.forward.0": {
551
+ "input_args": [
552
+ {
553
+ "type": "mindspore.Tensor",
554
+ "dtype": "Float32",
555
+ "shape": [
556
+ 8,
557
+ 16,
558
+ 14,
559
+ 14
560
+ ],
561
+ "Max": 1.638758659362793,
562
+ "Min": 0.0,
563
+ "Mean": 0.2544615864753723,
564
+ "Norm": 70.50277709960938,
565
+ "requires_grad": true,
566
+ "data_name": "Module.conv2.Conv2d.forward.0.input.0.npy"
567
+ }
568
+ ],
569
+ "input_kwargs": {},
570
+ "output": [
571
+ {
572
+ "type": "mindspore.Tensor",
573
+ "dtype": "Float32",
574
+ "shape": [
575
+ 8,
576
+ 32,
577
+ 10,
578
+ 10
579
+ ],
580
+ "Max": 1.6815717220306396,
581
+ "Min": -1.5120246410369873,
582
+ "Mean": -0.025344856083393097,
583
+ "Norm": 149.65576171875,
584
+ "requires_grad": true,
585
+ "data_name": "Module.conv2.Conv2d.forward.0.output.0.npy"
586
+ }
587
+ ],
588
+ "parameters": {
589
+ "weight": {
590
+ "type": "mindspore.Tensor",
591
+ "dtype": "Float32",
592
+ "shape": [
593
+ 32,
594
+ 16,
595
+ 5,
596
+ 5
597
+ ],
598
+ "Max": 0.05992485210299492,
599
+ "Min": -0.05999220535159111,
600
+ "Mean": -0.0006165213999338448,
601
+ "Norm": 3.421217441558838,
602
+ "requires_grad": true,
603
+ "data_name": "Module.conv2.Conv2d.forward.0.parameters.weight.npy"
604
+ },
605
+ "bias": {
606
+ "type": "mindspore.Tensor",
607
+ "dtype": "Float32",
608
+ "shape": [
609
+ 32
610
+ ],
611
+ "Max": 0.05744686722755432,
612
+ "Min": -0.04894155263900757,
613
+ "Mean": 0.006410328671336174,
614
+ "Norm": 0.17263513803482056,
615
+ "requires_grad": true,
616
+ "data_name": "Module.conv2.Conv2d.forward.0.parameters.bias.npy"
617
+ }
618
+ }
619
+ },
620
+ "Module.conv2.Conv2d.parameters_grad": {
621
+ "weight": [
622
+ {
623
+ "type": "mindspore.Tensor",
624
+ "dtype": "Float32",
625
+ "shape": [
626
+ 32,
627
+ 16,
628
+ 5,
629
+ 5
630
+ ],
631
+ "Max": 0.018550323322415352,
632
+ "Min": -0.008627401664853096,
633
+ "Mean": 0.0006675920449197292,
634
+ "Norm": 0.26084786653518677,
635
+ "requires_grad": false,
636
+ "data_name": "Module.conv2.Conv2d.parameters_grad.weight.npy"
637
+ }
638
+ ],
639
+ "bias": [
640
+ {
641
+ "type": "mindspore.Tensor",
642
+ "dtype": "Float32",
643
+ "shape": [
644
+ 32
645
+ ],
646
+ "Max": 0.014914230443537235,
647
+ "Min": -0.006656786892563105,
648
+ "Mean": 0.002657240955159068,
649
+ "Norm": 0.029451673850417137,
650
+ "requires_grad": false,
651
+ "data_name": "Module.conv2.Conv2d.parameters_grad.bias.npy"
652
+ }
653
+ ]
654
+ },
655
+ "Module.conv2.Conv2d.backward.0": {
656
+ "input": [
657
+ {
658
+ "type": "mindspore.Tensor",
659
+ "dtype": "Float32",
660
+ "shape": [
661
+ 8,
662
+ 32,
663
+ 10,
664
+ 10
665
+ ],
666
+ "Max": 0.0015069986693561077,
667
+ "Min": -0.001139344065450132,
668
+ "Mean": 3.3215508210560074e-06,
669
+ "Norm": 0.020567523315548897,
670
+ "requires_grad": false,
671
+ "data_name": "Module.conv2.Conv2d.backward.0.input.0.npy"
672
+ }
673
+ ],
674
+ "output": [
675
+ {
676
+ "type": "mindspore.Tensor",
677
+ "dtype": "Float32",
678
+ "shape": [
679
+ 8,
680
+ 16,
681
+ 14,
682
+ 14
683
+ ],
684
+ "Max": 0.0007466732058674097,
685
+ "Min": -0.00044813455315306783,
686
+ "Mean": 6.814070275140693e-06,
687
+ "Norm": 0.01474067009985447,
688
+ "requires_grad": false,
689
+ "data_name": "Module.conv2.Conv2d.backward.0.output.0.npy"
690
+ }
691
+ ]
692
+ }
693
+ }
694
+ }
695
+ ```
696
+
697
+ ### 3.2 L1 级别
698
+ L1级别的dump.json文件包括API的前反向的输入输出。以 relu API 为例,网络中 API 调用代码为:
699
+ `output = torch.nn.functional.relu(input)`
700
+
701
+ dump.json文件中包含以下数据名称:
702
+ - `Functional.relu.0.forward`:API的前向数据,其中input_args为API的输入数据(位置参数),input_kwargs为API的输入数据(关键字参数),output为API的输出数据。
703
+ - `Functional.relu.0.backward`:API的反向数据,其中input为API的反向输入梯度(对应前向输出的梯度),output为API的反向输出梯度(对应前向输入的梯度)。
704
+
705
+ ```json
706
+ {
707
+ "task": "tensor",
708
+ "level": "L1",
709
+ "framework": "mindtorch",
710
+ "dump_data_dir":"/dump/path",
711
+ "data": {
712
+ "Functional.relu.0.forward": {
713
+ "input_args": [
714
+ {
715
+ "type": "mindspore.Tensor",
716
+ "dtype": "Float32",
717
+ "shape": [
718
+ 32,
719
+ 16,
720
+ 28,
721
+ 28
722
+ ],
723
+ "Max": 1.3864083290100098,
724
+ "Min": -1.3364859819412231,
725
+ "Mean": 0.03711778670549393,
726
+ "Norm": 236.20692443847656,
727
+ "requires_grad": true,
728
+ "data_name": "Functional.relu.0.forward.input.0.npy"
729
+ }
730
+ ],
731
+ "input_kwargs": {},
732
+ "output": [
733
+ {
734
+ "type": "mindspore.Tensor",
735
+ "dtype": "Float32",
736
+ "shape": [
737
+ 32,
738
+ 16,
739
+ 28,
740
+ 28
741
+ ],
742
+ "Max": 1.3864083290100098,
743
+ "Min": 0.0,
744
+ "Mean": 0.16849493980407715,
745
+ "Norm": 175.23345947265625,
746
+ "requires_grad": true,
747
+ "data_name": "Functional.relu.0.forward.output.0.npy"
748
+ }
749
+ ]
750
+ },
751
+ "Functional.relu.0.backward": {
752
+ "input": [
753
+ {
754
+ "type": "mindspore.Tensor",
755
+ "dtype": "Float32",
756
+ "shape": [
757
+ 32,
758
+ 16,
759
+ 28,
760
+ 28
761
+ ],
762
+ "Max": 0.0001815402356442064,
763
+ "Min": -0.00013352684618439525,
764
+ "Mean": 0.00011915402356442064,
765
+ "Norm": 0.007598237134516239,
766
+ "requires_grad": false,
767
+ "data_name": "Functional.relu.0.backward.input.0.npy"
768
+ }
769
+ ],
770
+ "output": [
771
+ {
772
+ "type": "mindspore.Tensor",
773
+ "dtype": "Float32",
774
+ "shape": [
775
+ 32,
776
+ 16,
777
+ 28,
778
+ 28
779
+ ],
780
+ "Max": 0.0001815402356442064,
781
+ "Min": -0.00012117840378778055,
782
+ "Mean": 2.0098118724831693e-08,
783
+ "Norm": 0.006532244384288788,
784
+ "requires_grad": false,
785
+ "data_name": "Functional.relu.0.backward.output.0.npy"
786
+ }
787
+ ]
788
+ }
789
+ }
790
+ }
791
+ ```
792
+
793
+ ### 3.3 mix 级别
794
+
795
+ mix级别的dump.json文件同时包括L0和L1级别的dump数据,文件格式与上述示例相同。