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.
- {mindstudio_probe-1.1.1.dist-info → mindstudio_probe-1.2.2.dist-info}/METADATA +3 -2
- mindstudio_probe-1.2.2.dist-info/RECORD +415 -0
- msprobe/CMakeLists.txt +5 -0
- msprobe/README.md +16 -21
- msprobe/config.json +1 -0
- msprobe/core/common/const.py +185 -11
- msprobe/core/common/exceptions.py +3 -1
- msprobe/core/common/file_utils.py +33 -7
- msprobe/core/common/inplace_ops.yaml +4 -0
- msprobe/core/common/utils.py +42 -14
- msprobe/core/common_config.py +6 -0
- msprobe/core/compare/acc_compare.py +139 -128
- msprobe/core/compare/check.py +31 -29
- msprobe/core/compare/compare_cli.py +17 -16
- msprobe/core/compare/highlight.py +186 -99
- msprobe/core/compare/layer_mapping/data_scope_parser.py +19 -8
- msprobe/core/compare/layer_mapping/layer_mapping.py +21 -14
- msprobe/core/compare/layer_mapping/postprocess_pass.py +4 -3
- msprobe/core/compare/merge_result/merge_result.py +381 -0
- msprobe/core/compare/merge_result/merge_result_cli.py +31 -0
- msprobe/core/compare/merge_result/utils.py +81 -0
- msprobe/core/compare/multiprocessing_compute.py +2 -2
- msprobe/core/compare/npy_compare.py +109 -147
- msprobe/core/compare/utils.py +199 -69
- msprobe/core/data_dump/data_collector.py +100 -25
- msprobe/core/data_dump/data_processor/base.py +130 -28
- msprobe/core/data_dump/data_processor/factory.py +8 -3
- msprobe/core/data_dump/data_processor/mindspore_processor.py +170 -23
- msprobe/core/data_dump/data_processor/pytorch_processor.py +175 -64
- msprobe/core/data_dump/json_writer.py +54 -8
- msprobe/core/data_dump/scope.py +19 -18
- msprobe/core/overflow_check/abnormal_scene.py +9 -5
- msprobe/core/overflow_check/checker.py +1 -1
- msprobe/core/overflow_check/utils.py +1 -1
- msprobe/docs/01.installation.md +121 -17
- msprobe/docs/02.config_introduction.md +18 -16
- msprobe/docs/03.config_examples.md +24 -0
- msprobe/docs/05.data_dump_PyTorch.md +107 -58
- msprobe/docs/06.data_dump_MindSpore.md +95 -34
- msprobe/docs/07.accuracy_checker_PyTorch.md +18 -18
- msprobe/docs/09.accuracy_checker_MindSpore.md +8 -6
- msprobe/docs/10.accuracy_compare_PyTorch.md +99 -41
- msprobe/docs/11.accuracy_compare_MindSpore.md +249 -48
- msprobe/docs/12.overflow_check_PyTorch.md +1 -1
- msprobe/docs/19.monitor.md +310 -220
- msprobe/docs/21.visualization_PyTorch.md +125 -35
- msprobe/docs/22.visualization_MindSpore.md +149 -41
- msprobe/docs/23.generate_operator_PyTorch.md +107 -0
- msprobe/docs/24.code_mapping_Mindspore.md +28 -0
- msprobe/docs/{23.tool_function_introduction.md → 25.tool_function_introduction.md} +1 -0
- msprobe/docs/26.data_dump_PyTorch_baseline.md +37 -0
- msprobe/docs/27.dump_json_instruction.md +525 -0
- msprobe/docs/28.debugger_save_instruction.md +94 -0
- msprobe/docs/28.kernel_dump_MindSpore.md +69 -0
- msprobe/docs/FAQ.md +26 -2
- msprobe/docs/accuracy_checker_MindSpore/accuracy_checker_MindSpore_baseline.md +14 -0
- msprobe/docs/data_dump_MindSpore/data_dump_MindSpore_baseline.md +22 -0
- msprobe/docs/img/merge_result.png +0 -0
- msprobe/docs/img/monitor/step_count_per_record.png +0 -0
- msprobe/docs/img/visualization/fuzzy_match_ms.png +0 -0
- msprobe/docs/img/visualization/fuzzy_match_pt.png +0 -0
- msprobe/docs/img/visualization/tensorboard_1.png +0 -0
- msprobe/docs/img/visualization/tensorboard_2.png +0 -0
- msprobe/docs/img/visualization/vis_browser_1.png +0 -0
- msprobe/docs/img/visualization/vis_browser_2.png +0 -0
- msprobe/docs/img/visualization/vis_precision_info.png +0 -0
- msprobe/docs/img/visualization/vis_search_info.png +0 -0
- msprobe/docs/img/visualization/vis_show_info.png +0 -0
- msprobe/docs/img/visualization/vis_showcase.png +0 -0
- msprobe/docs/img/visualization/vis_unmatch_info.png +0 -0
- msprobe/docs/visualization/GPTModel.png +0 -0
- msprobe/docs/visualization/ParallelMLP.png +0 -0
- msprobe/docs/visualization/layer_mapping_example.md +132 -0
- msprobe/docs/visualization/mapping.png +0 -0
- msprobe/docs/visualization/mapping1.png +0 -0
- msprobe/docs/visualization/module_name.png +0 -0
- msprobe/docs/visualization/module_name1.png +0 -0
- msprobe/docs/visualization/no_mapping.png +0 -0
- msprobe/docs/visualization/no_mapping1.png +0 -0
- msprobe/docs/visualization/no_mapping_analyze.png +0 -0
- msprobe/docs/visualization/top_layer.png +0 -0
- msprobe/mindspore/__init__.py +11 -0
- msprobe/mindspore/api_accuracy_checker/api_accuracy_checker.py +80 -28
- msprobe/mindspore/api_accuracy_checker/api_runner.py +54 -16
- msprobe/mindspore/api_accuracy_checker/cmd_parser.py +2 -1
- msprobe/mindspore/api_accuracy_checker/compute_element.py +52 -8
- msprobe/mindspore/api_accuracy_checker/data_manager.py +37 -0
- msprobe/mindspore/api_accuracy_checker/main.py +1 -0
- msprobe/mindspore/api_accuracy_checker/multi_api_accuracy_checker.py +12 -6
- msprobe/mindspore/api_accuracy_checker/multi_data_manager.py +3 -1
- msprobe/mindspore/api_accuracy_checker/torch_mindtorch_importer.py +129 -0
- msprobe/mindspore/api_accuracy_checker/type_mapping.py +24 -1
- msprobe/mindspore/api_accuracy_checker/utils.py +6 -1
- msprobe/mindspore/code_mapping/bind.py +264 -0
- msprobe/mindspore/code_mapping/cmd_parser.py +40 -0
- msprobe/mindspore/code_mapping/graph.py +49 -0
- msprobe/mindspore/code_mapping/graph_parser.py +226 -0
- msprobe/mindspore/code_mapping/main.py +24 -0
- msprobe/mindspore/code_mapping/processor.py +34 -0
- msprobe/mindspore/common/const.py +3 -1
- msprobe/mindspore/common/utils.py +68 -5
- msprobe/mindspore/compare/distributed_compare.py +0 -2
- msprobe/mindspore/compare/ms_compare.py +105 -63
- msprobe/mindspore/compare/ms_graph_compare.py +14 -5
- msprobe/mindspore/debugger/debugger_config.py +28 -2
- msprobe/mindspore/debugger/precision_debugger.py +100 -12
- msprobe/mindspore/dump/hook_cell/api_registry.py +85 -16
- msprobe/mindspore/dump/hook_cell/hook_cell.py +60 -38
- msprobe/mindspore/dump/hook_cell/primitive_hooks.py +33 -15
- msprobe/mindspore/dump/hook_cell/support_wrap_ops.yaml +11 -1
- msprobe/mindspore/dump/hook_cell/wrap_api.py +92 -1
- msprobe/mindspore/dump/jit_dump.py +7 -6
- msprobe/mindspore/dump/kernel_dump/kernel_config.py +33 -0
- msprobe/mindspore/dump/kernel_graph_dump.py +7 -0
- msprobe/mindspore/free_benchmark/api_pynative_self_check.py +13 -4
- msprobe/mindspore/free_benchmark/perturbation/bit_noise.py +2 -2
- msprobe/mindspore/grad_probe/grad_analyzer.py +24 -12
- msprobe/mindspore/grad_probe/hook.py +13 -4
- msprobe/mindspore/mindtorch/__init__.py +18 -0
- msprobe/mindspore/mindtorch/mindtorch_adaptor.py +255 -0
- msprobe/mindspore/monitor/anomaly_detect.py +404 -0
- msprobe/mindspore/monitor/distributed/__init__.py +0 -0
- msprobe/mindspore/monitor/distributed/distributed_ops.yaml +15 -0
- msprobe/mindspore/monitor/distributed/stack_blacklist.yaml +5 -0
- msprobe/mindspore/monitor/distributed/wrap_distributed.py +300 -0
- msprobe/mindspore/monitor/features.py +63 -0
- msprobe/mindspore/monitor/module_hook.py +821 -0
- msprobe/mindspore/monitor/module_spec_verifier.py +94 -0
- msprobe/mindspore/monitor/utils.py +267 -0
- msprobe/mindspore/ms_config.py +13 -3
- msprobe/mindspore/overflow_check/kernel_graph_overflow_check.py +7 -0
- msprobe/mindspore/service.py +347 -107
- msprobe/msprobe.py +24 -3
- msprobe/pytorch/__init__.py +7 -7
- msprobe/pytorch/api_accuracy_checker/common/utils.py +31 -16
- msprobe/pytorch/api_accuracy_checker/compare/algorithm.py +41 -8
- msprobe/pytorch/api_accuracy_checker/compare/api_precision_compare.py +100 -267
- msprobe/pytorch/api_accuracy_checker/compare/api_precision_standard.yaml +4 -1
- msprobe/pytorch/api_accuracy_checker/compare/compare.py +69 -68
- msprobe/pytorch/api_accuracy_checker/compare/compare_column.py +54 -0
- msprobe/pytorch/api_accuracy_checker/compare/compare_input.py +51 -0
- msprobe/pytorch/api_accuracy_checker/compare/compare_utils.py +2 -4
- msprobe/pytorch/api_accuracy_checker/generate_op_script/op_generator.py +55 -31
- msprobe/pytorch/api_accuracy_checker/precision_standard/absolute_threshold.py +106 -0
- msprobe/pytorch/api_accuracy_checker/precision_standard/accumulative_error_compare.py +107 -0
- msprobe/pytorch/api_accuracy_checker/precision_standard/base_standard.py +151 -0
- msprobe/pytorch/api_accuracy_checker/precision_standard/benchmark_compare.py +226 -0
- msprobe/pytorch/api_accuracy_checker/precision_standard/binary_consistency.py +68 -0
- msprobe/pytorch/api_accuracy_checker/precision_standard/standard_config.py +218 -0
- msprobe/pytorch/api_accuracy_checker/precision_standard/standard_register.py +104 -0
- msprobe/pytorch/api_accuracy_checker/precision_standard/thousandth_standard.py +63 -0
- msprobe/pytorch/api_accuracy_checker/precision_standard/ulp_compare.py +200 -0
- msprobe/pytorch/api_accuracy_checker/run_ut/data_generate.py +57 -1
- msprobe/pytorch/api_accuracy_checker/run_ut/multi_run_ut.py +2 -1
- msprobe/pytorch/api_accuracy_checker/run_ut/run_overflow_check.py +42 -14
- msprobe/pytorch/api_accuracy_checker/run_ut/run_ut.py +64 -19
- msprobe/pytorch/api_accuracy_checker/run_ut/run_ut_utils.py +34 -4
- msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/device_dispatch.py +5 -3
- msprobe/pytorch/bench_functions/apply_adam.py +215 -0
- msprobe/pytorch/bench_functions/group_norm_silu.py +27 -0
- msprobe/pytorch/bench_functions/mish.py +21 -0
- msprobe/pytorch/bench_functions/moe_gating_top_k_softmax.py +44 -0
- msprobe/pytorch/bench_functions/npu_fusion_attention.py +42 -10
- msprobe/pytorch/bench_functions/sort_v2.py +21 -0
- msprobe/pytorch/common/parse_json.py +2 -1
- msprobe/pytorch/common/utils.py +116 -2
- msprobe/pytorch/compare/distributed_compare.py +17 -29
- msprobe/pytorch/compare/pt_compare.py +40 -20
- msprobe/pytorch/debugger/debugger_config.py +42 -17
- msprobe/pytorch/debugger/precision_debugger.py +56 -12
- msprobe/pytorch/dump/module_dump/__init__.py +0 -0
- msprobe/pytorch/dump/module_dump/module_dump.py +86 -0
- msprobe/pytorch/dump/module_dump/module_processer.py +204 -0
- msprobe/pytorch/free_benchmark/common/params.py +2 -1
- msprobe/pytorch/free_benchmark/common/utils.py +3 -0
- msprobe/pytorch/free_benchmark/compare/grad_saver.py +0 -2
- msprobe/pytorch/free_benchmark/result_handlers/base_handler.py +31 -47
- msprobe/pytorch/free_benchmark/result_handlers/preheat_handler.py +0 -4
- msprobe/pytorch/function_factory.py +7 -1
- msprobe/pytorch/hook_module/__init__.py +1 -1
- msprobe/pytorch/hook_module/hook_module.py +14 -11
- msprobe/pytorch/hook_module/register_optimizer_hook.py +59 -0
- msprobe/pytorch/hook_module/support_wrap_ops.yaml +36 -1
- msprobe/pytorch/hook_module/wrap_distributed.py +10 -8
- msprobe/pytorch/hook_module/wrap_functional.py +0 -40
- msprobe/pytorch/monitor/anomaly_analyse.py +1 -1
- msprobe/pytorch/monitor/anomaly_detect.py +98 -28
- msprobe/pytorch/monitor/csv2tb.py +164 -0
- msprobe/pytorch/monitor/distributed/wrap_distributed.py +25 -14
- msprobe/pytorch/monitor/features.py +3 -3
- msprobe/pytorch/monitor/module_hook.py +543 -318
- msprobe/pytorch/monitor/module_metric.py +27 -48
- msprobe/pytorch/monitor/module_spec_verifier.py +3 -1
- msprobe/pytorch/monitor/optimizer_collect.py +76 -56
- msprobe/pytorch/monitor/unittest/test_monitor.py +24 -9
- msprobe/pytorch/monitor/utils.py +84 -48
- msprobe/pytorch/online_dispatch/dispatch.py +8 -2
- msprobe/pytorch/parse_tool/lib/compare.py +10 -10
- msprobe/pytorch/parse_tool/lib/config.py +5 -7
- msprobe/pytorch/parse_tool/lib/file_desc.py +15 -1
- msprobe/pytorch/parse_tool/lib/interactive_cli.py +10 -10
- msprobe/pytorch/parse_tool/lib/parse_exception.py +7 -7
- msprobe/pytorch/parse_tool/lib/parse_tool.py +11 -10
- msprobe/pytorch/parse_tool/lib/utils.py +18 -19
- msprobe/pytorch/parse_tool/lib/visualization.py +9 -10
- msprobe/pytorch/pt_config.py +19 -22
- msprobe/pytorch/service.py +264 -115
- msprobe/visualization/builder/graph_builder.py +93 -10
- msprobe/visualization/builder/msprobe_adapter.py +30 -6
- msprobe/visualization/compare/graph_comparator.py +64 -14
- msprobe/visualization/compare/mode_adapter.py +1 -15
- msprobe/visualization/graph/base_node.py +15 -19
- msprobe/visualization/graph/distributed_analyzer.py +395 -0
- msprobe/visualization/graph/graph.py +9 -0
- msprobe/visualization/graph/node_op.py +4 -2
- msprobe/visualization/graph_service.py +100 -27
- msprobe/visualization/utils.py +24 -31
- mindstudio_probe-1.1.1.dist-info/RECORD +0 -341
- msprobe/pytorch/functional/module_dump.py +0 -84
- msprobe/pytorch/module_processer.py +0 -150
- {mindstudio_probe-1.1.1.dist-info → mindstudio_probe-1.2.2.dist-info}/LICENSE +0 -0
- {mindstudio_probe-1.1.1.dist-info → mindstudio_probe-1.2.2.dist-info}/WHEEL +0 -0
- {mindstudio_probe-1.1.1.dist-info → mindstudio_probe-1.2.2.dist-info}/entry_points.txt +0 -0
- {mindstudio_probe-1.1.1.dist-info → mindstudio_probe-1.2.2.dist-info}/top_level.txt +0 -0
- /msprobe/docs/{data_dump_Mindspore → data_dump_MindSpore}/dynamic_graph_quick_start_example.md +0 -0
- /msprobe/{pytorch/functional → mindspore/code_mapping}/__init__.py +0 -0
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
msprobe 工具主要通过在训练脚本内添加 dump 接口、启动训练的方式采集精度数据。
|
|
4
4
|
|
|
5
|
+
dump的'tensor'模式采集数据量大小,可以参考[数据量基线](./26.data_dump_PyTorch_baseline.md)。
|
|
6
|
+
|
|
5
7
|
本工具提供固定的 API 支持列表,若需要删除或增加 dump 的 API,可以在 msprobe/pytorch/hook_module/support_wrap_ops.yaml 文件内手动修改,如下示例:
|
|
6
8
|
|
|
7
9
|
```yaml
|
|
@@ -25,8 +27,12 @@ functional: # functional为算子类别,找到对应的类别,在该类别
|
|
|
25
27
|
PrecisionDebugger(config_path=None, task=None, dump_path=None, level=None, model=None, step=None)
|
|
26
28
|
```
|
|
27
29
|
|
|
28
|
-
1. config_path:指定 dump 配置文件路径;
|
|
29
|
-
2.
|
|
30
|
+
1. config_path:指定 dump 配置文件路径;
|
|
31
|
+
2. model:指定需要采集 Module 级数据的模型,支持传入 torch.nn.Module 或 list[torch.nn.Module] 类型,默认未配置。
|
|
32
|
+
level 配置为"L0"或"mix"时,必须在该接口或 **start** 接口中配置该参数。该参数在将来会从该接口移除,建议在 **start** 接口中配置该参数。
|
|
33
|
+
3. 其他参数均在 [config.json](../config.json) 文件中可配,详细配置可见 [config.json 介绍](./02.config_introduction.md)。
|
|
34
|
+
|
|
35
|
+
此接口的参数均不是必要,且优先级高于 [config.json](../config.json) 文件中的配置,但可配置的参数相比 config.json 较少。
|
|
30
36
|
|
|
31
37
|
### 1.2 start
|
|
32
38
|
|
|
@@ -38,12 +44,18 @@ PrecisionDebugger(config_path=None, task=None, dump_path=None, level=None, model
|
|
|
38
44
|
debugger.start(model=None)
|
|
39
45
|
```
|
|
40
46
|
|
|
41
|
-
1.
|
|
47
|
+
1. model:指定需要采集 Module 级数据的模型,支持传入 torch.nn.Module、list[torch.nn.Module]或Tuple[torch.nn.Module] 类型,默认未配置。
|
|
48
|
+
level 配置为"L0"或"mix"时,必须在该接口或 **PrecisionDebugger** 接口中配置该参数。
|
|
42
49
|
本接口中的 model 比 PrecisionDebugger 中 model 参数优先级更高,会覆盖 PrecisionDebugger 中的 model 参数。
|
|
43
50
|
|
|
44
51
|
### 1.3 stop
|
|
45
52
|
|
|
46
|
-
**功能说明**:停止精度数据采集。在 **start**
|
|
53
|
+
**功能说明**:停止精度数据采集。在 **start** 函数之后的任意位置添加。
|
|
54
|
+
若 **stop** 函数添加在反向计算代码(如loss.backward)之后,则会采集 **start** 和该函数之间的前反向数据。
|
|
55
|
+
若 **stop** 函数添加在反向计算代码之前,则需要将 [**step**](#15-step) 函数添加到反向计算代码之后,才能采集 **start** 和该函数之间的前反向数据。
|
|
56
|
+
使用示例可参见 [2.1 快速上手](#21-快速上手) 和 [2.2 采集完整的前反向数据](#22-采集完整的前反向数据)。
|
|
57
|
+
|
|
58
|
+
**注意**:**stop** 函数必须调用,否则可能导致精度数据落盘不全。
|
|
47
59
|
|
|
48
60
|
**原型**:
|
|
49
61
|
|
|
@@ -53,7 +65,8 @@ debugger.stop()
|
|
|
53
65
|
|
|
54
66
|
### 1.4 forward_backward_dump_end
|
|
55
67
|
|
|
56
|
-
|
|
68
|
+
**功能说明**:停止精度数据采集。与 **stop** 函数功能相同,该函数在将来会被移除,建议使用 **stop** 函数。
|
|
69
|
+
使用示例可参见 [2.3 采集指定代码块的前反向数据](#23-采集指定代码块的前反向数据)。
|
|
57
70
|
|
|
58
71
|
**原型**:
|
|
59
72
|
|
|
@@ -63,7 +76,8 @@ forward_backward_dump_end()
|
|
|
63
76
|
|
|
64
77
|
### 1.5 step
|
|
65
78
|
|
|
66
|
-
|
|
79
|
+
**功能说明**:结束一个 step 的数据采集,完成所有数据落盘并更新 dump 参数。在一个 step 结束的位置添加,且必须在 **stop** 函数之后的位置调用。
|
|
80
|
+
该函数需要配合 **start** 和 **stop** 函数使用,尽量添加在反向计算代码(如loss.backward)之后,否则可能会导致反向数据丢失。使用示例可参见[2.2 采集完整的前反向数据](#22-采集完整的前反向数据)。
|
|
67
81
|
|
|
68
82
|
**原型**:
|
|
69
83
|
|
|
@@ -103,13 +117,18 @@ module_dump_end()
|
|
|
103
117
|
|
|
104
118
|
**原型**:
|
|
105
119
|
```python
|
|
106
|
-
seed_all(seed=1234, mode=False)
|
|
120
|
+
seed_all(seed=1234, mode=False, rm_dropout=True)
|
|
107
121
|
```
|
|
108
122
|
|
|
109
123
|
**参数说明**:
|
|
110
124
|
|
|
111
125
|
1. seed: 随机性种子。参数示例: seed=1000。默认值:1234。非必选
|
|
112
126
|
2. mode:确定性计算模式。可配置True或False。参数示例:mode=True。默认为False。非必选(注意:确定性计算会导致API执行性能降低,建议在发现模型多次执行结果不同的情况下开启)
|
|
127
|
+
3. rm_dropout:控制dropout失效的开关。可配置 True 或 False,默认值:True,非必选。参数示例:rm_dropout=True。
|
|
128
|
+
该参数设置为 True 后, 工具会自动将 `torch.nn.functional.dropout`、`torch.nn.functional.dropout2d`、`torch.nn.functional.dropout3d`、`torch.nn.Dropout`、`torch.nn.Dropout2d`、`torch.nn.Dropout3d`
|
|
129
|
+
的接口参数 p 置为0,以避免因随机dropout造成的网络随机性。 注意:通过rm_dropout控制dropout失效或生效需要在初始化dropout实例前调用才能生效。
|
|
130
|
+
|
|
131
|
+
当前工具 dump 默认不会固定随机性和使 dropout 失效,若希望每次采集的数据保持一致,建议在 dump 数据前调用 seed_all 接口。
|
|
113
132
|
|
|
114
133
|
seed_all 函数可固定随机数的范围如下表。
|
|
115
134
|
|
|
@@ -128,28 +147,45 @@ seed_all 函数可固定随机数的范围如下表。
|
|
|
128
147
|
| torch.backends.cudnn.enable=False | 关闭 cuDNN |
|
|
129
148
|
| torch.backends.cudnn.benchmark=False | cuDNN 确定性地选择算法 |
|
|
130
149
|
| torch.backends.cudnn.deterministic=True | cuDNN 仅使用确定性的卷积算法 |
|
|
150
|
+
| torch.nn.functional.dropout | 将 dropout 的接口参数 p 置为0 |
|
|
151
|
+
| torch.nn.functional.dropout2d | 将 dropout2d 的接口参数 p 置为0 |
|
|
152
|
+
| torch.nn.functional.dropout3d | 将 dropout3d 的接口参数 p 置为0 |
|
|
153
|
+
| torch.nn.Dropout | 将 Dropout 的接口参数 p 置为0 |
|
|
154
|
+
| torch.nn.Dropout2d | 将 Dropout2d 的接口参数 p 置为0 |
|
|
155
|
+
| torch.nn.Dropout3d | 将 Dropout3d 的接口参数 p 置为0 |
|
|
131
156
|
|
|
132
157
|
需要保证 CPU 或 GPU 以及 NPU 的模型输入完全一致,dump 数据的比对才有意义,seed_all 并不能保证模型输入完全一致,如下表所示场景需要保证输入的一致性。
|
|
133
158
|
|
|
134
159
|
| 场景 | 固定方法 |
|
|
135
160
|
| --------------- | ------------- |
|
|
136
161
|
| 数据集的 shuffle | 关闭 shuffle。 |
|
|
137
|
-
| dropout | 关闭 dropout。 |
|
|
138
162
|
|
|
139
163
|
关闭 shuffle 示例:
|
|
140
164
|
|
|
141
165
|
```python
|
|
142
166
|
train_loader = torch.utils.data.DataLoader(
|
|
143
|
-
train_dataset,
|
|
144
|
-
batch_size
|
|
145
|
-
shuffle
|
|
146
|
-
num_workers
|
|
167
|
+
train_dataset,
|
|
168
|
+
batch_size=batch_size,
|
|
169
|
+
shuffle=False,
|
|
170
|
+
num_workers=num_workers
|
|
147
171
|
)
|
|
148
172
|
```
|
|
149
173
|
|
|
150
|
-
|
|
174
|
+
### 1.9 save
|
|
151
175
|
|
|
152
|
-
|
|
176
|
+
**功能说明**:单点保存网络执行过程中正反向数值,并以统计值/张量文件落盘。
|
|
177
|
+
|
|
178
|
+
**原型**:
|
|
179
|
+
```python
|
|
180
|
+
save(variable, name, save_backward=True)
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
**参数说明**:
|
|
184
|
+
| 参数名称 | 参数含义 | 支持数据类型 | 是否必选|
|
|
185
|
+
| ---------- | ------------------| ------------------- | ------------------- |
|
|
186
|
+
| variable | 需要保存的变量 |dict, list, torch.tensor, int, float, str | 是 |
|
|
187
|
+
| name | 指定的名称 | str | 是 |
|
|
188
|
+
| save_backward | 是否保存反向数据 | boolean | 否 |
|
|
153
189
|
|
|
154
190
|
## 2 示例代码
|
|
155
191
|
|
|
@@ -161,38 +197,43 @@ num_workers = num_workers
|
|
|
161
197
|
# 根据需要import包
|
|
162
198
|
import torch
|
|
163
199
|
import torch.nn as nn
|
|
164
|
-
import torch_npu # 需安装 torch_npu
|
|
165
200
|
import torch.nn.functional as F
|
|
201
|
+
|
|
202
|
+
# 导入工具的数据采集接口
|
|
166
203
|
from msprobe.pytorch import PrecisionDebugger, seed_all
|
|
204
|
+
|
|
167
205
|
# 在模型训练开始前固定随机性
|
|
168
206
|
seed_all()
|
|
207
|
+
# 在模型训练开始前实例化PrecisionDebugger
|
|
208
|
+
debugger = PrecisionDebugger(config_path='./config.json')
|
|
169
209
|
|
|
170
|
-
torch.npu.set_device("npu:0")
|
|
171
210
|
# 定义网络
|
|
172
211
|
class ModuleOP(nn.Module):
|
|
173
212
|
def __init__(self) -> None:
|
|
174
213
|
super().__init__()
|
|
175
|
-
self.linear_1 = nn.Linear(in_features=8,out_features=4)
|
|
176
|
-
self.linear_2 = nn.Linear(in_features=4,out_features=2)
|
|
214
|
+
self.linear_1 = nn.Linear(in_features=8, out_features=4)
|
|
215
|
+
self.linear_2 = nn.Linear(in_features=4, out_features=2)
|
|
177
216
|
|
|
178
|
-
def forward(self,x):
|
|
217
|
+
def forward(self, x):
|
|
179
218
|
x1 = self.linear_1(x)
|
|
180
219
|
x2 = self.linear_2(x1)
|
|
181
220
|
r1 = F.relu(x2)
|
|
182
221
|
return r1
|
|
183
222
|
|
|
184
223
|
if __name__ == "__main__":
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
debugger.start()
|
|
189
|
-
x = torch.randn(10,8)
|
|
190
|
-
out = module(x)
|
|
191
|
-
loss = out.sum()
|
|
192
|
-
loss.backward()
|
|
193
|
-
debugger.stop()
|
|
224
|
+
module = ModuleOP()
|
|
225
|
+
# 开启数据 dump
|
|
226
|
+
debugger.start(model=module)
|
|
194
227
|
|
|
228
|
+
x = torch.randn(10, 8)
|
|
229
|
+
out = module(x)
|
|
230
|
+
loss = out.sum()
|
|
231
|
+
loss.backward()
|
|
232
|
+
|
|
233
|
+
# 关闭数据 dump
|
|
234
|
+
debugger.stop()
|
|
195
235
|
```
|
|
236
|
+
|
|
196
237
|
### 2.2 采集完整的前反向数据
|
|
197
238
|
|
|
198
239
|
```Python
|
|
@@ -205,19 +246,20 @@ debugger = PrecisionDebugger(config_path="./config.json", dump_path="./dump_path
|
|
|
205
246
|
# ...
|
|
206
247
|
# 数据集迭代的位置一般为模型训练开始的位置
|
|
207
248
|
for data, label in data_loader:
|
|
208
|
-
|
|
209
|
-
|
|
249
|
+
debugger.start() # 开启数据dump
|
|
250
|
+
# 如下是模型每个step执行的逻辑
|
|
210
251
|
output = model(data)
|
|
211
252
|
#...
|
|
212
253
|
loss.backward()
|
|
213
|
-
|
|
214
|
-
|
|
254
|
+
debugger.stop() # 关闭数据dump
|
|
255
|
+
debugger.step() # 结束一个step的dump
|
|
215
256
|
```
|
|
216
257
|
|
|
217
258
|
### 2.3 采集指定代码块的前反向数据
|
|
218
259
|
|
|
219
260
|
```Python
|
|
220
261
|
from msprobe.pytorch import PrecisionDebugger, seed_all
|
|
262
|
+
|
|
221
263
|
# 在模型训练开始前固定随机性
|
|
222
264
|
seed_all()
|
|
223
265
|
# 请勿将PrecisionDebugger的初始化流程插入到循环代码中
|
|
@@ -227,14 +269,14 @@ debugger = PrecisionDebugger(config_path="./config.json", dump_path="./dump_path
|
|
|
227
269
|
# ...
|
|
228
270
|
# 数据集迭代的位置一般为模型训练开始的位置
|
|
229
271
|
for data, label in data_loader:
|
|
230
|
-
|
|
231
|
-
|
|
272
|
+
debugger.start() # 开启数据dump
|
|
273
|
+
# 如下是模型每个step执行的逻辑
|
|
232
274
|
output = model(data)
|
|
233
|
-
|
|
234
|
-
|
|
275
|
+
|
|
276
|
+
debugger.forward_backward_dump_end() # 插入该函数到start函数之后,只dump start函数到该函数之间的前反向数据。
|
|
277
|
+
# ...
|
|
235
278
|
loss.backward()
|
|
236
|
-
|
|
237
|
-
debugger.step() # 结束一个step的dump
|
|
279
|
+
debugger.step() # 结束一个step的dump
|
|
238
280
|
```
|
|
239
281
|
|
|
240
282
|
### 2.4 采集函数模块化数据
|
|
@@ -243,11 +285,14 @@ for data, label in data_loader:
|
|
|
243
285
|
# 根据需要import包
|
|
244
286
|
import torch
|
|
245
287
|
import torch.nn as nn
|
|
246
|
-
import torch_npu # 需安装 torch_npu
|
|
247
288
|
import torch.nn.functional as F
|
|
289
|
+
|
|
290
|
+
# 导入工具的数据采集接口
|
|
248
291
|
from msprobe.pytorch import PrecisionDebugger, module_dump, module_dump_end
|
|
249
292
|
|
|
250
|
-
|
|
293
|
+
# 在模型训练开始前实例化PrecisionDebugger
|
|
294
|
+
debugger = PrecisionDebugger(config_path='./config.json')
|
|
295
|
+
|
|
251
296
|
# 定义网络
|
|
252
297
|
class ModuleOP(nn.Module):
|
|
253
298
|
def __init__(self) -> None:
|
|
@@ -263,37 +308,38 @@ class ModuleOP(nn.Module):
|
|
|
263
308
|
|
|
264
309
|
if __name__ == "__main__":
|
|
265
310
|
module = ModuleOP()
|
|
266
|
-
#
|
|
267
|
-
debugger
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
x = torch.randn(10, 8)
|
|
311
|
+
# 开启数据dump
|
|
312
|
+
debugger.start()
|
|
313
|
+
x = torch.randn(10, 8)
|
|
271
314
|
# ... # start和module_dump接口之间的数据正常dump
|
|
272
315
|
module_dump(module, "MyModuleOP") # 开启模块级精度数据dump
|
|
273
|
-
out = module(x) # module内部的child modules或API
|
|
316
|
+
out = module(x) # module内部的child modules或API将不会被dump
|
|
274
317
|
module_dump_end() # 关闭模块级精度数据dump
|
|
275
318
|
loss = out.sum() # module_dump_end和stop接口之间的数据正常dump
|
|
276
|
-
loss.backward()
|
|
277
|
-
|
|
278
|
-
debugger.stop()
|
|
319
|
+
loss.backward()
|
|
320
|
+
# 关闭数据dump
|
|
321
|
+
debugger.stop()
|
|
279
322
|
```
|
|
280
323
|
|
|
281
324
|
## 3 dump 结果文件介绍
|
|
282
325
|
|
|
283
326
|
训练结束后,工具将 dump 的数据保存在 dump_path 参数指定的目录下。目录结构示例如下:
|
|
284
327
|
|
|
285
|
-
```
|
|
328
|
+
```lua
|
|
286
329
|
├── dump_path
|
|
287
330
|
│ ├── step0
|
|
288
331
|
│ | ├── rank0
|
|
289
332
|
│ | │ ├── dump_tensor_data
|
|
290
333
|
| | | | ├── Tensor.permute.1.forward.pt
|
|
291
|
-
| | | | ├──
|
|
334
|
+
| | | | ├── Functional.linear.5.backward.output.pt # 命名格式为{api_type}.{api_name}.{API调用次数}.{forward/backward}.{input/output}.{参数序号}, 其中,“参数序号”表示该API的第n个输入或输出,例如1,则为第一个参数,若该参数为list格式,则根据list继续排序,例如1.1,表示该API的第1个参数的第1个元素。
|
|
292
335
|
| | | | ...
|
|
293
|
-
| | | |
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
336
|
+
| | | | ├── Module.conv1.Conv2d.forward.0.input.0.pt # 命名格式为{Module}.{module_name}.{class_name}.{forward/backward}.{调用次数}.{input/output}.{参数序号}, 其中,“参数序号”表示该Module的第n个参数,例如1,则为第一个参数,若该参数为list格式,则根据list继续排序,例如1.1,表示该Module的第1个参数的第1个元素。
|
|
337
|
+
| | | | ├── Module.conv1.Conv2D.forward.0.parameters.bias.pt # 模块参数数据:命名格式为{Module}.{module_name}.{class_name}.forward.{调用次数}.parameters.{parameter_name}。
|
|
338
|
+
| | | | └── Module.conv1.Conv2D.parameters_grad.weight.pt # 模块参数梯度数据:命名格式为{Module}.{module_name}.{class_name}.parameters_grad.{parameter_name}。因为同一模块的参数使用同一梯度进行更新,所以参数梯度文件名不包含调用次数。
|
|
339
|
+
| | | | # 当dump时传入的model参数为List[torch.nn.Module]或Tuple[torch.nn.Module]时,模块级数据的命名中包含该模块在列表中的索引index,命名格式为{Module}.{index}.*,*表示以上三种模块级数据的命名格式,例如:Module.0.conv1.Conv2d.forward.0.input.0.pt。
|
|
340
|
+
│ | | ├── dump.json
|
|
341
|
+
│ | | ├── stack.json
|
|
342
|
+
│ | | └── construct.json
|
|
297
343
|
│ | ├── rank1
|
|
298
344
|
| | | ├── dump_tensor_data
|
|
299
345
|
| | | | └── ...
|
|
@@ -307,6 +353,12 @@ if __name__ == "__main__":
|
|
|
307
353
|
│ | ├── ...
|
|
308
354
|
│ ├── step2
|
|
309
355
|
```
|
|
356
|
+
* `rank`:设备 ID,每张卡的数据保存在对应的 `rank{ID}` 目录下。非分布式场景下没有 rank ID,目录名称为 rank。
|
|
357
|
+
* `dump_tensor_data`:保存采集到的张量数据。
|
|
358
|
+
* `dump.json`: 保存API或Module前反向数据的统计量信息。包含dump数据的API名称或Module名称,各数据的dtype、 shape、max、min、mean、L2norm(L2范数,平方根)统计信息以及当配置summary_mode="md5"时的CRC-32数据。具体介绍可参考[dump.json文件说明](./27.dump_json_instruction.md#1-dumpjson文件介绍pytorch)。
|
|
359
|
+
* `stack.json`:API/Module的调用栈信息。
|
|
360
|
+
* `construct.json`:分层分级结构,level为L1时,construct.json内容为空。
|
|
361
|
+
|
|
310
362
|
|
|
311
363
|
dump 过程中,pt 文件在对应算子或者模块被执行后就会落盘,而 json 文件则需要在正常执行 PrecisionDebugger.stop() 后才会写入完整数据,异常的程序终止会保存终止前被执行算子的相关 npy 文件,可能会导致 json 文件中数据丢失。
|
|
312
364
|
|
|
@@ -323,6 +375,3 @@ pt 文件保存的前缀和 PyTorch 对应关系如下:
|
|
|
323
375
|
| VF | torch._VF |
|
|
324
376
|
| Aten | torch.ops.aten |
|
|
325
377
|
| Distributed | torch.distributed |
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
@@ -20,38 +20,41 @@
|
|
|
20
20
|
|
|
21
21
|
以下通过一个简单的示例,展示如何在 MindSpore 中使用 msprobe 工具进行精度数据采集。
|
|
22
22
|
|
|
23
|
-
您可以参考 [动态图快速入门示例](
|
|
23
|
+
您可以参考 [动态图快速入门示例](data_dump_MindSpore/dynamic_graph_quick_start_example.md) 了解详细步骤。
|
|
24
24
|
|
|
25
25
|
## 4. 概述
|
|
26
26
|
|
|
27
27
|
msprobe 工具通过在训练脚本中添加 `PrecisionDebugger` 接口并启动训练的方式,采集模型在运行过程中的精度数据。该工具支持对MindSpore的静态图和动态图场景进行不同Level等级的精度数据采集。
|
|
28
28
|
|
|
29
|
+
dump 的"tensor"模式采集数据量大小,可以参考[数据量基线](data_dump_MindSpore/data_dump_MindSpore_baseline.md)。
|
|
29
30
|
|
|
30
|
-
## 5. 场景介绍
|
|
31
|
+
## 5. 场景介绍
|
|
31
32
|
|
|
32
|
-
### 5.1 静态图场景
|
|
33
|
-
在静态图场景下,msprobe 仅支持 **L2 Level** 的数据采集。
|
|
33
|
+
### 5.1 静态图场景
|
|
34
|
+
在静态图场景下,msprobe 仅支持 **L2 Level** 的数据采集。
|
|
34
35
|
- **L2 Level(Kernel 级)** :采集底层算子的输入输出数据,适用于深入分析算子级别的精度问题。
|
|
35
36
|
|
|
36
37
|
采集方式请参见[示例代码 > 静态图场景](#71-静态图场景)。详细介绍请参见[《config.json 配置文件介绍》](./02.config_introduction.md#11-通用配置)中的“level 参数”和[《config.json 配置示例》](./03.config_examples.md#2-mindspore-静态图场景) 中的“MindSpore 静态图场景”。
|
|
37
38
|
|
|
38
|
-
### 5.2 动态图场景
|
|
39
|
-
在动态图场景下,msprobe 支持 **L0** 、**L1** 、**mix** 、**L2 Level** 的数据采集,具体分为以下几种情况:
|
|
40
|
-
- **使用高阶 API(如 `Model 高阶API`)** :
|
|
39
|
+
### 5.2 动态图场景
|
|
40
|
+
在动态图场景下,msprobe 支持 **L0** 、**L1** 、**mix** 、**L2 Level**、 **debug** 的数据采集,具体分为以下几种情况:
|
|
41
|
+
- **使用高阶 API(如 `Model 高阶API`)** :
|
|
41
42
|
- 需要使用 `MsprobeStep` 回调类来控制数据采集的启停,适用于 **L0** 、**L1** 、**mix** 、**L2** 数据采集。
|
|
42
|
-
|
|
43
|
-
- **未使用高阶 API** :
|
|
43
|
+
|
|
44
|
+
- **未使用高阶 API** :
|
|
44
45
|
- 手动在训练循环中调用 `start`、`stop`、`step` 等接口,适用于 **L0** 、**L1** 、**mix** 、**L2** 数据采集。
|
|
45
46
|
|
|
46
|
-
采集方式请参见[示例代码 > 动态图场景](#72
|
|
47
|
+
采集方式请参见[示例代码 > 动态图场景](#72-动态图场景)。
|
|
47
48
|
|
|
48
|
-
> **注意** :动态图模式下,使用 `PSJit` 或 `PIJit` 装饰的部分实际以静态图模式执行,此时的 **Kernel 级(L2 Level)** 数据采集方式与静态图场景相同。
|
|
49
|
+
> **注意** :动态图模式下,使用 `PSJit` 或 `PIJit` 装饰的部分实际以静态图模式执行,此时的 **Kernel 级(L2 Level)** 数据采集方式与静态图场景相同。
|
|
49
50
|
- **L0 Level(Cell 级)** :采集 `Cell` 对象的数据,适用于需要分析特定网络模块的情况。
|
|
50
|
-
|
|
51
|
+
|
|
51
52
|
- **L1 Level(API 级)** :采集 MindSpore API 的输入输出数据,适用于定位 API 层面的精度问题。
|
|
52
53
|
|
|
53
54
|
- **mix(模块级 + API 级)** :在 `L0` 和 `L1` 级别的基础上同时采集模块级和 API 级数据,适用于需要分析模块和 API 层面精度问题的场景。
|
|
54
55
|
|
|
56
|
+
- **debug level (单点保存)**:单点保存网络中变量的正反向数据,适用于用户熟悉网络结构的场景。
|
|
57
|
+
|
|
55
58
|
|
|
56
59
|
详细介绍请参见[《config.json 配置文件介绍》](./02.config_introduction.md#11-通用配置)中的“level 参数”和[《config.json 配置示例》](./03.config_examples.md#3-mindspore-动态图场景) 中的“MindSpore 动态图场景”。
|
|
57
60
|
|
|
@@ -65,12 +68,15 @@ msprobe 工具通过在训练脚本中添加 `PrecisionDebugger` 接口并启动
|
|
|
65
68
|
**原型**:
|
|
66
69
|
|
|
67
70
|
```Python
|
|
68
|
-
PrecisionDebugger(config_path=None)
|
|
71
|
+
PrecisionDebugger(config_path=None, task=None, dump_path=None, level=None, step=None)
|
|
69
72
|
```
|
|
70
73
|
|
|
71
74
|
**参数说明**:
|
|
72
75
|
|
|
73
76
|
1. config_path:指定 dump 配置文件路径,string 类型。参数示例:"./config.json"。未配置该路径时,默认使用 [config.json](../config.json) 文件的默认配置,配置选项含义可见 [config.json 介绍](./02.config_introduction.md)。
|
|
77
|
+
2. 其他参数均在 [config.json](../config.json) 文件中可配,详细配置可见 [config.json 介绍](./02.config_introduction.md)。
|
|
78
|
+
|
|
79
|
+
此接口的参数均不是必要,且优先级高于 [config.json](../config.json) 文件中的配置,但可配置的参数相比 config.json 较少。
|
|
74
80
|
|
|
75
81
|
#### 6.1.1 start
|
|
76
82
|
|
|
@@ -84,11 +90,15 @@ start(model=None)
|
|
|
84
90
|
|
|
85
91
|
**参数说明**:
|
|
86
92
|
|
|
87
|
-
1. model
|
|
93
|
+
1. model:指定需要采集数据的实例化模型,支持传入mindspore.nn.Cell、List[mindspore.nn.Cell]或Tuple[mindspore.nn.Cell] 类型, 默认未配置。Cell级别("L0" level)dump 与 "mix" level dump 时,必须传入 model 才可以采集 model 内的所有Cell 对象数据。API级别("L1" level)dump 时,传入 model 可以采集 model 内包含 primitive op 对象在内的所有 API 数据,若不传入 model 参数,则只采集非 primitive op 的 API 数据。
|
|
88
94
|
|
|
89
95
|
#### 6.1.2 stop
|
|
90
96
|
|
|
91
|
-
|
|
97
|
+
**功能说明**:停止精度数据采集。在 **start** 函数之后的任意位置添加。若 **stop** 函数添加在反向计算代码之后,则会采集 **start** 和该函数之间的前反向数据。
|
|
98
|
+
若 **stop** 函数添加在反向计算代码之前,则需要将 [**step**](#613-step) 函数添加到反向计算代码之后,才能采集 **start** 和该函数之间的前反向数据。
|
|
99
|
+
**仅未使用 Model 高阶 API 的动态图场景支持。**
|
|
100
|
+
|
|
101
|
+
**注意**:**stop** 函数必须调用,否则可能导致精度数据落盘不全。
|
|
92
102
|
|
|
93
103
|
**原型**:
|
|
94
104
|
|
|
@@ -98,7 +108,9 @@ stop()
|
|
|
98
108
|
|
|
99
109
|
#### 6.1.3 step
|
|
100
110
|
|
|
101
|
-
|
|
111
|
+
**功能说明**:结束一个 step 的数据采集,完成所有数据落盘并更新 dump 参数。在一个 step 结束的位置添加,且必须在 **stop** 函数之后的位置调用。
|
|
112
|
+
该函数需要配合 **start** 和 **stop** 函数使用,尽量添加在反向计算代码之后,否则可能会导致反向数据丢失。
|
|
113
|
+
**仅未使用 Model 高阶 API 的动态图场景支持。**
|
|
102
114
|
|
|
103
115
|
**原型**:
|
|
104
116
|
|
|
@@ -108,9 +120,7 @@ step()
|
|
|
108
120
|
|
|
109
121
|
#### 6.1.4 forward_backward_dump_end
|
|
110
122
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
**仅支持L1级别数据采集场景。**
|
|
123
|
+
**功能说明**:停止精度数据采集。与 **stop** 函数功能相同,该函数在将来会被移除,建议使用 **stop** 函数。
|
|
114
124
|
|
|
115
125
|
**L1级别数据中的jit数据采集行为不受此接口影响。**
|
|
116
126
|
|
|
@@ -122,6 +132,24 @@ step()
|
|
|
122
132
|
forward_backward_dump_end()
|
|
123
133
|
```
|
|
124
134
|
|
|
135
|
+
#### 6.1.5 save
|
|
136
|
+
|
|
137
|
+
**功能说明**:单点保存网络执行过程中正反向数值,并以统计值/张量文件落盘。
|
|
138
|
+
|
|
139
|
+
**原型**:
|
|
140
|
+
```python
|
|
141
|
+
save(variable, name, save_backward=True)
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
**参数说明**:
|
|
145
|
+
| 参数名称 | 参数含义 | 支持数据类型 | 是否必选|
|
|
146
|
+
| ---------- | ------------------| ------------------- | ------------------- |
|
|
147
|
+
| variable | 需要保存的变量 |dict, list, torch.tensor, int, float, str | 是 |
|
|
148
|
+
| name | 指定的名称 | str | 是 |
|
|
149
|
+
| save_backward | 是否保存反向数据 | boolean | 否 |
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
|
|
125
153
|
### 6.2 msprobe.mindspore.common.utils.MsprobeStep
|
|
126
154
|
|
|
127
155
|
**功能说明**:MindSpore Callback类,自动在每个step开始时调用start()接口,在每个step结束时调用stop()、step()接口。实现使用 Model 高阶 API 的动态图场景下 L0、L1、mix 级别的精度数据采集控制,控制粒度为单个 **Step** ,而 PrecisionDebugger.start, PrecisionDebugger.stop 接口的控制粒度任意训练代码段。
|
|
@@ -173,11 +201,11 @@ debugger.start()
|
|
|
173
201
|
|
|
174
202
|
```
|
|
175
203
|
|
|
176
|
-
### 7.2 动态图场景
|
|
204
|
+
### 7.2 动态图场景
|
|
177
205
|
|
|
178
206
|
#### 7.2.1 L0 ,L1, mix 级别
|
|
179
207
|
|
|
180
|
-
##### 7.2.1.1 未使用 Model 高阶 API
|
|
208
|
+
##### 7.2.1.1 未使用 Model 高阶 API
|
|
181
209
|
|
|
182
210
|
|
|
183
211
|
```python
|
|
@@ -201,7 +229,7 @@ for data, label in data_loader:
|
|
|
201
229
|
debugger.step() # 更新迭代数
|
|
202
230
|
```
|
|
203
231
|
|
|
204
|
-
##### 7.2.1.2 使用 Model 高阶 API
|
|
232
|
+
##### 7.2.1.2 使用 Model 高阶 API
|
|
205
233
|
|
|
206
234
|
|
|
207
235
|
```python
|
|
@@ -225,7 +253,7 @@ trainer.train(1, train_dataset, callbacks=[MsprobeStep(debugger)])
|
|
|
225
253
|
|
|
226
254
|
#### 7.2.2 L2 级别
|
|
227
255
|
|
|
228
|
-
##### 7.2.2.1 未使用 Model 高阶 API
|
|
256
|
+
##### 7.2.2.1 未使用 Model 高阶 API
|
|
229
257
|
|
|
230
258
|
|
|
231
259
|
```python
|
|
@@ -248,7 +276,7 @@ for data, label in data_loader:
|
|
|
248
276
|
```
|
|
249
277
|
|
|
250
278
|
|
|
251
|
-
##### 7.2.2.2 使用 Model 高阶 API
|
|
279
|
+
##### 7.2.2.2 使用 Model 高阶 API
|
|
252
280
|
|
|
253
281
|
|
|
254
282
|
```python
|
|
@@ -273,7 +301,37 @@ trainer.train(1, train_dataset)
|
|
|
273
301
|
|
|
274
302
|
### 8.1 静态图场景
|
|
275
303
|
|
|
276
|
-
训练结束后,数据将保存在 `dump_path`
|
|
304
|
+
训练结束后,数据将保存在 `dump_path` 指定的目录下。
|
|
305
|
+
|
|
306
|
+
若jit_level=O2,且使用mindstudio-probe发布包或源码编包时添加了`--include-mod=adump`选项,目录结构示例如下:
|
|
307
|
+
```
|
|
308
|
+
├── dump_path
|
|
309
|
+
│ ├── rank_0
|
|
310
|
+
│ | ├── {timestamp}
|
|
311
|
+
│ | │ ├── step_0
|
|
312
|
+
| | | | ├── AssignAdd.Default_network-TrainOneStepCell_optimzer-Gsd_AssignAdd-op0.0.10.1735011096403740.input.0.ND.INT32.npy
|
|
313
|
+
| | | | ├── Cast.Default_network-TrainOneStepCell_network-WithLossCell__backbone-Net_Cast-op0.9.10.1735011096426349.input.0.ND.FLOAT.npy
|
|
314
|
+
| | | | ├── GetNext.Default_GetNext-op0.0.11.17350110964032987.output.0.ND.FLOAT.npy
|
|
315
|
+
| | | | ...
|
|
316
|
+
| | | | ├── RefDAata.accum_bias1.6.10.1735011096424907.output.0.ND.FLOAT.npy
|
|
317
|
+
| | | | ├── Sub.Default_network-TrainOneStepCell_network-WithLossCell__backbone-Net_Sub-op0.10.10.1735011096427368.input.0.ND.BF16
|
|
318
|
+
| | | | └── mapping.csv
|
|
319
|
+
│ | │ ├── step_1
|
|
320
|
+
| | | | ├── ...
|
|
321
|
+
| | | ├── ...
|
|
322
|
+
| | ├── ...
|
|
323
|
+
| |
|
|
324
|
+
│ ├── ...
|
|
325
|
+
| |
|
|
326
|
+
│ └── rank_7
|
|
327
|
+
│ ├── ...
|
|
328
|
+
```
|
|
329
|
+
**说明**
|
|
330
|
+
1. 若配置文件中指定落盘npy格式,但是实际数据格式不在npy支持范围内(如bf16、int4等),则该tensor会以原始码流落盘,并不会转换为npy格式。
|
|
331
|
+
2. 若原始文件全名长度超过255个字符,则文件基础名会被转换为长度为32位的随机数字字符串,原始文件名与转换后文件名的对应关系会保存在同目录下的`mapping.csv`文件中。
|
|
332
|
+
|
|
333
|
+
|
|
334
|
+
其他场景请参见 MindSpore 官方文档中的[数据对象目录](https://www.mindspore.cn/docs/zh-CN/r2.4.0/model_train/debug/dump.html)。
|
|
277
335
|
|
|
278
336
|
### 8.2 动态图场景
|
|
279
337
|
|
|
@@ -286,15 +344,18 @@ dump 结果目录结构示例如下:
|
|
|
286
344
|
│ | │ ├── dump_tensor_data
|
|
287
345
|
| | | | ├── MintFunctional.relu.0.backward.input.0.npy
|
|
288
346
|
| | | | ├── Mint.abs.0.forward.input.0.npy
|
|
289
|
-
| | | | ├── Functional.split.0.forward.input.0.npy
|
|
347
|
+
| | | | ├── Functional.split.0.forward.input.0.npy # 命名格式为{api_type}.{api_name}.{API调用次数}.{forward/backward}.{input/output}.{参数序号}, 其中,“参数序号”表示该API的第n个输入或输出,例如1,则为第一个参数,若该参数为list格式,则根据list继续排序,例如1.1,表示该API的第1个参数的第1个元素。
|
|
290
348
|
| | | | ├── Tensor.__add__.0.forward.output.0.npy
|
|
291
349
|
| | | | ...
|
|
292
350
|
| | | | ├── Jit.AlexNet.0.forward.input.0.npy
|
|
293
351
|
| | | | ├── Primitive.conv2d.Conv2D.0.forward.input.0.npy
|
|
294
|
-
| | | |
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
352
|
+
| | | | ├── Cell.conv1.Conv2D.forward.0.parameters.weight.npy # 模块参数数据:命名格式为{Cell}.{cell_name}.{class_name}.forward.{调用次数}.parameters.{parameter_name}。
|
|
353
|
+
| | | | ├── Cell.conv1.Conv2D.parameters_grad.weight.npy # 模块参数梯度数据:命名格式为{Cell}.{cell_name}.{class_name}.parameters_grad.{parameter_name}。因为同一模块的参数使用同一梯度进行更新,所以参数梯度文件名不包含调用次数。
|
|
354
|
+
| | | | └── Cell.relu.ReLU.forward.0.input.0.npy # 命名格式为{Cell}.{cell_name}.{class_name}.{forward/backward}.{调用次数}.{input/output}.{参数序号}, 其中,“参数序号”表示该Cell的第n个参数,例如1,则为第一个参数,若该参数为list格式,则根据list继续排序,例如1.1,表示该Cell的第1个参数的第1个元素。
|
|
355
|
+
| | | | # 当dump时传入的model参数为List[mindspore.nn.Cell]或Tuple[mindspore.nn.Cell]时,模块级数据的命名中包含该模块在列表中的索引index,命名格式为{Cell}.{index}.*,*表示以上三种模块级数据的命名格式,例如:Cell.0.relu.ReLU.forward.0.input.0.npy。
|
|
356
|
+
│ | | ├── dump.json
|
|
357
|
+
│ | | ├── stack.json
|
|
358
|
+
│ | | └── construct.json
|
|
298
359
|
│ | ├── rank1
|
|
299
360
|
| | | ├── dump_tensor_data
|
|
300
361
|
| | | | └── ...
|
|
@@ -311,9 +372,9 @@ dump 结果目录结构示例如下:
|
|
|
311
372
|
|
|
312
373
|
* `rank`:设备 ID,每张卡的数据保存在对应的 `rank{ID}` 目录下。非分布式场景下没有 rank ID,目录名称为 rank。
|
|
313
374
|
* `dump_tensor_data`:保存采集到的张量数据。
|
|
314
|
-
* `dump.json
|
|
315
|
-
* `stack.json`:API
|
|
316
|
-
* `construct.json
|
|
375
|
+
* `dump.json`: 保存API或Cell前反向数据的统计量信息。包含dump数据的API名称或Cell名称,各数据的dtype、 shape、max、min、mean、L2norm(L2范数,平方根)统计信息以及当配置summary_mode="md5"时的CRC-32数据。具体介绍可参考[dump.json文件说明](./27.dump_json_instruction.md#2-dumpjson文件示例mindspore)。
|
|
376
|
+
* `stack.json`:API/Cell的调用栈信息。
|
|
377
|
+
* `construct.json`:分层分级结构,level为L1时,construct.json内容为空。
|
|
317
378
|
|
|
318
379
|
dump 过程中,npy 文件在对应API或者模块被执行后就会落盘,而 json 文件则需要在正常执行 PrecisionDebugger.stop() 后才会写入完整数据,因此,程序异常终止时,被执行API对应的 npy 文件已被保存,但 json 文件中的数据可能丢失。
|
|
319
380
|
|
|
@@ -332,6 +393,7 @@ npy文件名的前缀含义如下:
|
|
|
332
393
|
| Primitive | mindspore.ops.Primitive API数据 |
|
|
333
394
|
| Mint | mindspore.mint API数据 |
|
|
334
395
|
| MintFunctional | mindspore.mint.nn.functional API数据 |
|
|
396
|
+
| Distributed | mindspore.communication.comm_func API数据 |
|
|
335
397
|
| Jit | 被"jit"装饰的模块或函数数据 |
|
|
336
398
|
| Cell | mindspore.nn.Cell 类(模块)数据 |
|
|
337
399
|
|
|
@@ -349,4 +411,3 @@ ops:
|
|
|
349
411
|
- adaptive_avg_pool2d
|
|
350
412
|
- adaptive_avg_pool3d
|
|
351
413
|
```
|
|
352
|
-
|