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.
- {mindstudio_probe-1.2.1.dist-info → mindstudio_probe-1.3.0.dist-info}/METADATA +3 -3
- {mindstudio_probe-1.2.1.dist-info → mindstudio_probe-1.3.0.dist-info}/RECORD +168 -150
- msprobe/README.md +27 -22
- msprobe/core/common/const.py +129 -60
- msprobe/core/common/decorator.py +50 -0
- msprobe/core/common/exceptions.py +3 -1
- msprobe/core/common/file_utils.py +25 -2
- msprobe/core/common/inplace_ops.yaml +1 -0
- msprobe/core/common/utils.py +43 -33
- msprobe/core/compare/acc_compare.py +43 -74
- msprobe/core/compare/check.py +2 -6
- msprobe/core/compare/highlight.py +2 -0
- msprobe/core/compare/layer_mapping/data_scope_parser.py +1 -1
- msprobe/core/compare/layer_mapping/layer_mapping.py +2 -1
- msprobe/core/compare/merge_result/merge_result.py +16 -9
- msprobe/core/compare/merge_result/utils.py +81 -0
- msprobe/core/compare/multiprocessing_compute.py +19 -12
- msprobe/core/compare/npy_compare.py +30 -12
- msprobe/core/compare/utils.py +30 -10
- msprobe/core/data_dump/api_registry.py +176 -0
- msprobe/core/data_dump/data_collector.py +58 -13
- msprobe/core/data_dump/data_processor/base.py +94 -10
- msprobe/core/data_dump/data_processor/factory.py +3 -0
- msprobe/core/data_dump/data_processor/mindspore_processor.py +33 -33
- msprobe/core/data_dump/data_processor/pytorch_processor.py +99 -18
- msprobe/core/data_dump/json_writer.py +61 -40
- msprobe/core/grad_probe/constant.py +1 -0
- msprobe/core/grad_probe/grad_compare.py +1 -1
- msprobe/core/overflow_check/abnormal_scene.py +2 -0
- msprobe/docs/01.installation.md +27 -1
- msprobe/docs/02.config_introduction.md +27 -23
- msprobe/docs/03.config_examples.md +24 -0
- msprobe/docs/05.data_dump_PyTorch.md +103 -16
- msprobe/docs/06.data_dump_MindSpore.md +76 -32
- msprobe/docs/07.accuracy_checker_PyTorch.md +11 -1
- msprobe/docs/08.accuracy_checker_online_PyTorch.md +3 -1
- msprobe/docs/09.accuracy_checker_MindSpore.md +5 -3
- msprobe/docs/10.accuracy_compare_PyTorch.md +59 -33
- msprobe/docs/11.accuracy_compare_MindSpore.md +40 -16
- msprobe/docs/12.overflow_check_PyTorch.md +3 -1
- msprobe/docs/13.overflow_check_MindSpore.md +4 -2
- msprobe/docs/14.data_parse_PyTorch.md +1 -7
- msprobe/docs/18.online_dispatch.md +1 -1
- msprobe/docs/19.monitor.md +332 -273
- msprobe/docs/21.visualization_PyTorch.md +42 -13
- msprobe/docs/22.visualization_MindSpore.md +43 -13
- msprobe/docs/23.generate_operator_PyTorch.md +9 -9
- msprobe/docs/27.dump_json_instruction.md +301 -27
- msprobe/docs/28.debugger_save_instruction.md +94 -0
- msprobe/docs/28.kernel_dump_MindSpore.md +69 -0
- msprobe/docs/29.data_dump_MSAdapter.md +229 -0
- msprobe/docs/30.overflow_check_MSAdapter.md +31 -0
- msprobe/docs/FAQ.md +3 -11
- msprobe/docs/img/compare_result.png +0 -0
- msprobe/docs/img/merge_result.png +0 -0
- msprobe/docs/img/monitor/step_count_per_record.png +0 -0
- msprobe/docs/img/visualization/vis_browser_1.png +0 -0
- msprobe/docs/img/visualization/vis_match_info.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/mindspore/__init__.py +4 -2
- msprobe/mindspore/api_accuracy_checker/api_accuracy_checker.py +32 -7
- msprobe/mindspore/api_accuracy_checker/api_runner.py +70 -22
- msprobe/mindspore/api_accuracy_checker/base_compare_algorithm.py +2 -1
- msprobe/mindspore/api_accuracy_checker/bench_functions/flash_attention_score.py +602 -0
- msprobe/mindspore/api_accuracy_checker/bench_functions/fusion_operator.py +41 -0
- msprobe/mindspore/api_accuracy_checker/compute_element.py +47 -1
- msprobe/mindspore/api_accuracy_checker/data_manager.py +2 -1
- msprobe/mindspore/api_accuracy_checker/multi_api_accuracy_checker.py +2 -1
- msprobe/mindspore/api_accuracy_checker/torch_mindtorch_importer.py +130 -0
- msprobe/mindspore/api_accuracy_checker/type_mapping.py +24 -1
- msprobe/mindspore/api_accuracy_checker/utils.py +6 -1
- msprobe/mindspore/common/const.py +61 -0
- msprobe/mindspore/common/utils.py +48 -18
- msprobe/mindspore/compare/ms_compare.py +27 -19
- msprobe/mindspore/compare/ms_graph_compare.py +6 -5
- msprobe/mindspore/debugger/debugger_config.py +31 -6
- msprobe/mindspore/debugger/precision_debugger.py +45 -14
- msprobe/mindspore/dump/dump_tool_factory.py +5 -3
- msprobe/mindspore/dump/hook_cell/api_register.py +142 -0
- msprobe/mindspore/dump/hook_cell/hook_cell.py +9 -10
- msprobe/mindspore/dump/hook_cell/support_wrap_ops.yaml +24 -26
- msprobe/mindspore/dump/jit_dump.py +21 -15
- msprobe/mindspore/dym_loader/hook_dynamic_loader.cc +22 -56
- msprobe/mindspore/dym_loader/hook_dynamic_loader.h +0 -1
- msprobe/mindspore/free_benchmark/api_pynative_self_check.py +10 -6
- msprobe/mindspore/free_benchmark/perturbation/perturbation_factory.py +4 -2
- msprobe/mindspore/free_benchmark/self_check_tool_factory.py +6 -3
- msprobe/mindspore/grad_probe/global_context.py +2 -0
- msprobe/mindspore/grad_probe/grad_analyzer.py +2 -1
- msprobe/mindspore/grad_probe/hook.py +2 -4
- 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 +873 -0
- msprobe/mindspore/monitor/module_spec_verifier.py +94 -0
- msprobe/mindspore/monitor/utils.py +309 -0
- msprobe/mindspore/ms_config.py +8 -2
- msprobe/mindspore/overflow_check/overflow_check_tool_factory.py +5 -3
- msprobe/mindspore/service.py +114 -34
- msprobe/pytorch/__init__.py +0 -1
- msprobe/pytorch/api_accuracy_checker/compare/api_precision_compare.py +3 -6
- msprobe/pytorch/api_accuracy_checker/generate_op_script/op_generator.py +12 -7
- msprobe/pytorch/api_accuracy_checker/generate_op_script/operator_replication.template +2 -2
- msprobe/pytorch/api_accuracy_checker/run_ut/multi_run_ut.py +4 -5
- msprobe/pytorch/api_accuracy_checker/run_ut/run_overflow_check.py +5 -5
- msprobe/pytorch/api_accuracy_checker/run_ut/run_ut.py +25 -6
- msprobe/pytorch/api_accuracy_checker/run_ut/run_ut_utils.py +28 -19
- msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/attl.py +3 -1
- msprobe/pytorch/bench_functions/apply_adam.py +215 -0
- msprobe/pytorch/bench_functions/group_norm_silu.py +27 -0
- msprobe/pytorch/{parse.py → bench_functions/mish.py} +6 -4
- msprobe/pytorch/bench_functions/moe_gating_top_k_softmax.py +50 -0
- msprobe/pytorch/bench_functions/sort_v2.py +21 -0
- msprobe/pytorch/common/utils.py +97 -4
- msprobe/pytorch/debugger/debugger_config.py +19 -9
- msprobe/pytorch/debugger/precision_debugger.py +24 -1
- msprobe/pytorch/dump/module_dump/module_dump.py +4 -3
- msprobe/pytorch/dump/module_dump/module_processer.py +21 -35
- msprobe/pytorch/free_benchmark/common/utils.py +1 -1
- msprobe/pytorch/free_benchmark/compare/single_benchmark.py +1 -1
- msprobe/pytorch/free_benchmark/perturbed_layers/npu/add_noise.py +3 -3
- msprobe/pytorch/free_benchmark/perturbed_layers/npu/bit_noise.py +3 -3
- msprobe/pytorch/free_benchmark/perturbed_layers/npu/change_value.py +1 -1
- msprobe/pytorch/free_benchmark/perturbed_layers/npu/improve_precision.py +1 -1
- msprobe/pytorch/free_benchmark/result_handlers/check_handler.py +1 -1
- msprobe/pytorch/function_factory.py +8 -2
- msprobe/pytorch/grad_probe/grad_monitor.py +2 -2
- msprobe/pytorch/hook_module/api_register.py +131 -0
- msprobe/pytorch/hook_module/hook_module.py +19 -14
- msprobe/pytorch/hook_module/register_optimizer_hook.py +2 -1
- msprobe/pytorch/hook_module/support_wrap_ops.yaml +173 -75
- msprobe/pytorch/monitor/anomaly_detect.py +14 -29
- msprobe/pytorch/monitor/csv2tb.py +18 -14
- msprobe/pytorch/monitor/distributed/wrap_distributed.py +8 -2
- msprobe/pytorch/monitor/module_hook.py +238 -193
- msprobe/pytorch/monitor/module_metric.py +9 -6
- msprobe/pytorch/monitor/optimizer_collect.py +100 -67
- msprobe/pytorch/monitor/unittest/test_monitor.py +1 -1
- msprobe/pytorch/monitor/utils.py +76 -44
- msprobe/pytorch/online_dispatch/compare.py +0 -2
- msprobe/pytorch/online_dispatch/dispatch.py +9 -0
- msprobe/pytorch/online_dispatch/dump_compare.py +3 -0
- msprobe/pytorch/online_dispatch/utils.py +3 -0
- msprobe/pytorch/parse_tool/lib/interactive_cli.py +1 -6
- msprobe/pytorch/parse_tool/lib/utils.py +2 -1
- msprobe/pytorch/pt_config.py +30 -29
- msprobe/pytorch/service.py +114 -32
- msprobe/visualization/builder/graph_builder.py +75 -10
- msprobe/visualization/builder/msprobe_adapter.py +7 -6
- msprobe/visualization/compare/graph_comparator.py +42 -38
- msprobe/visualization/compare/mode_adapter.py +0 -19
- msprobe/visualization/graph/base_node.py +11 -3
- msprobe/visualization/graph/distributed_analyzer.py +71 -3
- msprobe/visualization/graph/graph.py +0 -11
- msprobe/visualization/graph/node_op.py +4 -3
- msprobe/visualization/graph_service.py +4 -5
- msprobe/visualization/utils.py +12 -35
- msprobe/mindspore/dump/hook_cell/api_registry.py +0 -205
- msprobe/mindspore/dump/hook_cell/wrap_api.py +0 -212
- msprobe/pytorch/hook_module/api_registry.py +0 -166
- msprobe/pytorch/hook_module/wrap_distributed.py +0 -75
- msprobe/pytorch/hook_module/wrap_functional.py +0 -66
- msprobe/pytorch/hook_module/wrap_npu_custom.py +0 -85
- msprobe/pytorch/hook_module/wrap_tensor.py +0 -69
- msprobe/pytorch/hook_module/wrap_torch.py +0 -84
- msprobe/pytorch/hook_module/wrap_vf.py +0 -60
- {mindstudio_probe-1.2.1.dist-info → mindstudio_probe-1.3.0.dist-info}/LICENSE +0 -0
- {mindstudio_probe-1.2.1.dist-info → mindstudio_probe-1.3.0.dist-info}/WHEEL +0 -0
- {mindstudio_probe-1.2.1.dist-info → mindstudio_probe-1.3.0.dist-info}/entry_points.txt +0 -0
- {mindstudio_probe-1.2.1.dist-info → mindstudio_probe-1.3.0.dist-info}/top_level.txt +0 -0
|
@@ -10,44 +10,49 @@
|
|
|
10
10
|
|
|
11
11
|
### 1.1 通用配置
|
|
12
12
|
|
|
13
|
-
| 参数 | 解释
|
|
14
|
-
| -----------------
|
|
15
|
-
| task | dump 的任务类型,str 类型。可选参数:<br/> "statistics":仅采集统计信息,默认值;<br/> "tensor":采集统计信息和完全复刻整网的真实数据;<br/> "run_ut":精度预检,仅 PyTorch 场景支持,采集数据时勿选;<br/> "overflow_check":溢出检测;<br/> "free_benchmark"
|
|
16
|
-
| dump_path | 设置 dump 数据目录路径,str 类型。<br/> **配置示例**:"dump_path": "./dump_path"。
|
|
17
|
-
| rank | 指定对某张卡上的数据进行采集,list[Union[int, str]] 类型,默认未配置(表示采集所有卡的数据),应配置元素为 ≥0 的整数或类似"4-6"的字符串,且须配置实际可用的 Rank ID。<br/> PyTorch 场景: Rank ID 从 0 开始计数,最大取值为所有节点可用卡总数-1,若所配置的值大于实际训练所运行的卡的 Rank ID,则 dump 数据为空,比如当前环境 Rank ID 为 0 到 7,实际训练运行 0 到 3 卡,此时若配置 Rank ID 为 4 或不存在的 10 等其他值,dump 数据为空。<br/> MindSpore 场景:所有节点的 Rank ID 均从 0 开始计数,最大取值为每个节点可用卡总数-1,config.json 配置一次 rank 参数对所有节点同时生效。<br/> 注意,单卡训练时,rank必须为[],即空列表,不能指定rank。<br/>**配置示例**:"rank": [1, "4-6"]。
|
|
18
|
-
| step | 指定采集某个 step 的数据,list[Union[int, str]] 类型。默认未配置,表示采集所有 step 数据。采集特定 step 时,须指定为训练脚本中存在的 step,可逐个配置,也可以指定范围。<br/> **配置示例**:"step": [0, 1 , 2, "4-6"]。
|
|
19
|
-
| level | dump 级别,str 类型,根据不同级别采集不同数据。可选参数:<br/>"L0":dump 模块级精度数据,仅 PyTorch
|
|
20
|
-
| enable_dataloader | 自动控制开关,bool 类型,仅 PyTorch 场景支持。可选参数 true(开启)或 false(关闭),默认为 false。配置为 true 后自动识别 step 参数指定的迭代,并在该迭代执行完成后退出训练,此时 start、stop 和 step 函数可不配置,开启该开关要求训练脚本是通过 torch.utils.data.dataloader 方式加载数据。仅支持 PyTorch 单卡训练使用,分布式训练场景下存在数据 dump 不全问题。 **这个特性下个版本将被废弃**
|
|
13
|
+
| 参数 | 解释 | 是否必选 |
|
|
14
|
+
| ----------------- |------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -------- |
|
|
15
|
+
| task | dump 的任务类型,str 类型。可选参数:<br/> "statistics":仅采集统计信息,默认值;<br/> "tensor":采集统计信息和完全复刻整网的真实数据;<br/> "run_ut":精度预检,仅 PyTorch 场景支持,采集数据时勿选;<br/> "overflow_check":溢出检测;<br/> "free_benchmark":无标杆比对,不支持 MSAdapter 场景;<br/> "grad_probe":梯度监控, 不支持 MSAdapter 场景; <br/> "structure":仅采集模型结构以及调用栈信息,不采集具体数据。 <br/> 根据 task 参数取值的不同,可以配置不同场景参数,详见:<br/>[1.2 task 配置为 statistics](#12-task-配置为-statistics),<br/>[1.3 task 配置为 tensor](#13-task-配置为-tensor),<br/>[1.4 task 配置为 run_ut](#14-task-配置为-run_ut),<br/>[1.5 task 配置为 overflow_check](#15-task-配置为-overflow_check),<br/>[1.6 task 配置为 free_benchmark](#16-task-配置为-free_benchmark),<br/>[1.7 task 配置为 grad_probe](#17-task-配置为-grad_probe)。 <br/> **配置示例**:"task": "tensor"。 | 否 |
|
|
16
|
+
| dump_path | 设置 dump 数据目录路径,str 类型。<br/> **配置示例**:"dump_path": "./dump_path"。 | 是 |
|
|
17
|
+
| rank | 指定对某张卡上的数据进行采集,list[Union[int, str]] 类型,默认未配置(表示采集所有卡的数据),应配置元素为 ≥0 的整数或类似"4-6"的字符串,且须配置实际可用的 Rank ID。<br/> PyTorch 场景: Rank ID 从 0 开始计数,最大取值为所有节点可用卡总数-1,若所配置的值大于实际训练所运行的卡的 Rank ID,则 dump 数据为空,比如当前环境 Rank ID 为 0 到 7,实际训练运行 0 到 3 卡,此时若配置 Rank ID 为 4 或不存在的 10 等其他值,dump 数据为空。<br/> MindSpore 场景:所有节点的 Rank ID 均从 0 开始计数,最大取值为每个节点可用卡总数-1,config.json 配置一次 rank 参数对所有节点同时生效。<br/> 注意,单卡训练时,rank必须为[],即空列表,不能指定rank。<br/>**配置示例**:"rank": [1, "4-6"]。 | 否 |
|
|
18
|
+
| step | 指定采集某个 step 的数据,list[Union[int, str]] 类型。默认未配置,表示采集所有 step 数据。采集特定 step 时,须指定为训练脚本中存在的 step,可逐个配置,也可以指定范围。<br/> **配置示例**:"step": [0, 1 , 2, "4-6"]。 | 否 |
|
|
19
|
+
| level | dump 级别,str 类型,根据不同级别采集不同数据。可选参数:<br/>"L0":dump 模块级精度数据,仅 PyTorch、MSAdapter 以及 MindSpore 动态图场景支持,使用背景详见 [1.1.1 模块级精度数据 dump 说明](#111-模块级精度数据-dump-说明);<br/>"L1":dump API 级精度数据,默认值,仅 PyTorch、MSAdapter 以及 MindSpore 动态图场景支持;<br/>"L2":dump kernel 级精度数据,PyTorch 场景详细介绍见 [PyTorch 场景的 kernel dump 说明](./04.kernel_dump_PyTorch.md);MindSpore 动态图场景详细介绍见 [MindSpore 动态图场景的 kernel dump 说明](./28.kernel_dump_MindSpore.md);MindSpore 静态图场景详细介绍见《MindSpore 场景的数据采集》中的 ["**8.1 静态图场景**"](./06.data_dump_MindSpore.md#81-静态图场景)小节;<br/>"mix":dump module 模块级和 API 级精度数据,即"L0"+"L1",仅 PyTorch、MSAdapter 以及 MindSpore 动态图场景支持。<br/>"debug":单点保存功能,细节详见[单点保存工具 README](./28.debugger_save_instruction.md)<br/> **配置示例**:"level": "L1"。 | 否 |
|
|
20
|
+
| enable_dataloader | 自动控制开关,bool 类型,仅 PyTorch 场景支持。可选参数 true(开启)或 false(关闭),默认为 false。配置为 true 后自动识别 step 参数指定的迭代,并在该迭代执行完成后退出训练,此时 start、stop 和 step 函数可不配置,开启该开关要求训练脚本是通过 torch.utils.data.dataloader 方式加载数据。仅支持 PyTorch 单卡训练使用,分布式训练场景下存在数据 dump 不全问题。 **这个特性下个版本将被废弃** | 否 |
|
|
21
|
+
| async_dump | 异步 dump 开关,bool 类型。可选参数 true(开启)或 false(关闭),默认为 false。配置为 true 后开启异步 dump,即采集的精度数据会在当前 step 训练结束后统一落盘,训练过程中工具不触发同步操作。由于使用该模式有**显存溢出**的风险,当 task 配置为 tensor 时,即真实数据的异步dump模式,必须配置 [list](#13-task-配置为-tensor) 参数,指定需要 dump 的 tensor 。该模式暂不支持复数类型 tensor <br/>的统计量计算。 | 否 |
|
|
21
22
|
|
|
22
23
|
#### 1.1.1 模块级精度数据 dump 说明
|
|
23
24
|
|
|
24
|
-
仅 PyTorch
|
|
25
|
+
仅 PyTorch、MSAdapter以及 MindSpore 动态图场景支持。
|
|
25
26
|
|
|
26
27
|
大模型场景下,通常不是简单的利用自动迁移能力实现从 GPU 到 NPU 的训练脚本迁移,而是会对 NPU 网络进行一系列针对性的适配,因此,常常会造成迁移后的 NPU 模型存在部分子结构不能与 GPU 原始模型完全对应。模型结构不一致导致 API 调用类型及数量不一致,若直接按照 API 粒度进行精度数据 dump 和比对,则无法完全比对所有的 API。
|
|
27
28
|
|
|
28
29
|
本小节介绍的功能是对模型中的大粒度模块进行数据 dump,使其比对时,对于无法以 API 粒度比对的模块可以直接以模块粒度进行比对。
|
|
29
30
|
|
|
30
|
-
模块指的是继承 nn.Module 类(PyTorch场景)或 nn.Cell 类(MindSpore场景)的子类,通常情况下这类模块就是一个小模型,可以被视为一个整体,dump 数据时以模块为粒度进行 dump。
|
|
31
|
+
模块指的是继承 nn.Module 类(PyTorch 与 MSAdapter 场景)或 nn.Cell 类(MindSpore 场景)的子类,通常情况下这类模块就是一个小模型,可以被视为一个整体,dump 数据时以模块为粒度进行 dump。
|
|
32
|
+
|
|
33
|
+
|
|
31
34
|
|
|
32
35
|
### 1.2 task 配置为 statistics
|
|
33
36
|
|
|
34
37
|
<table>
|
|
35
38
|
<tr><th>参数</th><th>解释</th><th>是否必选</th></tr>
|
|
36
|
-
<tr><td>scope</td><td>PyTorch
|
|
37
|
-
"scope": ["Module.conv1.Conv2d.forward.0", "Module.fc2.Linear.forward.0"],
|
|
39
|
+
<tr><td>scope</td><td>PyTorch、MSAdapter 以及 MindSpore 动态图场景 dump 范围,list[str] 类型,默认未配置(list 也未配置时表示 dump 所有 API 的数据)。该参数可以在 [ ] 内配置两个模块名或 API 名,要求列表长度必须为2,需要配置按照工具命名格式的完整模块名或API名称,用于锁定区间,dump 该范围内的数据。<br/><b>配置示例</b>:
|
|
40
|
+
"scope": ["Module.conv1.Conv2d.forward.0", "Module.fc2.Linear.forward.0"],
|
|
38
41
|
或 "scope": ["Cell.conv1.Conv2d.forward.0", "Cell.fc2.Dense.backward.0"], 或"scope": ["Tensor.add.0.forward", "Functional.square.2.forward"]。与 level 参数取值相关,level 为 L0 级别时,可配置模块名;level 为 L1 级别时,可配置 API 名, level为 mix 级别时,可配置为模块名或API名。</td><td>否</td></tr>
|
|
39
42
|
<tr><td rowspan="4">list</td><td>自定义采集的算子列表,list[str] 类型,默认未配置(scope 也未配置时表示 dump 所有 API 的数据),包含以下配置方法:</td><td rowspan="4">否</td></tr>
|
|
40
|
-
<tr><td>PyTorch
|
|
43
|
+
<tr><td>PyTorch、MSAdapter 以及 MindSpore 动态图场景配置具体的 API 全称,dump 该 API 数据。在 PyTorch 场景,如果 level 配置成 L2,该配置为必填项。<br/><b>配置示例</b>:"list": ["Tensor.permute.1.forward", "Tensor.transpose.2.forward", "Torch.relu.3.backward"]。<br/> PyTorch 和 MindSpore 动态图场景在level为 mix 级别时可以配置模块名称,dump该模块展开数据 (dump该模块从执行开始到执行结束期间的所有数据)。
|
|
41
44
|
<br/><b>配置示例</b>:"list": ["Module.module.language_model.encoder.layers.0.mlp.ParallelMlp.forward.0"], 或 "list": ["Cell.network_with_loss.language_model.encoder.layers.0.mlp.ParallelMlp.forward.0"]</td></tr>
|
|
42
|
-
<tr><td>PyTorch
|
|
43
|
-
<tr><td>MindSpore 静态图场景配置 kernel_name,可以是算子的名称列表,也可以指定算子类型(
|
|
45
|
+
<tr><td>PyTorch、MSAdapter 以及 MindSpore 动态图场景指定某一类 API,dump 某一类的 API 级别输入输出数据。<br/><b>配置示例</b>:"list": ["relu"]。 <br/> PyTorch、MSAdapter 以及 MindSpore 动态图场景在level为 mix 级别时, 会dump名称中包含list中配置的字符串的API数据,还会将名称中包含list中配置的字符串的模块进行展开dump (dump该模块从执行开始到执行结束期间的所有数据)。</td></tr>
|
|
46
|
+
<tr><td>MindSpore 静态图场景配置 kernel_name,可以是算子的名称列表,也可以指定算子类型(jit_level=O2 时不支持),还可以配置算子名称的正则表达式(当字符串符合“name-regex(xxx)”格式时,后台则会将其作为正则表达式。<br/><b>配置示例</b>:list: ["name-regex(Default/.+)"]<br/>可匹配算子名称以“Default/”开头的所有算子。</td></tr>
|
|
44
47
|
<tr><td rowspan="3">data_mode</td><td>dump 数据过滤,str 类型。</td><td rowspan="3">否</td></tr>
|
|
45
|
-
<tr><td>PyTorch
|
|
48
|
+
<tr><td>PyTorch、MSAdapter 以及 MindSpore 动态图场景:支持"all"、"forward"、"backward"、"input"和"output",除"all"外,其余参数可以自由组合。默认为["all"],即保存所有 dump 的数据。<br/> <b>配置示例</b>:"data_mode": ["backward"] (仅保存反向数据)或 "data_mode": ["forward", "input"](仅保存前向的输入数据)。</td></tr>
|
|
46
49
|
<tr><td>MindSpore 静态图场景:仅支持"all"、"input"和"output"参数,且各参数只能单独配置,不支持自由组合。<br/><b>配置示例</b>:"data_mode": ["all"]。</td></tr>
|
|
47
|
-
<tr><td rowspan="
|
|
50
|
+
<tr><td rowspan="3">summary_mode</td><td>控制 dump 文件输出的模式,str 类型,支持 PyTorch、MSAdapter、MindSpore 动态图以及 MindSpore 静态图 jit_level=O2 场景。</td><td rowspan="3">否</td></tr>
|
|
51
|
+
<tr><td>PyTorch、MSAdapter 以及 MindSpore 动态图场景:可选参数为<br/> md5:dump 输出包含 CRC-32 值以及 API 统计信息的 dump.json 文件,用于验证数据的完整性;<br/> statistics:dump 仅输出包含 API 统计信息的 dump.json 文件,默认值。<br/><b>配置示例</b>:"summary_mode": "md5"。</td></tr>
|
|
52
|
+
<tr><td>MindSpore 静态图 jit_level=O2 场景:支持上述配置的同时额外支持配置统计项列表,可选统计项为max、min、mean、l2norm,可从中任意选取组合搭配。其中mean、l2norm的结果为float数据格式。<br/><b>配置示例</b>:"summary_mode": ["max", "min"]。</td></tr>
|
|
48
53
|
</table>
|
|
49
54
|
|
|
50
|
-
**说明**:"summary_mode"配置为"md5"时,所使用的校验算法为CRC-32算法。
|
|
55
|
+
**说明**:"summary_mode" 配置为 "md5" 时,所使用的校验算法为 CRC-32 算法。
|
|
51
56
|
|
|
52
57
|
### 1.3 task 配置为 tensor
|
|
53
58
|
|
|
@@ -83,16 +88,16 @@
|
|
|
83
88
|
|
|
84
89
|
### 1.5 task 配置为 overflow_check
|
|
85
90
|
|
|
86
|
-
PyTorch
|
|
91
|
+
PyTorch、MSAdapter 以及 MindSpore 动态图场景下,"level"须为"L0"或"L1";MindSpore 静态图场景下,"level"须为"L2",且模型编译优化等级(jit_level)须为"O2"。
|
|
87
92
|
|
|
88
93
|
| 参数 | 解释 | 是否必选 |
|
|
89
94
|
| ------------- | ---------------------- | -------- |
|
|
90
|
-
| overflow_nums | 最大溢出次数,int 类型,默认为 1,仅 PyTorch
|
|
91
|
-
| check_mode | 溢出类型,str 类型,仅 MindSpore
|
|
95
|
+
| overflow_nums | 最大溢出次数,int 类型,默认为 1,仅 PyTorch、MSAdapter 以及 MindSpore 动态图场景支持。表示第 N 次溢出后,不再进行溢出检测。过程中检测到溢出 API 对应的 输入输出 数据均 dump。<br/>**配置示例**:"overflow_nums": 3。配置为 -1 时,表示持续检测溢出直到训练结束。 | 否 |
|
|
96
|
+
| check_mode | 溢出类型,str 类型,仅 MindSpore v2.3.0 以下版本的静态图场景支持,可选参数:<br/>"aicore":开启 AI Core 的溢出检测;<br/>"atomic":开启 Atomic 的溢出检测;<br/>"all":开启算子的溢出检测,默认值。<br/>**配置示例**:"check_mode": "all"。 | 否 |
|
|
92
97
|
|
|
93
98
|
### 1.6 task 配置为 free_benchmark
|
|
94
99
|
|
|
95
|
-
仅 PyTorch
|
|
100
|
+
仅 PyTorch 与 MindSpore 动态图场景支持,且"level"为"L1"。
|
|
96
101
|
|
|
97
102
|
- task 配置为 free_benchmark 时,开启**无标杆比对**,在 NPU 环境下通过对当前模型 API 的输入添加扰动因子,二次执行,将得到的输出与未添加扰动因子前的输出进行比对,从而**得出该模型中可能存在因迁移等变化导致精度降低的 API**。
|
|
98
103
|
|
|
@@ -161,4 +166,3 @@ PyTorch 与 MindSpore 动态图场景下,"level"须为"L0"或"L1";MindSpore
|
|
|
161
166
|
|
|
162
167
|
intervals就是根据值分布bounds划分出的区间。
|
|
163
168
|
MindSpore静态图模式下,L0级别中暂不支持"MD5"
|
|
164
|
-
|
|
@@ -100,6 +100,18 @@
|
|
|
100
100
|
}
|
|
101
101
|
```
|
|
102
102
|
|
|
103
|
+
### 1.6 task 配置为 structure
|
|
104
|
+
|
|
105
|
+
```json
|
|
106
|
+
{
|
|
107
|
+
"task": "structure",
|
|
108
|
+
"dump_path": "/home/data_dump",
|
|
109
|
+
"rank": [],
|
|
110
|
+
"step": [],
|
|
111
|
+
"level": "mix"
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
103
115
|
## 2 MindSpore 静态图场景
|
|
104
116
|
|
|
105
117
|
### 2.1 task 配置为 statistics
|
|
@@ -228,3 +240,15 @@
|
|
|
228
240
|
}
|
|
229
241
|
}
|
|
230
242
|
```
|
|
243
|
+
|
|
244
|
+
### 3.5 task 配置为 structure
|
|
245
|
+
|
|
246
|
+
```json
|
|
247
|
+
{
|
|
248
|
+
"task": "structure",
|
|
249
|
+
"dump_path": "/home/data_dump",
|
|
250
|
+
"rank": [],
|
|
251
|
+
"step": [],
|
|
252
|
+
"level": "mix"
|
|
253
|
+
}
|
|
254
|
+
```
|
|
@@ -34,6 +34,8 @@ level 配置为"L0"或"mix"时,必须在该接口或 **start** 接口中配置
|
|
|
34
34
|
|
|
35
35
|
此接口的参数均不是必要,且优先级高于 [config.json](../config.json) 文件中的配置,但可配置的参数相比 config.json 较少。
|
|
36
36
|
|
|
37
|
+
注:此接口的初始化需与采集目标在同一个进程中,否则将无法采集目标数据。
|
|
38
|
+
|
|
37
39
|
### 1.2 start
|
|
38
40
|
|
|
39
41
|
**功能说明**:启动精度数据采集。在模型初始化之后的位置添加。需要与 stop 函数一起添加在 for 循环内。
|
|
@@ -44,7 +46,7 @@ level 配置为"L0"或"mix"时,必须在该接口或 **start** 接口中配置
|
|
|
44
46
|
debugger.start(model=None)
|
|
45
47
|
```
|
|
46
48
|
|
|
47
|
-
1. model:指定需要采集 Module 级数据的模型,支持传入 torch.nn.Module
|
|
49
|
+
1. model:指定需要采集 Module 级数据的模型,支持传入 torch.nn.Module、list[torch.nn.Module]或Tuple[torch.nn.Module] 类型,默认未配置。
|
|
48
50
|
level 配置为"L0"或"mix"时,必须在该接口或 **PrecisionDebugger** 接口中配置该参数。
|
|
49
51
|
本接口中的 model 比 PrecisionDebugger 中 model 参数优先级更高,会覆盖 PrecisionDebugger 中的 model 参数。
|
|
50
52
|
|
|
@@ -52,8 +54,10 @@ level 配置为"L0"或"mix"时,必须在该接口或 **PrecisionDebugger** 接
|
|
|
52
54
|
|
|
53
55
|
**功能说明**:停止精度数据采集。在 **start** 函数之后的任意位置添加。
|
|
54
56
|
若 **stop** 函数添加在反向计算代码(如loss.backward)之后,则会采集 **start** 和该函数之间的前反向数据。
|
|
55
|
-
若 **stop** 函数添加在反向计算代码之前,则需要将 **step** 函数添加到反向计算代码之后,才能采集 **start** 和该函数之间的前反向数据。
|
|
56
|
-
|
|
57
|
+
若 **stop** 函数添加在反向计算代码之前,则需要将 [**step**](#15-step) 函数添加到反向计算代码之后,才能采集 **start** 和该函数之间的前反向数据。
|
|
58
|
+
使用示例可参见 [2.1 快速上手](#21-快速上手) 和 [2.2 采集完整的前反向数据](#22-采集完整的前反向数据)。
|
|
59
|
+
|
|
60
|
+
**注意**:**stop** 函数必须调用,否则可能导致精度数据落盘不全。
|
|
57
61
|
|
|
58
62
|
**原型**:
|
|
59
63
|
|
|
@@ -123,7 +127,7 @@ seed_all(seed=1234, mode=False, rm_dropout=True)
|
|
|
123
127
|
1. seed: 随机性种子。参数示例: seed=1000。默认值:1234。非必选
|
|
124
128
|
2. mode:确定性计算模式。可配置True或False。参数示例:mode=True。默认为False。非必选(注意:确定性计算会导致API执行性能降低,建议在发现模型多次执行结果不同的情况下开启)
|
|
125
129
|
3. rm_dropout:控制dropout失效的开关。可配置 True 或 False,默认值:True,非必选。参数示例:rm_dropout=True。
|
|
126
|
-
该参数设置为 True 后, 工具会自动将 `torch.nn.functional.dropout`、`torch.nn.functional.dropout2d`、`torch.nn.functional.dropout3d`、`torch.nn.Dropout`、`torch.nn.Dropout2d`、`torch.nn.Dropout3d`
|
|
130
|
+
该参数设置为 True 后, 工具会自动将 `torch.nn.functional.dropout`、`torch.nn.functional.dropout2d`、`torch.nn.functional.dropout3d`、`torch.nn.Dropout`、`torch.nn.Dropout2d`、`torch.nn.Dropout3d`
|
|
127
131
|
的接口参数 p 置为0,以避免因随机dropout造成的网络随机性。 注意:通过rm_dropout控制dropout失效或生效需要在初始化dropout实例前调用才能生效。
|
|
128
132
|
|
|
129
133
|
当前工具 dump 默认不会固定随机性和使 dropout 失效,若希望每次采集的数据保持一致,建议在 dump 数据前调用 seed_all 接口。
|
|
@@ -169,6 +173,37 @@ train_loader = torch.utils.data.DataLoader(
|
|
|
169
173
|
)
|
|
170
174
|
```
|
|
171
175
|
|
|
176
|
+
### 1.9 save
|
|
177
|
+
|
|
178
|
+
**功能说明**:单点保存网络执行过程中正反向数值,并以统计值/张量文件落盘。
|
|
179
|
+
|
|
180
|
+
**原型**:
|
|
181
|
+
```python
|
|
182
|
+
save(variable, name, save_backward=True)
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
**参数说明**:
|
|
186
|
+
| 参数名称 | 参数含义 | 支持数据类型 | 是否必选|
|
|
187
|
+
| ---------- | ------------------| ------------------- | ------------------- |
|
|
188
|
+
| variable | 需要保存的变量 |dict, list, tuple, torch.tensor, int, float, str | 是 |
|
|
189
|
+
| name | 指定的名称 | str | 是 |
|
|
190
|
+
| save_backward | 是否保存反向数据 | boolean | 否 |
|
|
191
|
+
|
|
192
|
+
### 1.10 set_init_step
|
|
193
|
+
|
|
194
|
+
**功能说明**:设置起始step数,step数默认从0开始计数,使用该接口后step从指定值开始计数。该函数需要写在训练迭代的循环开始前,不能写在循环内。
|
|
195
|
+
|
|
196
|
+
**原型**:
|
|
197
|
+
|
|
198
|
+
```Python
|
|
199
|
+
debugger.set_init_step(step)
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
**参数说明**:
|
|
203
|
+
|
|
204
|
+
1.step: 指定的起始step数。
|
|
205
|
+
|
|
206
|
+
|
|
172
207
|
## 2 示例代码
|
|
173
208
|
|
|
174
209
|
### 2.1 快速上手
|
|
@@ -254,7 +289,7 @@ for data, label in data_loader:
|
|
|
254
289
|
debugger.start() # 开启数据dump
|
|
255
290
|
# 如下是模型每个step执行的逻辑
|
|
256
291
|
output = model(data)
|
|
257
|
-
|
|
292
|
+
|
|
258
293
|
debugger.forward_backward_dump_end() # 插入该函数到start函数之后,只dump start函数到该函数之间的前反向数据。
|
|
259
294
|
# ...
|
|
260
295
|
loss.backward()
|
|
@@ -300,7 +335,58 @@ if __name__ == "__main__":
|
|
|
300
335
|
loss = out.sum() # module_dump_end和stop接口之间的数据正常dump
|
|
301
336
|
loss.backward()
|
|
302
337
|
# 关闭数据dump
|
|
303
|
-
debugger.stop()
|
|
338
|
+
debugger.stop()
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
### 2.5 跨文件采集数据
|
|
342
|
+
为了确保所有API都被工具封装,PrecisionDebugger的实例化通常放在训练工程的入口位置,但有的时候,模型定义会在另一个文件中。 假设有两个文件,train.py(为训练工程入口)module.py(为模型定义文件),为了采集module.py中定义的ModuleOP模块中某些子模块或API的前反向数据,需要在train.py和module.py文件中分别导入PrecisionDebugger并进行如下配置。
|
|
343
|
+
|
|
344
|
+
train.py文件:
|
|
345
|
+
|
|
346
|
+
```Python
|
|
347
|
+
# 根据需要import包
|
|
348
|
+
import torch
|
|
349
|
+
from module import ModuleOP
|
|
350
|
+
|
|
351
|
+
# 导入工具的数据采集接口
|
|
352
|
+
from msprobe.pytorch import PrecisionDebugger
|
|
353
|
+
|
|
354
|
+
# 将PrecisionDebugger的实例化放在文件的开始位置,即导包后的位置,确保所有API都被封装
|
|
355
|
+
debugger = PrecisionDebugger(config_path='./config.json')
|
|
356
|
+
|
|
357
|
+
if __name__ == "__main__":
|
|
358
|
+
module = ModuleOP()
|
|
359
|
+
|
|
360
|
+
x = torch.randn(10, 8)
|
|
361
|
+
out = module(x)
|
|
362
|
+
loss = out.sum()
|
|
363
|
+
loss.backward()
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
module.py文件:
|
|
367
|
+
|
|
368
|
+
```Python
|
|
369
|
+
import torch
|
|
370
|
+
import torch.nn as nn
|
|
371
|
+
import torch.nn.functional as F
|
|
372
|
+
|
|
373
|
+
from msprobe.pytorch import PrecisionDebugger
|
|
374
|
+
|
|
375
|
+
# 定义网络
|
|
376
|
+
class ModuleOP(nn.Module):
|
|
377
|
+
def __init__(self) -> None:
|
|
378
|
+
super().__init__()
|
|
379
|
+
self.linear_1 = nn.Linear(in_features=8, out_features=4)
|
|
380
|
+
self.linear_2 = nn.Linear(in_features=4, out_features=2)
|
|
381
|
+
|
|
382
|
+
def forward(self, x):
|
|
383
|
+
PrecisionDebugger.start()
|
|
384
|
+
x1 = self.linear_1(x)
|
|
385
|
+
PrecisionDebugger.stop()
|
|
386
|
+
x2 = self.linear_2(x1)
|
|
387
|
+
r1 = F.relu(x2)
|
|
388
|
+
return r1
|
|
389
|
+
|
|
304
390
|
```
|
|
305
391
|
|
|
306
392
|
## 3 dump 结果文件介绍
|
|
@@ -313,14 +399,15 @@ if __name__ == "__main__":
|
|
|
313
399
|
│ | ├── rank0
|
|
314
400
|
│ | │ ├── dump_tensor_data
|
|
315
401
|
| | | | ├── Tensor.permute.1.forward.pt
|
|
316
|
-
| | | | ├──
|
|
317
|
-
| | | | ├── Module.conv1.Conv2D.forward.0.parameters.bias.pt # 模块参数数据:命名格式为{Module}.{module_name}.{class_name}.forward.{调用次数}.parameters.{parameter_name}。
|
|
318
|
-
| | | | ├── Module.conv1.Conv2D.parameters_grad.weight.pt # 模块参数梯度数据:命名格式为{Module}.{module_name}.{class_name}.parameters_grad.{parameter_name}。因为同一模块的参数使用同一梯度进行更新,所以参数梯度文件名不包含调用次数。
|
|
402
|
+
| | | | ├── 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个元素。
|
|
319
403
|
| | | | ...
|
|
320
|
-
| | | |
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
404
|
+
| | | | ├── 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.Conv2D.forward.0.parameters.bias.pt # 模块参数数据:命名格式为{Module}.{module_name}.{class_name}.forward.{调用次数}.parameters.{parameter_name}。
|
|
406
|
+
| | | | └── Module.conv1.Conv2D.parameters_grad.weight.pt # 模块参数梯度数据:命名格式为{Module}.{module_name}.{class_name}.parameters_grad.{parameter_name}。因为同一模块的参数使用同一梯度进行更新,所以参数梯度文件名不包含调用次数。
|
|
407
|
+
| | | | # 当dump时传入的model参数为List[torch.nn.Module]或Tuple[torch.nn.Module]时,模块级数据的命名中包含该模块在列表中的索引index,命名格式为{Module}.{index}.*,*表示以上三种模块级数据的命名格式,例如:Module.0.conv1.Conv2d.forward.0.input.0.pt。
|
|
408
|
+
│ | | ├── dump.json
|
|
409
|
+
│ | | ├── stack.json
|
|
410
|
+
│ | | └── construct.json
|
|
324
411
|
│ | ├── rank1
|
|
325
412
|
| | | ├── dump_tensor_data
|
|
326
413
|
| | | | └── ...
|
|
@@ -333,12 +420,12 @@ if __name__ == "__main__":
|
|
|
333
420
|
│ ├── step1
|
|
334
421
|
│ | ├── ...
|
|
335
422
|
│ ├── step2
|
|
336
|
-
```
|
|
423
|
+
```
|
|
337
424
|
* `rank`:设备 ID,每张卡的数据保存在对应的 `rank{ID}` 目录下。非分布式场景下没有 rank ID,目录名称为 rank。
|
|
338
425
|
* `dump_tensor_data`:保存采集到的张量数据。
|
|
339
|
-
* `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-
|
|
426
|
+
* `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文件)。
|
|
340
427
|
* `stack.json`:API/Module的调用栈信息。
|
|
341
|
-
* `construct.json`:分层分级结构,level为L1时,construct.json内容为空。
|
|
428
|
+
* `construct.json`:分层分级结构,level为L1时,construct.json内容为空。
|
|
342
429
|
|
|
343
430
|
|
|
344
431
|
dump 过程中,pt 文件在对应算子或者模块被执行后就会落盘,而 json 文件则需要在正常执行 PrecisionDebugger.stop() 后才会写入完整数据,异常的程序终止会保存终止前被执行算子的相关 npy 文件,可能会导致 json 文件中数据丢失。
|
|
@@ -28,31 +28,33 @@ msprobe 工具通过在训练脚本中添加 `PrecisionDebugger` 接口并启动
|
|
|
28
28
|
|
|
29
29
|
dump 的"tensor"模式采集数据量大小,可以参考[数据量基线](data_dump_MindSpore/data_dump_MindSpore_baseline.md)。
|
|
30
30
|
|
|
31
|
-
## 5. 场景介绍
|
|
31
|
+
## 5. 场景介绍
|
|
32
32
|
|
|
33
|
-
### 5.1 静态图场景
|
|
34
|
-
在静态图场景下,msprobe 仅支持 **L2 Level**
|
|
33
|
+
### 5.1 静态图场景
|
|
34
|
+
在静态图场景下,msprobe 仅支持 **L2 Level** 的数据采集,且当 MindSpore 版本高于 2.5.0 时,必须使用编包时添加了`--include-mod=adump`选项的 mindstudio-probe whl 包进行 msprobe 工具安装。
|
|
35
35
|
- **L2 Level(Kernel 级)** :采集底层算子的输入输出数据,适用于深入分析算子级别的精度问题。
|
|
36
36
|
|
|
37
37
|
采集方式请参见[示例代码 > 静态图场景](#71-静态图场景)。详细介绍请参见[《config.json 配置文件介绍》](./02.config_introduction.md#11-通用配置)中的“level 参数”和[《config.json 配置示例》](./03.config_examples.md#2-mindspore-静态图场景) 中的“MindSpore 静态图场景”。
|
|
38
38
|
|
|
39
|
-
### 5.2 动态图场景
|
|
40
|
-
在动态图场景下,msprobe 支持 **L0** 、**L1** 、**mix** 、**L2 Level** 的数据采集,具体分为以下几种情况:
|
|
41
|
-
- **使用高阶 API(如 `Model 高阶API`)** :
|
|
39
|
+
### 5.2 动态图场景
|
|
40
|
+
在动态图场景下,msprobe 支持 **L0** 、**L1** 、**mix** 、**L2 Level**、 **debug** 的数据采集,具体分为以下几种情况:
|
|
41
|
+
- **使用高阶 API(如 `Model 高阶API`)** :
|
|
42
42
|
- 需要使用 `MsprobeStep` 回调类来控制数据采集的启停,适用于 **L0** 、**L1** 、**mix** 、**L2** 数据采集。
|
|
43
|
-
|
|
44
|
-
- **未使用高阶 API** :
|
|
43
|
+
|
|
44
|
+
- **未使用高阶 API** :
|
|
45
45
|
- 手动在训练循环中调用 `start`、`stop`、`step` 等接口,适用于 **L0** 、**L1** 、**mix** 、**L2** 数据采集。
|
|
46
46
|
|
|
47
47
|
采集方式请参见[示例代码 > 动态图场景](#72-动态图场景)。
|
|
48
48
|
|
|
49
|
-
> **注意** :动态图模式下,使用 `PSJit` 或 `PIJit` 装饰的部分实际以静态图模式执行,此时的 **Kernel 级(L2 Level)** 数据采集方式与静态图场景相同。
|
|
49
|
+
> **注意** :动态图模式下,使用 `PSJit` 或 `PIJit` 装饰的部分实际以静态图模式执行,此时的 **Kernel 级(L2 Level)** 数据采集方式与静态图场景相同。
|
|
50
50
|
- **L0 Level(Cell 级)** :采集 `Cell` 对象的数据,适用于需要分析特定网络模块的情况。
|
|
51
|
-
|
|
51
|
+
|
|
52
52
|
- **L1 Level(API 级)** :采集 MindSpore API 的输入输出数据,适用于定位 API 层面的精度问题。
|
|
53
53
|
|
|
54
54
|
- **mix(模块级 + API 级)** :在 `L0` 和 `L1` 级别的基础上同时采集模块级和 API 级数据,适用于需要分析模块和 API 层面精度问题的场景。
|
|
55
55
|
|
|
56
|
+
- **debug level (单点保存)**:单点保存网络中变量的正反向数据,适用于用户熟悉网络结构的场景。
|
|
57
|
+
|
|
56
58
|
|
|
57
59
|
详细介绍请参见[《config.json 配置文件介绍》](./02.config_introduction.md#11-通用配置)中的“level 参数”和[《config.json 配置示例》](./03.config_examples.md#3-mindspore-动态图场景) 中的“MindSpore 动态图场景”。
|
|
58
60
|
|
|
@@ -88,13 +90,15 @@ start(model=None)
|
|
|
88
90
|
|
|
89
91
|
**参数说明**:
|
|
90
92
|
|
|
91
|
-
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 数据。
|
|
92
94
|
|
|
93
95
|
#### 6.1.2 stop
|
|
94
96
|
|
|
95
97
|
**功能说明**:停止精度数据采集。在 **start** 函数之后的任意位置添加。若 **stop** 函数添加在反向计算代码之后,则会采集 **start** 和该函数之间的前反向数据。
|
|
96
|
-
若 **stop** 函数添加在反向计算代码之前,则需要将 **step** 函数添加到反向计算代码之后,才能采集 **start** 和该函数之间的前反向数据。
|
|
97
|
-
|
|
98
|
+
若 **stop** 函数添加在反向计算代码之前,则需要将 [**step**](#613-step) 函数添加到反向计算代码之后,才能采集 **start** 和该函数之间的前反向数据。
|
|
99
|
+
**仅未使用 Model 高阶 API 的动态图场景支持。**
|
|
100
|
+
|
|
101
|
+
**注意**:**stop** 函数必须调用,否则可能导致精度数据落盘不全。
|
|
98
102
|
|
|
99
103
|
**原型**:
|
|
100
104
|
|
|
@@ -128,7 +132,39 @@ step()
|
|
|
128
132
|
forward_backward_dump_end()
|
|
129
133
|
```
|
|
130
134
|
|
|
131
|
-
|
|
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, tuple, torch.tensor, int, float, str | 是 |
|
|
148
|
+
| name | 指定的名称 | str | 是 |
|
|
149
|
+
| save_backward | 是否保存反向数据 | boolean | 否 |
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
#### 6.1.6 set_init_step
|
|
153
|
+
|
|
154
|
+
**功能说明**:设置起始step数,step数默认从0开始计数,使用该接口后step从指定值开始计数。该函数需要写在训练迭代的循环开始前,不能写在循环内。。
|
|
155
|
+
|
|
156
|
+
**原型**:
|
|
157
|
+
|
|
158
|
+
```Python
|
|
159
|
+
set_init_step(step)
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
**参数说明**:
|
|
163
|
+
|
|
164
|
+
1.step: 指定的起始step数。
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
### 6.2 msprobe.mindspore.MsprobeStep
|
|
132
168
|
|
|
133
169
|
**功能说明**:MindSpore Callback类,自动在每个step开始时调用start()接口,在每个step结束时调用stop()、step()接口。实现使用 Model 高阶 API 的动态图场景下 L0、L1、mix 级别的精度数据采集控制,控制粒度为单个 **Step** ,而 PrecisionDebugger.start, PrecisionDebugger.stop 接口的控制粒度任意训练代码段。
|
|
134
170
|
|
|
@@ -142,7 +178,17 @@ MsprobeStep(debugger)
|
|
|
142
178
|
|
|
143
179
|
1. debugger:PrecisionDebugger对象。
|
|
144
180
|
|
|
145
|
-
### 6.3 msprobe.mindspore.
|
|
181
|
+
### 6.3 msprobe.mindspore.MsprobeInitStep
|
|
182
|
+
|
|
183
|
+
**功能说明**:MindSpore Callback 类,自动获取并设置初始 step 值。仅适用于静态图 O0/O1 模式的断点续训场景。
|
|
184
|
+
|
|
185
|
+
**原型**:
|
|
186
|
+
|
|
187
|
+
```Python
|
|
188
|
+
MsprobeInitStep()
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
### 6.4 msprobe.mindspore.seed_all
|
|
146
192
|
|
|
147
193
|
**功能说明**:用于固定网络中的随机性和开启确定性计算。
|
|
148
194
|
|
|
@@ -159,9 +205,6 @@ seed_all(seed=1234, mode=False, rm_dropout=True)
|
|
|
159
205
|
|
|
160
206
|
3. rm_dropout:控制dropout失效的开关。可配置 True 或 False,默认值:True,非必选。参数示例:rm_dropout=True。该参数设置为 True 后,将会使mindspore.ops.Dropout,mindspore.ops.Dropout2D,mindspore.ops.Dropout3D,mindspore.mint.nn.Dropout和mindspore.mint.nn.functional.dropout失效,以避免因随机dropout造成的网络随机性。建议在采集mindspore数据前开启。注意:通过rm_dropout控制dropout失效或生效需要在初始化Dropout实例前调用才能生效。
|
|
161
207
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
208
|
## 7. 示例代码
|
|
166
209
|
|
|
167
210
|
### 7.1 静态图场景
|
|
@@ -183,7 +226,7 @@ debugger.start()
|
|
|
183
226
|
|
|
184
227
|
#### 7.2.1 L0 ,L1, mix 级别
|
|
185
228
|
|
|
186
|
-
##### 7.2.1.1 未使用 Model 高阶 API
|
|
229
|
+
##### 7.2.1.1 未使用 Model 高阶 API
|
|
187
230
|
|
|
188
231
|
|
|
189
232
|
```python
|
|
@@ -207,7 +250,7 @@ for data, label in data_loader:
|
|
|
207
250
|
debugger.step() # 更新迭代数
|
|
208
251
|
```
|
|
209
252
|
|
|
210
|
-
##### 7.2.1.2 使用 Model 高阶 API
|
|
253
|
+
##### 7.2.1.2 使用 Model 高阶 API
|
|
211
254
|
|
|
212
255
|
|
|
213
256
|
```python
|
|
@@ -231,7 +274,7 @@ trainer.train(1, train_dataset, callbacks=[MsprobeStep(debugger)])
|
|
|
231
274
|
|
|
232
275
|
#### 7.2.2 L2 级别
|
|
233
276
|
|
|
234
|
-
##### 7.2.2.1 未使用 Model 高阶 API
|
|
277
|
+
##### 7.2.2.1 未使用 Model 高阶 API
|
|
235
278
|
|
|
236
279
|
|
|
237
280
|
```python
|
|
@@ -254,7 +297,7 @@ for data, label in data_loader:
|
|
|
254
297
|
```
|
|
255
298
|
|
|
256
299
|
|
|
257
|
-
##### 7.2.2.2 使用 Model 高阶 API
|
|
300
|
+
##### 7.2.2.2 使用 Model 高阶 API
|
|
258
301
|
|
|
259
302
|
|
|
260
303
|
```python
|
|
@@ -281,9 +324,10 @@ trainer.train(1, train_dataset)
|
|
|
281
324
|
|
|
282
325
|
训练结束后,数据将保存在 `dump_path` 指定的目录下。
|
|
283
326
|
|
|
284
|
-
若jit_level=O2,且使用mindstudio-probe发布包或源码编包时添加了`--include-mod=adump`选项,目录结构示例如下:
|
|
327
|
+
若jit_level=O2,MindSpore 版本不低于 2.5.0,且使用mindstudio-probe发布包或源码编包时添加了`--include-mod=adump`选项,目录结构示例如下:
|
|
285
328
|
```
|
|
286
329
|
├── dump_path
|
|
330
|
+
│ ├── acl_dump_{device_id}.json
|
|
287
331
|
│ ├── rank_0
|
|
288
332
|
│ | ├── {timestamp}
|
|
289
333
|
│ | │ ├── step_0
|
|
@@ -307,10 +351,9 @@ trainer.train(1, train_dataset)
|
|
|
307
351
|
**说明**
|
|
308
352
|
1. 若配置文件中指定落盘npy格式,但是实际数据格式不在npy支持范围内(如bf16、int4等),则该tensor会以原始码流落盘,并不会转换为npy格式。
|
|
309
353
|
2. 若原始文件全名长度超过255个字符,则文件基础名会被转换为长度为32位的随机数字字符串,原始文件名与转换后文件名的对应关系会保存在同目录下的`mapping.csv`文件中。
|
|
354
|
+
3. acl_dump_{device_id}.json 为在 Dump 接口调用过程中生成的中间文件,一般情况下无需关注。
|
|
310
355
|
|
|
311
|
-
|
|
312
|
-
其他场景请参见 MindSpore 官方文档中的[数据对象目录](https://www.mindspore.cn/docs/zh-CN/r2.4.0/model_train/debug/dump.html)。
|
|
313
|
-
|
|
356
|
+
其他场景下,除 kernel_kbyk_dump.json(jit_level=O0/O1)、kernel_graph_dump.json(jit_level=O2)等无需关注的中间文件外的其他 dump 结果文件请参见 MindSpore 官方文档中的[ Ascend 下 O0/O1 模式 Dump 数据对象目录和数据文件介绍](https://www.mindspore.cn/docs/zh-CN/r2.5.0/model_train/debug/dump.html#%E6%95%B0%E6%8D%AE%E5%AF%B9%E8%B1%A1%E7%9B%AE%E5%BD%95%E5%92%8C%E6%95%B0%E6%8D%AE%E6%96%87%E4%BB%B6%E4%BB%8B%E7%BB%8D)与[ Ascend 下 O2 模式 Dump 数据对象目录和数据文件介绍](https://www.mindspore.cn/docs/zh-CN/r2.5.0/model_train/debug/dump.html#%E6%95%B0%E6%8D%AE%E5%AF%B9%E8%B1%A1%E7%9B%AE%E5%BD%95%E5%92%8C%E6%95%B0%E6%8D%AE%E6%96%87%E4%BB%B6%E4%BB%8B%E7%BB%8D-1)。
|
|
314
357
|
### 8.2 动态图场景
|
|
315
358
|
|
|
316
359
|
dump 结果目录结构示例如下:
|
|
@@ -322,14 +365,15 @@ dump 结果目录结构示例如下:
|
|
|
322
365
|
│ | │ ├── dump_tensor_data
|
|
323
366
|
| | | | ├── MintFunctional.relu.0.backward.input.0.npy
|
|
324
367
|
| | | | ├── Mint.abs.0.forward.input.0.npy
|
|
325
|
-
| | | | ├── 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个元素。
|
|
368
|
+
| | | | ├── 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个元素。
|
|
326
369
|
| | | | ├── Tensor.__add__.0.forward.output.0.npy
|
|
327
370
|
| | | | ...
|
|
328
371
|
| | | | ├── Jit.AlexNet.0.forward.input.0.npy
|
|
329
372
|
| | | | ├── Primitive.conv2d.Conv2D.0.forward.input.0.npy
|
|
330
|
-
| | | | ├── Cell.conv1.Conv2D.forward.0.parameters.weight.npy
|
|
331
|
-
| | | | ├── Cell.conv1.Conv2D.parameters_grad.weight.npy
|
|
332
|
-
| | | | └── Cell.relu.ReLU.forward.0.input.0.npy
|
|
373
|
+
| | | | ├── Cell.conv1.Conv2D.forward.0.parameters.weight.npy # 模块参数数据:命名格式为{Cell}.{cell_name}.{class_name}.forward.{调用次数}.parameters.{parameter_name}。
|
|
374
|
+
| | | | ├── Cell.conv1.Conv2D.parameters_grad.weight.npy # 模块参数梯度数据:命名格式为{Cell}.{cell_name}.{class_name}.parameters_grad.{parameter_name}。因为同一模块的参数使用同一梯度进行更新,所以参数梯度文件名不包含调用次数。
|
|
375
|
+
| | | | └── 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
|
+
| | | | # 当dump时传入的model参数为List[mindspore.nn.Cell]或Tuple[mindspore.nn.Cell]时,模块级数据的命名中包含该模块在列表中的索引index,命名格式为{Cell}.{index}.*,*表示以上三种模块级数据的命名格式,例如:Cell.0.relu.ReLU.forward.0.input.0.npy。
|
|
333
377
|
│ | | ├── dump.json
|
|
334
378
|
│ | | ├── stack.json
|
|
335
379
|
│ | | └── construct.json
|
|
@@ -349,9 +393,9 @@ dump 结果目录结构示例如下:
|
|
|
349
393
|
|
|
350
394
|
* `rank`:设备 ID,每张卡的数据保存在对应的 `rank{ID}` 目录下。非分布式场景下没有 rank ID,目录名称为 rank。
|
|
351
395
|
* `dump_tensor_data`:保存采集到的张量数据。
|
|
352
|
-
* `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-
|
|
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-MindSpore场景下的dump.json文件)。
|
|
353
397
|
* `stack.json`:API/Cell的调用栈信息。
|
|
354
|
-
* `construct.json`:分层分级结构,level为L1时,construct.json内容为空。
|
|
398
|
+
* `construct.json`:分层分级结构,level为L1时,construct.json内容为空。
|
|
355
399
|
|
|
356
400
|
dump 过程中,npy 文件在对应API或者模块被执行后就会落盘,而 json 文件则需要在正常执行 PrecisionDebugger.stop() 后才会写入完整数据,因此,程序异常终止时,被执行API对应的 npy 文件已被保存,但 json 文件中的数据可能丢失。
|
|
357
401
|
|
|
@@ -107,7 +107,7 @@ msprobe -f pytorch multi_run_ut -api_info ./dump_path/step{step_number}/rank{ran
|
|
|
107
107
|
| -save_error_data | 保存精度未达标的 API 输入输出数据。 | 否 |
|
|
108
108
|
| -o 或 --out_path | 指定 run_ut 执行结果存盘路径,默认“./”。 | 否 |
|
|
109
109
|
| -j 或 --jit_compile | 开启 jit 编译。 | 否 |
|
|
110
|
-
| -n
|
|
110
|
+
| -n 或 --num_splits | 同时执行 run_ut 线程的数量,默认为 8,最大支持 64,但每个 Device 最大支持 8 个线程。当指定多个线程和多个 Device 时,线程数在每张卡上均分。 | 否 |
|
|
111
111
|
| -d 或 --device | 指定 Device ID,选择 UT 代码运行所在的卡,默认值为 0,支持同时指定 0~7,共 8 个 Device。 | 否 |
|
|
112
112
|
| -csv_path 或 --result_csv_path | 指定本次运行中断时生成的 `accuracy_checking_result_{timestamp}.csv` 文件路径,执行 run_ut 中断时,若想从中断处继续执行,配置此参数即可。需要指定为上次中断的 `accuracy_checking_result_{timestamp}.csv` 文件。详见 [3.3 断点续检](#33-断点续检)。 | run_ut 操作中断后继续执行场景下必须配置 |
|
|
113
113
|
| -f 或 --filter_api | 过滤模型中除最大值和最小值以外其他参数和结构相同的 API。适用于模型较大且重复 API 较多的场景。 | 否 |
|
|
@@ -295,3 +295,13 @@ a:误差比对法指标。
|
|
|
295
295
|
- npu_scaled_masked_softmax
|
|
296
296
|
|
|
297
297
|
- npu_swiglu
|
|
298
|
+
|
|
299
|
+
- npu_apply_adam
|
|
300
|
+
|
|
301
|
+
- npu_group_norm_silu
|
|
302
|
+
|
|
303
|
+
- npu_mish
|
|
304
|
+
|
|
305
|
+
- npu_moe_gating_top_k_softmax
|
|
306
|
+
|
|
307
|
+
- npu_sort_v2
|
|
@@ -60,7 +60,9 @@ Host 与 GPU Host 设备间建立连接,将 NPU 上对应 API 的输入数据
|
|
|
60
60
|
|
|
61
61
|
#### 3.1.3 局域网场景配置示例
|
|
62
62
|
|
|
63
|
-
若采用 TLS1.2 协议加密传输 api 数据,需配置 SSL
|
|
63
|
+
若采用 TLS1.2 协议加密传输 api 数据,需配置 SSL 证书,可参考如下生成自签名证书方法。
|
|
64
|
+
|
|
65
|
+
以下秘钥生成方法仅为简单示例,客户应使用与自己需求相符的秘钥生成和存储机制并保证秘钥安全性与机密性,必要时可采用分层秘钥机制。
|
|
64
66
|
```shell
|
|
65
67
|
# 创建私钥文件server.key
|
|
66
68
|
openssl genrsa -out server.key 2048
|