mindstudio-probe 1.2.2__py3-none-any.whl → 8.1.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.2.dist-info → mindstudio_probe-8.1.0.dist-info}/METADATA +4 -3
- {mindstudio_probe-1.2.2.dist-info → mindstudio_probe-8.1.0.dist-info}/RECORD +243 -191
- msprobe/README.md +57 -21
- msprobe/core/__init__.py +17 -0
- msprobe/core/common/const.py +224 -82
- msprobe/core/common/decorator.py +50 -0
- msprobe/core/common/exceptions.py +5 -3
- msprobe/core/common/file_utils.py +274 -40
- 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 +148 -72
- msprobe/core/common_config.py +7 -0
- msprobe/core/compare/acc_compare.py +640 -462
- msprobe/core/compare/check.py +36 -107
- msprobe/core/compare/compare_cli.py +4 -0
- msprobe/core/compare/config.py +72 -0
- msprobe/core/compare/highlight.py +217 -215
- msprobe/core/compare/layer_mapping/layer_mapping.py +4 -1
- msprobe/core/compare/merge_result/merge_result.py +12 -6
- msprobe/core/compare/multiprocessing_compute.py +227 -107
- msprobe/core/compare/npy_compare.py +32 -16
- msprobe/core/compare/utils.py +218 -244
- msprobe/{mindspore/runtime.py → core/config_check/__init__.py} +2 -4
- 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/{pytorch/parse.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 +239 -0
- msprobe/core/data_dump/data_collector.py +36 -9
- msprobe/core/data_dump/data_processor/base.py +74 -53
- msprobe/core/data_dump/data_processor/mindspore_processor.py +119 -78
- msprobe/core/data_dump/data_processor/pytorch_processor.py +134 -96
- msprobe/core/data_dump/json_writer.py +146 -57
- msprobe/core/debugger/precision_debugger.py +143 -0
- msprobe/core/grad_probe/constant.py +2 -1
- msprobe/core/grad_probe/grad_compare.py +2 -2
- 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/overflow_check/abnormal_scene.py +2 -0
- msprobe/core/service.py +356 -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 +157 -0
- msprobe/docs/01.installation.md +6 -5
- msprobe/docs/02.config_introduction.md +89 -30
- msprobe/docs/03.config_examples.md +1 -0
- msprobe/docs/04.kernel_dump_PyTorch.md +1 -1
- msprobe/docs/05.data_dump_PyTorch.md +184 -50
- msprobe/docs/06.data_dump_MindSpore.md +193 -28
- msprobe/docs/07.accuracy_checker_PyTorch.md +13 -3
- msprobe/docs/08.accuracy_checker_online_PyTorch.md +72 -10
- msprobe/docs/09.accuracy_checker_MindSpore.md +19 -7
- msprobe/docs/10.accuracy_compare_PyTorch.md +266 -102
- msprobe/docs/11.accuracy_compare_MindSpore.md +117 -43
- msprobe/docs/12.overflow_check_PyTorch.md +5 -3
- msprobe/docs/13.overflow_check_MindSpore.md +6 -4
- msprobe/docs/14.data_parse_PyTorch.md +4 -10
- msprobe/docs/17.grad_probe.md +2 -1
- msprobe/docs/18.online_dispatch.md +3 -3
- msprobe/docs/19.monitor.md +211 -103
- msprobe/docs/21.visualization_PyTorch.md +100 -28
- msprobe/docs/22.visualization_MindSpore.md +103 -31
- msprobe/docs/23.generate_operator_PyTorch.md +9 -9
- 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 +278 -8
- msprobe/docs/28.debugger_save_instruction.md +111 -20
- msprobe/docs/28.kernel_dump_MindSpore.md +1 -1
- msprobe/docs/29.data_dump_MSAdapter.md +229 -0
- msprobe/docs/30.overflow_check_MSAdapter.md +31 -0
- msprobe/docs/31.config_check.md +95 -0
- msprobe/docs/32.ckpt_compare.md +69 -0
- msprobe/docs/33.generate_operator_MindSpore.md +190 -0
- msprobe/docs/34.RL_collect.md +92 -0
- msprobe/docs/35.nan_analyze.md +72 -0
- msprobe/docs/FAQ.md +3 -11
- 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/merge_result.png +0 -0
- msprobe/docs/img/save_compare_result_sample.png +0 -0
- msprobe/docs/img/visualization/proxy.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 +3 -3
- msprobe/mindspore/api_accuracy_checker/api_accuracy_checker.py +151 -55
- msprobe/mindspore/api_accuracy_checker/api_runner.py +25 -11
- msprobe/mindspore/api_accuracy_checker/base_compare_algorithm.py +2 -1
- msprobe/mindspore/api_accuracy_checker/bench_functions/flash_attention_score.py +580 -0
- msprobe/mindspore/api_accuracy_checker/bench_functions/fusion_operator.py +41 -0
- msprobe/mindspore/api_accuracy_checker/cmd_parser.py +4 -0
- msprobe/mindspore/api_accuracy_checker/data_manager.py +4 -3
- msprobe/mindspore/api_accuracy_checker/generate_op_script/config_op.json +9 -0
- msprobe/mindspore/api_accuracy_checker/generate_op_script/op_generator.py +451 -0
- msprobe/mindspore/api_accuracy_checker/generate_op_script/operator_replication.template +2081 -0
- msprobe/mindspore/api_accuracy_checker/multi_api_accuracy_checker.py +11 -1
- 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 +73 -2
- msprobe/mindspore/common/utils.py +157 -29
- msprobe/mindspore/compare/common_dir_compare.py +382 -0
- msprobe/mindspore/compare/distributed_compare.py +2 -26
- msprobe/mindspore/compare/ms_compare.py +18 -398
- msprobe/mindspore/compare/ms_graph_compare.py +20 -10
- msprobe/mindspore/compare/utils.py +37 -0
- msprobe/mindspore/debugger/debugger_config.py +59 -7
- msprobe/mindspore/debugger/precision_debugger.py +83 -90
- msprobe/mindspore/dump/cell_dump_process.py +902 -0
- msprobe/mindspore/dump/cell_dump_with_insert_gradient.py +889 -0
- msprobe/mindspore/dump/dump_tool_factory.py +18 -8
- 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 +176 -0
- msprobe/mindspore/dump/hook_cell/hook_cell.py +22 -12
- 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 +42 -26
- msprobe/mindspore/dump/jit_dump.py +35 -27
- 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 -16
- msprobe/mindspore/free_benchmark/api_pynative_self_check.py +22 -12
- msprobe/mindspore/free_benchmark/common/utils.py +1 -1
- 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 +9 -2
- msprobe/mindspore/grad_probe/grad_analyzer.py +2 -1
- msprobe/mindspore/grad_probe/grad_stat_csv.py +3 -2
- msprobe/mindspore/grad_probe/hook.py +2 -4
- msprobe/mindspore/mindspore_service.py +111 -0
- msprobe/mindspore/monitor/common_func.py +52 -0
- msprobe/mindspore/monitor/data_writers.py +237 -0
- msprobe/mindspore/monitor/distributed/wrap_distributed.py +1 -1
- msprobe/mindspore/monitor/features.py +13 -1
- msprobe/mindspore/monitor/module_hook.py +568 -444
- msprobe/mindspore/monitor/optimizer_collect.py +331 -0
- msprobe/mindspore/monitor/utils.py +71 -9
- msprobe/mindspore/ms_config.py +16 -15
- msprobe/mindspore/overflow_check/overflow_check_tool_factory.py +5 -3
- 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/api_precision_compare.py +3 -6
- msprobe/pytorch/api_accuracy_checker/compare/compare.py +36 -34
- msprobe/pytorch/api_accuracy_checker/generate_op_script/op_generator.py +15 -13
- msprobe/pytorch/api_accuracy_checker/generate_op_script/operator_replication.template +206 -4
- msprobe/pytorch/api_accuracy_checker/run_ut/multi_run_ut.py +9 -9
- msprobe/pytorch/api_accuracy_checker/run_ut/run_overflow_check.py +6 -5
- msprobe/pytorch/api_accuracy_checker/run_ut/run_ut.py +31 -9
- msprobe/pytorch/api_accuracy_checker/run_ut/run_ut_utils.py +28 -20
- msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/attl.py +3 -1
- 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 +154 -0
- msprobe/pytorch/attl_manager.py +65 -0
- msprobe/pytorch/bench_functions/moe_gating_top_k_softmax.py +6 -0
- msprobe/pytorch/bench_functions/npu_fusion_attention.py +27 -0
- msprobe/pytorch/common/utils.py +53 -19
- 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 +50 -96
- msprobe/pytorch/dump/module_dump/hook_wrapper.py +93 -0
- msprobe/pytorch/dump/module_dump/module_dump.py +15 -61
- msprobe/pytorch/dump/module_dump/module_processer.py +150 -114
- 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 +1 -1
- msprobe/pytorch/grad_probe/grad_monitor.py +2 -2
- msprobe/pytorch/grad_probe/grad_stat_csv.py +3 -2
- msprobe/pytorch/hook_module/api_register.py +155 -0
- msprobe/pytorch/hook_module/hook_module.py +18 -22
- msprobe/pytorch/hook_module/jit_script_wrapper.py +33 -0
- msprobe/pytorch/hook_module/pt_hook_manager.py +68 -0
- msprobe/pytorch/hook_module/register_optimizer_hook.py +2 -1
- msprobe/pytorch/hook_module/support_wrap_ops.yaml +193 -75
- msprobe/pytorch/hook_module/utils.py +28 -2
- msprobe/pytorch/monitor/csv2tb.py +14 -4
- msprobe/pytorch/monitor/data_writers.py +259 -0
- msprobe/pytorch/monitor/distributed/wrap_distributed.py +8 -2
- msprobe/pytorch/monitor/module_hook.py +336 -241
- msprobe/pytorch/monitor/module_metric.py +17 -0
- msprobe/pytorch/monitor/optimizer_collect.py +244 -224
- msprobe/pytorch/monitor/utils.py +84 -4
- msprobe/pytorch/online_dispatch/compare.py +0 -2
- msprobe/pytorch/online_dispatch/dispatch.py +13 -2
- msprobe/pytorch/online_dispatch/dump_compare.py +8 -2
- 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 +5 -4
- msprobe/pytorch/pt_config.py +16 -11
- msprobe/pytorch/pytorch_service.py +70 -0
- msprobe/visualization/builder/graph_builder.py +69 -10
- msprobe/visualization/builder/msprobe_adapter.py +24 -12
- msprobe/visualization/compare/graph_comparator.py +63 -51
- msprobe/visualization/compare/mode_adapter.py +22 -20
- msprobe/visualization/graph/base_node.py +11 -4
- msprobe/visualization/graph/distributed_analyzer.py +1 -10
- msprobe/visualization/graph/graph.py +2 -13
- msprobe/visualization/graph/node_op.py +1 -2
- msprobe/visualization/graph_service.py +251 -104
- msprobe/visualization/utils.py +26 -44
- msprobe/mindspore/dump/hook_cell/api_registry.py +0 -207
- msprobe/mindspore/dump/hook_cell/wrap_api.py +0 -212
- msprobe/mindspore/dym_loader/hook_dynamic_loader.cc +0 -140
- msprobe/mindspore/monitor/anomaly_detect.py +0 -404
- msprobe/mindspore/monitor/module_spec_verifier.py +0 -94
- msprobe/mindspore/service.py +0 -543
- msprobe/pytorch/hook_module/api_registry.py +0 -166
- msprobe/pytorch/hook_module/wrap_distributed.py +0 -79
- 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
- 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 -470
- {mindstudio_probe-1.2.2.dist-info → mindstudio_probe-8.1.0.dist-info}/LICENSE +0 -0
- {mindstudio_probe-1.2.2.dist-info → mindstudio_probe-8.1.0.dist-info}/WHEEL +0 -0
- {mindstudio_probe-1.2.2.dist-info → mindstudio_probe-8.1.0.dist-info}/entry_points.txt +0 -0
- {mindstudio_probe-1.2.2.dist-info → mindstudio_probe-8.1.0.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
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
# MSAdapter 场景的精度数据采集
|
|
2
|
+
|
|
3
|
+
MSAdapter 是一款 MindSpore 生态适配工具,可以将 PyTorch 训练脚本高效迁移至 MindSpore 框架执行,以实现在不改变原有 PyTorch 用户开发习惯的情况下,使得 PyTorch 代码能在昇腾上获得高效性能。
|
|
4
|
+
|
|
5
|
+
msprobe 工具主要通过在训练脚本内添加 dump 接口、启动训练的方式采集精度数据。
|
|
6
|
+
|
|
7
|
+
本工具提供固定的 API 支持列表,若需要删除或增加 dump 的 API,可以在 msprobe/pytorch/hook_module/support_wrap_ops.yaml 文件内手动修改,如下示例:
|
|
8
|
+
|
|
9
|
+
```yaml
|
|
10
|
+
functional: # functional为算子类别,找到对应的类别,在该类别下按照下列格式删除或添加API
|
|
11
|
+
- conv1d
|
|
12
|
+
- conv2d
|
|
13
|
+
- conv3d
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
删除 API 的场景:部分模型代码逻辑会存在 API 原生类型校验,工具执行dump操作时,对封装后的模型 API 可能与模型的原生 API 类型不一致,此时可能引发校验失败,详见《[FAQ](FAQ.md#33-异常情况)》中“异常情况”的第10和11条。
|
|
17
|
+
|
|
18
|
+
## 1. 工具安装
|
|
19
|
+
|
|
20
|
+
请参见[《msprobe 工具安装指南》](./01.installation.md)。
|
|
21
|
+
|
|
22
|
+
## 2 接口介绍
|
|
23
|
+
|
|
24
|
+
### 2.1 msprobe.mindspore.PrecisionDebugger
|
|
25
|
+
|
|
26
|
+
**功能说明**:通过加载 dump 配置文件的方式来确定 dump 操作的详细配置。
|
|
27
|
+
|
|
28
|
+
**原型**:
|
|
29
|
+
|
|
30
|
+
```Python
|
|
31
|
+
PrecisionDebugger(config_path=None, task=None, dump_path=None, level=None, step=None)
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
**参数说明**:
|
|
35
|
+
|
|
36
|
+
1. config_path:指定 dump 配置文件路径,string 类型。参数示例:"./config.json"。未配置该路径时,默认使用 [config.json](../config.json) 文件的默认配置,配置选项含义可见 [config.json 介绍](./02.config_introduction.md)。
|
|
37
|
+
|
|
38
|
+
2. 其他参数与 [config.json](../config.json) 文件中的同名配置字段含义相同,具体可见 [config.json 介绍](./02.config_introduction.md)。当参数值非None时,优先级高于 [config.json](../config.json) 文件中的同名配置。
|
|
39
|
+
|
|
40
|
+
#### 2.1.1 start
|
|
41
|
+
|
|
42
|
+
**功能说明**:启动精度数据采集。需要与 [**stop**](#212-stop) 接口一起添加在训练迭代的 for 循环内。
|
|
43
|
+
|
|
44
|
+
**原型**:
|
|
45
|
+
|
|
46
|
+
```Python
|
|
47
|
+
start(model=None)
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
**参数说明**:
|
|
51
|
+
|
|
52
|
+
1. model:指定需要采集 Module 级数据的模型,支持传入 torch.nn.Module、list[torch.nn.Module]或Tuple[torch.nn.Module] 类型,默认未配置。level 配置为 "L0" 或 "mix" 时,必须在该接口中配置该参数。API级别("L1" level)dump 时,传入 model 可以采集 model 内包含 primitive op 对象在内的所有 API 数据,若不传入 model 参数,则只采集非 primitive op 的 API 数据。
|
|
53
|
+
|
|
54
|
+
#### 2.1.2 stop
|
|
55
|
+
|
|
56
|
+
**功能说明**:停止精度数据采集。在 **start** 接口调用之后的任意位置添加。若 **stop** 接口添加在反向计算代码之后,则会采集 **start** 和该接口之间的前反向数据。
|
|
57
|
+
若 **stop** 接口添加在反向计算代码之前,则需要将 [**step**](#213-step) 接口添加到反向计算代码之后,才能采集 **start** 和该接口之间的前反向数据。
|
|
58
|
+
|
|
59
|
+
**注意**:**stop** 接口必须调用,否则可能导致精度数据落盘不全。
|
|
60
|
+
|
|
61
|
+
**原型**:
|
|
62
|
+
|
|
63
|
+
```Python
|
|
64
|
+
stop()
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
#### 2.1.3 step
|
|
68
|
+
|
|
69
|
+
**功能说明**:进行训练 step 数的自增,完成当前 step 所有数据的落盘并更新 dump 参数。在一个 step 训练结束的位置添加,且必须在 **stop** 接口之后的位置调用。该接口需要配合 **start** 和 **stop** 函数使用,尽量添加在反向计算代码之后,否则可能会导致反向数据丢失。
|
|
70
|
+
|
|
71
|
+
**原型**:
|
|
72
|
+
|
|
73
|
+
```Python
|
|
74
|
+
step()
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
#### 2.1.4 forward_backward_dump_end
|
|
78
|
+
|
|
79
|
+
**功能说明**:停止精度数据采集。与 **stop** 接口功能相同,该函数在将来会被移除,建议使用 **stop** 接口。
|
|
80
|
+
|
|
81
|
+
**原型**:
|
|
82
|
+
|
|
83
|
+
```Python
|
|
84
|
+
forward_backward_dump_end()
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
#### 2.1.5 save
|
|
88
|
+
|
|
89
|
+
**功能说明**:单点保存网络执行过程中正反向数值,并以统计值/张量文件落盘。
|
|
90
|
+
|
|
91
|
+
**原型**:
|
|
92
|
+
```python
|
|
93
|
+
save(variable, name, save_backward=True)
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
**参数说明**:
|
|
97
|
+
| 参数名称 | 参数含义 | 支持数据类型 | 是否必选|
|
|
98
|
+
| ---------- | ------------------| ------------------- | ------------------- |
|
|
99
|
+
| variable | 需要保存的变量 |dict, list, tuple, torch.tensor, int, float, str | 是 |
|
|
100
|
+
| name | 指定的名称 | str | 是 |
|
|
101
|
+
| save_backward | 是否保存反向数据 | boolean | 否 |
|
|
102
|
+
|
|
103
|
+
### 2.2 msprobe.mindspore.seed_all
|
|
104
|
+
|
|
105
|
+
**功能说明**:用于固定网络中的随机性和开启确定性计算。
|
|
106
|
+
|
|
107
|
+
**原型**:
|
|
108
|
+
```python
|
|
109
|
+
seed_all(seed=1234, mode=False, rm_dropout=True)
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
**参数说明**:
|
|
113
|
+
|
|
114
|
+
1. seed: 随机性种子,默认值:1234,非必选。参数示例: seed=1000。该参数用于 random、numpy.random, mindspore.common.Initializer、mindspore.nn.probability.distribution的随机数生成以及 Python 中 str、bytes、datetime 对象的 hash 算法。
|
|
115
|
+
|
|
116
|
+
2. mode:确定性计算使能,可配置 True 或 False,默认值:False,非必选。参数示例:mode=True。该参数设置为 True 后,将会开启算子确定性运行模式与归约类通信算子(AllReduce、ReduceScatter、Reduce)的确定性计算。注意:确定性计算会导致 API 执行性能降低,建议在发现模型多次执行结果不同的情况下开启。
|
|
117
|
+
|
|
118
|
+
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 造成的网络随机性。建议在采集数据前调用。
|
|
119
|
+
|
|
120
|
+
**注意**:通过 rm_dropout 控制 dropout 失效或生效需要在初始化 Dropout 实例前调用才能生效。
|
|
121
|
+
|
|
122
|
+
## 3 示例代码
|
|
123
|
+
|
|
124
|
+
以下为添加了 msprobe 工具 dump 接口的示例训练脚本。
|
|
125
|
+
|
|
126
|
+
```python
|
|
127
|
+
import mindspore as ms
|
|
128
|
+
import torch
|
|
129
|
+
import torch.nn as nn
|
|
130
|
+
import torch.nn.functional as F
|
|
131
|
+
|
|
132
|
+
# 导入工具的数据采集接口
|
|
133
|
+
from msprobe.mindspore import PrecisionDebugger
|
|
134
|
+
|
|
135
|
+
# 在模型训练开始前实例化PrecisionDebugger
|
|
136
|
+
debugger = PrecisionDebugger(config_path='./config.json')
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
# 定义网络
|
|
140
|
+
class Net(nn.Module):
|
|
141
|
+
def __init__(self) -> None:
|
|
142
|
+
super().__init__()
|
|
143
|
+
self.linear1 = nn.Linear(in_features=8, out_features=4)
|
|
144
|
+
self.linear2 = nn.Linear(in_features=4, out_features=2)
|
|
145
|
+
|
|
146
|
+
def forward(self, x):
|
|
147
|
+
x1 = self.linear1(x)
|
|
148
|
+
x2 = self.linear2(x1)
|
|
149
|
+
logits = F.relu(x2)
|
|
150
|
+
return logits
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
net = Net()
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
def train_step(inputs):
|
|
157
|
+
return net(inputs)
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
if __name__ == "__main__":
|
|
161
|
+
data = (torch.randn(10, 8), torch.randn(10, 8), torch.randn(10, 8))
|
|
162
|
+
grad_fn = ms.value_and_grad(train_step, grad_position=0)
|
|
163
|
+
|
|
164
|
+
for inputs in data:
|
|
165
|
+
# 开启数据 dump
|
|
166
|
+
debugger.start(model=net)
|
|
167
|
+
|
|
168
|
+
out, grad = grad_fn(inputs)
|
|
169
|
+
|
|
170
|
+
# 停止数据 dump
|
|
171
|
+
debugger.stop()
|
|
172
|
+
# 更新 step 信息
|
|
173
|
+
debugger.step()
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
## 4 dump 结果文件介绍
|
|
177
|
+
|
|
178
|
+
训练结束后,工具将 dump 的数据保存在 dump_path 参数指定的目录下。目录结构示例如下:
|
|
179
|
+
|
|
180
|
+
```lua
|
|
181
|
+
├── dump_path
|
|
182
|
+
│ ├── step0
|
|
183
|
+
│ | ├── rank0
|
|
184
|
+
│ | │ ├── dump_tensor_data
|
|
185
|
+
| | | | ├── Tensor.permute.1.forward.npy
|
|
186
|
+
| | | | ├── Functional.linear.5.backward.output.npy # 命名格式为{api_type}.{api_name}.{API调用次数}.{forward/backward}.{input/output}.{参数序号}, 其中,“参数序号”表示该API的第n个输入或输出,例如1,则为第一个参数,若该参数为list格式,则根据list继续排序,例如1.1,表示该API的第1个参数的第1个元素。
|
|
187
|
+
| | | | ...
|
|
188
|
+
| | | | ├── Module.conv1.Conv2d.forward.0.input.0.npy # 命名格式为{Module}.{module_name}.{class_name}.{forward/backward}.{调用次数}.{input/output}.{参数序号}, 其中,“参数序号”表示该Module的第n个参数,例如1,则为第一个参数,若该参数为list格式,则根据list继续排序,例如1.1,表示该Module的第1个参数的第1个元素。
|
|
189
|
+
| | | | ├── Module.conv1.Conv2D.forward.0.parameters.bias.npy # 模块参数数据:命名格式为{Module}.{module_name}.{class_name}.forward.{调用次数}.parameters.{parameter_name}。
|
|
190
|
+
| | | | └── Module.conv1.Conv2D.parameters_grad.weight.npy # 模块参数梯度数据:命名格式为{Module}.{module_name}.{class_name}.parameters_grad.{parameter_name}。因为同一模块的参数使用同一梯度进行更新,所以参数梯度文件名不包含调用次数。
|
|
191
|
+
| | | | # 当dump时传入的model参数为List[torch.nn.Module]或Tuple[torch.nn.Module]时,模块级数据的命名中包含该模块在列表中的索引index,命名格式为{Module}.{index}.*,*表示以上三种模块级数据的命名格式,例如:Module.0.conv1.Conv2d.forward.0.input.0.npy。
|
|
192
|
+
│ | | ├── dump.json
|
|
193
|
+
│ | | ├── stack.json
|
|
194
|
+
│ | | └── construct.json
|
|
195
|
+
│ | ├── rank1
|
|
196
|
+
| | | ├── dump_tensor_data
|
|
197
|
+
| | | | └── ...
|
|
198
|
+
│ | | ├── dump.json
|
|
199
|
+
│ | | ├── stack.json
|
|
200
|
+
| | | └── construct.json
|
|
201
|
+
│ | ├── ...
|
|
202
|
+
│ | |
|
|
203
|
+
| | └── rank7
|
|
204
|
+
│ ├── step1
|
|
205
|
+
│ | ├── ...
|
|
206
|
+
│ ├── step2
|
|
207
|
+
```
|
|
208
|
+
* `rank`:设备 ID,每张卡的数据保存在对应的 `rank{ID}` 目录下。非分布式场景下没有 rank ID,目录名称为 rank。
|
|
209
|
+
* `dump_tensor_data`:保存采集到的张量数据。
|
|
210
|
+
* `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#3-msadapter-场景下的-dumpjson-文件)。
|
|
211
|
+
* `stack.json`:API/Module 的调用栈信息。
|
|
212
|
+
* `construct.json`:分层分级结构,level 为 L1 时,construct.json 内容为空。
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
当 task 为 tensor 时,dump 过程中,npy 文件在对应算子或者模块被执行后就会落盘,而 json 文件则需要在正常执行 PrecisionDebugger.stop() 后才会写入完整数据。因此如果程序异常终止,终止前被执行算子的相关 npy 文件得以保存,但 json 文件中的数据可能丢失。
|
|
216
|
+
|
|
217
|
+
其中 rank 为设备上各卡的 ID,每张卡上 dump 的数据会生成对应 dump 目录。非分布式场景下没有 rank ID,目录名称为 rank。
|
|
218
|
+
|
|
219
|
+
npy 文件名的前缀含义如下:
|
|
220
|
+
|
|
221
|
+
| 前缀 | 含义 |
|
|
222
|
+
| ----------- | ---------------------------- |
|
|
223
|
+
| Tensor | torch.Tensor API数据 |
|
|
224
|
+
| Torch | torch API数据 |
|
|
225
|
+
| Functional | torch.nn.functional API数据 |
|
|
226
|
+
| NPU | NPU 亲和API数据 |
|
|
227
|
+
| Distributed | torch.distributed API数据 |
|
|
228
|
+
| Jit | 被 "jit" 装饰的模块或函数数据 |
|
|
229
|
+
| Module | torch.nn.Module 类(模块)数据 |
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# MSAdapter 场景的溢出检测
|
|
2
|
+
|
|
3
|
+
msprobe 工具提供 MSAdapter 场景下的溢出检测功能。其检测对象为 **API** 级别(除 Primitive 和 Jit 类 API)或**模块**级别,分别对应 config.json 配置中的 **"L1"** 、**"L0"** level。
|
|
4
|
+
|
|
5
|
+
需要注意,本工具仅支持在 INF/NAN 模式<sup>a</sup>下进行溢出检测。INF/NAN 模式的使能方式如下:
|
|
6
|
+
|
|
7
|
+
```Shell
|
|
8
|
+
# 使能 CANN 侧 INF/NAN 模式
|
|
9
|
+
export INF_NAN_MODE_ENABLE=1
|
|
10
|
+
# 使能 MindSpore 框架侧 INF/NAN 模式
|
|
11
|
+
export MS_ASCEND_CHECK_OVERFLOW_MODE="INFNAN_MODE"
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
**a**:在处理浮点数计算溢出问题时,NPU 当前支持两种溢出模式:INF/NAN 模式与饱和模式。INF/NAN 模式遵循 IEEE 754 标准,根据定义输出 INF/NAN 的计算结果。与之对应的饱和模式在计算出现溢出时,饱和为浮点数极值(+-MAX)。对于 CANN 侧配置,Atlas 训练系列产品,默认为饱和模式,且不支持使用 INF/NAN 模式;Atlas A2训练系列产品,默认为 INF/NAN 模式,且不建议使用饱和模式。对于 MindSpore 框架侧配置,仅支持对 Atlas A2 训练系列产品进行设置,默认为 INF/NAN 模式。CANN 侧 与 MindSpore 框架侧配置须一致。
|
|
15
|
+
|
|
16
|
+
溢出检测任务的配置示例见["**MindSpore 动态图场景 task 配置为 overflow_check**"](./03.config_examples.md#33-task-配置为-overflow_check)小节。
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
## 1 接口介绍
|
|
20
|
+
|
|
21
|
+
溢出检测功能提供的接口与数据采集任务一致,详见 MSAdapter 场景的精度数据采集中的["**2 接口介绍**"](./29.data_dump_MSAdapter.md#2-接口介绍)小节。
|
|
22
|
+
|
|
23
|
+
需要注意,目前暂不支持 "L1" level 下 primitive op 的溢出检测。
|
|
24
|
+
|
|
25
|
+
## 2 示例代码
|
|
26
|
+
|
|
27
|
+
溢出检测功能使用方式与数据采集任务一致,详见 MSAdapter 场景的精度数据采集中的["**3 示例代码**"](./29.data_dump_MSAdapter.md#3-示例代码)小节。
|
|
28
|
+
|
|
29
|
+
## 3 溢出检测结果文件介绍
|
|
30
|
+
|
|
31
|
+
溢出检测结果文件目录结构与含义与数据采集任务一致,但仅保存溢出 API 或 模块 的真实数据或统计信息。详见 MSAdapter 场景的精度数据采集中的["**4 dump 结果文件介绍**"](./29.data_dump_MSAdapter.md#4-dump-结果文件介绍)小节。
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# config check
|
|
2
|
+
|
|
3
|
+
## 介绍
|
|
4
|
+
|
|
5
|
+
该工具主要适用于对比两个环境下可能影响训练精度的配置差异,支持mindspore和pytorch两个框架,包括:
|
|
6
|
+
|
|
7
|
+
- 环境变量
|
|
8
|
+
- 三方库版本
|
|
9
|
+
- 训练超参
|
|
10
|
+
- 权重
|
|
11
|
+
- 数据集
|
|
12
|
+
- 随机操作
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
## 安装教程
|
|
16
|
+
|
|
17
|
+
参见 msprobe [安装教程](./01.installation.md)
|
|
18
|
+
|
|
19
|
+
## 使用说明
|
|
20
|
+
|
|
21
|
+
用户需要在两个待比对的训练的环境上分别进行数据采集, 工具会采集两个环境下影响精度的配置,采集结果上传到同一机器进行比对。
|
|
22
|
+
|
|
23
|
+
### 数据采集
|
|
24
|
+
|
|
25
|
+
#### 静态数据采集
|
|
26
|
+
|
|
27
|
+
静态数据采集仅支持环境变量,三方库版本及训练超参采集,其中环境变量,三方库版本默认采集,训练超参采集需要用户传入启动训练的 shell 脚本路径或 yaml 配置文件,
|
|
28
|
+
支持多个输入,不传入表示不采集。
|
|
29
|
+
|
|
30
|
+
启动命令如下
|
|
31
|
+
```shell
|
|
32
|
+
msprobe -f pytorch/mindspore config_check -d **.sh **.yaml -o output_path
|
|
33
|
+
```
|
|
34
|
+
-f 代表训练框架,传入pytorch或mindspore,必选。
|
|
35
|
+
|
|
36
|
+
-d 代表数据采集模式,可传入启动训练的 shell 脚本路径或 yaml 配置文件路径,可选,不传入代表不采集。
|
|
37
|
+
|
|
38
|
+
-o 代表输出路径,可选,默认为 config_check_pack.zip。
|
|
39
|
+
|
|
40
|
+
#### 动态数据采集
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
在训练流程执行到的第一个python脚本开始处插入如下代码:
|
|
44
|
+
```
|
|
45
|
+
from msprobe.core.config_check import ConfigChecker
|
|
46
|
+
ConfigChecker.apply_patches(fmk)
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
说明:
|
|
50
|
+
|
|
51
|
+
- fmk:训练框架。可选 pytorch 和 mindspore ,不传默认为 pytorch。
|
|
52
|
+
|
|
53
|
+
在模型初始化好之后插入如下代码:
|
|
54
|
+
```
|
|
55
|
+
from msprobe.core.config_check import ConfigChecker
|
|
56
|
+
ConfigChecker(model, shell_path, output_zip_path, fmk)
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
说明:
|
|
60
|
+
|
|
61
|
+
- model:初始化好的模型。不传或缺省就不会采集权重和数据集。
|
|
62
|
+
- shell_path:动态采集模式下支持 **megatron** 训练超参自动捕获,使用 **megatron** 时推荐不传入,其他情况下可传入训练脚本路径,类型为列表,传入一个或多个训练配置/启动脚本。不传或缺省就不会采集超参。
|
|
63
|
+
- output_zip_path:输出zip包的路径,不传默认为"./config_check_pack.zip"。
|
|
64
|
+
- fmk:当前是什么框架。可选 pytorch 和 mindspore ,不传默认为 pytorch。
|
|
65
|
+
|
|
66
|
+
采集完成后会得到一个zip包,里面包括各项[影响精度的配置](#介绍)。会分rank和step存储,其中step为micro_step。
|
|
67
|
+
|
|
68
|
+
在另一个环境上执行上述操作,得到另一个zip包
|
|
69
|
+
|
|
70
|
+
### 数据比对
|
|
71
|
+
|
|
72
|
+
将两个zip包传到同一个环境下,使用如下命令进行比对:
|
|
73
|
+
|
|
74
|
+
```shell
|
|
75
|
+
msprobe -f pytorch config_check -c bench_zip_path cmp_zip_path -o output_path
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
其中**bench_zip_path** 为标杆侧采集到的数据, **cmp_zip_path** 为待对比侧采集到的数据。
|
|
79
|
+
|
|
80
|
+
**output_path 会被删掉再新建**,不传默认为"./config_check_result", 在 **output_path** 里会生成2个目录和1个文件:
|
|
81
|
+
- bench:bench_zip_path里打包的数据。
|
|
82
|
+
- cmp:cmp_zip_path里打包的数据。
|
|
83
|
+
- result.xlsx:比对结果。里面会有多个sheet页,其中**summary**总览通过情况,其余页是具体检查项的详情。其中step为micro_step。
|
|
84
|
+
|
|
85
|
+
## 通过标准
|
|
86
|
+
|
|
87
|
+
以下五项检查通过:
|
|
88
|
+
|
|
89
|
+
- 环境变量
|
|
90
|
+
- 三方库版本
|
|
91
|
+
- 训练超参
|
|
92
|
+
- 权重
|
|
93
|
+
- 数据集
|
|
94
|
+
|
|
95
|
+
这五项检查在**精度比对**前必须保证达成。
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# Checkpoint Compare
|
|
2
|
+
|
|
3
|
+
## 介绍
|
|
4
|
+
在模型训练过程中或结束后,可能保存一些检查点文件(checkpoint,简称ckpt)记录当前模型、优化器等训练状态, 工具支持比较两个不同的ckpt,评估模型相似度。
|
|
5
|
+
|
|
6
|
+
当前支持Megatron-LM、MindSpeed(PyTorch/MindTorch)的ckpt比较。支持TP、PP、EP、VPP模型并行;支持megatron.core、megatron.legacy、TransformerEngine的模型实现。
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
## 安装教程
|
|
10
|
+
|
|
11
|
+
参见 msprobe [安装教程](./01.installation.md)
|
|
12
|
+
|
|
13
|
+
## 使用说明
|
|
14
|
+
Megatron、MindSpeed的ckpt加载依赖megatron,请确保megatron在python环境中或megatron在当前路径下。
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
启动命令如下
|
|
18
|
+
```shell
|
|
19
|
+
msprobe --framework pytorch config_check --compare path1 path2 -o output_path.json
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
| 参数名 | 解释 | 是否必选 |
|
|
23
|
+
|--------|-------|--------|
|
|
24
|
+
| -f 或 --framework | 深度学习框架,str类型。支持参数:pytorch,mindspore,注意:msadaptor场景传入mindspore。 | 是 |
|
|
25
|
+
| -c 或 --compare | 2个ckpt的路径 | 是 |
|
|
26
|
+
| -o 或 --output | 比对结果输出路径,默认为 ./ckpt_similarity.json。输出路径存在时将报错终止。 | 否 |
|
|
27
|
+
|
|
28
|
+
Megatron-LM 和 MindSpeed 的 ckpt 目录结构如下:
|
|
29
|
+
|
|
30
|
+
```txt
|
|
31
|
+
directory_name/
|
|
32
|
+
├── iter_0000005/ # 某个iteration时的ckpt目录。
|
|
33
|
+
│ └── mp_rank_xx_xxx/ # 单个rank的ckpt目录,xx_xxx为模型并行索引。
|
|
34
|
+
│ └── model_optim_rng.pt # 包含模型参数、随机状态等的PyTorch binary文件。
|
|
35
|
+
├── iter_0000010/
|
|
36
|
+
├── latest_checkpointed_iteration.txt # 记录最后一个保存的ckpt的纯文本文件。
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
对于--compare参数的两个路径,为directory_name时,工具通过latest_checkpointed_iteration.txt自动选择latest checkpoint进行比对. 为directory_name/iter_xxxxxxx时, 工具使用指定iteration的ckpt进行比对。暂不支持单个rank的比对。
|
|
40
|
+
|
|
41
|
+
## 输出示例
|
|
42
|
+
Checkpoint比对结果以json文件输出,内容如下示例:
|
|
43
|
+
```json
|
|
44
|
+
{
|
|
45
|
+
"decoder.layers.0.input_layernorm.weight": {
|
|
46
|
+
"l2": 0.0,
|
|
47
|
+
"cos": 0.999999,
|
|
48
|
+
"numel": 128,
|
|
49
|
+
"shape": [
|
|
50
|
+
128
|
|
51
|
+
]
|
|
52
|
+
},
|
|
53
|
+
"decoder.layers.0.pre_mlp_layernorm.weight": {
|
|
54
|
+
"l2": 0.012,
|
|
55
|
+
"cos": 0.98,
|
|
56
|
+
"numel": 128,
|
|
57
|
+
"shape": [
|
|
58
|
+
128
|
|
59
|
+
]
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
统计量 | 解释 |
|
|
65
|
+
|-------|---------|
|
|
66
|
+
| l2 | 欧式距离,$\|\|a-b\|\|_2$ |
|
|
67
|
+
| cos | 余弦相似度, $\frac{<a,b>}{\|\|a\|\|_2\|\|b\|\|_2}$ |
|
|
68
|
+
| numel | 参数的元素个数 |
|
|
69
|
+
| shape | 参数的shape |
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
# 单算子API自动生成脚本
|
|
2
|
+
|
|
3
|
+
## 1 简介
|
|
4
|
+
|
|
5
|
+
单算子API自动生成脚本通过提取dump数据中的可疑算子,对其进行单API复现,输出单API精度的比对结果。具体而言,该工具可以从dump数据中提取可疑API的前反向信息,根据前反向数据生成单API的前反向过程,最后通过**新精度标准比对法**<sup>a</sup>将 NPU 和 CPU 的结果进行比对,从而给出不同比对方法下的比对结果。本工具支持**随机生成模式和真实数据模式**<sup>b</sup>。
|
|
6
|
+
|
|
7
|
+
a. 在生成单API脚本时可以选择由工具构造随机数获得 dump 数据或选择真实输入的数据进行单API复现。随机生成模式(对应 task: "statistics")执行效率高,可以快速获得结果,但数据精度低,只能大致判断精度问题;真实数据模式(对应 task: "tensor")执行效率略低于随机生成模式,但是数据精度高,可以准确判断精度问题。
|
|
8
|
+
|
|
9
|
+
## 2 使用方式
|
|
10
|
+
|
|
11
|
+
### 前提
|
|
12
|
+
1. 安装 msprobe。详见[ msprobe 安装](./01.installation.md)章节。
|
|
13
|
+
2. 已完成对训练过程的dump,获得dump.json文件。
|
|
14
|
+
[MindSpore 场景下的数据采集](./06.data_dump_MindSpore.md)章节或[Msadapter 场景下的数据采集](./29.data_dump_MSAdapter.md)章节,注意需要配置 level="L1"。
|
|
15
|
+
|
|
16
|
+
3. 发现某个算子疑似存在精度问题,并得知算子名,如Mint.split.1、Functional.softmax.3、Tensor.add.0、Torch.matmul.5等,要求API入参与torch场景相同。
|
|
17
|
+
|
|
18
|
+
4.(可选)当需要使用Msadapter时,由于需要环境中同时存在 Torch 与 Msadapter,所以只支持在**安装原生Torch**的场景下通过export PYTHONPATH="xx/msadapter/build/lib"等通过**环境变量使能Msadapter的方式**的环境中进行预检,预检工具能够自动索引得到所需的 Torch 与 Msadapter环境,环境安装详细参考:[msadapter官网](https://gitee.com/mindspore/msadapter)。
|
|
19
|
+
|
|
20
|
+
### 2.1 dump.json 示例(由dump生成)
|
|
21
|
+
```
|
|
22
|
+
{
|
|
23
|
+
"task": "statistics",
|
|
24
|
+
"level": "L1",
|
|
25
|
+
"framework": "mindtorch",
|
|
26
|
+
"dump_data_dir": null,
|
|
27
|
+
"data": {
|
|
28
|
+
"Tensor.reshape.779.forward": {
|
|
29
|
+
"input_args": [
|
|
30
|
+
{
|
|
31
|
+
"type": "mindspore.Tensor",
|
|
32
|
+
"dtype": "BFloat16",
|
|
33
|
+
"shape": [
|
|
34
|
+
8192,
|
|
35
|
+
896
|
|
36
|
+
],
|
|
37
|
+
"Max": 0.62890625,
|
|
38
|
+
"Min": -0.78515625,
|
|
39
|
+
"Mean": 0.00035858154296875,
|
|
40
|
+
"Norm": 105.0
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"type": "int",
|
|
44
|
+
"value": -1
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"type": "int",
|
|
48
|
+
"value": 896
|
|
49
|
+
}
|
|
50
|
+
],
|
|
51
|
+
"input_kwargs": {},
|
|
52
|
+
"output": [
|
|
53
|
+
{
|
|
54
|
+
"type": "mindspore.Tensor",
|
|
55
|
+
"dtype": "BFloat16",
|
|
56
|
+
"shape": [
|
|
57
|
+
8192,
|
|
58
|
+
896
|
|
59
|
+
],
|
|
60
|
+
"Max": 0.62890625,
|
|
61
|
+
"Min": -0.78515625,
|
|
62
|
+
"Mean": 0.00035858154296875,
|
|
63
|
+
"Norm": 105.0
|
|
64
|
+
}
|
|
65
|
+
]
|
|
66
|
+
},
|
|
67
|
+
"Tensor.reshape.779.backward": {
|
|
68
|
+
"input": [
|
|
69
|
+
{
|
|
70
|
+
"type": "mindspore.Tensor",
|
|
71
|
+
"dtype": "BFloat16",
|
|
72
|
+
"shape": [
|
|
73
|
+
8192,
|
|
74
|
+
896
|
|
75
|
+
],
|
|
76
|
+
"Max": 0.0,
|
|
77
|
+
"Min": 0.0,
|
|
78
|
+
"Mean": 0.0,
|
|
79
|
+
"Norm": 0.0
|
|
80
|
+
}
|
|
81
|
+
],
|
|
82
|
+
"output": [
|
|
83
|
+
{
|
|
84
|
+
"type": "mindspore.Tensor",
|
|
85
|
+
"dtype": "BFloat16",
|
|
86
|
+
"shape": [
|
|
87
|
+
8192,
|
|
88
|
+
896
|
|
89
|
+
],
|
|
90
|
+
"Max": 0.0,
|
|
91
|
+
"Min": 0.0,
|
|
92
|
+
"Mean": 0.0,
|
|
93
|
+
"Norm": 0.0
|
|
94
|
+
}
|
|
95
|
+
]
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### 2.2 配置config_op.json
|
|
102
|
+
单API复现参数配置如下(以复现softmax算子为例):
|
|
103
|
+
```
|
|
104
|
+
{
|
|
105
|
+
"dump_json_path": "./dump.json",
|
|
106
|
+
"api_name": "Tensor.reshape.779",
|
|
107
|
+
"extract_api_path": "Tensor.reshape.779",
|
|
108
|
+
"propagation": "backward",
|
|
109
|
+
"data_mode": "random_data",
|
|
110
|
+
"random_seed": 42,
|
|
111
|
+
"iter_times": 1
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
**配置文件参数说明**
|
|
115
|
+
|
|
116
|
+
| 参数名称 | 解释 |
|
|
117
|
+
| ---------------------------- |-------------------------------------------------------------------------------------------------------------------|
|
|
118
|
+
| dump_json_path | dump.json的文件路径,包含所有dump算子的信息;如果已经提取了可疑算子并保存可以不指定。 |
|
|
119
|
+
| api_name | 算子名(目前只支持Mint,Tensor,Functional,Torch类中可自动求导api),如Mint.split.1,Functional.softmax.3、Tensor.add.0、Torch.matmul.5等。 |
|
|
120
|
+
| extract_api_path | 提取可疑算子的json文件路径 |
|
|
121
|
+
| propagation | 选择复现算子的forward还是backward,默认为forward |
|
|
122
|
+
| data_mode | 选择复现算子的随机数据(random_data)还是真实数据(real_data)模式,默认为random_data |
|
|
123
|
+
| random_seed | 仅random_data模式有效,表示手动设定的随机种子,默认为1234 |
|
|
124
|
+
| iter_times | 仅random_data模式有效,表示单API运行的次数,由于安全相关原因,最大支持设置为1000 |
|
|
125
|
+
|
|
126
|
+
### 2.3 运行命令生成单API脚本
|
|
127
|
+
config_op.json配置好后,运行如下命令:
|
|
128
|
+
```
|
|
129
|
+
msprobe -f mindspore op_generate -i ./config.json -o ./
|
|
130
|
+
```
|
|
131
|
+
或者
|
|
132
|
+
|
|
133
|
+
进入到mstt的generate_op_script文件夹
|
|
134
|
+
```
|
|
135
|
+
cd mstt/debug/accuracy_tools/msprobe/mindspore/api_accuracy_checker/generate_op_script
|
|
136
|
+
```
|
|
137
|
+
运行
|
|
138
|
+
```
|
|
139
|
+
python op_generator.py -i ./config_op.json -o ./
|
|
140
|
+
```
|
|
141
|
+
**参数说明**
|
|
142
|
+
| 参数名称 | 解释 | 是否必选 |
|
|
143
|
+
| ---------------------------- | ------------------------------------------------------------ | ---------------------------------- |
|
|
144
|
+
| -i 或 --config_input | config_op.json的路径 | 是 |
|
|
145
|
+
| -o 或 --api_output_path | 单API脚本的输出路径 | 是 |
|
|
146
|
+
|
|
147
|
+
### 2.4 运行单API脚本
|
|
148
|
+
运行完op_generator.py后,会在指定路径下生成api_name.py的单API脚本,例如Mint.split.1.forward.py、Functional.softmax.3.backward.py、Tensor.add.0.forward.py、Torch.matmul.5.backward.py
|
|
149
|
+
|
|
150
|
+
运行单API脚本即可获得不同比对方法下的比对结果
|
|
151
|
+
```
|
|
152
|
+
python api_name.py
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
**运行结果说明**
|
|
156
|
+
|
|
157
|
+
单算子脚本生成到路径`./op_result_output`的 `accuracy_checking_result_{timestamp}.csv` 和 `accuracy_checking_details_{timestamp}.csv` 文件内容详情如下:
|
|
158
|
+
|
|
159
|
+
`accuracy_checking_details_{timestamp}.csv`
|
|
160
|
+
|
|
161
|
+
| 字段 | 含义 |
|
|
162
|
+
| ------------------- | ------------------------------------------------------------ |
|
|
163
|
+
| API Name | API 名称。 |
|
|
164
|
+
| Bench Dtype | 标杆数据的 API 数据类型。 |
|
|
165
|
+
| Tested Dtype | 被检验数据的 API 数据类型。 |
|
|
166
|
+
| Shape | API 的 Shape 信息。 |
|
|
167
|
+
| Cosine | 被检验数据与标杆数据的余弦相似度。 |
|
|
168
|
+
| MaxAbsErr | 被检验数据与标杆数据的最大绝对误差。 |
|
|
169
|
+
| MaxRelativeErr | 被检验数据与标杆数据的最大相对误差。 |
|
|
170
|
+
| Status | API 预检通过状态,pass 表示通过测试,error 表示未通过。 |
|
|
171
|
+
| Message | 提示信息。 |
|
|
172
|
+
|
|
173
|
+
注意:PyTorch 无法对 dtype 为整数类型的 tensor 进行反向求导,而 MindSpore 支持。反向过程的预检仅比较 dtype 为浮点型的输出。
|
|
174
|
+
|
|
175
|
+
`accuracy_checking_result_{timestamp}.csv`
|
|
176
|
+
|
|
177
|
+
| 字段 | 含义 |
|
|
178
|
+
| --------------------- | ----------------- |
|
|
179
|
+
| API Name | API 名称。 |
|
|
180
|
+
| Forward Test Success | 前向 API 是否通过测试,pass 为通过,error 为错误。 |
|
|
181
|
+
| Backward Test Success | 反向 API 是否通过测试,pass 为通过,error 为错误,如果是空白的话代表该 API 没有反向输出。 |
|
|
182
|
+
| Message | 提示信息。 |
|
|
183
|
+
|
|
184
|
+
Forward Test Success 和 Backward Test Success 是否通过测试是由 `accuracy_checking_details_{timestamp}.csv` 中的余弦相似度、最大绝对误差判定结果决定的。具体规则详见 [4.1 API 预检指标](#41-api-预检指标)。
|
|
185
|
+
需要注意的是 `accuracy_checking_details_{timestamp}.csv` 中可能存在一个 API 的前向(反向)有多个输出,那么每个输出记录一行,而在 `accuracy_checking_result_{timestamp}.csv` 中的结果需要该 API 的所有结果均为 pass 才能标记为 pass,只要存在一个 error 则标记 error。
|
|
186
|
+
|
|
187
|
+
### 3.1 API 预检指标
|
|
188
|
+
|
|
189
|
+
- API 预检指标是通过对 `accuracy_checking_details_{timestamp}.csv` 中的余弦相似度、最大绝对误差的数值进行判断,得出该 API 是否符合精度标准的参考指标。
|
|
190
|
+
- 余弦相似度大于 0.99,并且最大绝对误差小于 0.0001,标记“pass”,否则标记为“error”。
|