mindstudio-probe 1.1.0__py3-none-any.whl → 1.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.1.0.dist-info → mindstudio_probe-1.1.1.dist-info}/METADATA +5 -5
- mindstudio_probe-1.1.1.dist-info/RECORD +341 -0
- {mindstudio_probe-1.1.0.dist-info → mindstudio_probe-1.1.1.dist-info}/WHEEL +1 -1
- {mindstudio_probe-1.1.0.dist-info → mindstudio_probe-1.1.1.dist-info}/entry_points.txt +0 -1
- msprobe/README.md +39 -3
- msprobe/config.json +1 -3
- msprobe/core/advisor/advisor.py +8 -3
- msprobe/core/common/const.py +113 -13
- msprobe/core/common/exceptions.py +25 -3
- msprobe/core/common/file_utils.py +150 -26
- msprobe/core/common/inplace_op_checker.py +15 -0
- msprobe/core/common/log.py +27 -9
- msprobe/core/common/utils.py +182 -69
- msprobe/core/common_config.py +44 -15
- msprobe/core/compare/acc_compare.py +207 -142
- msprobe/core/compare/check.py +2 -5
- msprobe/core/compare/compare_cli.py +21 -4
- msprobe/core/compare/highlight.py +124 -55
- msprobe/core/compare/layer_mapping/__init__.py +19 -0
- msprobe/core/compare/layer_mapping/data_scope_parser.py +235 -0
- msprobe/core/compare/layer_mapping/layer_mapping.py +242 -0
- msprobe/core/compare/layer_mapping/postprocess_pass.py +94 -0
- msprobe/core/compare/npy_compare.py +52 -23
- msprobe/core/compare/utils.py +272 -247
- msprobe/core/data_dump/data_collector.py +13 -11
- msprobe/core/data_dump/data_processor/base.py +46 -16
- msprobe/core/data_dump/data_processor/mindspore_processor.py +4 -4
- msprobe/core/data_dump/data_processor/pytorch_processor.py +156 -59
- msprobe/core/data_dump/scope.py +113 -34
- msprobe/core/grad_probe/constant.py +27 -13
- msprobe/core/grad_probe/grad_compare.py +18 -1
- msprobe/core/grad_probe/utils.py +30 -2
- msprobe/core/overflow_check/abnormal_scene.py +185 -0
- msprobe/core/overflow_check/api_info.py +55 -0
- msprobe/core/overflow_check/checker.py +138 -0
- msprobe/core/overflow_check/filter.py +157 -0
- msprobe/core/overflow_check/ignore_rules.yaml +55 -0
- msprobe/core/overflow_check/level.py +22 -0
- msprobe/core/overflow_check/utils.py +28 -0
- msprobe/docs/01.installation.md +10 -0
- msprobe/docs/02.config_introduction.md +49 -22
- msprobe/docs/03.config_examples.md +2 -9
- msprobe/docs/04.kernel_dump_PyTorch.md +73 -0
- msprobe/docs/05.data_dump_PyTorch.md +3 -1
- msprobe/docs/06.data_dump_MindSpore.md +157 -90
- msprobe/docs/07.accuracy_checker_PyTorch.md +12 -12
- msprobe/docs/08.accuracy_checker_online_PyTorch.md +1 -6
- msprobe/docs/09.accuracy_checker_MindSpore.md +44 -8
- msprobe/docs/10.accuracy_compare_PyTorch.md +19 -13
- msprobe/docs/11.accuracy_compare_MindSpore.md +104 -13
- msprobe/docs/12.overflow_check_PyTorch.md +1 -1
- msprobe/docs/13.overflow_check_MindSpore.md +6 -6
- msprobe/docs/15.free_benchmarking_PyTorch.md +4 -5
- msprobe/docs/16.free_benchmarking_MindSpore.md +56 -37
- msprobe/docs/17.grad_probe.md +5 -6
- msprobe/docs/19.monitor.md +468 -0
- msprobe/docs/20.monitor_performance_baseline.md +52 -0
- msprobe/docs/21.visualization_PyTorch.md +386 -0
- msprobe/docs/22.visualization_MindSpore.md +384 -0
- msprobe/docs/23.tool_function_introduction.md +28 -0
- msprobe/docs/FAQ.md +3 -0
- msprobe/docs/data_dump_Mindspore/dynamic_graph_quick_start_example.md +211 -0
- msprobe/docs/img/compare_result.png +0 -0
- msprobe/docs/img/monitor/cpu_info.png +0 -0
- msprobe/mindspore/__init__.py +15 -0
- msprobe/mindspore/api_accuracy_checker/api_accuracy_checker.py +113 -145
- msprobe/mindspore/api_accuracy_checker/api_info.py +21 -6
- msprobe/mindspore/api_accuracy_checker/api_runner.py +43 -18
- msprobe/mindspore/api_accuracy_checker/base_compare_algorithm.py +21 -7
- msprobe/mindspore/api_accuracy_checker/checker_support_api.yaml +77 -0
- msprobe/mindspore/api_accuracy_checker/cmd_parser.py +63 -1
- msprobe/mindspore/api_accuracy_checker/compute_element.py +59 -24
- msprobe/mindspore/api_accuracy_checker/data_manager.py +264 -0
- msprobe/mindspore/api_accuracy_checker/main.py +27 -3
- msprobe/mindspore/api_accuracy_checker/multi_api_accuracy_checker.py +206 -0
- msprobe/mindspore/api_accuracy_checker/multi_data_manager.py +58 -0
- msprobe/mindspore/api_accuracy_checker/type_mapping.py +22 -5
- msprobe/mindspore/api_accuracy_checker/utils.py +34 -17
- msprobe/mindspore/cell_processor.py +33 -12
- msprobe/mindspore/common/const.py +33 -13
- msprobe/mindspore/common/log.py +5 -9
- msprobe/mindspore/common/utils.py +43 -4
- msprobe/mindspore/compare/distributed_compare.py +22 -22
- msprobe/mindspore/compare/ms_compare.py +271 -248
- msprobe/mindspore/compare/ms_graph_compare.py +81 -47
- msprobe/mindspore/debugger/debugger_config.py +4 -1
- msprobe/mindspore/debugger/precision_debugger.py +7 -1
- msprobe/mindspore/dump/dump_tool_factory.py +3 -1
- msprobe/mindspore/dump/hook_cell/api_registry.py +12 -2
- msprobe/mindspore/dump/hook_cell/primitive_hooks.py +13 -16
- msprobe/mindspore/dump/hook_cell/support_wrap_ops.yaml +25 -0
- msprobe/mindspore/dump/jit_dump.py +17 -5
- msprobe/mindspore/dump/kernel_graph_dump.py +2 -4
- msprobe/mindspore/dump/kernel_kbyk_dump.py +2 -4
- msprobe/mindspore/dym_loader/hook_dynamic_loader.cc +140 -0
- msprobe/mindspore/dym_loader/hook_dynamic_loader.h +53 -0
- msprobe/mindspore/free_benchmark/api_pynative_self_check.py +145 -39
- msprobe/mindspore/free_benchmark/common/handler_params.py +1 -2
- msprobe/mindspore/free_benchmark/common/utils.py +19 -4
- msprobe/mindspore/free_benchmark/data/support_wrap_ops.yaml +0 -204
- msprobe/mindspore/free_benchmark/handler/base_handler.py +3 -3
- msprobe/mindspore/free_benchmark/handler/check_handler.py +4 -5
- msprobe/mindspore/free_benchmark/handler/fix_handler.py +4 -4
- msprobe/mindspore/free_benchmark/handler/handler_factory.py +4 -4
- msprobe/mindspore/free_benchmark/perturbation/add_noise.py +2 -2
- msprobe/mindspore/free_benchmark/perturbation/base_perturbation.py +15 -6
- msprobe/mindspore/free_benchmark/perturbation/bit_noise.py +4 -4
- msprobe/mindspore/free_benchmark/perturbation/exchange_value.py +2 -2
- msprobe/mindspore/free_benchmark/perturbation/improve_precision.py +13 -6
- msprobe/mindspore/free_benchmark/perturbation/perturbation_factory.py +2 -2
- msprobe/mindspore/free_benchmark/self_check_tool_factory.py +2 -2
- msprobe/mindspore/grad_probe/global_context.py +28 -8
- msprobe/mindspore/grad_probe/grad_analyzer.py +27 -13
- msprobe/mindspore/grad_probe/grad_monitor.py +16 -1
- msprobe/mindspore/grad_probe/grad_stat_csv.py +33 -5
- msprobe/mindspore/grad_probe/hook.py +24 -10
- msprobe/mindspore/grad_probe/utils.py +18 -5
- msprobe/mindspore/ms_config.py +22 -15
- msprobe/mindspore/overflow_check/kernel_graph_overflow_check.py +2 -4
- msprobe/mindspore/runtime.py +15 -0
- msprobe/mindspore/service.py +36 -30
- msprobe/mindspore/task_handler_factory.py +15 -0
- msprobe/msprobe.py +24 -7
- msprobe/pytorch/__init__.py +3 -2
- msprobe/pytorch/api_accuracy_checker/common/config.py +62 -0
- msprobe/pytorch/api_accuracy_checker/compare/api_precision_compare.py +3 -4
- msprobe/pytorch/api_accuracy_checker/generate_op_script/config_op.json +9 -0
- msprobe/pytorch/api_accuracy_checker/generate_op_script/op_generator.py +454 -0
- msprobe/pytorch/api_accuracy_checker/generate_op_script/operator_replication.template +365 -0
- msprobe/pytorch/api_accuracy_checker/run_ut/data_generate.py +6 -1
- msprobe/pytorch/api_accuracy_checker/run_ut/multi_run_ut.py +19 -14
- msprobe/pytorch/api_accuracy_checker/run_ut/run_overflow_check.py +13 -9
- msprobe/pytorch/api_accuracy_checker/run_ut/run_ut.py +77 -53
- msprobe/pytorch/api_accuracy_checker/run_ut/run_ut_utils.py +15 -4
- msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/attl.py +9 -24
- msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/client.py +4 -12
- msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/dump_dispatch.py +9 -4
- msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/server.py +3 -11
- msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/utils.py +2 -2
- msprobe/pytorch/bench_functions/confusion_transpose.py +5 -1
- msprobe/pytorch/bench_functions/matmul_backward.py +12 -0
- msprobe/pytorch/bench_functions/npu_fusion_attention.py +100 -6
- msprobe/pytorch/bench_functions/rotary_mul.py +4 -0
- msprobe/pytorch/bench_functions/swiglu.py +10 -2
- msprobe/pytorch/common/parse_json.py +6 -6
- msprobe/pytorch/common/utils.py +56 -5
- msprobe/pytorch/compare/distributed_compare.py +8 -9
- msprobe/pytorch/compare/pt_compare.py +8 -6
- msprobe/pytorch/debugger/debugger_config.py +19 -15
- msprobe/pytorch/dump/kernel_dump/kernel_config.py +33 -0
- msprobe/pytorch/free_benchmark/common/constant.py +15 -0
- msprobe/pytorch/free_benchmark/common/counter.py +15 -0
- msprobe/pytorch/free_benchmark/common/enums.py +15 -0
- msprobe/pytorch/free_benchmark/common/params.py +8 -1
- msprobe/pytorch/free_benchmark/common/utils.py +26 -4
- msprobe/pytorch/free_benchmark/compare/grad_saver.py +20 -3
- msprobe/pytorch/free_benchmark/compare/single_benchmark.py +2 -0
- msprobe/pytorch/free_benchmark/perturbed_layers/npu/add_noise.py +3 -1
- msprobe/pytorch/free_benchmark/perturbed_layers/npu/bit_noise.py +6 -4
- msprobe/pytorch/free_benchmark/perturbed_layers/npu/change_value.py +2 -0
- msprobe/pytorch/free_benchmark/perturbed_layers/npu/improve_precision.py +4 -0
- msprobe/pytorch/free_benchmark/result_handlers/base_handler.py +10 -0
- msprobe/pytorch/free_benchmark/result_handlers/fix_handler.py +6 -5
- msprobe/pytorch/grad_probe/grad_monitor.py +23 -6
- msprobe/pytorch/grad_probe/grad_stat_csv.py +40 -10
- msprobe/pytorch/hook_module/support_wrap_ops.yaml +1 -0
- msprobe/pytorch/hook_module/wrap_functional.py +14 -12
- msprobe/pytorch/module_processer.py +2 -5
- msprobe/pytorch/monitor/anomaly_analyse.py +201 -0
- msprobe/pytorch/monitor/anomaly_detect.py +340 -0
- msprobe/pytorch/monitor/distributed/__init__.py +0 -0
- msprobe/pytorch/monitor/distributed/distributed_ops.yaml +19 -0
- msprobe/pytorch/monitor/distributed/stack_blacklist.yaml +5 -0
- msprobe/pytorch/monitor/distributed/wrap_distributed.py +272 -0
- msprobe/pytorch/monitor/features.py +108 -0
- msprobe/pytorch/monitor/module_hook.py +870 -0
- msprobe/pytorch/monitor/module_metric.py +193 -0
- msprobe/pytorch/monitor/module_spec_verifier.py +93 -0
- msprobe/pytorch/monitor/optimizer_collect.py +295 -0
- msprobe/pytorch/monitor/unittest/__init__.py +0 -0
- msprobe/pytorch/monitor/unittest/test_monitor.py +145 -0
- msprobe/pytorch/monitor/utils.py +250 -0
- msprobe/pytorch/monitor/visualizer.py +59 -0
- msprobe/pytorch/online_dispatch/__init__.py +2 -3
- msprobe/pytorch/online_dispatch/compare.py +29 -38
- msprobe/pytorch/online_dispatch/dispatch.py +50 -25
- msprobe/pytorch/online_dispatch/dump_compare.py +21 -9
- msprobe/pytorch/online_dispatch/single_compare.py +53 -32
- msprobe/pytorch/online_dispatch/torch_ops_config.yaml +1 -1
- msprobe/pytorch/online_dispatch/utils.py +49 -21
- msprobe/pytorch/parse_tool/lib/compare.py +12 -18
- msprobe/pytorch/parse_tool/lib/config.py +1 -1
- msprobe/pytorch/parse_tool/lib/parse_tool.py +1 -2
- msprobe/pytorch/parse_tool/lib/utils.py +16 -35
- msprobe/pytorch/parse_tool/lib/visualization.py +2 -0
- msprobe/pytorch/pt_config.py +31 -8
- msprobe/pytorch/service.py +15 -5
- msprobe/visualization/__init__.py +14 -0
- msprobe/visualization/builder/__init__.py +14 -0
- msprobe/visualization/builder/graph_builder.py +165 -0
- msprobe/visualization/builder/msprobe_adapter.py +205 -0
- msprobe/visualization/compare/__init__.py +14 -0
- msprobe/visualization/compare/graph_comparator.py +130 -0
- msprobe/visualization/compare/mode_adapter.py +211 -0
- msprobe/visualization/graph/__init__.py +14 -0
- msprobe/visualization/graph/base_node.py +124 -0
- msprobe/visualization/graph/graph.py +200 -0
- msprobe/visualization/graph/node_colors.py +95 -0
- msprobe/visualization/graph/node_op.py +39 -0
- msprobe/visualization/graph_service.py +214 -0
- msprobe/visualization/utils.py +232 -0
- mindstudio_probe-1.1.0.dist-info/RECORD +0 -287
- msprobe/docs/04.acl_config_examples.md +0 -78
- msprobe/mindspore/compare/layer_mapping.py +0 -146
- msprobe/mindspore/compare/modify_mapping.py +0 -107
- msprobe/mindspore/free_benchmark/decorator/dec_forward.py +0 -57
- msprobe/mindspore/free_benchmark/decorator/decorator_factory.py +0 -122
- {mindstudio_probe-1.1.0.dist-info → mindstudio_probe-1.1.1.dist-info}/LICENSE +0 -0
- {mindstudio_probe-1.1.0.dist-info → mindstudio_probe-1.1.1.dist-info}/top_level.txt +0 -0
- /msprobe/{mindspore/free_benchmark/decorator → pytorch/monitor}/__init__.py +0 -0
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# PyTorch 场景的 kernel dump 说明
|
|
2
|
+
|
|
3
|
+
当使用 msprobe 数据采集功能时,level 配置为 "L2" 表示采集 kernel 层级的算子数据,仅支持昇腾 NPU 平台。
|
|
4
|
+
|
|
5
|
+
本文主要介绍 kernel dump 的配置示例和采集结果介绍, msprobe 数据采集功能的详细使用参考 《[PyTorch 场景的精度数据采集](./05.data_dump_PyTorch.md)》。
|
|
6
|
+
|
|
7
|
+
## 1 kernel dump 配置示例
|
|
8
|
+
|
|
9
|
+
使用 kernel dump 时,list 必须要填一个 API 名称,kernel dump 目前每个 step 只支持采集一个 API 的数据。
|
|
10
|
+
API 名称填写参考 L1 dump 结果文件 dump.json 中的API名称,命名格式为:`{api_type}.{api_name}.{API调用次数}.{forward/backward}`。
|
|
11
|
+
|
|
12
|
+
```json
|
|
13
|
+
{
|
|
14
|
+
"task": "tensor",
|
|
15
|
+
"dump_path": "/home/data_dump",
|
|
16
|
+
"level": "L2",
|
|
17
|
+
"rank": [],
|
|
18
|
+
"step": [],
|
|
19
|
+
"tensor": {
|
|
20
|
+
"scope": [],
|
|
21
|
+
"list": ["Functional.linear.0.backward"]
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## 2 结果文件介绍
|
|
27
|
+
|
|
28
|
+
### 2.1 采集结果说明
|
|
29
|
+
|
|
30
|
+
如果 API kernel 级数据采集成功,会打印以下信息:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
The kernel data of {api_name} is dumped successfully.
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
注意:如果打印该信息后,没有数据生成,参考**常见问题3.1**进行排查。
|
|
37
|
+
|
|
38
|
+
如果 kernel dump 遇到不支持的 API, 会打印以下信息:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
The kernel dump does not support the {api_name} API.
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
其中 {api_name} 是对应溢出的 API 名称。
|
|
45
|
+
|
|
46
|
+
### 2.2 输出文件说明
|
|
47
|
+
kernel dump 采集成功后,会在指定的 dump_path 目录下生成如下文件:
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
├── /home/data_dump/
|
|
51
|
+
│ ├── step0
|
|
52
|
+
│ │ ├── 20241201103000 # 日期时间格式,表示2024-12-01 10:30:00
|
|
53
|
+
│ │ │ ├── 0 # 表示 device id
|
|
54
|
+
│ │ │ │ ├──{op_type}.{op_name}.{task_id}.{stream_id}.{timestamp} # kernel 层算子数据
|
|
55
|
+
│ │ │ ...
|
|
56
|
+
│ │ ├── kernel_config_{device_id}.json # kernel dump 在接口调用过程中生成的中间文件,一般情况下无需关注
|
|
57
|
+
│ │ ...
|
|
58
|
+
│ ├── step1
|
|
59
|
+
│ ...
|
|
60
|
+
```
|
|
61
|
+
成功采集到数据后,可以使用 msprobe 工具提供的《[PyTorch 场景的数据解析](./14.data_parse_PyTorch.md)》功能分析数据。
|
|
62
|
+
|
|
63
|
+
## 3 常见问题
|
|
64
|
+
|
|
65
|
+
#### 3.1 采集结果文件为空,有可能是什么原因?
|
|
66
|
+
|
|
67
|
+
1. 首先需要确认工具使用方式、配置文件内容、list 填写的 API 名称格式是否都正确无误。
|
|
68
|
+
|
|
69
|
+
2. 其次需要确认 API 是否运行在昇腾 NPU 上,如果是运行在其他设备上则不会存在 kernel 级数据。
|
|
70
|
+
|
|
71
|
+
3. 如果排除上述两点仍然没有数据,您可以使用《[Ascend Extension for PyTorch 插件](https://gitee.com/ascend/pytorch)》提供的
|
|
72
|
+
torch_npu.npu 接口进行 kernel 层数据采集,工具的 kernel dump 也是基于其中的init_dump、set_dump和finalize_dump三个子接口实现的。
|
|
73
|
+
torch_npu.npu 接口详细描述见《[torch_npu.npu API 概述](https://www.hiascend.com/document/detail/zh/Pytorch/60RC3/apiref/apilist/ptaoplist_000192.html)》。
|
|
@@ -11,6 +11,8 @@ functional: # functional为算子类别,找到对应的类别,在该类别
|
|
|
11
11
|
- conv3d
|
|
12
12
|
```
|
|
13
13
|
|
|
14
|
+
删除API的场景:部分模型代码逻辑会存在API原生类型校验,工具执行dump操作时,对模型的API封装可能与模型的原生API类型不一致,此时可能引发校验失败,详见《[FAQ](FAQ.md)》中“异常情况”的第10和11条。
|
|
15
|
+
|
|
14
16
|
## 1 接口介绍
|
|
15
17
|
|
|
16
18
|
### 1.1 PrecisionDebugger
|
|
@@ -289,7 +291,7 @@ if __name__ == "__main__":
|
|
|
289
291
|
| | | | ├── MyModule.0.forward.input.pt # 开启模块级精度数据dump时存在模块级的dump数据文件
|
|
290
292
|
| | | | ...
|
|
291
293
|
| | | | └── Fcuntion.linear.5.backward.output.pt
|
|
292
|
-
│ | | ├── dump.json # 保存前反向算子、算子的统计量信息或溢出算子信息。包含dump数据的API名称(命名格式为:`{api_type}_{api_name}_{API调用次数}_{前向反向}_{input/output}.{参数序号}`)、dtype、 shape、各数据的max、min、mean、L2norm统计信息以及当配置summary_mode="md5"时的
|
|
294
|
+
│ | | ├── dump.json # 保存前反向算子、算子的统计量信息或溢出算子信息。包含dump数据的API名称(命名格式为:`{api_type}_{api_name}_{API调用次数}_{前向反向}_{input/output}.{参数序号}`)、dtype、 shape、各数据的max、min、mean、L2norm统计信息以及当配置summary_mode="md5"时的CRC-32数据。其中,“参数序号”表示该API下的第n个参数,例如1,则为第一个参数,若该参数为list格式,则根据list继续排序,例如1.1,表示该API的第1个参数的第1个子参数;L2norm表示L2范数(平方根)
|
|
293
295
|
│ | | ├── stack.json # 算子调用栈信息
|
|
294
296
|
│ | | └── construct.json # 分层分级结构
|
|
295
297
|
│ | ├── rank1
|
|
@@ -1,23 +1,64 @@
|
|
|
1
|
-
# MindSpore 场景的精度数据采集
|
|
2
1
|
|
|
3
|
-
msprobe
|
|
2
|
+
# msprobe 工具 MindSpore场景精度数据采集指南
|
|
4
3
|
|
|
5
|
-
需要注意,**动态图 kernel 级**("L2" level)精度数据采集对象为被 PSJit 或 PIJit 装饰的 Cell 或 function 内的算子,其被装饰部分实际以**静态图**模式执行,所以此场景下的工具使用方式与静态图场景完全相同。下文无特殊说明时,介绍的动态图场景不包括 kernel 级("L2" level)dump 情形。
|
|
6
4
|
|
|
7
|
-
|
|
5
|
+
## 1. 专业名词解释
|
|
8
6
|
|
|
9
|
-
|
|
7
|
+
* **静态图**:在编译时就确定网络结构,静态图模式拥有较高的训练性能,但难以调试。
|
|
8
|
+
* **动态图**:运行时动态构建网络,相较于静态图模式虽然易于调试,但难以高效执行。
|
|
9
|
+
* **高阶 API**:如 `mindspore.train.Model`,封装了训练过程的高级接口。
|
|
10
|
+
* **JIT(Just-In-Time 编译)**:MindSpore提供JIT(just-in-time)技术进一步进行性能优化。JIT模式会通过AST树解析的方式或者Python字节码解析的方式,将代码解析为一张中间表示图(IR,intermediate representation)。IR图作为该代码的唯一表示,编译器通过对该IR图的优化,来达到对代码的优化,提高运行性能。与动态图模式相对应,这种JIT的编译模式被称为静态图模式。
|
|
11
|
+
* **Primitive op**:MindSpore 中的基本算子,通常由 `mindspore.ops.Primitive` 定义,提供底层的算子操作接口。
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
## 2. 工具安装
|
|
15
|
+
|
|
16
|
+
请参见[《msprobe 工具安装指南》](./01.installation.md)。
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
## 3. 快速入门
|
|
20
|
+
|
|
21
|
+
以下通过一个简单的示例,展示如何在 MindSpore 中使用 msprobe 工具进行精度数据采集。
|
|
22
|
+
|
|
23
|
+
您可以参考 [动态图快速入门示例](./data_dump_Mindspore/dynamic_graph_quick_start_example.md) 了解详细步骤。
|
|
24
|
+
|
|
25
|
+
## 4. 概述
|
|
26
|
+
|
|
27
|
+
msprobe 工具通过在训练脚本中添加 `PrecisionDebugger` 接口并启动训练的方式,采集模型在运行过程中的精度数据。该工具支持对MindSpore的静态图和动态图场景进行不同Level等级的精度数据采集。
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
## 5. 场景介绍
|
|
31
|
+
|
|
32
|
+
### 5.1 静态图场景
|
|
33
|
+
在静态图场景下,msprobe 仅支持 **L2 Level** 的数据采集。
|
|
34
|
+
- **L2 Level(Kernel 级)** :采集底层算子的输入输出数据,适用于深入分析算子级别的精度问题。
|
|
35
|
+
|
|
36
|
+
采集方式请参见[示例代码 > 静态图场景](#71-静态图场景)。详细介绍请参见[《config.json 配置文件介绍》](./02.config_introduction.md#11-通用配置)中的“level 参数”和[《config.json 配置示例》](./03.config_examples.md#2-mindspore-静态图场景) 中的“MindSpore 静态图场景”。
|
|
37
|
+
|
|
38
|
+
### 5.2 动态图场景
|
|
39
|
+
在动态图场景下,msprobe 支持 **L0** 、**L1** 、**mix** 、**L2 Level** 的数据采集,具体分为以下几种情况:
|
|
40
|
+
- **使用高阶 API(如 `Model 高阶API`)** :
|
|
41
|
+
- 需要使用 `MsprobeStep` 回调类来控制数据采集的启停,适用于 **L0** 、**L1** 、**mix** 、**L2** 数据采集。
|
|
42
|
+
|
|
43
|
+
- **未使用高阶 API** :
|
|
44
|
+
- 手动在训练循环中调用 `start`、`stop`、`step` 等接口,适用于 **L0** 、**L1** 、**mix** 、**L2** 数据采集。
|
|
45
|
+
|
|
46
|
+
采集方式请参见[示例代码 > 动态图场景](#72-动态图场景-)。
|
|
47
|
+
|
|
48
|
+
> **注意** :动态图模式下,使用 `PSJit` 或 `PIJit` 装饰的部分实际以静态图模式执行,此时的 **Kernel 级(L2 Level)** 数据采集方式与静态图场景相同。
|
|
49
|
+
- **L0 Level(Cell 级)** :采集 `Cell` 对象的数据,适用于需要分析特定网络模块的情况。
|
|
50
|
+
|
|
51
|
+
- **L1 Level(API 级)** :采集 MindSpore API 的输入输出数据,适用于定位 API 层面的精度问题。
|
|
52
|
+
|
|
53
|
+
- **mix(模块级 + API 级)** :在 `L0` 和 `L1` 级别的基础上同时采集模块级和 API 级数据,适用于需要分析模块和 API 层面精度问题的场景。
|
|
10
54
|
|
|
11
|
-
```yaml
|
|
12
|
-
ops: # ops为算子类别,找到对应的类别,在该类别下按照下列格式删除或添加API
|
|
13
|
-
- adaptive_avg_pool1d
|
|
14
|
-
- adaptive_avg_pool2d
|
|
15
|
-
- adaptive_avg_pool3d
|
|
16
|
-
```
|
|
17
55
|
|
|
18
|
-
|
|
56
|
+
详细介绍请参见[《config.json 配置文件介绍》](./02.config_introduction.md#11-通用配置)中的“level 参数”和[《config.json 配置示例》](./03.config_examples.md#3-mindspore-动态图场景) 中的“MindSpore 动态图场景”。
|
|
19
57
|
|
|
20
|
-
|
|
58
|
+
|
|
59
|
+
## 6 接口介绍
|
|
60
|
+
|
|
61
|
+
### 6.1 msprobe.mindspore.PrecisionDebugger
|
|
21
62
|
|
|
22
63
|
**功能说明**:通过加载 dump 配置文件的方式来确定 dump 操作的详细配置。
|
|
23
64
|
|
|
@@ -31,7 +72,7 @@ PrecisionDebugger(config_path=None)
|
|
|
31
72
|
|
|
32
73
|
1. config_path:指定 dump 配置文件路径,string 类型。参数示例:"./config.json"。未配置该路径时,默认使用 [config.json](../config.json) 文件的默认配置,配置选项含义可见 [config.json 介绍](./02.config_introduction.md)。
|
|
33
74
|
|
|
34
|
-
####
|
|
75
|
+
#### 6.1.1 start
|
|
35
76
|
|
|
36
77
|
**功能说明**:启动精度数据采集。需在模型执行模式(静态图/动态图、O0/O1/O2编译等级)设置后调用。静态图场景下,必须在模型初始化及 mindspore.communication.init 调用前添加;动态图场景下,如果没有使用 [Model](https://gitee.com/link?target=https%3A%2F%2Fwww.mindspore.cn%2Ftutorials%2Fzh-CN%2Fr2.3.1%2Fadvanced%2Fmodel.html) 高阶 API 进行训练,则需要与 stop 函数一起添加在 for 循环内,否则只有需要传入model参数时,才使用该接口。
|
|
37
78
|
|
|
@@ -43,9 +84,9 @@ start(model=None)
|
|
|
43
84
|
|
|
44
85
|
**参数说明**:
|
|
45
86
|
|
|
46
|
-
1. model:指具体的 mindspore.nn.Cell
|
|
87
|
+
1. model:指具体的 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 数据。
|
|
47
88
|
|
|
48
|
-
####
|
|
89
|
+
#### 6.1.2 stop
|
|
49
90
|
|
|
50
91
|
**功能说明**:停止数据采集。在 **start** 函数之后的任意位置添加。需要与 start 函数一起添加在 for 循环内。若需要 dump 反向数据,则需要添加在反向计算代码之后。**仅未使用 Model 高阶 API 的动态图场景支持。**
|
|
51
92
|
|
|
@@ -55,7 +96,7 @@ start(model=None)
|
|
|
55
96
|
stop()
|
|
56
97
|
```
|
|
57
98
|
|
|
58
|
-
####
|
|
99
|
+
#### 6.1.3 step
|
|
59
100
|
|
|
60
101
|
**功能说明**:在最后一个 **stop** 函数后或一个 step 训练结束的位置添加。**仅未使用 Model 高阶 API 的动态图场景支持。**
|
|
61
102
|
|
|
@@ -65,13 +106,13 @@ stop()
|
|
|
65
106
|
step()
|
|
66
107
|
```
|
|
67
108
|
|
|
68
|
-
####
|
|
109
|
+
#### 6.1.4 forward_backward_dump_end
|
|
69
110
|
|
|
70
111
|
**功能说明**:在 **start** 函数和在 **stop** 函数之间调用,表示采集 **start** 到 **forward_backward_dump_end**之间的L1级别的正反向数据。
|
|
71
112
|
|
|
72
113
|
**仅支持L1级别数据采集场景。**
|
|
73
114
|
|
|
74
|
-
**L1级别数据中的jit
|
|
115
|
+
**L1级别数据中的jit数据采集行为不受此接口影响。**
|
|
75
116
|
|
|
76
117
|
**仅未使用 Model 高阶 API 的动态图场景支持。**
|
|
77
118
|
|
|
@@ -81,9 +122,9 @@ step()
|
|
|
81
122
|
forward_backward_dump_end()
|
|
82
123
|
```
|
|
83
124
|
|
|
84
|
-
###
|
|
125
|
+
### 6.2 msprobe.mindspore.common.utils.MsprobeStep
|
|
85
126
|
|
|
86
|
-
**功能说明**:MindSpore Callback类,自动在每个step开始时调用start()接口,在每个step结束时调用stop()、step()接口。实现使用 Model 高阶 API 的动态图场景下 L0、L1 级别的精度数据采集控制,控制粒度为单个 **Step** ,而 PrecisionDebugger.start, PrecisionDebugger.stop 接口的控制粒度任意训练代码段。
|
|
127
|
+
**功能说明**:MindSpore Callback类,自动在每个step开始时调用start()接口,在每个step结束时调用stop()、step()接口。实现使用 Model 高阶 API 的动态图场景下 L0、L1、mix 级别的精度数据采集控制,控制粒度为单个 **Step** ,而 PrecisionDebugger.start, PrecisionDebugger.stop 接口的控制粒度任意训练代码段。
|
|
87
128
|
|
|
88
129
|
**原型**:
|
|
89
130
|
|
|
@@ -95,13 +136,13 @@ MsprobeStep(debugger)
|
|
|
95
136
|
|
|
96
137
|
1. debugger:PrecisionDebugger对象。
|
|
97
138
|
|
|
98
|
-
###
|
|
139
|
+
### 6.3 msprobe.mindspore.seed_all
|
|
99
140
|
|
|
100
141
|
**功能说明**:用于固定网络中的随机性和开启确定性计算。
|
|
101
142
|
|
|
102
143
|
**原型**:
|
|
103
144
|
```python
|
|
104
|
-
seed_all(seed=1234, mode=False)
|
|
145
|
+
seed_all(seed=1234, mode=False, rm_dropout=True)
|
|
105
146
|
```
|
|
106
147
|
|
|
107
148
|
**参数说明**:
|
|
@@ -110,26 +151,36 @@ seed_all(seed=1234, mode=False)
|
|
|
110
151
|
|
|
111
152
|
2. mode:确定性计算使能,可配置 True 或 False,默认值:False,非必选。参数示例:mode=True。该参数设置为 True 后,将会开启算子确定性运行模式与归约类通信算子(AllReduce、ReduceScatter、Reduce)的确定性计算。注意:确定性计算会导致API执行性能降低,建议在发现模型多次执行结果不同的情况下开启。
|
|
112
153
|
|
|
113
|
-
|
|
154
|
+
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实例前调用才能生效。
|
|
114
155
|
|
|
115
|
-
### 2.1 MindSpore 静态图场景
|
|
116
156
|
|
|
117
|
-
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
## 7. 示例代码
|
|
160
|
+
|
|
161
|
+
### 7.1 静态图场景
|
|
162
|
+
|
|
163
|
+
```python
|
|
118
164
|
import mindspore as ms
|
|
119
165
|
ms.set_context(mode=ms.GRAPH_MODE, device_target="Ascend")
|
|
120
166
|
|
|
121
167
|
from msprobe.mindspore import PrecisionDebugger
|
|
122
168
|
debugger = PrecisionDebugger(config_path="./config.json")
|
|
123
169
|
debugger.start()
|
|
124
|
-
# 请勿将以上初始化流程置于模型实例化或mindspore.communication.init调用后
|
|
170
|
+
# 请勿将以上初始化流程置于模型实例化或 mindspore.communication.init 调用后
|
|
171
|
+
# 模型定义和训练代码
|
|
125
172
|
# ...
|
|
173
|
+
|
|
126
174
|
```
|
|
127
175
|
|
|
128
|
-
###
|
|
176
|
+
### 7.2 动态图场景
|
|
129
177
|
|
|
130
|
-
####
|
|
178
|
+
#### 7.2.1 L0 ,L1, mix 级别
|
|
131
179
|
|
|
132
|
-
|
|
180
|
+
##### 7.2.1.1 未使用 Model 高阶 API
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
```python
|
|
133
184
|
import mindspore as ms
|
|
134
185
|
ms.set_context(mode=ms.PYNATIVE_MODE, device_target="Ascend")
|
|
135
186
|
|
|
@@ -141,60 +192,66 @@ debugger = PrecisionDebugger(config_path="./config.json")
|
|
|
141
192
|
model = Network()
|
|
142
193
|
# 数据集迭代的地方往往是模型开始训练的地方
|
|
143
194
|
for data, label in data_loader:
|
|
144
|
-
debugger.start() # 进行L1级别下非primitive op采集时调用
|
|
145
|
-
# debugger.start(model) # 进行L0级别或L1级别下primitive op的数据采集时调用
|
|
146
|
-
# 如下是模型每个step执行的逻辑
|
|
195
|
+
debugger.start() # 进行 L1 级别下非 primitive op 采集时调用
|
|
196
|
+
# debugger.start(model) # 进行 L0, mix 级别或 L1 级别下 primitive op 的数据采集时调用
|
|
197
|
+
# 如下是模型每个 step 执行的逻辑
|
|
147
198
|
grad_net = ms.grad(model)(data)
|
|
148
199
|
# ...
|
|
149
|
-
debugger.stop() # 关闭数据dump
|
|
150
|
-
debugger.step() #
|
|
200
|
+
debugger.stop() # 关闭数据 dump
|
|
201
|
+
debugger.step() # 更新迭代数
|
|
151
202
|
```
|
|
152
203
|
|
|
153
|
-
|
|
204
|
+
##### 7.2.1.2 使用 Model 高阶 API
|
|
154
205
|
|
|
155
|
-
|
|
206
|
+
|
|
207
|
+
```python
|
|
156
208
|
import mindspore as ms
|
|
209
|
+
from mindspore.train import Model
|
|
157
210
|
ms.set_context(mode=ms.PYNATIVE_MODE, device_target="Ascend")
|
|
158
211
|
|
|
159
212
|
from msprobe.mindspore import PrecisionDebugger
|
|
213
|
+
from msprobe.mindspore.common.utils import MsprobeStep
|
|
160
214
|
debugger = PrecisionDebugger(config_path="./config.json")
|
|
161
|
-
debugger.start()
|
|
162
|
-
# 请勿将以上初始化流程置于模型实例化或mindspore.communication.init调用后
|
|
163
215
|
|
|
164
216
|
# 模型、损失函数的定义以及初始化等操作
|
|
165
217
|
# ...
|
|
218
|
+
|
|
166
219
|
model = Network()
|
|
167
|
-
#
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
# ...
|
|
220
|
+
# 只有进行 L0 级别下 Cell 对象,mix 级别,L1 级别下 primitive op 的数据采集时才需要调用
|
|
221
|
+
# debugger.start(model)
|
|
222
|
+
trainer = Model(model, loss_fn=loss_fn, optimizer=optimizer, metrics={'accuracy'})
|
|
223
|
+
trainer.train(1, train_dataset, callbacks=[MsprobeStep(debugger)])
|
|
172
224
|
```
|
|
173
225
|
|
|
174
|
-
#### 2.2
|
|
226
|
+
#### 7.2.2 L2 级别
|
|
175
227
|
|
|
176
|
-
|
|
228
|
+
##### 7.2.2.1 未使用 Model 高阶 API
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
```python
|
|
177
232
|
import mindspore as ms
|
|
178
|
-
from mindspore.train import Model
|
|
179
233
|
ms.set_context(mode=ms.PYNATIVE_MODE, device_target="Ascend")
|
|
180
234
|
|
|
181
235
|
from msprobe.mindspore import PrecisionDebugger
|
|
182
|
-
from msprobe.mindspore.common.utils import MsprobeStep
|
|
183
236
|
debugger = PrecisionDebugger(config_path="./config.json")
|
|
237
|
+
debugger.start()
|
|
238
|
+
# 请勿将以上初始化流程置于模型实例化或 mindspore.communication.init 调用后
|
|
184
239
|
|
|
185
240
|
# 模型、损失函数的定义以及初始化等操作
|
|
186
241
|
# ...
|
|
187
|
-
|
|
188
242
|
model = Network()
|
|
189
|
-
#
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
243
|
+
# 数据集迭代的地方往往是模型开始训练的地方
|
|
244
|
+
for data, label in data_loader:
|
|
245
|
+
# 如下是模型每个 step 执行的逻辑
|
|
246
|
+
grad_net = ms.grad(model)(data)
|
|
247
|
+
# ...
|
|
193
248
|
```
|
|
194
249
|
|
|
195
|
-
#### 2.2.4 使用 Model 高阶 API(L2 级别)
|
|
196
250
|
|
|
197
|
-
|
|
251
|
+
##### 7.2.2.2 使用 Model 高阶 API
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
```python
|
|
198
255
|
import mindspore as ms
|
|
199
256
|
from mindspore.train import Model
|
|
200
257
|
ms.set_context(mode=ms.PYNATIVE_MODE, device_target="Ascend")
|
|
@@ -202,7 +259,7 @@ ms.set_context(mode=ms.PYNATIVE_MODE, device_target="Ascend")
|
|
|
202
259
|
from msprobe.mindspore import PrecisionDebugger
|
|
203
260
|
debugger = PrecisionDebugger(config_path="./config.json")
|
|
204
261
|
debugger.start()
|
|
205
|
-
# 请勿将以上初始化流程置于模型实例化或mindspore.communication.init调用后
|
|
262
|
+
# 请勿将以上初始化流程置于模型实例化或 mindspore.communication.init 调用后
|
|
206
263
|
|
|
207
264
|
# 模型、损失函数的定义以及初始化等操作
|
|
208
265
|
# ...
|
|
@@ -212,29 +269,17 @@ trainer = Model(model, loss_fn=loss_fn, optimizer=optimizer, metrics={'accuracy'
|
|
|
212
269
|
trainer.train(1, train_dataset)
|
|
213
270
|
```
|
|
214
271
|
|
|
215
|
-
##
|
|
216
|
-
|
|
217
|
-
### 3.1 MindSpore 静态图场景
|
|
218
|
-
|
|
219
|
-
训练结束后,工具将 dump 的数据保存在 dump_path 参数指定的目录下。
|
|
220
|
-
|
|
221
|
-
- jit_level 为O0/O1时:
|
|
222
|
-
|
|
223
|
-
dump 结果目录请参见 MindSpore 官网中的[同步 Dump 数据对象目录](https://www.mindspore.cn/tutorials/experts/zh-CN/r2.3.1/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)。
|
|
224
|
-
|
|
225
|
-
- jit_level 为O2时:
|
|
272
|
+
## 8. dump 结果文件介绍
|
|
226
273
|
|
|
227
|
-
|
|
274
|
+
### 8.1 静态图场景
|
|
228
275
|
|
|
229
|
-
|
|
276
|
+
训练结束后,数据将保存在 `dump_path` 指定的目录下,目录结构请参见 MindSpore 官方文档中的[数据对象目录](https://www.mindspore.cn/docs/zh-CN/r2.4.0/model_train/debug/dump.html)。
|
|
230
277
|
|
|
231
|
-
###
|
|
278
|
+
### 8.2 动态图场景
|
|
232
279
|
|
|
233
|
-
|
|
280
|
+
dump 结果目录结构示例如下:
|
|
234
281
|
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
```bash
|
|
282
|
+
```lua
|
|
238
283
|
├── dump_path
|
|
239
284
|
│ ├── step0
|
|
240
285
|
│ | ├── rank0
|
|
@@ -245,9 +290,10 @@ dump结果目录结构示例如下:
|
|
|
245
290
|
| | | | ├── Tensor.__add__.0.forward.output.0.npy
|
|
246
291
|
| | | | ...
|
|
247
292
|
| | | | ├── Jit.AlexNet.0.forward.input.0.npy
|
|
248
|
-
| | | |
|
|
249
|
-
|
|
250
|
-
│ | | ├──
|
|
293
|
+
| | | | ├── Primitive.conv2d.Conv2D.0.forward.input.0.npy
|
|
294
|
+
| | | | └── Cell.relu.ReLU.forward.0.input.0.npy
|
|
295
|
+
│ | | ├── dump.json # 保存前反向API、API的统计量信息或溢出API信息。包含dump数据的API名称或Cell名称(Api命名格式为:{api_type}_{api_name}_{API调用次数}_{前向反向}_{input/output}.{参数序号},Cell命名格式为:{Cell}_{cell_name}_{class_name}_{前向反向}.{index}.{input/output}.{参数序号})、dtype、 shape、各数据的max、min、mean、L2norm统计信息以及当配置summary_mode="md5"时的CRC-32数据。其中,“参数序号”表示该API或Cell下的第n个参数,例如1,则为第一个参数,若该参数为list格式,则根据list继续排序,例如1.1,表示该API或Cell的第1个参数的第1个子参数;L2norm表示L2范数(平方根)。
|
|
296
|
+
│ | | ├── stack.json # API 调用栈信息
|
|
251
297
|
│ | | └── construct.json # 分层分级结构,level为L1时,construct.json内容为空
|
|
252
298
|
│ | ├── rank1
|
|
253
299
|
| | | ├── dump_tensor_data
|
|
@@ -263,23 +309,44 @@ dump结果目录结构示例如下:
|
|
|
263
309
|
│ ├── step2
|
|
264
310
|
```
|
|
265
311
|
|
|
266
|
-
|
|
312
|
+
* `rank`:设备 ID,每张卡的数据保存在对应的 `rank{ID}` 目录下。非分布式场景下没有 rank ID,目录名称为 rank。
|
|
313
|
+
* `dump_tensor_data`:保存采集到的张量数据。
|
|
314
|
+
* `dump.json`:记录模块或 API 的统计信息。
|
|
315
|
+
* `stack.json`:API调用栈信息。
|
|
316
|
+
* `construct.json`:分层分级结构信息。
|
|
267
317
|
|
|
268
|
-
|
|
318
|
+
dump 过程中,npy 文件在对应API或者模块被执行后就会落盘,而 json 文件则需要在正常执行 PrecisionDebugger.stop() 后才会写入完整数据,因此,程序异常终止时,被执行API对应的 npy 文件已被保存,但 json 文件中的数据可能丢失。
|
|
269
319
|
|
|
270
320
|
动态图场景下使能 PSJit 或 PIJit,装饰特定 Cell 或 function,被装饰的部分会全部/部分使能**静态图**流程。
|
|
271
321
|
|
|
272
322
|
- PSJit 场景下 config.json 文件配置 level 为 L1 时,被 PSJit 装饰的部分也作为 API 被 dump 到对应目录;配置 level 为 L2 时,则只会 dump 用户网络中静态图流程下的相关 kernel,其结果目录同jit_level 为 O0/O1 时的静态图 dump 相同。
|
|
273
323
|
- PIJit 场景下 config.json 文件配置 level 为 L1 时,会被还原为动态图,按 API 粒度进行 dump;配置 level 为 L2 时,则只会 dump 用户网络中静态图流程下的相关 kernel。
|
|
274
324
|
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
|
279
|
-
|
|
|
280
|
-
|
|
|
281
|
-
|
|
|
282
|
-
|
|
|
283
|
-
|
|
|
284
|
-
|
|
|
285
|
-
|
|
|
325
|
+
|
|
326
|
+
npy文件名的前缀含义如下:
|
|
327
|
+
|
|
328
|
+
| 前缀 | 含义 |
|
|
329
|
+
| -------------- |------------------------------|
|
|
330
|
+
| Tensor | mindspore.Tensor API数据 |
|
|
331
|
+
| Functional | mindspore.ops API数据 |
|
|
332
|
+
| Primitive | mindspore.ops.Primitive API数据 |
|
|
333
|
+
| Mint | mindspore.mint API数据 |
|
|
334
|
+
| MintFunctional | mindspore.mint.nn.functional API数据 |
|
|
335
|
+
| Jit | 被"jit"装饰的模块或函数数据 |
|
|
336
|
+
| Cell | mindspore.nn.Cell 类(模块)数据 |
|
|
337
|
+
|
|
338
|
+
|
|
339
|
+
|
|
340
|
+
## 9.补充说明
|
|
341
|
+
|
|
342
|
+
### 9.1 修改 API 支持列表
|
|
343
|
+
|
|
344
|
+
动态图 API 级 dump 时,本工具提供固定的 API 支持列表,仅支持对列表中的 API 进行精度数据采集。一般情况下,无需修改该列表,而是通过config.json中的scope/list字段进行 dump API 指定。若需要改变 API 支持列表,可以在 `msprobe/mindspore/dump/hook_cell/support_wrap_ops.yaml` 文件内手动修改,如下示例:
|
|
345
|
+
|
|
346
|
+
```yaml
|
|
347
|
+
ops:
|
|
348
|
+
- adaptive_avg_pool1d
|
|
349
|
+
- adaptive_avg_pool2d
|
|
350
|
+
- adaptive_avg_pool3d
|
|
351
|
+
```
|
|
352
|
+
|
|
@@ -137,8 +137,8 @@ msprobe -f pytorch run_ut -api_info ./dump.json -csv_path /home/xxx/ut/accuracy_
|
|
|
137
137
|
| 字段 | 含义 |
|
|
138
138
|
| --------------------- | ------------------------- |
|
|
139
139
|
| API name | API 名称。 |
|
|
140
|
-
| Forward Test Success | 前向 API 是否通过测试,pass 为通过,warning 为待观察,error 为错误。SKIP 表示跳过该 API 的计算,跳过原因在 Message
|
|
141
|
-
| Backward Test Success | 反向 API 是否通过测试,pass 为通过,warning 为待观察,error 为错误。如果是空白的话代表该 API
|
|
140
|
+
| Forward Test Success | 前向 API 是否通过测试,pass 为通过,warning 为待观察,error 为错误。SKIP 表示跳过该 API 的计算,跳过原因在 Message 字段中提示,包括:该 API 不支持精度预检,或该 API 被黑名单过滤或不在白名单上,或运行错误等。 |
|
|
141
|
+
| Backward Test Success | 反向 API 是否通过测试,pass 为通过,warning 为待观察,error 为错误。如果是空白的话代表该 API 没有反向输出。SKIP 表示跳过该 API 的计算,跳过原因在 Message 字段中提示,包括:该 API 不支持精度预检,或该 API 被黑名单过滤或不在白名单上,或运行错误等。 |
|
|
142
142
|
| Message | 提示信息。 |
|
|
143
143
|
|
|
144
144
|
该结果为中间结果,仅作为参考,建议完成 [5 预检结果比对](#5-预检结果比对)后查看比对结果。该结果后续将会删除。
|
|
@@ -174,8 +174,8 @@ Forward Test Success 和 Backward Test Success 是否通过测试是由 `accurac
|
|
|
174
174
|
| ULP 误差最大值 | NPU 或 GPU 数据与标杆数据 ULP 误差的最大值(取绝对值后)。 |
|
|
175
175
|
| ULP 误差平均值 | NPU 或 GPU 数据与标杆数据 ULP 误差的平均值(取绝对值后)。 |
|
|
176
176
|
| ULP 误差大于阈值占比 | NPU 或 GPU 数据与标杆数据的 ULP 误差(取绝对值后)大于阈值(当 NPU 或 GPU 数据类型为 float16 或 bfloat16 时,阈值为 1;当 NPU 或 GPU 数据类型为 float32 时,阈值为 32)的元素个数占总元素的个数比例。 |
|
|
177
|
-
| Status | API
|
|
178
|
-
|
|
|
177
|
+
| Status | API 预检通过状态。pass 表示通过测试;error 表示未通过;warning 表示测试未通过双千或双万精度指标;SKIP 表示跳过该 API 的计算,跳过原因在 Message 字段中提示,包括:该 API 的某个参数的反向不计算梯度,没有任何计算过程,其他信息均为空,或该 API 的数据类型不支持使用新精度标准进行比对(如 float64),或该 API 不支持精度预检,或该 API 被黑名单过滤或不在白名单上,或运行错误等。 |
|
|
178
|
+
| Message | 提示信息。 |
|
|
179
179
|
|
|
180
180
|
### 4.1 API 预检指标
|
|
181
181
|
|
|
@@ -214,8 +214,8 @@ msprobe -f pytorch api_precision_compare -npu /home/xxx/npu/accuracy_checking_de
|
|
|
214
214
|
|
|
215
215
|
| 参数名称 | 说明 | 是否必选 |
|
|
216
216
|
| -------------------- | ------------- | -------- |
|
|
217
|
-
| -npu 或 --npu_csv_path | NPU 预检结果 `accuracy_checking_details_{timestamp}.csv` 文件路径。默认从当前目录下识别该文件。 |
|
|
218
|
-
| -gpu 或 --gpu_csv_path | GPU 预检结果 `accuracy_checking_details_{timestamp}.csv` 文件路径。默认从当前目录下识别该文件。 |
|
|
217
|
+
| -npu 或 --npu_csv_path | NPU 预检结果 `accuracy_checking_details_{timestamp}.csv` 文件路径。默认从当前目录下识别该文件。 | 是 |
|
|
218
|
+
| -gpu 或 --gpu_csv_path | GPU 预检结果 `accuracy_checking_details_{timestamp}.csv` 文件路径。默认从当前目录下识别该文件。 | 是 |
|
|
219
219
|
| -o 或 --out_path | 指定 api_precision_compare.py 执行结果存盘路径,默认为当前目录。 | 否 |
|
|
220
220
|
|
|
221
221
|
执行完成后输出 `api_precision_compare_result_{timestamp}.csv` 和 `api_precision_compare_details_{timestamp}.csv` 文件。文件示例如下:
|
|
@@ -228,10 +228,10 @@ msprobe -f pytorch api_precision_compare -npu /home/xxx/npu/accuracy_checking_de
|
|
|
228
228
|
|
|
229
229
|
| 字段 | 含义 |
|
|
230
230
|
| --------------------- | ------------------------------------------------------------ |
|
|
231
|
-
| API name | API 名称。
|
|
232
|
-
| Forward Test Success | 前向 API
|
|
233
|
-
| Backward Test Success | 反向 API
|
|
234
|
-
| Message | 提示信息。
|
|
231
|
+
| API name | API 名称。 |
|
|
232
|
+
| Forward Test Success | 前向 API 是否通过测试。pass 为通过;warning 为待观察;error 为错误;SKIP 表示跳过该 API 的计算,跳过原因在 Message 字段中提示,包括:该 API 的数据类型不支持使用新精度标准进行比对(如 float64),或该 API 不支持精度预检,或该 API 被黑名单过滤或不在白名单上,或运行错误等。 |
|
|
233
|
+
| Backward Test Success | 反向 API 是否通过测试。pass 为通过;warning 为待观察;error 为错误;如果是空白的话代表该 API 没有反向输出;SKIP 表示该 API 的数据类型不支持使用新精度标准进行比对(如 float64)。 |
|
|
234
|
+
| Message | 提示信息。 |
|
|
235
235
|
|
|
236
236
|
Forward Test Success 和 Backward Test Success 是否通过测试是由 `api_precision_compare_details_{timestamp}.csv` 中的各个指标判定结果决定的。需要注意的是 `api_precision_compare_details_{timestamp}.csv` 中可能存在一个 API 的前向(反向)有多个输出,那么每个输出记录一行,而在 `api_precision_compare_result_{timestamp}.csv` 中的结果需要该 API 的所有结果均为 pass 才能标记为 pass,只要存在一个 error 则标记 error,仅存在 warning 和 pass 且不存在 error 标记 warning。
|
|
237
237
|
|
|
@@ -266,9 +266,9 @@ Forward Test Success 和 Backward Test Success 是否通过测试是由 `api_pre
|
|
|
266
266
|
| ULP 误差判定结果 | ULP 误差判定结果。<br/> 当 NPU 或 GPU 数据类型是 float16 或 bfloat16 时,以下两条标准满足其一标记为 pass,否则标记为 error:<br> NPU ULP 误差大于阈值占比小于 0.001;<br/> NPU ULP 误差大于阈值占比小于 GPU ULP 误差大于阈值占比。<br/> 当 NPU 或 GPU 数据类型是 float32 时,以下三条标准满足其一标记为 pass,否则标记为 error:<br/> NPU ULP 误差平均值小于 64;<br/> NPU ULP 误差大于阈值占比小于 0.05;<br/> NPU ULP 误差大于阈值占比小于 GPU ULP 误差大于阈值占比。 |
|
|
267
267
|
| 双千指标 | 双千精度指标。是指 NPU 的 Tensor 中的元素逐个与对应的标杆数据对比,相对误差小于千分之一的个数占总元素个数的比例。测试通过标准为相对误差大于千分之一的个数占总元素个数的比例小于千分之一。仅 conv1d 和 conv2d 使用该指标。双千指标法指标。 |
|
|
268
268
|
| 双千指标判定结果 | 双千指标判定结果。双千指标大于 0.999 标记为 pass,否则标记为 error。 |
|
|
269
|
-
| 比对结果 | 综合所有指标的最终结果。如果比对指标中有 error,则标记为 error
|
|
269
|
+
| 比对结果 | 综合所有指标的最终结果。如果比对指标中有 error,则标记为 error,在 Message 字段中提示该 API 比对结果不符合标准的指标;有 warning,则标记为 warning,在 Message 字段中提示该 API 比对结果不符合标准的指标;否则标记为 pass;SKIP 表示跳过该 API 的计算,跳过原因在 Message 字段中提示,包括:该 API 的某个参数的反向不计算梯度,没有任何计算过程,其他信息均为空,或该 API 的数据类型不支持使用新精度标准进行比对(如 float64),或该 API 不支持精度预检,或该 API 被黑名单过滤或不在白名单上,或运行错误等。 |
|
|
270
270
|
| 比对算法 | API 使用的比对算法,为标杆比对法、二进制一致法、绝对阈值法和 ULP 误差比对法中的一种。 |
|
|
271
|
-
| Message |
|
|
271
|
+
| Message | 提示信息。 |
|
|
272
272
|
|
|
273
273
|
a:误差比对法指标。
|
|
274
274
|
|
|
@@ -49,8 +49,6 @@ Host 与 GPU Host 设备间建立连接,将 NPU 上对应 API 的输入数据
|
|
|
49
49
|
| level | dump 级别,str 类型,在线预检时配置为 L1,表示 dump API 级精度数据。在线预检可不配置,默认取值 L1。 | 是 |
|
|
50
50
|
| rank | 指定对某张卡上的数据进行 dump,list[int] 类型,默认未配置(表示 dump所有卡的数据),需要与 GPU 侧配置项 rank_list 保持一致。 | 否 |
|
|
51
51
|
| step | 指定 dump 某个 step 的数据,list[int] 类型,默认未配置,表示 dump 所有 step 的数据。dump 特定 step 时,须指定为训练脚本中存在的 step。 | 否 |
|
|
52
|
-
| seed | 随机种子数,int 类型,默认值为 1234。通过固定随机数保证模型的输入或输出一致。 | 否 |
|
|
53
|
-
| is_deterministic | 确定性计算模式,bool 类型,可取值 true(开启)或 false(关闭),默认关闭。 | 否 |
|
|
54
52
|
| scope | dump 范围,list[str] 类型,默认未配置(list 也未配置时表示 dump 所有 api 的数据),配置方式参考 [config.json 配置介绍](./02.config_introduction.md)。 | 否 |
|
|
55
53
|
| list | dump 范围,list[str] 类型,默认未配置(scope 也未配置时表示 dump 所有 api 的数据),配置方式参考 [config.json 配置介绍](./02.config_introduction.md)。 | 否 |
|
|
56
54
|
| online_run_ut | 在线预检模式开关,bool 类型,可取值 True(开启)、False(关闭),默认关闭。 | 是 |
|
|
@@ -58,6 +56,7 @@ Host 与 GPU Host 设备间建立连接,将 NPU 上对应 API 的输入数据
|
|
|
58
56
|
| host | 在线预检模式局域网场景信息接收端 IP,str 类型,用于 GPU 设备和 NPU 设备间进行通信,NPU 侧须配置为 GPU 侧的局域网 IP 地址。局域网场景时,不能配置 nfs_path 参数,否则局域网场景不生效。 | 否 |
|
|
59
57
|
| port | 在线预检模式局域网场景信息接收端端口号,int 类型,用于 GPU 设备和 NPU 设备间进行通信,NPU 侧须配置为 GPU 侧的端口号。局域网场景时,不能配置 nfs_path 参数,否则局域网场景不生效。 | 否 |
|
|
60
58
|
| tls_path | 在线预检模式局域网场景 SSL 证书路径,该路径下包含私钥文件 client.key 和公钥文件 client.crt,str 类型,未配置该参数时默认取值当前路径。tls_path配置为空字符串时,采用TCP协议明文传输api数据;当配置为路径时,采用TLS1.2协议加密传输数据,加密传输时安全性较高,传输速率较低。 | 否 |
|
|
59
|
+
| online_run_ut_recompute | 模型训练是否使用重计算机制,bool类型,默认为False,表示模型没有使用重计算。在线预检暂不支持重计算机制下反向算子的预检,当模型训练使用重计算时,跳过反向算子预检,默认模型关闭重计算。 | 否 |
|
|
61
60
|
|
|
62
61
|
#### 3.1.3 局域网场景配置示例
|
|
63
62
|
|
|
@@ -114,8 +113,6 @@ NPU 侧:
|
|
|
114
113
|
"rank": [0],
|
|
115
114
|
"step": [0],
|
|
116
115
|
"level": "L1",
|
|
117
|
-
"seed": 1234,
|
|
118
|
-
"is_deterministic": true,
|
|
119
116
|
"tensor": {
|
|
120
117
|
"scope": [],
|
|
121
118
|
"list": [],
|
|
@@ -158,8 +155,6 @@ NPU 侧:
|
|
|
158
155
|
"rank": [0],
|
|
159
156
|
"step": [0],
|
|
160
157
|
"level": "L1",
|
|
161
|
-
"seed": 1234,
|
|
162
|
-
"is_deterministic": true,
|
|
163
158
|
"tensor": {
|
|
164
159
|
"scope": [],
|
|
165
160
|
"list": [],
|