mindstudio-probe 1.3.0__py3-none-any.whl → 8.1.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.
- {mindstudio_probe-1.3.0.dist-info → mindstudio_probe-8.1.1.dist-info}/METADATA +4 -2
- {mindstudio_probe-1.3.0.dist-info → mindstudio_probe-8.1.1.dist-info}/RECORD +204 -152
- msprobe/README.md +32 -1
- msprobe/core/__init__.py +17 -0
- msprobe/core/common/const.py +120 -21
- msprobe/core/common/exceptions.py +2 -2
- msprobe/core/common/file_utils.py +279 -50
- msprobe/core/common/framework_adapter.py +169 -0
- msprobe/core/common/global_lock.py +86 -0
- msprobe/core/common/runtime.py +25 -0
- msprobe/core/common/utils.py +136 -45
- msprobe/core/common_config.py +7 -0
- msprobe/core/compare/acc_compare.py +646 -428
- msprobe/core/compare/check.py +36 -103
- msprobe/core/compare/compare_cli.py +4 -0
- msprobe/core/compare/config.py +72 -0
- msprobe/core/compare/highlight.py +215 -215
- msprobe/core/compare/layer_mapping/layer_mapping.py +2 -0
- msprobe/core/compare/merge_result/merge_result.py +4 -4
- msprobe/core/compare/multiprocessing_compute.py +223 -110
- msprobe/core/compare/npy_compare.py +2 -4
- msprobe/core/compare/utils.py +214 -244
- msprobe/core/config_check/__init__.py +17 -0
- msprobe/{pytorch/dump/kernel_dump/kernel_config.py → core/config_check/checkers/__init__.py} +8 -16
- msprobe/core/config_check/checkers/base_checker.py +60 -0
- msprobe/core/config_check/checkers/dataset_checker.py +138 -0
- msprobe/core/config_check/checkers/env_args_checker.py +96 -0
- msprobe/core/config_check/checkers/hyperparameter_checker.py +170 -0
- msprobe/core/config_check/checkers/pip_checker.py +90 -0
- msprobe/core/config_check/checkers/random_checker.py +367 -0
- msprobe/core/config_check/checkers/weights_checker.py +147 -0
- msprobe/core/config_check/ckpt_compare/ckpt_comparator.py +74 -0
- msprobe/core/config_check/ckpt_compare/megatron_loader.py +302 -0
- msprobe/core/config_check/ckpt_compare/metrics.py +83 -0
- msprobe/core/config_check/ckpt_compare/name_mapping.yaml +12 -0
- msprobe/core/config_check/config_check_cli.py +51 -0
- msprobe/core/config_check/config_checker.py +100 -0
- msprobe/{mindspore/runtime.py → core/config_check/resource/dependency.yaml} +7 -4
- msprobe/core/config_check/resource/env.yaml +57 -0
- msprobe/core/config_check/resource/hyperparameter.yaml +21 -0
- msprobe/core/config_check/utils/hyperparameter_parser.py +115 -0
- msprobe/core/config_check/utils/utils.py +107 -0
- msprobe/core/data_dump/api_registry.py +67 -4
- msprobe/core/data_dump/data_collector.py +170 -89
- msprobe/core/data_dump/data_processor/base.py +72 -51
- msprobe/core/data_dump/data_processor/mindspore_processor.py +109 -55
- msprobe/core/data_dump/data_processor/pytorch_processor.py +90 -82
- msprobe/core/data_dump/json_writer.py +143 -27
- msprobe/core/debugger/precision_debugger.py +144 -0
- msprobe/core/grad_probe/constant.py +1 -1
- msprobe/core/grad_probe/grad_compare.py +1 -1
- msprobe/core/grad_probe/utils.py +1 -1
- msprobe/core/hook_manager.py +242 -0
- msprobe/core/monitor/anomaly_processor.py +384 -0
- msprobe/core/service.py +357 -0
- msprobe/core/single_save/__init__.py +0 -0
- msprobe/core/single_save/single_comparator.py +243 -0
- msprobe/core/single_save/single_saver.py +146 -0
- msprobe/docs/01.installation.md +6 -5
- msprobe/docs/02.config_introduction.md +79 -22
- msprobe/docs/03.config_examples.md +1 -0
- msprobe/docs/04.kernel_dump_PyTorch.md +1 -1
- msprobe/docs/05.data_dump_PyTorch.md +118 -49
- msprobe/docs/06.data_dump_MindSpore.md +167 -20
- msprobe/docs/07.accuracy_checker_PyTorch.md +2 -2
- msprobe/docs/08.accuracy_checker_online_PyTorch.md +69 -9
- msprobe/docs/09.accuracy_checker_MindSpore.md +18 -6
- msprobe/docs/10.accuracy_compare_PyTorch.md +212 -74
- msprobe/docs/11.accuracy_compare_MindSpore.md +87 -37
- msprobe/docs/12.overflow_check_PyTorch.md +2 -2
- msprobe/docs/13.overflow_check_MindSpore.md +2 -2
- msprobe/docs/14.data_parse_PyTorch.md +3 -3
- msprobe/docs/17.grad_probe.md +2 -1
- msprobe/docs/18.online_dispatch.md +2 -2
- msprobe/docs/19.monitor.md +90 -44
- msprobe/docs/21.visualization_PyTorch.md +68 -15
- msprobe/docs/22.visualization_MindSpore.md +71 -18
- msprobe/docs/25.tool_function_introduction.md +23 -22
- msprobe/docs/26.data_dump_PyTorch_baseline.md +14 -3
- msprobe/docs/27.dump_json_instruction.md +1 -1
- msprobe/docs/28.debugger_save_instruction.md +111 -20
- msprobe/docs/29.data_dump_MSAdapter.md +2 -2
- msprobe/docs/30.overflow_check_MSAdapter.md +2 -2
- msprobe/docs/31.config_check.md +95 -0
- msprobe/docs/32.ckpt_compare.md +69 -0
- msprobe/docs/33.generate_operator_MindSpore.md +181 -0
- msprobe/docs/34.RL_collect.md +92 -0
- msprobe/docs/35.nan_analyze.md +72 -0
- msprobe/docs/data_dump_MindSpore/data_dump_MindSpore_baseline.md +12 -1
- msprobe/docs/data_dump_MindSpore/dynamic_graph_quick_start_example.md +3 -1
- msprobe/docs/img/compare_result.png +0 -0
- msprobe/docs/img/save_compare_result_sample.png +0 -0
- msprobe/docs/img/visualization/proxy.png +0 -0
- msprobe/mindspore/__init__.py +1 -2
- msprobe/mindspore/api_accuracy_checker/api_accuracy_checker.py +150 -58
- msprobe/mindspore/api_accuracy_checker/api_runner.py +7 -3
- msprobe/mindspore/api_accuracy_checker/bench_functions/flash_attention_score.py +47 -69
- msprobe/mindspore/api_accuracy_checker/cmd_parser.py +4 -0
- msprobe/mindspore/api_accuracy_checker/compute_element.py +0 -1
- msprobe/mindspore/api_accuracy_checker/data_manager.py +2 -2
- msprobe/mindspore/api_accuracy_checker/generate_op_script/op_generator.py +460 -0
- msprobe/mindspore/api_accuracy_checker/generate_op_script/operator_replication.template +2081 -0
- msprobe/mindspore/api_accuracy_checker/multi_api_accuracy_checker.py +9 -0
- msprobe/mindspore/api_accuracy_checker/torch_mindtorch_importer.py +2 -1
- msprobe/mindspore/cell_processor.py +204 -33
- msprobe/mindspore/code_mapping/graph_parser.py +4 -21
- msprobe/mindspore/common/const.py +17 -7
- msprobe/mindspore/common/utils.py +128 -11
- msprobe/mindspore/compare/common_dir_compare.py +382 -0
- msprobe/mindspore/compare/distributed_compare.py +2 -26
- msprobe/mindspore/compare/ms_compare.py +17 -405
- msprobe/mindspore/compare/ms_graph_compare.py +14 -5
- msprobe/mindspore/compare/utils.py +37 -0
- msprobe/mindspore/debugger/debugger_config.py +53 -3
- msprobe/mindspore/debugger/precision_debugger.py +72 -91
- msprobe/mindspore/dump/cell_dump_process.py +877 -0
- msprobe/mindspore/dump/cell_dump_with_insert_gradient.py +864 -0
- msprobe/mindspore/dump/dump_tool_factory.py +13 -5
- msprobe/mindspore/dump/graph_mode_cell_dump.py +139 -0
- msprobe/mindspore/dump/graph_tensor_dump.py +123 -0
- msprobe/mindspore/dump/hook_cell/api_register.py +40 -6
- msprobe/mindspore/dump/hook_cell/hook_cell.py +18 -7
- msprobe/mindspore/dump/hook_cell/ms_hook_manager.py +88 -0
- msprobe/mindspore/dump/hook_cell/primitive_hooks.py +8 -2
- msprobe/mindspore/dump/hook_cell/support_wrap_ops.yaml +18 -0
- msprobe/mindspore/dump/jit_dump.py +21 -18
- msprobe/mindspore/dump/kernel_kbyk_dump.py +6 -3
- msprobe/mindspore/dym_loader/hook_dynamic_loader.cpp +110 -0
- msprobe/mindspore/dym_loader/hook_dynamic_loader.h +15 -15
- msprobe/mindspore/free_benchmark/api_pynative_self_check.py +12 -6
- msprobe/mindspore/free_benchmark/common/utils.py +1 -1
- msprobe/mindspore/grad_probe/global_context.py +7 -2
- msprobe/mindspore/grad_probe/grad_stat_csv.py +3 -2
- msprobe/mindspore/mindspore_service.py +114 -0
- msprobe/mindspore/monitor/common_func.py +52 -0
- msprobe/mindspore/monitor/data_writers.py +237 -0
- msprobe/mindspore/monitor/features.py +20 -7
- msprobe/mindspore/monitor/module_hook.py +281 -209
- msprobe/mindspore/monitor/optimizer_collect.py +334 -0
- msprobe/mindspore/monitor/utils.py +25 -5
- msprobe/mindspore/ms_config.py +16 -15
- msprobe/mindspore/task_handler_factory.py +5 -2
- msprobe/msprobe.py +19 -0
- msprobe/nan_analyze/__init__.py +14 -0
- msprobe/nan_analyze/analyzer.py +255 -0
- msprobe/nan_analyze/graph.py +189 -0
- msprobe/nan_analyze/utils.py +211 -0
- msprobe/pytorch/api_accuracy_checker/common/config.py +2 -2
- msprobe/pytorch/api_accuracy_checker/compare/compare.py +36 -34
- msprobe/pytorch/api_accuracy_checker/compare/compare_utils.py +20 -20
- msprobe/pytorch/api_accuracy_checker/generate_op_script/op_generator.py +4 -7
- msprobe/pytorch/api_accuracy_checker/generate_op_script/operator_replication.template +204 -2
- msprobe/pytorch/api_accuracy_checker/run_ut/multi_run_ut.py +12 -11
- msprobe/pytorch/api_accuracy_checker/run_ut/run_overflow_check.py +1 -0
- msprobe/pytorch/api_accuracy_checker/run_ut/run_ut.py +8 -5
- msprobe/pytorch/api_accuracy_checker/run_ut/run_ut_utils.py +2 -3
- msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/client.py +29 -13
- msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/device_dispatch.py +12 -2
- msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/server.py +45 -31
- msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/utils.py +156 -0
- msprobe/pytorch/attl_manager.py +65 -0
- msprobe/pytorch/bench_functions/npu_fusion_attention.py +27 -0
- msprobe/pytorch/common/utils.py +26 -14
- msprobe/pytorch/compare/distributed_compare.py +4 -36
- msprobe/pytorch/compare/pt_compare.py +13 -84
- msprobe/pytorch/compare/utils.py +47 -0
- msprobe/pytorch/debugger/debugger_config.py +34 -17
- msprobe/pytorch/debugger/precision_debugger.py +66 -118
- msprobe/pytorch/dump/module_dump/hook_wrapper.py +93 -0
- msprobe/pytorch/dump/module_dump/module_dump.py +11 -58
- msprobe/pytorch/dump/module_dump/module_processer.py +143 -113
- msprobe/pytorch/grad_probe/grad_stat_csv.py +3 -2
- msprobe/pytorch/hook_module/api_register.py +29 -5
- msprobe/pytorch/hook_module/hook_module.py +9 -18
- msprobe/pytorch/hook_module/jit_script_wrapper.py +33 -0
- msprobe/pytorch/hook_module/pt_hook_manager.py +68 -0
- msprobe/pytorch/hook_module/support_wrap_ops.yaml +22 -1
- msprobe/pytorch/hook_module/utils.py +28 -2
- msprobe/pytorch/monitor/csv2tb.py +6 -2
- msprobe/pytorch/monitor/data_writers.py +259 -0
- msprobe/pytorch/monitor/module_hook.py +227 -158
- msprobe/pytorch/monitor/module_metric.py +14 -0
- msprobe/pytorch/monitor/optimizer_collect.py +242 -270
- msprobe/pytorch/monitor/utils.py +16 -3
- msprobe/pytorch/online_dispatch/dispatch.py +4 -2
- msprobe/pytorch/online_dispatch/dump_compare.py +5 -2
- msprobe/pytorch/parse_tool/lib/utils.py +3 -3
- msprobe/pytorch/pt_config.py +8 -7
- msprobe/pytorch/pytorch_service.py +73 -0
- msprobe/visualization/builder/graph_builder.py +33 -13
- msprobe/visualization/builder/msprobe_adapter.py +24 -11
- msprobe/visualization/compare/graph_comparator.py +53 -45
- msprobe/visualization/compare/mode_adapter.py +31 -1
- msprobe/visualization/graph/base_node.py +3 -3
- msprobe/visualization/graph/graph.py +2 -2
- msprobe/visualization/graph_service.py +250 -103
- msprobe/visualization/utils.py +27 -11
- msprobe/mindspore/dym_loader/hook_dynamic_loader.cc +0 -106
- msprobe/mindspore/monitor/anomaly_detect.py +0 -404
- msprobe/mindspore/monitor/module_spec_verifier.py +0 -94
- msprobe/mindspore/service.py +0 -549
- msprobe/pytorch/monitor/anomaly_analyse.py +0 -201
- msprobe/pytorch/monitor/anomaly_detect.py +0 -410
- msprobe/pytorch/monitor/module_spec_verifier.py +0 -95
- msprobe/pytorch/monitor/unittest/test_monitor.py +0 -160
- msprobe/pytorch/service.py +0 -473
- {mindstudio_probe-1.3.0.dist-info → mindstudio_probe-8.1.1.dist-info}/LICENSE +0 -0
- {mindstudio_probe-1.3.0.dist-info → mindstudio_probe-8.1.1.dist-info}/WHEEL +0 -0
- {mindstudio_probe-1.3.0.dist-info → mindstudio_probe-8.1.1.dist-info}/entry_points.txt +0 -0
- {mindstudio_probe-1.3.0.dist-info → mindstudio_probe-8.1.1.dist-info}/top_level.txt +0 -0
- /msprobe/{mindspore → core}/compare/ms_to_pt_api.yaml +0 -0
- /msprobe/{mindspore/dump → core}/kernel_dump/kernel_config.py +0 -0
- /msprobe/{pytorch/monitor/unittest → core/monitor}/__init__.py +0 -0
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
msprobe 工具主要通过在训练脚本内添加 dump 接口、启动训练的方式采集精度数据。
|
|
4
4
|
|
|
5
|
-
dump
|
|
5
|
+
dump "statistics"模式的性能膨胀大小"与"tensor"模式采集的数据量大小,可以参考[dump基线](./26.data_dump_PyTorch_baseline.md)。
|
|
6
6
|
|
|
7
7
|
本工具提供固定的 API 支持列表,若需要删除或增加 dump 的 API,可以在 msprobe/pytorch/hook_module/support_wrap_ops.yaml 文件内手动修改,如下示例:
|
|
8
8
|
|
|
@@ -15,6 +15,52 @@ functional: # functional为算子类别,找到对应的类别,在该类别
|
|
|
15
15
|
|
|
16
16
|
删除API的场景:部分模型代码逻辑会存在API原生类型校验,工具执行dump操作时,对模型的API封装可能与模型的原生API类型不一致,此时可能引发校验失败,详见《[FAQ](FAQ.md)》中“异常情况”的第10和11条。
|
|
17
17
|
|
|
18
|
+
## 快速上手
|
|
19
|
+
|
|
20
|
+
这个示例定义了一个 nn.Module 类型的简单网络,使用原型函数 PrecisionDebugger 进行数据采集。
|
|
21
|
+
|
|
22
|
+
```python
|
|
23
|
+
# 根据需要import包
|
|
24
|
+
import torch
|
|
25
|
+
import torch.nn as nn
|
|
26
|
+
import torch.nn.functional as F
|
|
27
|
+
|
|
28
|
+
# 导入工具的数据采集接口
|
|
29
|
+
from msprobe.pytorch import PrecisionDebugger, seed_all
|
|
30
|
+
|
|
31
|
+
# 在模型训练开始前固定随机性
|
|
32
|
+
seed_all()
|
|
33
|
+
|
|
34
|
+
# 在模型训练开始前实例化PrecisionDebugger
|
|
35
|
+
debugger = PrecisionDebugger()
|
|
36
|
+
|
|
37
|
+
# 定义网络
|
|
38
|
+
class ModuleOP(nn.Module):
|
|
39
|
+
def __init__(self) -> None:
|
|
40
|
+
super().__init__()
|
|
41
|
+
self.linear_1 = nn.Linear(in_features=8, out_features=4)
|
|
42
|
+
self.linear_2 = nn.Linear(in_features=4, out_features=2)
|
|
43
|
+
|
|
44
|
+
def forward(self, x):
|
|
45
|
+
x1 = self.linear_1(x)
|
|
46
|
+
x2 = self.linear_2(x1)
|
|
47
|
+
r1 = F.relu(x2)
|
|
48
|
+
return r1
|
|
49
|
+
|
|
50
|
+
if __name__ == "__main__":
|
|
51
|
+
module = ModuleOP()
|
|
52
|
+
|
|
53
|
+
# 开启数据 dump
|
|
54
|
+
debugger.start(model=module)
|
|
55
|
+
x = torch.randn(10, 8)
|
|
56
|
+
out = module(x)
|
|
57
|
+
loss = out.sum()
|
|
58
|
+
loss.backward()
|
|
59
|
+
|
|
60
|
+
# 关闭数据 dump
|
|
61
|
+
debugger.stop()
|
|
62
|
+
```
|
|
63
|
+
|
|
18
64
|
## 1 接口介绍
|
|
19
65
|
|
|
20
66
|
### 1.1 PrecisionDebugger
|
|
@@ -30,9 +76,9 @@ PrecisionDebugger(config_path=None, task=None, dump_path=None, level=None, model
|
|
|
30
76
|
1. config_path:指定 dump 配置文件路径;
|
|
31
77
|
2. model:指定需要采集 Module 级数据的模型,支持传入 torch.nn.Module 或 list[torch.nn.Module] 类型,默认未配置。
|
|
32
78
|
level 配置为"L0"或"mix"时,必须在该接口或 **start** 接口中配置该参数。该参数在将来会从该接口移除,建议在 **start** 接口中配置该参数。
|
|
33
|
-
3. 其他参数均在
|
|
79
|
+
3. 其他参数均在 config.json 文件中可配,详细配置可见 [config.json 介绍](./02.config_introduction.md)。
|
|
34
80
|
|
|
35
|
-
|
|
81
|
+
此接口的参数均不是必要(均不配置的情况下默认采集所有 rank 和 step 的 L1 级别的统计数据),且优先级高于 config.json 文件中的配置,但可配置的参数相比 config.json 较少。
|
|
36
82
|
|
|
37
83
|
注:此接口的初始化需与采集目标在同一个进程中,否则将无法采集目标数据。
|
|
38
84
|
|
|
@@ -43,12 +89,15 @@ level 配置为"L0"或"mix"时,必须在该接口或 **start** 接口中配置
|
|
|
43
89
|
**原型**:
|
|
44
90
|
|
|
45
91
|
```Python
|
|
46
|
-
debugger.start(model=None)
|
|
92
|
+
debugger.start(model=None, token_range=None)
|
|
47
93
|
```
|
|
48
94
|
|
|
49
95
|
1. model:指定需要采集 Module 级数据的模型,支持传入 torch.nn.Module、list[torch.nn.Module]或Tuple[torch.nn.Module] 类型,默认未配置。
|
|
50
|
-
level 配置为"L0"
|
|
96
|
+
level 配置为"L0"|"mix"或token_range不为None时,必须在该接口或 **PrecisionDebugger** 接口中配置该参数。
|
|
51
97
|
本接口中的 model 比 PrecisionDebugger 中 model 参数优先级更高,会覆盖 PrecisionDebugger 中的 model 参数。
|
|
98
|
+
<br>对于复杂模型,如果仅需要监控一部分(如model.A,model.A extends torch.nn.Module),传入需要监控的部分(如model.A)即可。
|
|
99
|
+
注意:传入的当前层不会被dump,工具只会dump传入层的子层级。如传入了model.A,A本身不会被dump,而是会dump A.x, A.x.xx等。
|
|
100
|
+
2. token_range:指定推理模型采集时的token循环始末范围,支持传入[int, int]类型,代表[start, end],范围包含边界,默认未配置。
|
|
52
101
|
|
|
53
102
|
### 1.3 stop
|
|
54
103
|
|
|
@@ -203,55 +252,47 @@ debugger.set_init_step(step)
|
|
|
203
252
|
|
|
204
253
|
1.step: 指定的起始step数。
|
|
205
254
|
|
|
255
|
+
### 1.11 register_custom_api
|
|
206
256
|
|
|
207
|
-
|
|
257
|
+
**功能说明**:注册用户自定义的api到工具用于 L1 dump 。
|
|
208
258
|
|
|
209
|
-
|
|
259
|
+
**原型**:
|
|
210
260
|
|
|
211
|
-
|
|
261
|
+
```Python
|
|
262
|
+
debugger.register_custom_api(module, api_name, api_prefix)
|
|
263
|
+
```
|
|
264
|
+
**参数说明**:
|
|
212
265
|
|
|
213
|
-
|
|
214
|
-
# 根据需要import包
|
|
215
|
-
import torch
|
|
216
|
-
import torch.nn as nn
|
|
217
|
-
import torch.nn.functional as F
|
|
266
|
+
以 torch.matmul api 为例
|
|
218
267
|
|
|
219
|
-
|
|
220
|
-
from msprobe.pytorch import PrecisionDebugger, seed_all
|
|
268
|
+
1.module: api 所属的包,即传入 torch。
|
|
221
269
|
|
|
222
|
-
|
|
223
|
-
seed_all()
|
|
224
|
-
# 在模型训练开始前实例化PrecisionDebugger
|
|
225
|
-
debugger = PrecisionDebugger(config_path='./config.json')
|
|
270
|
+
2.api_name: api 名,string类型,即传入 "matmul"。
|
|
226
271
|
|
|
227
|
-
|
|
228
|
-
class ModuleOP(nn.Module):
|
|
229
|
-
def __init__(self) -> None:
|
|
230
|
-
super().__init__()
|
|
231
|
-
self.linear_1 = nn.Linear(in_features=8, out_features=4)
|
|
232
|
-
self.linear_2 = nn.Linear(in_features=4, out_features=2)
|
|
272
|
+
3.api_prefix: [dump.json](./27.dump_json_instruction.md) 中 api 名的前缀,可选,默认为包名的字符串格式, 即 "torch"。
|
|
233
273
|
|
|
234
|
-
|
|
235
|
-
x1 = self.linear_1(x)
|
|
236
|
-
x2 = self.linear_2(x1)
|
|
237
|
-
r1 = F.relu(x2)
|
|
238
|
-
return r1
|
|
274
|
+
### 1.12 restore_custom_api
|
|
239
275
|
|
|
240
|
-
|
|
241
|
-
module = ModuleOP()
|
|
242
|
-
# 开启数据 dump
|
|
243
|
-
debugger.start(model=module)
|
|
276
|
+
**功能说明**:恢复用户原有的自定义的api,取消 dump 。
|
|
244
277
|
|
|
245
|
-
|
|
246
|
-
out = module(x)
|
|
247
|
-
loss = out.sum()
|
|
248
|
-
loss.backward()
|
|
278
|
+
**原型**:
|
|
249
279
|
|
|
250
|
-
|
|
251
|
-
|
|
280
|
+
```Python
|
|
281
|
+
debugger.restore_custom_api(module, api_name)
|
|
252
282
|
```
|
|
283
|
+
**参数说明**:
|
|
284
|
+
|
|
285
|
+
以 torch.matmul api 为例
|
|
286
|
+
|
|
287
|
+
1.module: api 所属的包,即传入 torch。
|
|
288
|
+
|
|
289
|
+
2.api_name: api 名,string类型,即传入 "matmul"。
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
## 2 示例代码
|
|
293
|
+
|
|
253
294
|
|
|
254
|
-
### 2.
|
|
295
|
+
### 2.1 采集完整的前反向数据
|
|
255
296
|
|
|
256
297
|
```Python
|
|
257
298
|
from msprobe.pytorch import PrecisionDebugger, seed_all
|
|
@@ -272,7 +313,7 @@ for data, label in data_loader:
|
|
|
272
313
|
debugger.step() # 结束一个step的dump
|
|
273
314
|
```
|
|
274
315
|
|
|
275
|
-
### 2.
|
|
316
|
+
### 2.2 采集指定代码块的前反向数据
|
|
276
317
|
|
|
277
318
|
```Python
|
|
278
319
|
from msprobe.pytorch import PrecisionDebugger, seed_all
|
|
@@ -296,7 +337,7 @@ for data, label in data_loader:
|
|
|
296
337
|
debugger.step() # 结束一个step的dump
|
|
297
338
|
```
|
|
298
339
|
|
|
299
|
-
### 2.
|
|
340
|
+
### 2.3 采集函数模块化数据
|
|
300
341
|
|
|
301
342
|
```Python
|
|
302
343
|
# 根据需要import包
|
|
@@ -338,7 +379,7 @@ if __name__ == "__main__":
|
|
|
338
379
|
debugger.stop()
|
|
339
380
|
```
|
|
340
381
|
|
|
341
|
-
### 2.
|
|
382
|
+
### 2.4 跨文件采集数据
|
|
342
383
|
为了确保所有API都被工具封装,PrecisionDebugger的实例化通常放在训练工程的入口位置,但有的时候,模型定义会在另一个文件中。 假设有两个文件,train.py(为训练工程入口)module.py(为模型定义文件),为了采集module.py中定义的ModuleOP模块中某些子模块或API的前反向数据,需要在train.py和module.py文件中分别导入PrecisionDebugger并进行如下配置。
|
|
343
384
|
|
|
344
385
|
train.py文件:
|
|
@@ -389,6 +430,29 @@ class ModuleOP(nn.Module):
|
|
|
389
430
|
|
|
390
431
|
```
|
|
391
432
|
|
|
433
|
+
### 2.5 推理模型采集指定token_range
|
|
434
|
+
|
|
435
|
+
```Python
|
|
436
|
+
from vllm import LLM, SamplingParams
|
|
437
|
+
from msprobe.pytorch import PrecisionDebugger, seed_all
|
|
438
|
+
# 在模型训练开始前固定随机性
|
|
439
|
+
seed_all()
|
|
440
|
+
# 请勿将PrecisionDebugger的初始化流程插入到循环代码中
|
|
441
|
+
debugger = PrecisionDebugger(config_path="./config.json", dump_path="./dump_path")
|
|
442
|
+
# 模型定义及初始化等操作
|
|
443
|
+
prompts = ["Hello, my name is"]
|
|
444
|
+
sampling_params = SamplingParams(temprature=0.8, top_p=0.95)
|
|
445
|
+
llm = LLM(model='...')
|
|
446
|
+
model = llm.llm_engine.model_executor.driver_worker.worker.model_runner.get_model()
|
|
447
|
+
# 开启数据dump, 指定采集推理模型逐字符循环推理中的第1~3次
|
|
448
|
+
debugger.start(model=model, token_range=[1,3])
|
|
449
|
+
# 推理模型生成的逻辑
|
|
450
|
+
output = llm.generate(prompts, sampling_params=sampling_params)
|
|
451
|
+
# 关闭数据dump并落盘
|
|
452
|
+
debugger.stop()
|
|
453
|
+
debugger.step()
|
|
454
|
+
```
|
|
455
|
+
|
|
392
456
|
## 3 dump 结果文件介绍
|
|
393
457
|
|
|
394
458
|
训练结束后,工具将 dump 的数据保存在 dump_path 参数指定的目录下。目录结构示例如下:
|
|
@@ -402,17 +466,19 @@ class ModuleOP(nn.Module):
|
|
|
402
466
|
| | | | ├── 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个元素。
|
|
403
467
|
| | | | ...
|
|
404
468
|
| | | | ├── 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个元素。
|
|
405
|
-
| | | | ├── Module.conv1.
|
|
406
|
-
| | | | └── Module.conv1.
|
|
469
|
+
| | | | ├── Module.conv1.Conv2d.forward.0.parameters.bias.pt # 模块参数数据:命名格式为{Module}.{module_name}.{class_name}.forward.{调用次数}.parameters.{parameter_name}。
|
|
470
|
+
| | | | └── Module.conv1.Conv2d.parameters_grad.weight.pt # 模块参数梯度数据:命名格式为{Module}.{module_name}.{class_name}.parameters_grad.{parameter_name}。因为同一模块的参数使用同一梯度进行更新,所以参数梯度文件名不包含调用次数。
|
|
407
471
|
| | | | # 当dump时传入的model参数为List[torch.nn.Module]或Tuple[torch.nn.Module]时,模块级数据的命名中包含该模块在列表中的索引index,命名格式为{Module}.{index}.*,*表示以上三种模块级数据的命名格式,例如:Module.0.conv1.Conv2d.forward.0.input.0.pt。
|
|
408
472
|
│ | | ├── dump.json
|
|
409
473
|
│ | | ├── stack.json
|
|
474
|
+
│ | | ├── dump_error_info.log
|
|
410
475
|
│ | | └── construct.json
|
|
411
476
|
│ | ├── rank1
|
|
412
477
|
| | | ├── dump_tensor_data
|
|
413
478
|
| | | | └── ...
|
|
414
479
|
│ | | ├── dump.json
|
|
415
480
|
│ | | ├── stack.json
|
|
481
|
+
│ | | ├── dump_error_info.log
|
|
416
482
|
| | | └── construct.json
|
|
417
483
|
│ | ├── ...
|
|
418
484
|
│ | |
|
|
@@ -424,6 +490,7 @@ class ModuleOP(nn.Module):
|
|
|
424
490
|
* `rank`:设备 ID,每张卡的数据保存在对应的 `rank{ID}` 目录下。非分布式场景下没有 rank ID,目录名称为 rank。
|
|
425
491
|
* `dump_tensor_data`:保存采集到的张量数据。
|
|
426
492
|
* `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-PyTorch场景下的dump.json文件)。
|
|
493
|
+
* `dump_error_info.log`: 仅在dump工具报错时拥有此记录日志,用于记录dump错误日志。
|
|
427
494
|
* `stack.json`:API/Module的调用栈信息。
|
|
428
495
|
* `construct.json`:分层分级结构,level为L1时,construct.json内容为空。
|
|
429
496
|
|
|
@@ -434,12 +501,14 @@ dump 过程中,pt 文件在对应算子或者模块被执行后就会落盘,
|
|
|
434
501
|
|
|
435
502
|
pt 文件保存的前缀和 PyTorch 对应关系如下:
|
|
436
503
|
|
|
437
|
-
| 前缀
|
|
438
|
-
|
|
504
|
+
| 前缀 | Torch模块 |
|
|
505
|
+
|-------------|---------------------|
|
|
439
506
|
| Tensor | torch.Tensor |
|
|
440
507
|
| Torch | torch |
|
|
441
508
|
| Functional | torch.nn.functional |
|
|
442
|
-
| NPU | NPU 亲和算子
|
|
509
|
+
| NPU | NPU 亲和算子 |
|
|
443
510
|
| VF | torch._VF |
|
|
444
511
|
| Aten | torch.ops.aten |
|
|
445
512
|
| Distributed | torch.distributed |
|
|
513
|
+
| MindSpeed | mindspeed.ops |
|
|
514
|
+
|
|
@@ -26,18 +26,20 @@
|
|
|
26
26
|
|
|
27
27
|
msprobe 工具通过在训练脚本中添加 `PrecisionDebugger` 接口并启动训练的方式,采集模型在运行过程中的精度数据。该工具支持对MindSpore的静态图和动态图场景进行不同Level等级的精度数据采集。
|
|
28
28
|
|
|
29
|
-
dump
|
|
29
|
+
dump "statistics"模式的性能膨胀大小"与"tensor"模式采集的数据量大小,可以参考[dump基线](data_dump_MindSpore/data_dump_MindSpore_baseline.md)。
|
|
30
30
|
|
|
31
31
|
## 5. 场景介绍
|
|
32
32
|
|
|
33
33
|
### 5.1 静态图场景
|
|
34
|
-
在静态图场景下,msprobe
|
|
34
|
+
在静态图场景下,msprobe 支持 **L0 Level** 和 **L2 Level** 的数据采集。且当 MindSpore 版本高于 2.5.0 时,若需采集 **L2 Level** 数据,必须使用编包时添加了`--include-mod=adump`选项的 mindstudio-probe whl 包进行 msprobe 工具安装。
|
|
35
|
+
- **L0 Level(Cell 级)** :采集 `Cell` 对象的数据,适用于需要分析特定网络模块的情况。仅支持 2.7.0 及以上版本的 MindSpore 框架。
|
|
36
|
+
|
|
35
37
|
- **L2 Level(Kernel 级)** :采集底层算子的输入输出数据,适用于深入分析算子级别的精度问题。
|
|
36
38
|
|
|
37
39
|
采集方式请参见[示例代码 > 静态图场景](#71-静态图场景)。详细介绍请参见[《config.json 配置文件介绍》](./02.config_introduction.md#11-通用配置)中的“level 参数”和[《config.json 配置示例》](./03.config_examples.md#2-mindspore-静态图场景) 中的“MindSpore 静态图场景”。
|
|
38
40
|
|
|
39
41
|
### 5.2 动态图场景
|
|
40
|
-
在动态图场景下,msprobe 支持 **L0** 、**L1** 、**mix** 、**L2
|
|
42
|
+
在动态图场景下,msprobe 支持 **L0** 、**L1** 、**mix** 、**L2**、 **debug** 的数据采集,具体分为以下几种情况:
|
|
41
43
|
- **使用高阶 API(如 `Model 高阶API`)** :
|
|
42
44
|
- 需要使用 `MsprobeStep` 回调类来控制数据采集的启停,适用于 **L0** 、**L1** 、**mix** 、**L2** 数据采集。
|
|
43
45
|
|
|
@@ -46,7 +48,7 @@ dump 的"tensor"模式采集数据量大小,可以参考[数据量基线](data
|
|
|
46
48
|
|
|
47
49
|
采集方式请参见[示例代码 > 动态图场景](#72-动态图场景)。
|
|
48
50
|
|
|
49
|
-
> **注意** :动态图模式下,使用 `
|
|
51
|
+
> **注意** :动态图模式下,使用 `mindspore.jit` 装饰的部分实际以静态图模式执行,此时的 **Kernel 级(L2 Level)** 数据采集方式与静态图场景相同。
|
|
50
52
|
- **L0 Level(Cell 级)** :采集 `Cell` 对象的数据,适用于需要分析特定网络模块的情况。
|
|
51
53
|
|
|
52
54
|
- **L1 Level(API 级)** :采集 MindSpore API 的输入输出数据,适用于定位 API 层面的精度问题。
|
|
@@ -56,7 +58,7 @@ dump 的"tensor"模式采集数据量大小,可以参考[数据量基线](data
|
|
|
56
58
|
- **debug level (单点保存)**:单点保存网络中变量的正反向数据,适用于用户熟悉网络结构的场景。
|
|
57
59
|
|
|
58
60
|
|
|
59
|
-
详细介绍请参见[《config.json 配置文件介绍》](./02.config_introduction.md#11-通用配置)中的“level
|
|
61
|
+
详细介绍请参见[《config.json 配置文件介绍》](./02.config_introduction.md#11-通用配置)中的“level 参数”。
|
|
60
62
|
|
|
61
63
|
|
|
62
64
|
## 6 接口介绍
|
|
@@ -85,12 +87,15 @@ PrecisionDebugger(config_path=None, task=None, dump_path=None, level=None, step=
|
|
|
85
87
|
**原型**:
|
|
86
88
|
|
|
87
89
|
```Python
|
|
88
|
-
start(model=None)
|
|
90
|
+
start(model=None, token_range=None)
|
|
89
91
|
```
|
|
90
92
|
|
|
91
93
|
**参数说明**:
|
|
92
94
|
|
|
93
|
-
1. model:指定需要采集数据的实例化模型,支持传入mindspore.nn.Cell、List[mindspore.nn.Cell]或Tuple[mindspore.nn.Cell]
|
|
95
|
+
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 数据。token_range不为None时,必须传入model参数。
|
|
96
|
+
<br>对于复杂模型,如果仅需要监控一部分(如model.A,model.A extends mindspore.nn.Cell),传入需要监控的部分(如model.A)即可。
|
|
97
|
+
注意:传入的当前层不会被dump,工具只会dump传入层的子层级。如传入了model.A,A本身不会被dump,而是会dump A.x, A.x.xx等。
|
|
98
|
+
2. token_range:指定推理模型采集时的token循环始末范围,支持传入[int, int]类型,代表[start, end],范围包含边界,默认未配置。
|
|
94
99
|
|
|
95
100
|
#### 6.1.2 stop
|
|
96
101
|
|
|
@@ -110,7 +115,7 @@ stop()
|
|
|
110
115
|
|
|
111
116
|
**功能说明**:结束一个 step 的数据采集,完成所有数据落盘并更新 dump 参数。在一个 step 结束的位置添加,且必须在 **stop** 函数之后的位置调用。
|
|
112
117
|
该函数需要配合 **start** 和 **stop** 函数使用,尽量添加在反向计算代码之后,否则可能会导致反向数据丢失。
|
|
113
|
-
**仅未使用 Model 高阶 API
|
|
118
|
+
**仅未使用 Model 高阶 API 的动态图和静态图场景支持。**
|
|
114
119
|
|
|
115
120
|
**原型**:
|
|
116
121
|
|
|
@@ -151,7 +156,7 @@ save(variable, name, save_backward=True)
|
|
|
151
156
|
|
|
152
157
|
#### 6.1.6 set_init_step
|
|
153
158
|
|
|
154
|
-
**功能说明**:设置起始step数,step数默认从0开始计数,使用该接口后step
|
|
159
|
+
**功能说明**:设置起始step数,step数默认从0开始计数,使用该接口后step从指定值开始计数。该函数需要写在训练迭代的循环开始前,不能写在循环内。
|
|
155
160
|
|
|
156
161
|
**原型**:
|
|
157
162
|
|
|
@@ -164,9 +169,46 @@ set_init_step(step)
|
|
|
164
169
|
1.step: 指定的起始step数。
|
|
165
170
|
|
|
166
171
|
|
|
172
|
+
#### 6.1.7 register_custom_api
|
|
173
|
+
|
|
174
|
+
**功能说明**:注册用户自定义的api到工具,用于 L1 dump 。
|
|
175
|
+
|
|
176
|
+
**原型**:
|
|
177
|
+
|
|
178
|
+
```Python
|
|
179
|
+
debugger.register_custom_api(module, api_name, api_prefix)
|
|
180
|
+
```
|
|
181
|
+
**参数说明**:
|
|
182
|
+
|
|
183
|
+
以 torch.matmul api 为例
|
|
184
|
+
|
|
185
|
+
1.module: api 所属的包,即传入 torch。
|
|
186
|
+
|
|
187
|
+
2.api_name: api 名,string类型,即传入 "matmul"。
|
|
188
|
+
|
|
189
|
+
3.api_prefix: [dump.json](./27.dump_json_instruction.md) 中 api 名的前缀,可选,默认为包名的字符串格式, 即 "torch"。
|
|
190
|
+
|
|
191
|
+
#### 6.1.8 restore_custom_api
|
|
192
|
+
|
|
193
|
+
**功能说明**:恢复用户原有的自定义的api,取消 dump 。
|
|
194
|
+
|
|
195
|
+
**原型**:
|
|
196
|
+
|
|
197
|
+
```Python
|
|
198
|
+
debugger.restore_custom_api(module, api_name)
|
|
199
|
+
```
|
|
200
|
+
**参数说明**:
|
|
201
|
+
|
|
202
|
+
以 torch.matmul api 为例
|
|
203
|
+
|
|
204
|
+
1.module: api 所属的包,即传入 torch。
|
|
205
|
+
|
|
206
|
+
2.api_name: api 名,string类型,即传入 "matmul"。
|
|
207
|
+
|
|
208
|
+
|
|
167
209
|
### 6.2 msprobe.mindspore.MsprobeStep
|
|
168
210
|
|
|
169
|
-
**功能说明**:MindSpore Callback类,自动在每个step开始时调用start()接口,在每个step结束时调用stop()、step()接口。实现使用 Model 高阶 API 的动态图场景下 L0、L1、mix 级别的精度数据采集控制,控制粒度为单个 **Step** ,而 PrecisionDebugger.start, PrecisionDebugger.stop
|
|
211
|
+
**功能说明**:MindSpore Callback类,自动在每个step开始时调用start()接口,在每个step结束时调用stop()、step()接口。实现使用 Model 高阶 API 的动态图场景下 L0、L1、mix 级别,和静态图场景下 L0级别的精度数据采集控制,控制粒度为单个 **Step** ,而 PrecisionDebugger.start, PrecisionDebugger.stop 接口的控制粒度为任意训练代码段。
|
|
170
212
|
|
|
171
213
|
**原型**:
|
|
172
214
|
|
|
@@ -209,6 +251,56 @@ seed_all(seed=1234, mode=False, rm_dropout=True)
|
|
|
209
251
|
|
|
210
252
|
### 7.1 静态图场景
|
|
211
253
|
|
|
254
|
+
#### 7.1.1 L0 级别
|
|
255
|
+
|
|
256
|
+
**说明**: 静态图 L0 级别的Dump功能是基于mindspore.ops.TensorDump算子实现。在Ascend平台上的Graph模式下,可以通过设置环境变量 [MS_DUMP_SLICE_SIZE 和 MS_DUMP_WAIT_TIME](https://www.mindspore.cn/docs/zh-CN/r2.5.0/api_python/env_var_list.html) 解决在输出大Tesnor或输出Tensor比较密集场景下算子执行失败的问题。
|
|
257
|
+
|
|
258
|
+
##### 7.1.1.1 未使用 Model 高阶 API
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
```python
|
|
262
|
+
import mindspore as ms
|
|
263
|
+
ms.set_context(mode=ms.GRAPH_MODE, device_target="Ascend")
|
|
264
|
+
|
|
265
|
+
from msprobe.mindspore import PrecisionDebugger
|
|
266
|
+
debugger = PrecisionDebugger(config_path="./config.json")
|
|
267
|
+
|
|
268
|
+
# 模型、损失函数的定义以及初始化等操作
|
|
269
|
+
# ...
|
|
270
|
+
model = Network()
|
|
271
|
+
# 数据集迭代的地方往往是模型开始训练的地方
|
|
272
|
+
for data, label in data_loader:
|
|
273
|
+
debugger.start(model) # 进行 L0 级别下Cell 对象的数据采集时调用
|
|
274
|
+
# 如下是模型每个 step 执行的逻辑
|
|
275
|
+
grad_net = ms.grad(model)(data)
|
|
276
|
+
# ...
|
|
277
|
+
debugger.step() # 更新迭代数
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
##### 7.1.1.2 使用 Model 高阶 API
|
|
281
|
+
|
|
282
|
+
|
|
283
|
+
```python
|
|
284
|
+
import mindspore as ms
|
|
285
|
+
from mindspore.train import Model
|
|
286
|
+
ms.set_context(mode=ms.GRAPH_MODE, device_target="Ascend")
|
|
287
|
+
|
|
288
|
+
from msprobe.mindspore import PrecisionDebugger
|
|
289
|
+
from msprobe.mindspore.common.utils import MsprobeStep
|
|
290
|
+
debugger = PrecisionDebugger(config_path="./config.json")
|
|
291
|
+
|
|
292
|
+
# 模型、损失函数的定义以及初始化等操作
|
|
293
|
+
# ...
|
|
294
|
+
|
|
295
|
+
model = Network()
|
|
296
|
+
# 进行 L0 级别下 Cell 对象的数据采集时调用
|
|
297
|
+
debugger.start(model)
|
|
298
|
+
trainer = Model(model, loss_fn=loss_fn, optimizer=optimizer, metrics={'accuracy'})
|
|
299
|
+
trainer.train(1, train_dataset, callbacks=[MsprobeStep(debugger)])
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
#### 7.1.2 L2 级别
|
|
303
|
+
|
|
212
304
|
```python
|
|
213
305
|
import mindspore as ms
|
|
214
306
|
ms.set_context(mode=ms.GRAPH_MODE, device_target="Ascend")
|
|
@@ -219,7 +311,8 @@ debugger.start()
|
|
|
219
311
|
# 请勿将以上初始化流程置于模型实例化或 mindspore.communication.init 调用后
|
|
220
312
|
# 模型定义和训练代码
|
|
221
313
|
# ...
|
|
222
|
-
|
|
314
|
+
debugger.stop()
|
|
315
|
+
debugger.step()
|
|
223
316
|
```
|
|
224
317
|
|
|
225
318
|
### 7.2 动态图场景
|
|
@@ -318,11 +411,38 @@ trainer = Model(model, loss_fn=loss_fn, optimizer=optimizer, metrics={'accuracy'
|
|
|
318
411
|
trainer.train(1, train_dataset)
|
|
319
412
|
```
|
|
320
413
|
|
|
414
|
+
|
|
415
|
+
#### 7.2.3 推理模型采集指定token_range
|
|
416
|
+
需要配合mindtorch套件改造原推理代码,套件包装后使用方式与torch一致,唯一区别为import的是msprobe.mindspore下的PrecisionDebugger。
|
|
417
|
+
|
|
418
|
+
```Python
|
|
419
|
+
from vllm import LLM, SamplingParams
|
|
420
|
+
from msprobe.mindspore import PrecisionDebugger, seed_all
|
|
421
|
+
# 在模型训练开始前固定随机性
|
|
422
|
+
seed_all()
|
|
423
|
+
# 请勿将PrecisionDebugger的初始化流程插入到循环代码中
|
|
424
|
+
debugger = PrecisionDebugger(config_path="./config.json", dump_path="./dump_path")
|
|
425
|
+
# 模型定义及初始化等操作
|
|
426
|
+
prompts = ["Hello, my name is"]
|
|
427
|
+
sampling_params = SamplingParams(temprature=0.8, top_p=0.95)
|
|
428
|
+
llm = LLM(model='...')
|
|
429
|
+
model = llm.llm_engine.model_executor.driver_worker.worker.model_runner.get_model()
|
|
430
|
+
# 开启数据dump, 指定采集推理模型逐字符循环推理中的第1~3次
|
|
431
|
+
debugger.start(model=model, token_range=[1,3])
|
|
432
|
+
# 推理模型生成的逻辑
|
|
433
|
+
output = llm.generate(prompts, sampling_params=sampling_params)
|
|
434
|
+
# 关闭数据dump并落盘
|
|
435
|
+
debugger.stop()
|
|
436
|
+
debugger.step()
|
|
437
|
+
```
|
|
438
|
+
|
|
321
439
|
## 8. dump 结果文件介绍
|
|
322
440
|
|
|
323
441
|
### 8.1 静态图场景
|
|
324
442
|
|
|
325
|
-
训练结束后,数据将保存在 `dump_path`
|
|
443
|
+
训练结束后,数据将保存在 `dump_path` 指定的目录下。<br/>
|
|
444
|
+
L0 级别 dump 的目录结构与动态图场景下目录结构一致。<br/>
|
|
445
|
+
L2 级别 dump 的目录结构如下所示:
|
|
326
446
|
|
|
327
447
|
若jit_level=O2,MindSpore 版本不低于 2.5.0,且使用mindstudio-probe发布包或源码编包时添加了`--include-mod=adump`选项,目录结构示例如下:
|
|
328
448
|
```
|
|
@@ -369,19 +489,21 @@ dump 结果目录结构示例如下:
|
|
|
369
489
|
| | | | ├── Tensor.__add__.0.forward.output.0.npy
|
|
370
490
|
| | | | ...
|
|
371
491
|
| | | | ├── Jit.AlexNet.0.forward.input.0.npy
|
|
372
|
-
| | | | ├── Primitive.conv2d.
|
|
373
|
-
| | | | ├── Cell.conv1.
|
|
374
|
-
| | | | ├── Cell.conv1.
|
|
492
|
+
| | | | ├── Primitive.conv2d.Conv2d.0.forward.input.0.npy
|
|
493
|
+
| | | | ├── Cell.conv1.Conv2d.forward.0.parameters.weight.npy # 模块参数数据:命名格式为{Cell}.{cell_name}.{class_name}.forward.{调用次数}.parameters.{parameter_name}。
|
|
494
|
+
| | | | ├── Cell.conv1.Conv2d.parameters_grad.weight.npy # 模块参数梯度数据:命名格式为{Cell}.{cell_name}.{class_name}.parameters_grad.{parameter_name}。因为同一模块的参数使用同一梯度进行更新,所以参数梯度文件名不包含调用次数。
|
|
375
495
|
| | | | └── 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个元素。
|
|
376
496
|
| | | | # 当dump时传入的model参数为List[mindspore.nn.Cell]或Tuple[mindspore.nn.Cell]时,模块级数据的命名中包含该模块在列表中的索引index,命名格式为{Cell}.{index}.*,*表示以上三种模块级数据的命名格式,例如:Cell.0.relu.ReLU.forward.0.input.0.npy。
|
|
377
497
|
│ | | ├── dump.json
|
|
378
498
|
│ | | ├── stack.json
|
|
499
|
+
│ | | ├── dump_error_info.log
|
|
379
500
|
│ | | └── construct.json
|
|
380
501
|
│ | ├── rank1
|
|
381
502
|
| | | ├── dump_tensor_data
|
|
382
503
|
| | | | └── ...
|
|
383
504
|
│ | | ├── dump.json
|
|
384
505
|
│ | | ├── stack.json
|
|
506
|
+
│ | | ├── dump_error_info.log
|
|
385
507
|
| | | └── construct.json
|
|
386
508
|
│ | ├── ...
|
|
387
509
|
│ | |
|
|
@@ -393,17 +515,42 @@ dump 结果目录结构示例如下:
|
|
|
393
515
|
|
|
394
516
|
* `rank`:设备 ID,每张卡的数据保存在对应的 `rank{ID}` 目录下。非分布式场景下没有 rank ID,目录名称为 rank。
|
|
395
517
|
* `dump_tensor_data`:保存采集到的张量数据。
|
|
396
|
-
* `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-
|
|
518
|
+
* `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-mindspore-场景下的-dumpjson-文件)。
|
|
519
|
+
* `dump_error_info.log`: 仅在dump工具报错时拥有此记录日志,用于记录dump错误日志。
|
|
397
520
|
* `stack.json`:API/Cell的调用栈信息。
|
|
398
521
|
* `construct.json`:分层分级结构,level为L1时,construct.json内容为空。
|
|
399
522
|
|
|
400
523
|
dump 过程中,npy 文件在对应API或者模块被执行后就会落盘,而 json 文件则需要在正常执行 PrecisionDebugger.stop() 后才会写入完整数据,因此,程序异常终止时,被执行API对应的 npy 文件已被保存,但 json 文件中的数据可能丢失。
|
|
401
524
|
|
|
402
|
-
|
|
525
|
+
动态图场景下使用 `mindspore.jit` 装饰特定 Cell 或 function 时,被装饰的部分会被编译成**静态图**执行。
|
|
526
|
+
|
|
527
|
+
- config.json 文件配置 level 为 L0 或 mix,且 MindSpore 版本不低于 2.7.0 时, 若存在 construct 方法被 `mindspore.jit` 装饰的 Cell 对象,则 dump_path 下将生成 `graph` 与 `pynative` 目录,分别存放 construct 方法被 `mindspore.jit` 装饰的 Cell 对象的精度数据、其它Cell 或 API 对象的精度数据。示例如下:
|
|
403
528
|
|
|
404
|
-
|
|
405
|
-
|
|
529
|
+
```lua
|
|
530
|
+
├── dump_path
|
|
531
|
+
│ ├── graph
|
|
532
|
+
│ | ├── step0
|
|
533
|
+
│ | | ├── rank0
|
|
534
|
+
│ | │ | ├── dump_tensor_data
|
|
535
|
+
| | | | | ├── ...
|
|
536
|
+
│ | | | ├── dump.json
|
|
537
|
+
│ | | | ├── stack.json
|
|
538
|
+
│ | | | └── construct.json
|
|
539
|
+
│ | | ├── ...
|
|
540
|
+
│ ├── pynative
|
|
541
|
+
│ | ├── step0
|
|
542
|
+
│ | | ├── rank0
|
|
543
|
+
│ | │ | ├── dump_tensor_data
|
|
544
|
+
| | | | | ├── ...
|
|
545
|
+
│ | | | ├── dump.json
|
|
546
|
+
│ | | | ├── stack.json
|
|
547
|
+
│ | | | └── construct.json
|
|
548
|
+
│ | | ├── ...
|
|
549
|
+
```
|
|
406
550
|
|
|
551
|
+
- config.json 文件配置 level 为 L1 时, 若 `mindspore.jit` 的 `capture_mode` 参数设置为 ast(原 PSJit 场景), 则被装饰的部分也作为 API 被 dump 到对应目录;若 `mindspore.jit` 的 `capture_mode` 参数设置为 bytecode(原 PIJit 场景), 则被装饰的部分会被还原为动态图,按 API 粒度进行 dump。
|
|
552
|
+
|
|
553
|
+
- config.json 文件配置 level 为 L2 时, 仅会 dump 被 `mindspore.jit` 装饰部分的 kernel 精度数据,其结果目录同 jit_level 为 O0/O1 时的静态图 dump 结果相同。
|
|
407
554
|
|
|
408
555
|
npy文件名的前缀含义如下:
|
|
409
556
|
|
|
@@ -414,12 +561,12 @@ npy文件名的前缀含义如下:
|
|
|
414
561
|
| Primitive | mindspore.ops.Primitive API数据 |
|
|
415
562
|
| Mint | mindspore.mint API数据 |
|
|
416
563
|
| MintFunctional | mindspore.mint.nn.functional API数据 |
|
|
564
|
+
| MintDistributed | mindspore.mint.distributed API数据 |
|
|
417
565
|
| Distributed | mindspore.communication.comm_func API数据 |
|
|
418
566
|
| Jit | 被"jit"装饰的模块或函数数据 |
|
|
419
567
|
| Cell | mindspore.nn.Cell 类(模块)数据 |
|
|
420
568
|
|
|
421
569
|
|
|
422
|
-
|
|
423
570
|
## 9.补充说明
|
|
424
571
|
|
|
425
572
|
### 9.1 修改 API 支持列表
|
|
@@ -13,9 +13,9 @@ b. 在预检 dump 时可以选择由工具构造随机数获得 dump 数据或
|
|
|
13
13
|
1. 在 NPU 和 GPU 环境下分别安装 msprobe。详见[ msprobe 安装](./01.installation.md)章节。
|
|
14
14
|
2. 在 NPU 训练脚本内添加 msprobe 工具 dump 接口 PrecisionDebugger,采集待预检数据。注意需要配置 level="L1"。
|
|
15
15
|
3. 将 NPU 环境下 dump 的预检数据拷贝至 GPU 环境。
|
|
16
|
-
4. 在 NPU 和 GPU 环境下分别执行 run_ut,生成的结果最终用于 api_precision_compare
|
|
16
|
+
4. 在 NPU 和 GPU 环境下分别执行 run_ut,生成的结果最终用于 api_precision_compare 的输入。详见 [3 离线预检操作指导](#3-离线预检操作指导)。
|
|
17
17
|
5. 将 NPU 和 GPU 执行 run_ut 生成的 `accuracy_checking_details_{timestamp}.csv` 结果文件拷贝至同一环境下。
|
|
18
|
-
6. 运行 api_precision_compare
|
|
18
|
+
6. 运行 api_precision_compare,输出结果为预检操作的最终结果。详见 [5 预检结果比对](#5-预检结果比对)章节。
|
|
19
19
|
|
|
20
20
|
## 3 离线预检操作指导
|
|
21
21
|
|