mindstudio-probe 1.1.1__py3-none-any.whl → 1.2.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {mindstudio_probe-1.1.1.dist-info → mindstudio_probe-1.2.2.dist-info}/METADATA +3 -2
- mindstudio_probe-1.2.2.dist-info/RECORD +415 -0
- msprobe/CMakeLists.txt +5 -0
- msprobe/README.md +16 -21
- msprobe/config.json +1 -0
- msprobe/core/common/const.py +185 -11
- msprobe/core/common/exceptions.py +3 -1
- msprobe/core/common/file_utils.py +33 -7
- msprobe/core/common/inplace_ops.yaml +4 -0
- msprobe/core/common/utils.py +42 -14
- msprobe/core/common_config.py +6 -0
- msprobe/core/compare/acc_compare.py +139 -128
- msprobe/core/compare/check.py +31 -29
- msprobe/core/compare/compare_cli.py +17 -16
- msprobe/core/compare/highlight.py +186 -99
- msprobe/core/compare/layer_mapping/data_scope_parser.py +19 -8
- msprobe/core/compare/layer_mapping/layer_mapping.py +21 -14
- msprobe/core/compare/layer_mapping/postprocess_pass.py +4 -3
- msprobe/core/compare/merge_result/merge_result.py +381 -0
- msprobe/core/compare/merge_result/merge_result_cli.py +31 -0
- msprobe/core/compare/merge_result/utils.py +81 -0
- msprobe/core/compare/multiprocessing_compute.py +2 -2
- msprobe/core/compare/npy_compare.py +109 -147
- msprobe/core/compare/utils.py +199 -69
- msprobe/core/data_dump/data_collector.py +100 -25
- msprobe/core/data_dump/data_processor/base.py +130 -28
- msprobe/core/data_dump/data_processor/factory.py +8 -3
- msprobe/core/data_dump/data_processor/mindspore_processor.py +170 -23
- msprobe/core/data_dump/data_processor/pytorch_processor.py +175 -64
- msprobe/core/data_dump/json_writer.py +54 -8
- msprobe/core/data_dump/scope.py +19 -18
- msprobe/core/overflow_check/abnormal_scene.py +9 -5
- msprobe/core/overflow_check/checker.py +1 -1
- msprobe/core/overflow_check/utils.py +1 -1
- msprobe/docs/01.installation.md +121 -17
- msprobe/docs/02.config_introduction.md +18 -16
- msprobe/docs/03.config_examples.md +24 -0
- msprobe/docs/05.data_dump_PyTorch.md +107 -58
- msprobe/docs/06.data_dump_MindSpore.md +95 -34
- msprobe/docs/07.accuracy_checker_PyTorch.md +18 -18
- msprobe/docs/09.accuracy_checker_MindSpore.md +8 -6
- msprobe/docs/10.accuracy_compare_PyTorch.md +99 -41
- msprobe/docs/11.accuracy_compare_MindSpore.md +249 -48
- msprobe/docs/12.overflow_check_PyTorch.md +1 -1
- msprobe/docs/19.monitor.md +310 -220
- msprobe/docs/21.visualization_PyTorch.md +125 -35
- msprobe/docs/22.visualization_MindSpore.md +149 -41
- msprobe/docs/23.generate_operator_PyTorch.md +107 -0
- msprobe/docs/24.code_mapping_Mindspore.md +28 -0
- msprobe/docs/{23.tool_function_introduction.md → 25.tool_function_introduction.md} +1 -0
- msprobe/docs/26.data_dump_PyTorch_baseline.md +37 -0
- msprobe/docs/27.dump_json_instruction.md +525 -0
- msprobe/docs/28.debugger_save_instruction.md +94 -0
- msprobe/docs/28.kernel_dump_MindSpore.md +69 -0
- msprobe/docs/FAQ.md +26 -2
- msprobe/docs/accuracy_checker_MindSpore/accuracy_checker_MindSpore_baseline.md +14 -0
- msprobe/docs/data_dump_MindSpore/data_dump_MindSpore_baseline.md +22 -0
- msprobe/docs/img/merge_result.png +0 -0
- msprobe/docs/img/monitor/step_count_per_record.png +0 -0
- msprobe/docs/img/visualization/fuzzy_match_ms.png +0 -0
- msprobe/docs/img/visualization/fuzzy_match_pt.png +0 -0
- msprobe/docs/img/visualization/tensorboard_1.png +0 -0
- msprobe/docs/img/visualization/tensorboard_2.png +0 -0
- msprobe/docs/img/visualization/vis_browser_1.png +0 -0
- msprobe/docs/img/visualization/vis_browser_2.png +0 -0
- msprobe/docs/img/visualization/vis_precision_info.png +0 -0
- msprobe/docs/img/visualization/vis_search_info.png +0 -0
- msprobe/docs/img/visualization/vis_show_info.png +0 -0
- msprobe/docs/img/visualization/vis_showcase.png +0 -0
- msprobe/docs/img/visualization/vis_unmatch_info.png +0 -0
- msprobe/docs/visualization/GPTModel.png +0 -0
- msprobe/docs/visualization/ParallelMLP.png +0 -0
- msprobe/docs/visualization/layer_mapping_example.md +132 -0
- msprobe/docs/visualization/mapping.png +0 -0
- msprobe/docs/visualization/mapping1.png +0 -0
- msprobe/docs/visualization/module_name.png +0 -0
- msprobe/docs/visualization/module_name1.png +0 -0
- msprobe/docs/visualization/no_mapping.png +0 -0
- msprobe/docs/visualization/no_mapping1.png +0 -0
- msprobe/docs/visualization/no_mapping_analyze.png +0 -0
- msprobe/docs/visualization/top_layer.png +0 -0
- msprobe/mindspore/__init__.py +11 -0
- msprobe/mindspore/api_accuracy_checker/api_accuracy_checker.py +80 -28
- msprobe/mindspore/api_accuracy_checker/api_runner.py +54 -16
- msprobe/mindspore/api_accuracy_checker/cmd_parser.py +2 -1
- msprobe/mindspore/api_accuracy_checker/compute_element.py +52 -8
- msprobe/mindspore/api_accuracy_checker/data_manager.py +37 -0
- msprobe/mindspore/api_accuracy_checker/main.py +1 -0
- msprobe/mindspore/api_accuracy_checker/multi_api_accuracy_checker.py +12 -6
- msprobe/mindspore/api_accuracy_checker/multi_data_manager.py +3 -1
- msprobe/mindspore/api_accuracy_checker/torch_mindtorch_importer.py +129 -0
- msprobe/mindspore/api_accuracy_checker/type_mapping.py +24 -1
- msprobe/mindspore/api_accuracy_checker/utils.py +6 -1
- msprobe/mindspore/code_mapping/bind.py +264 -0
- msprobe/mindspore/code_mapping/cmd_parser.py +40 -0
- msprobe/mindspore/code_mapping/graph.py +49 -0
- msprobe/mindspore/code_mapping/graph_parser.py +226 -0
- msprobe/mindspore/code_mapping/main.py +24 -0
- msprobe/mindspore/code_mapping/processor.py +34 -0
- msprobe/mindspore/common/const.py +3 -1
- msprobe/mindspore/common/utils.py +68 -5
- msprobe/mindspore/compare/distributed_compare.py +0 -2
- msprobe/mindspore/compare/ms_compare.py +105 -63
- msprobe/mindspore/compare/ms_graph_compare.py +14 -5
- msprobe/mindspore/debugger/debugger_config.py +28 -2
- msprobe/mindspore/debugger/precision_debugger.py +100 -12
- msprobe/mindspore/dump/hook_cell/api_registry.py +85 -16
- msprobe/mindspore/dump/hook_cell/hook_cell.py +60 -38
- msprobe/mindspore/dump/hook_cell/primitive_hooks.py +33 -15
- msprobe/mindspore/dump/hook_cell/support_wrap_ops.yaml +11 -1
- msprobe/mindspore/dump/hook_cell/wrap_api.py +92 -1
- msprobe/mindspore/dump/jit_dump.py +7 -6
- msprobe/mindspore/dump/kernel_dump/kernel_config.py +33 -0
- msprobe/mindspore/dump/kernel_graph_dump.py +7 -0
- msprobe/mindspore/free_benchmark/api_pynative_self_check.py +13 -4
- msprobe/mindspore/free_benchmark/perturbation/bit_noise.py +2 -2
- msprobe/mindspore/grad_probe/grad_analyzer.py +24 -12
- msprobe/mindspore/grad_probe/hook.py +13 -4
- msprobe/mindspore/mindtorch/__init__.py +18 -0
- msprobe/mindspore/mindtorch/mindtorch_adaptor.py +255 -0
- msprobe/mindspore/monitor/anomaly_detect.py +404 -0
- msprobe/mindspore/monitor/distributed/__init__.py +0 -0
- msprobe/mindspore/monitor/distributed/distributed_ops.yaml +15 -0
- msprobe/mindspore/monitor/distributed/stack_blacklist.yaml +5 -0
- msprobe/mindspore/monitor/distributed/wrap_distributed.py +300 -0
- msprobe/mindspore/monitor/features.py +63 -0
- msprobe/mindspore/monitor/module_hook.py +821 -0
- msprobe/mindspore/monitor/module_spec_verifier.py +94 -0
- msprobe/mindspore/monitor/utils.py +267 -0
- msprobe/mindspore/ms_config.py +13 -3
- msprobe/mindspore/overflow_check/kernel_graph_overflow_check.py +7 -0
- msprobe/mindspore/service.py +347 -107
- msprobe/msprobe.py +24 -3
- msprobe/pytorch/__init__.py +7 -7
- msprobe/pytorch/api_accuracy_checker/common/utils.py +31 -16
- msprobe/pytorch/api_accuracy_checker/compare/algorithm.py +41 -8
- msprobe/pytorch/api_accuracy_checker/compare/api_precision_compare.py +100 -267
- msprobe/pytorch/api_accuracy_checker/compare/api_precision_standard.yaml +4 -1
- msprobe/pytorch/api_accuracy_checker/compare/compare.py +69 -68
- msprobe/pytorch/api_accuracy_checker/compare/compare_column.py +54 -0
- msprobe/pytorch/api_accuracy_checker/compare/compare_input.py +51 -0
- msprobe/pytorch/api_accuracy_checker/compare/compare_utils.py +2 -4
- msprobe/pytorch/api_accuracy_checker/generate_op_script/op_generator.py +55 -31
- msprobe/pytorch/api_accuracy_checker/precision_standard/absolute_threshold.py +106 -0
- msprobe/pytorch/api_accuracy_checker/precision_standard/accumulative_error_compare.py +107 -0
- msprobe/pytorch/api_accuracy_checker/precision_standard/base_standard.py +151 -0
- msprobe/pytorch/api_accuracy_checker/precision_standard/benchmark_compare.py +226 -0
- msprobe/pytorch/api_accuracy_checker/precision_standard/binary_consistency.py +68 -0
- msprobe/pytorch/api_accuracy_checker/precision_standard/standard_config.py +218 -0
- msprobe/pytorch/api_accuracy_checker/precision_standard/standard_register.py +104 -0
- msprobe/pytorch/api_accuracy_checker/precision_standard/thousandth_standard.py +63 -0
- msprobe/pytorch/api_accuracy_checker/precision_standard/ulp_compare.py +200 -0
- msprobe/pytorch/api_accuracy_checker/run_ut/data_generate.py +57 -1
- msprobe/pytorch/api_accuracy_checker/run_ut/multi_run_ut.py +2 -1
- msprobe/pytorch/api_accuracy_checker/run_ut/run_overflow_check.py +42 -14
- msprobe/pytorch/api_accuracy_checker/run_ut/run_ut.py +64 -19
- msprobe/pytorch/api_accuracy_checker/run_ut/run_ut_utils.py +34 -4
- msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/device_dispatch.py +5 -3
- msprobe/pytorch/bench_functions/apply_adam.py +215 -0
- msprobe/pytorch/bench_functions/group_norm_silu.py +27 -0
- msprobe/pytorch/bench_functions/mish.py +21 -0
- msprobe/pytorch/bench_functions/moe_gating_top_k_softmax.py +44 -0
- msprobe/pytorch/bench_functions/npu_fusion_attention.py +42 -10
- msprobe/pytorch/bench_functions/sort_v2.py +21 -0
- msprobe/pytorch/common/parse_json.py +2 -1
- msprobe/pytorch/common/utils.py +116 -2
- msprobe/pytorch/compare/distributed_compare.py +17 -29
- msprobe/pytorch/compare/pt_compare.py +40 -20
- msprobe/pytorch/debugger/debugger_config.py +42 -17
- msprobe/pytorch/debugger/precision_debugger.py +56 -12
- msprobe/pytorch/dump/module_dump/__init__.py +0 -0
- msprobe/pytorch/dump/module_dump/module_dump.py +86 -0
- msprobe/pytorch/dump/module_dump/module_processer.py +204 -0
- msprobe/pytorch/free_benchmark/common/params.py +2 -1
- msprobe/pytorch/free_benchmark/common/utils.py +3 -0
- msprobe/pytorch/free_benchmark/compare/grad_saver.py +0 -2
- msprobe/pytorch/free_benchmark/result_handlers/base_handler.py +31 -47
- msprobe/pytorch/free_benchmark/result_handlers/preheat_handler.py +0 -4
- msprobe/pytorch/function_factory.py +7 -1
- msprobe/pytorch/hook_module/__init__.py +1 -1
- msprobe/pytorch/hook_module/hook_module.py +14 -11
- msprobe/pytorch/hook_module/register_optimizer_hook.py +59 -0
- msprobe/pytorch/hook_module/support_wrap_ops.yaml +36 -1
- msprobe/pytorch/hook_module/wrap_distributed.py +10 -8
- msprobe/pytorch/hook_module/wrap_functional.py +0 -40
- msprobe/pytorch/monitor/anomaly_analyse.py +1 -1
- msprobe/pytorch/monitor/anomaly_detect.py +98 -28
- msprobe/pytorch/monitor/csv2tb.py +164 -0
- msprobe/pytorch/monitor/distributed/wrap_distributed.py +25 -14
- msprobe/pytorch/monitor/features.py +3 -3
- msprobe/pytorch/monitor/module_hook.py +543 -318
- msprobe/pytorch/monitor/module_metric.py +27 -48
- msprobe/pytorch/monitor/module_spec_verifier.py +3 -1
- msprobe/pytorch/monitor/optimizer_collect.py +76 -56
- msprobe/pytorch/monitor/unittest/test_monitor.py +24 -9
- msprobe/pytorch/monitor/utils.py +84 -48
- msprobe/pytorch/online_dispatch/dispatch.py +8 -2
- msprobe/pytorch/parse_tool/lib/compare.py +10 -10
- msprobe/pytorch/parse_tool/lib/config.py +5 -7
- msprobe/pytorch/parse_tool/lib/file_desc.py +15 -1
- msprobe/pytorch/parse_tool/lib/interactive_cli.py +10 -10
- msprobe/pytorch/parse_tool/lib/parse_exception.py +7 -7
- msprobe/pytorch/parse_tool/lib/parse_tool.py +11 -10
- msprobe/pytorch/parse_tool/lib/utils.py +18 -19
- msprobe/pytorch/parse_tool/lib/visualization.py +9 -10
- msprobe/pytorch/pt_config.py +19 -22
- msprobe/pytorch/service.py +264 -115
- msprobe/visualization/builder/graph_builder.py +93 -10
- msprobe/visualization/builder/msprobe_adapter.py +30 -6
- msprobe/visualization/compare/graph_comparator.py +64 -14
- msprobe/visualization/compare/mode_adapter.py +1 -15
- msprobe/visualization/graph/base_node.py +15 -19
- msprobe/visualization/graph/distributed_analyzer.py +395 -0
- msprobe/visualization/graph/graph.py +9 -0
- msprobe/visualization/graph/node_op.py +4 -2
- msprobe/visualization/graph_service.py +100 -27
- msprobe/visualization/utils.py +24 -31
- mindstudio_probe-1.1.1.dist-info/RECORD +0 -341
- msprobe/pytorch/functional/module_dump.py +0 -84
- msprobe/pytorch/module_processer.py +0 -150
- {mindstudio_probe-1.1.1.dist-info → mindstudio_probe-1.2.2.dist-info}/LICENSE +0 -0
- {mindstudio_probe-1.1.1.dist-info → mindstudio_probe-1.2.2.dist-info}/WHEEL +0 -0
- {mindstudio_probe-1.1.1.dist-info → mindstudio_probe-1.2.2.dist-info}/entry_points.txt +0 -0
- {mindstudio_probe-1.1.1.dist-info → mindstudio_probe-1.2.2.dist-info}/top_level.txt +0 -0
- /msprobe/docs/{data_dump_Mindspore → data_dump_MindSpore}/dynamic_graph_quick_start_example.md +0 -0
- /msprobe/{pytorch/functional → mindspore/code_mapping}/__init__.py +0 -0
msprobe/docs/19.monitor.md
CHANGED
|
@@ -4,67 +4,77 @@
|
|
|
4
4
|
|
|
5
5
|
训练状态轻量化监控工具,能够在较低性能损耗下收集和记录模型训练过程中的激活值、权重梯度、优化器状态和通信算子的中间值,实时呈现训练状态。
|
|
6
6
|
|
|
7
|
-
- [快速上手](#快速上手)
|
|
8
|
-
- [权重监控](#权重监控)
|
|
9
|
-
- [权重梯度监控](#权重梯度监控)
|
|
10
|
-
- [激活值监控](#激活值监控)
|
|
11
|
-
- [优化器状态监控](#优化器状态监控)
|
|
12
|
-
- [详细配置](#详细配置)
|
|
13
|
-
|
|
14
7
|
## 安装
|
|
15
|
-
参见[msprobe安装](./01.installation.md)
|
|
8
|
+
参见[msprobe安装](./01.installation.md)。
|
|
9
|
+
|
|
10
|
+
要求:
|
|
11
|
+
|
|
12
|
+
- PyTorch场景:torch不低于**2.0**
|
|
13
|
+
- MindSpore场景:mindspore不低于**2.4.10**,仅支持**MindSpore动态图**,暂不支持**msadapter**套件
|
|
14
|
+
|
|
15
|
+
## 功能介绍
|
|
16
|
+
下表中字段为训练状态轻量化监控工具的完整功能点:
|
|
17
|
+
|
|
18
|
+
| 功能 | 说明 | 支持场景 |
|
|
19
|
+
| ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------ |
|
|
20
|
+
| [权重监控](#权重监控) | 开启权重监控 | PyTorch、MindSpore |
|
|
21
|
+
| [权重梯度监控](#权重梯度监控) | 开启权重梯度监控 | PyTorch、MindSpore |
|
|
22
|
+
| [激活值监控](#激活值监控) | 开启激活值监控 | PyTorch、MindSpore |
|
|
23
|
+
| [优化器状态监控](#优化器状态监控) | 开启优化器状态监控 | PyTorch、MindSpore |
|
|
24
|
+
| [指定监控对象](#指定监控对象) | 指定监控的nn.Module(nn.Cell)及对应的输入输出 | PyTorch、MindSpore |
|
|
25
|
+
| [打印模型结构](#打印模型结构) | 打印模型结构 | PyTorch |
|
|
26
|
+
| [Module全量监控](#Module全量监控) | 对全量module的输入输出做监控 | PyTorch、MindSpore |
|
|
27
|
+
| [Parameter全量监控](#Parameter全量监控) | 对全量Parameter的输入输出做监控 | PyTorch、MindSpore |
|
|
28
|
+
| [输出格式和统计量](#输出格式和统计量) | format PyTorch支持`csv`、`tensorboard`和`api`,MindSpore仅支持`csv`,`ops`均支持,`ndigits`仅PyTorch支持 | PyTorch、MindSpore |
|
|
29
|
+
| [梯度异常时序判断](#梯度异常时序判断) | 梯度异常时自动梯度落盘 | PyTorch |
|
|
30
|
+
| [csv格式数据转tensorboard可视化显示](#csv格式数据转tensorboard可视化显示) | 将csv转为tensorboard文件显示 | PyTorch |
|
|
31
|
+
| [动态启停](#动态启停) | 训练过程中动态修改配置开启监控 | PyTorch |
|
|
32
|
+
| [功能重载](#功能重载) | 训练中开启激活值监控。待废弃,请使用动态启停功能代替。 | PyTorch |
|
|
16
33
|
|
|
17
34
|
## 快速上手
|
|
18
35
|
根据需求监控相应对象。比如在loss上扬,grad norm正常的异常训练过程中,优先考虑监控模型前向过程;在grad norm异常的训练过程中,监控权重和激活值的梯度。
|
|
19
36
|
推荐使用方式:权重梯度的监控性能损耗小(20B dense模型全量权重梯度监控,时间增加<1%,内存增加<1%),可以长期开启。激活值监控性能损耗大,在必要时开启或者仅监控部分。
|
|
20
37
|
|
|
21
38
|
### 工具使能
|
|
22
|
-
|
|
39
|
+
在实际训练代码中找到模型、优化器定义的位置,使能monitor工具,通过配置文件(json)控制工具行为。如下分别为Pytorch场景和MindSpore场景下的使能方式。
|
|
40
|
+
|
|
41
|
+
- Pytorch使能方式:
|
|
23
42
|
```python
|
|
24
|
-
#
|
|
25
|
-
# Megatron-LM(core_r0.6.0) megatron/training.py, def pretrain:
|
|
43
|
+
# Megatron-LM(core_r0.6.0) training.py
|
|
26
44
|
model, optimizer, opt_param_scheduler = setup_model_and_optimizer(
|
|
27
45
|
model_provider, model_type)
|
|
28
46
|
|
|
29
|
-
|
|
47
|
+
...
|
|
30
48
|
from msprobe.pytorch import TrainerMon
|
|
31
|
-
# 监控工具初始化
|
|
32
49
|
monitor = TrainerMon(
|
|
33
50
|
config_file_path="./monitor_config.json",
|
|
34
|
-
process_group=None,
|
|
35
51
|
params_have_main_grad=True, # 权重是否使用main_grad,通常megatron为True,deepspeed为False。默认为True。
|
|
36
|
-
opt_ty=None # 优化器类型,默认为None,具体取值参考公开接口
|
|
37
52
|
)
|
|
38
|
-
monitor.set_wrapped_optimizer(optimizer)
|
|
39
53
|
# 挂载监控对象
|
|
40
|
-
monitor.
|
|
54
|
+
monitor.set_monitor(
|
|
41
55
|
model,
|
|
42
56
|
grad_acc_steps=args.global_batch_size//args.data_parallel_size//args.micro_batch_size,
|
|
43
|
-
optimizer=
|
|
57
|
+
optimizer=optimizer,
|
|
44
58
|
dp_group=None,
|
|
45
|
-
tp_group=None
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
# optional
|
|
49
|
-
# 可以在任意位置获取当前的参数梯度统计量
|
|
50
|
-
reduced, unreduced = monitor.generate_wgrad_metrics()
|
|
51
|
-
# 可以在任意位置获取当前的激活值、激活值梯度统计量
|
|
52
|
-
actv, actv_grad = monitor.generate_xy_metrics()
|
|
59
|
+
tp_group=None,
|
|
60
|
+
start_iteration=0 # 断点续训时提供当前iteration,默认从0开始
|
|
61
|
+
)
|
|
53
62
|
```
|
|
54
63
|
|
|
55
|
-
|
|
64
|
+
*注意*:补充deepspeed下常用框架的使能位置。
|
|
65
|
+
|
|
66
|
+
deepspeed与accelerate、transformers同时使用时,optimizer传值方式为`optimizer=optimizer.optimizer`,若未使用deepspeed,单独使用accelerate、transformers,optimizer传值方式为`optimizer=optimizer`。
|
|
56
67
|
|
|
57
|
-
|
|
68
|
+
1) 同时使用deepspeed和accelerate时,工具使能位置参考如下:
|
|
58
69
|
|
|
59
70
|
```python
|
|
60
71
|
model, optimizer, trainloader, evalloader, schedular = accelerator.prepare(...)
|
|
61
|
-
|
|
72
|
+
...
|
|
62
73
|
monitor = TrainerMon(...)
|
|
63
|
-
monitor.
|
|
64
|
-
monitor.monitor_gnorm_with_ad(....optimizer=optimizer.optimizer)
|
|
74
|
+
monitor.set_monitor(....optimizer=optimizer.optimizer)
|
|
65
75
|
```
|
|
66
76
|
|
|
67
|
-
|
|
77
|
+
2. 同时使用deepspeed和transformers时,工具使能位置参考如下:
|
|
68
78
|
|
|
69
79
|
```python
|
|
70
80
|
# src/transformers/trainer.py
|
|
@@ -72,19 +82,107 @@ class Trainer:
|
|
|
72
82
|
def _inner_training_loop:
|
|
73
83
|
...
|
|
74
84
|
monitor = TrainerMon(...)
|
|
75
|
-
monitor.
|
|
76
|
-
monitor.monitor_gnorm_with_ad(....optimizer=self.optimizer.optimizer)
|
|
85
|
+
monitor.set_monitor(....optimizer=self.optimizer.optimizer)
|
|
77
86
|
|
|
78
87
|
for epoch in range(epochs_trained, num_train_epochs):
|
|
79
88
|
...
|
|
80
89
|
```
|
|
81
90
|
|
|
91
|
+
- MindSpore使能方式:
|
|
92
|
+
```python
|
|
93
|
+
...
|
|
94
|
+
from msprobe.mindspore import TrainerMon
|
|
95
|
+
monitor = TrainerMon(
|
|
96
|
+
config_file_path="./monitor_config.json",
|
|
97
|
+
process_group=None,
|
|
98
|
+
params_have_main_grad=True, # 权重是否使用main_grad,通常megatron为True,deepspeed为False。默认为True。
|
|
99
|
+
)
|
|
100
|
+
# 挂载监控对象
|
|
101
|
+
monitor.set_monitor(
|
|
102
|
+
model,
|
|
103
|
+
grad_acc_steps=args.global_batch_size//args.data_parallel_size//args.micro_batch_size,
|
|
104
|
+
optimizer=optimizer,
|
|
105
|
+
dp_group=None,
|
|
106
|
+
tp_group=None
|
|
107
|
+
)
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
### 权重监控
|
|
112
|
+
- 工具配置示例:
|
|
113
|
+
```json
|
|
114
|
+
{
|
|
115
|
+
"targets": {
|
|
116
|
+
},
|
|
117
|
+
"param_distribution": true,
|
|
118
|
+
"format": "csv",
|
|
119
|
+
"ops": ["norm", "min", "max", "nans"]
|
|
120
|
+
}
|
|
121
|
+
```
|
|
122
|
+
`targets`中指定module包含的所有权重都会被监控。`targets`为空时,默认监控全部module。
|
|
123
|
+
设置`param_distribution`为true,表示开启权重监控功能,默认值为false。
|
|
124
|
+
|
|
125
|
+
### 权重梯度监控
|
|
126
|
+
- 工具配置示例:
|
|
127
|
+
```json
|
|
128
|
+
{
|
|
129
|
+
"targets": {
|
|
130
|
+
},
|
|
131
|
+
"wg_distribution": true,
|
|
132
|
+
"format": "csv",
|
|
133
|
+
"ops": ["norm", "min", "max", "nans"]
|
|
134
|
+
}
|
|
135
|
+
```
|
|
136
|
+
`targets`中指定module包含的所有权重都会被监控。`targets`为空时,默认监控全部module。
|
|
137
|
+
设置`wg_distribution`(weight grad, noted as `wg`) 为true,表示开启权重梯度监控功能,默认值为false。
|
|
138
|
+
|
|
139
|
+
### 激活值监控
|
|
140
|
+
|
|
141
|
+
- 工具配置
|
|
142
|
+
```json
|
|
143
|
+
{
|
|
144
|
+
"targets": {
|
|
145
|
+
},
|
|
146
|
+
"xy_distribution": true,
|
|
147
|
+
"forward_only": false,
|
|
148
|
+
"backward_only": false,
|
|
149
|
+
"all_xy": true,
|
|
150
|
+
"format": "csv",
|
|
151
|
+
"ops": ["norm", "min", "max", "nans"]
|
|
152
|
+
}
|
|
153
|
+
```
|
|
154
|
+
`all_xy`为true表示监控全量module激活值,若需要对指定模块设置监控对象,在`targets`中进行配置,配置方式参考 [指定监控对象](#指定监控对象) 。
|
|
155
|
+
|
|
156
|
+
设置`xy_distribution`为true表示开启激活值监控功能,默认值为false。
|
|
157
|
+
|
|
158
|
+
注意:`forward_only`和`backward_only`均为true时,触发warning,前反向均不采集;默认值均为false时,前反向均采集。
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
### 优化器状态监控
|
|
162
|
+
- 工具配置示例:
|
|
163
|
+
```json
|
|
164
|
+
{
|
|
165
|
+
"targets": {
|
|
166
|
+
},
|
|
167
|
+
"mv_distribution": true,
|
|
168
|
+
"format": "csv",
|
|
169
|
+
"ops": ["norm", "min", "max", "nans"]
|
|
170
|
+
}
|
|
171
|
+
```
|
|
172
|
+
`targets`中指定module包含的所有权重都会被监控。`targets`为空时,默认监控全部module。
|
|
173
|
+
设置`mv_distribution`为true表示开启优化监控功能(1st moment noted as `m`, 2nd moment noted as `v`),默认值为false。[什么是mv](https://arxiv.org/pdf/1412.6980)
|
|
174
|
+
|
|
175
|
+
本工具针对分布式计算框架megatron和deepspeed框架做了适配,暂不支持其他框架。
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
## 高阶功能
|
|
179
|
+
|
|
82
180
|
### 指定监控对象
|
|
83
181
|
|
|
84
|
-
工具支持对nn.Module(**激活值监控**)和nn.Parameter
|
|
182
|
+
工具支持对nn.Module(**激活值监控**)和nn.Parameter(**权重监控**、**权重梯度监控、优化器监控**)对象实现相应的监控行为,在配置文件的"targets"(dict)字段指定,targets格式为{module_name/param_name: {filed: format}}。
|
|
85
183
|
|
|
86
|
-
|
|
87
|
-
|
|
184
|
+
#### 打印模型结构
|
|
185
|
+
工具提供可选项`print_struct`打印模型结构,帮助配置targets。工具会在在第一个step后打印结构并停止训练进程,模型结构默认打印在`$MONITOR_OUTPUT_DIR/module_struct.json`。
|
|
88
186
|
```json
|
|
89
187
|
{
|
|
90
188
|
"print_struct": true
|
|
@@ -92,7 +190,7 @@ class Trainer:
|
|
|
92
190
|
```
|
|
93
191
|
|
|
94
192
|
输出样例:
|
|
95
|
-
|
|
193
|
+
字段`config`用于配置文件中指定module target。其余为各个元素的shape和dtype。
|
|
96
194
|
|
|
97
195
|
```json
|
|
98
196
|
"0:63.mlp.linear_fc2": {
|
|
@@ -134,7 +232,8 @@ class Trainer:
|
|
|
134
232
|
}
|
|
135
233
|
}
|
|
136
234
|
```
|
|
137
|
-
|
|
235
|
+
#### Module全量监控
|
|
236
|
+
工具提供简便的全量module监控方式。或不配置targets、all_xy字段,同样表示全量监控。
|
|
138
237
|
|
|
139
238
|
```json
|
|
140
239
|
{
|
|
@@ -159,11 +258,12 @@ class Trainer:
|
|
|
159
258
|
}
|
|
160
259
|
```
|
|
161
260
|
|
|
162
|
-
|
|
261
|
+
#### Parameter全量监控
|
|
262
|
+
工具提供简便的全量parameter监控方式。或不配置targets,同样表示全量监控。
|
|
163
263
|
|
|
164
264
|
```json
|
|
165
265
|
{
|
|
166
|
-
"targets": {
|
|
266
|
+
"targets": {}
|
|
167
267
|
}
|
|
168
268
|
```
|
|
169
269
|
|
|
@@ -177,17 +277,19 @@ class Trainer:
|
|
|
177
277
|
}
|
|
178
278
|
```
|
|
179
279
|
|
|
180
|
-
|
|
181
|
-
通过环境变量`MONITOR_OUTPUT_DIR
|
|
280
|
+
#### 输出路径
|
|
281
|
+
通过环境变量`MONITOR_OUTPUT_DIR`设置monitor输出路径,默认为`./monitor_output/`。
|
|
182
282
|
```shell
|
|
183
283
|
export MONITOR_OUTPUT_DIR=/xxx/output_dir
|
|
184
284
|
```
|
|
185
285
|
|
|
186
286
|
- 输出格式
|
|
187
|
-
通过可选配置项`format
|
|
287
|
+
通过可选配置项`format`指定,当前支持`csv`, `tensorboard`, `api`。其中`csv`为默认缺省值。
|
|
188
288
|
|
|
189
|
-
-
|
|
190
|
-
监控结果写入tensorboard的event文件,启动tensorboard
|
|
289
|
+
- **tensorboard**
|
|
290
|
+
监控结果写入tensorboard的event文件,启动tensorboard查看。
|
|
291
|
+
激活值监控任务的tag为{vpp_stage}:{module_name}.{input or output}:{micro_step}/{rank}/{task}\_{ops}
|
|
292
|
+
其他监控任务的tag为{vpp_stage}:{param_name}/{rank}/{task}\_{ops}
|
|
191
293
|
```shell
|
|
192
294
|
tensorboard --logdir=$MONITOR_OUTPUT_DIR
|
|
193
295
|
```
|
|
@@ -196,73 +298,30 @@ export MONITOR_OUTPUT_DIR=/xxx/output_dir
|
|
|
196
298
|
ssh -N -L localhost:6006:localhost:6006 your_username@remote_server_address
|
|
197
299
|
```
|
|
198
300
|
|
|
199
|
-
-
|
|
200
|
-
监控结果写入csv文件中,可以通过`ndigits
|
|
301
|
+
- **csv**
|
|
302
|
+
监控结果写入csv文件中,可以通过`ndigits`字段设置小数位数。
|
|
303
|
+
表头为 vpp_stage | name | step | micro_step(optional) | *ops |。
|
|
304
|
+
仅在激活值监控的输出文件中包含micor_step。
|
|
305
|
+
激活值监控的name为<module_name>.\<input or output>, 其他任务的name为<param_name>>
|
|
201
306
|
|
|
202
|
-
-
|
|
203
|
-
监控结果不落盘,在训练过程中可以通过`generate_wgrad_metrics`、`generate_xy_metrics
|
|
307
|
+
- **api**
|
|
308
|
+
监控结果不落盘,在训练过程中可以通过`generate_wgrad_metrics`、`generate_xy_metrics`等接口获取,使用方式参考[公开接口](#公开接口) 。
|
|
204
309
|
|
|
205
310
|
- 统计量
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
### 权重监控
|
|
209
|
-
- 工具配置示例:
|
|
210
|
-
```json
|
|
211
|
-
{
|
|
212
|
-
"targets": {
|
|
213
|
-
"": {}
|
|
214
|
-
},
|
|
215
|
-
"param_distribution": true,
|
|
216
|
-
"format": "csv",
|
|
217
|
-
"ops": ["norm", "min", "max", "nans"]
|
|
218
|
-
}
|
|
219
|
-
```
|
|
220
|
-
"targets"中指定module包含的所有权重都会被监控。整个model的name为空字符串可以覆盖全量权重。
|
|
221
|
-
设置"param_distribution"开启权重监控功能。
|
|
222
|
-
|
|
223
|
-
使用deepspeed的zero优化器时,需要在工具中指定优化器类型并传入优化器,获取梯度切分行为已还原参数梯度。
|
|
224
|
-
```python
|
|
225
|
-
from msprobe.pytorch import TrainerMon
|
|
226
|
-
# 以zero1优化器举例,opt_ty取值DeepSpeedZeroOptimizer_Stage1_or_2
|
|
227
|
-
# 示例为deepspeed,params_have_main_grad取值False
|
|
228
|
-
monitor = TrainerMon("./monitor_config.json", params_have_main_grad=False, opt_ty="DeepSpeedZeroOptimizer_Stage1_or_2")
|
|
229
|
-
monitor.set_wrapped_optimizer(optimizer) # optimzier为训练框架自定义的优化器
|
|
230
|
-
monitor.monitor_gnorm_with_ad(
|
|
231
|
-
model, grad_acc_steps=model.grad_acc_steps, optimizer=optimizer)
|
|
232
|
-
```
|
|
233
|
-
|
|
311
|
+
通过配置项`ops`指定。当前支持`norm`, `min`, `max`, `mean`, `nans`,`zeros`。其中`nans`监控tensor中`nan`的数量,`zeros`统计tensor中数值小于`eps`的比例。
|
|
234
312
|
|
|
235
|
-
|
|
236
|
-
- 工具配置示例:
|
|
237
|
-
```json
|
|
238
|
-
{
|
|
239
|
-
"targets": {
|
|
240
|
-
"": {}
|
|
241
|
-
},
|
|
242
|
-
"wg_distribution": true,
|
|
243
|
-
"format": "csv",
|
|
244
|
-
"ops": ["norm", "min", "max", "nans"]
|
|
245
|
-
}
|
|
246
|
-
```
|
|
247
|
-
"targets"中指定module包含的所有权重都会被监控。整个model的name为空字符串可以覆盖全量梯度。
|
|
248
|
-
设置"wg_distribution"(weight grad, noted as `wg`)开启梯度监控功能。
|
|
313
|
+
- csv输出件合并
|
|
249
314
|
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
# 以zero1优化器举例,opt_ty取值DeepSpeedZeroOptimizer_Stage1_or_2
|
|
254
|
-
# 示例为deepspeed,params_have_main_grad取值False
|
|
255
|
-
monitor = TrainerMon("./monitor_config.json", params_have_main_grad=False, opt_ty="DeepSpeedZeroOptimizer_Stage1_or_2")
|
|
256
|
-
monitor.set_wrapped_optimizer(optimizer) # optimzier为训练框架自定义的优化器
|
|
257
|
-
monitor.monitor_gnorm_with_ad(
|
|
258
|
-
model, grad_acc_steps=model.grad_acc_steps, optimizer=optimizer)
|
|
259
|
-
```
|
|
315
|
+
提供csv输出件合并功能,在配置json文件中设置`step_count_per_record`,表示每个csv文件存储多个step的监控数据。默认值为1,表示每个csv文件记录一个step的监控数据。
|
|
316
|
+
|
|
317
|
+
如下图所示为梯度监控结果示例,配置`step_count_per_record`为5,连续监控10个step,每个csv文件记录了5个step的梯度数据。其中`grad_reduced_0-4.csv`为step0至step4共计5个step的聚合后梯度数据,`grad_unreduced_0-4.csv`为step0至step4共计5个step的聚合前梯度数据。
|
|
260
318
|
|
|
319
|
+

|
|
261
320
|
|
|
262
321
|
### 梯度异常时序判断
|
|
263
322
|
1. 训练前配置相关参数
|
|
264
323
|
|
|
265
|
-
工具支持自动判断训练过程中的梯度异常,需要在配置文件中设置alert相关字段。"AnomalyTurbulence"会将当前数值与历史均值比较,如果相对偏差超过阈值,会在打屏信息中提示用户。如果打开"dump"选项,则会将异常梯度相关信息落盘到目录`monitor_output/anomaly_detected`,用于后续时序判断。
|
|
324
|
+
工具支持自动判断训练过程中的梯度异常,需要在配置文件中设置alert相关字段。"AnomalyTurbulence"会将当前数值与历史均值比较,如果相对偏差超过阈值,会在打屏信息中提示用户。如果打开"`dump`"选项,则会将异常梯度相关信息落盘到目录`monitor_output/anomaly_detected`,用于后续时序判断。
|
|
266
325
|
```json
|
|
267
326
|
"alert": {
|
|
268
327
|
"rules": [{"rule_name": "AnomalyTurbulence", "args": {"threshold": 0.5}}],
|
|
@@ -271,61 +330,93 @@ monitor.monitor_gnorm_with_ad(
|
|
|
271
330
|
```
|
|
272
331
|
2. 实例化工具时传入流水线并行group
|
|
273
332
|
```python
|
|
274
|
-
monitor = TrainerMon(
|
|
333
|
+
monitor = TrainerMon(
|
|
334
|
+
"./monitor_config.json",
|
|
335
|
+
process_group=mpu.get_pipeline_model_parallel_group(),
|
|
336
|
+
params_have_main_grad=True # 权重是否使用main_grad,通常megatron为True,deepspeed为False。默认为True。
|
|
337
|
+
)
|
|
338
|
+
```
|
|
339
|
+
训练过程中,检测到异常后打屏提示,并将异常信息按照rank分组写入json文件,文件路径默认为`monitor_output/anomaly_detected`,异常信息示例如下:
|
|
340
|
+
|
|
341
|
+
```json
|
|
342
|
+
{
|
|
343
|
+
"0:1.self_attention.core_attention_flash_0/rank0/input_grad_step_1_call_112": {
|
|
344
|
+
"rank": 0,
|
|
345
|
+
"step": 1,
|
|
346
|
+
"micro_step": 0,
|
|
347
|
+
"pp_stage": 0,
|
|
348
|
+
"vpp_stage": 0,
|
|
349
|
+
"call_id": 112,
|
|
350
|
+
"tag_name": "0:1.self_attention.core_attention_flash_0/rank0/input_grad",
|
|
351
|
+
"message": "Rule AnomalyTurbulence reports anomaly signal in ('0:1.self_attention.core_attention_flash_0/rank0/input_grad', 'min') at step 1.",
|
|
352
|
+
"group_mates": [0, 1]
|
|
353
|
+
},
|
|
354
|
+
...
|
|
355
|
+
}
|
|
275
356
|
```
|
|
276
|
-
照常开始训练
|
|
277
357
|
|
|
278
|
-
3.
|
|
358
|
+
3. 异常事件排序
|
|
359
|
+
|
|
360
|
+
当模型训练过程中出现较多异常数据,需要对异常事件排序。工具提供topk的异常排序能力,按照api的执行顺序进行排序,便于定界首次异常点。异常分析命令示例:
|
|
279
361
|
|
|
280
362
|
```shell
|
|
281
363
|
python3 -m msprobe.pytorch.monitor.anomaly_analyse -d $MONITOR_OUTPUT_DIR/anomaly_detected
|
|
282
364
|
```
|
|
283
|
-
|
|
284
|
-
| 字段名 | 解释 | 是否必选 |
|
|
285
|
-
| ------ | -------- | -------- |
|
|
286
|
-
|-d 或 --data_path| 指定梯度异常落盘文件夹,梯度监控功能输出,一般为$MONITOR_OUTPUT_DIR/anomaly_detected。|是 |
|
|
287
|
-
|-o 或 --out_path| 排序后的异常落盘文件地址,默认在--data_path路径下落盘一个anomaly_analyse.json文件| 否 |
|
|
288
|
-
|-k 或 --topk| 指定保留前topk个异常,默认为8| 否 |
|
|
289
|
-
|-s 或 --step_list| 指定分析的step范围,默认为[]| 否 |
|
|
365
|
+
异常事件分析结束,将topk事件写入文件`anomaly_detected/anomaly_analyse.json`。异常分析支持以下参数配置:
|
|
290
366
|
|
|
367
|
+
| 字段名 | 解释 | 是否必选 |
|
|
368
|
+
| ----------------- | ------------------------------------------------------------ | -------- |
|
|
369
|
+
| -d 或 --data_path | 指定梯度异常落盘文件夹,梯度监控功能输出,一般为$MONITOR_OUTPUT_DIR/anomaly_detected。 | 是 |
|
|
370
|
+
| -o 或 --out_path | 排序后的异常落盘文件地址,默认在--data_path路径下落盘一个anomaly_analyse.json文件。 | 否 |
|
|
371
|
+
| -k 或 --topk | 指定保留前topk个异常,默认为8。 | 否 |
|
|
372
|
+
| -s 或 --step_list | 指定分析的step范围,默认为[]。 | 否 |
|
|
291
373
|
|
|
292
374
|
|
|
293
|
-
###
|
|
375
|
+
### csv格式数据转tensorboard可视化显示
|
|
294
376
|
|
|
295
|
-
|
|
296
|
-
```json
|
|
297
|
-
{
|
|
298
|
-
"targets": {
|
|
299
|
-
"module.module.language_model.encoder.layers.0": {
|
|
300
|
-
"input": "tuple[2]",
|
|
301
|
-
"output": "tensor"
|
|
302
|
-
}
|
|
303
|
-
},
|
|
304
|
-
"print_struct": false,
|
|
305
|
-
"xy_distribution": true,
|
|
306
|
-
"forward_only": true,
|
|
307
|
-
"backward_only": false,
|
|
308
|
-
"all_xy": true,
|
|
309
|
-
"format": "csv",
|
|
310
|
-
"ops": ["norm", "min", "max", "nans"]
|
|
311
|
-
}
|
|
312
|
-
```
|
|
313
|
-
设置"xy_distribution"为true表示开启激活值监控功能,"all_xy"为true表示监控全量module激活值。
|
|
377
|
+
将csv数据转换为tensorboard格式数据。
|
|
314
378
|
|
|
315
|
-
forward_only和backward_only均为true时,触发warning,前反向均不采集;均为false时,前反向均采集。
|
|
316
379
|
```python
|
|
317
|
-
from msprobe.pytorch import
|
|
318
|
-
#
|
|
319
|
-
#
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
380
|
+
from msprobe.pytorch.monitor.csv2tb import csv2tensorboard_by_step
|
|
381
|
+
# 前三个参数用来指定需要转换的一批文件,指定monitor输出目录及一个时间范围,会对这个范围内的文件进行转换
|
|
382
|
+
# process_num指定拉起的进程个数,默认为1,更多的进程个数可以加速转换
|
|
383
|
+
# data_type_list是一个列表,指定需要转换的数据类型, 数据类型应来自输出件文件前缀,所有类型数据:
|
|
384
|
+
# ["actv", "actv_grad", "exp_avg", "exp_avg_sq", "grad_unreduced", "grad_reduced", "param"]
|
|
385
|
+
# 不指定就转换全部数据
|
|
386
|
+
# output_dirpath可指定输出目录, 不传值时保存到"{curtime}_csv2tensorboard_by_step"文件夹,其中curtime为自动获取的当前时间戳
|
|
387
|
+
csv2tensorboard_by_step(
|
|
388
|
+
monitor_path="~/monitor_output",
|
|
389
|
+
time_start="Dec03_21-34-40",
|
|
390
|
+
time_end="Dec03_21-34-42",
|
|
391
|
+
process_num=8,
|
|
392
|
+
data_type_list=["param"]
|
|
393
|
+
)
|
|
324
394
|
```
|
|
325
395
|
|
|
396
|
+
### 动态启停
|
|
397
|
+
动态启停模式:支持用户在训练过程中随时启动/更新监控。
|
|
398
|
+
|
|
399
|
+
用户可在训练开始前通过配置环境变量DYNAMIC_MONITOR=True来确认开启动态启停模式,该模式下需要配合config.json文件中的dynamic_on字段来使用。
|
|
400
|
+
|
|
401
|
+
在动态启停模式下,启动和停止分别由如下控制:
|
|
402
|
+
|
|
403
|
+
- 启动:
|
|
404
|
+
首次监控:config.json文件中dynamic_on字段为true,代表是否需要开启监控。
|
|
405
|
+
非首次监控:config文件时间戳更新且config.json文件中dynamic_on字段为true。
|
|
406
|
+
- 停止:
|
|
407
|
+
到达collect_times之后自动停止并改config.json文件中dynamic_on字段为false,可再通过上述操作重启。
|
|
326
408
|
|
|
409
|
+
大部分情况下,用户可在看到异常趋势后再手动更新config.json文件并打开dynamic_on开关;此外,使用时若想要在一开始就启动监控,可直接打开dynamic_on开关做基础配置的监测(首次不要求时间戳更新)
|
|
410
|
+
|
|
411
|
+
注意事项:
|
|
412
|
+
|
|
413
|
+
- 默认监控启动皆统一在配置初始化或查询到更新后的下一步,也就是若第n步挂上hook则第n+1步才启动采集,如需采集第0步数据请用静态模式。
|
|
414
|
+
- config中途修改出错时,若此时不在监控就不生效,若在监控则用原配置继续。
|
|
415
|
+
- 达到collect_times之后会自动将该值置为false待下次改true重启。
|
|
327
416
|
|
|
328
417
|
### 功能重载
|
|
418
|
+
此功能将在2026年废弃。请使用[动态启停](#动态启停)功能代替。
|
|
419
|
+
|
|
329
420
|
- 统计量
|
|
330
421
|
可以在训练过程中修改`TrainerMon`实例的`ops`属性, 调整监控的统计量。
|
|
331
422
|
```python
|
|
@@ -340,76 +431,63 @@ if {some condition}:
|
|
|
340
431
|
monitor.reload_xy(xy_distribution=True)
|
|
341
432
|
```
|
|
342
433
|
|
|
343
|
-
|
|
344
|
-
-
|
|
345
|
-
```json
|
|
346
|
-
{
|
|
347
|
-
"targets": {
|
|
348
|
-
"module.encoder.layers.0": {},
|
|
349
|
-
"module.embedding.word_embedding.weight": {}
|
|
350
|
-
},
|
|
351
|
-
"mv_distribution": true,
|
|
352
|
-
"format": "csv",
|
|
353
|
-
"ops": ["norm", "min", "max", "nans"]
|
|
354
|
-
}
|
|
355
|
-
```
|
|
356
|
-
"targets"中指定module包含的所有权重都会被监控。
|
|
357
|
-
设置"mv_distribution"表示开启优化监控功能(1st moment noted as `m`, 2nd moment noted as `v`)。[什么是mv](https://arxiv.org/pdf/1412.6980)
|
|
358
|
-
|
|
359
|
-
本工具针对分布式计算框架megatron和deepspeed框架做了适配,暂不支持其他框架。
|
|
360
|
-
|
|
434
|
+
## 公开接口
|
|
435
|
+
- monitor工具初始化
|
|
361
436
|
```python
|
|
362
|
-
|
|
363
|
-
# 以zero1优化器举例,opt_ty取值DeepSpeedZeroOptimizer_Stage1_or_2
|
|
364
|
-
# 示例为deepspeed,params_have_main_grad取值False
|
|
365
|
-
monitor = TrainerMon("./monitor_config.json", params_have_main_grad=False, opt_ty="DeepSpeedZeroOptimizer_Stage1_or_2")
|
|
366
|
-
monitor.set_wrapped_optimizer(optimizer) # optimzier为训练框架自定义的优化器
|
|
367
|
-
monitor.monitor_gnorm_with_ad(
|
|
368
|
-
model, grad_acc_steps=model.grad_acc_steps, optimizer=optimizer)
|
|
437
|
+
TrainerMon.__init__(config_file_path, process_group=None, params_have_main_grad=True) -> None
|
|
369
438
|
```
|
|
370
439
|
|
|
371
|
-
|
|
440
|
+
| 参数 | 说明 | 是否必选 |
|
|
441
|
+
| --------------------- | ------------------------------------------------------------ | -------- |
|
|
442
|
+
| config_file_path | json配置文件路径。 | 是 |
|
|
443
|
+
| process_group | 传入ProcessGroup对象,用以确定pipeline并行不同rank异常间时序,megatron下通过core.parallel_state.get_pipeline_model_parallel_group()获得。仅在异常时序判断功能中使用。 | 否 |
|
|
444
|
+
| params_have_main_grad | 权重是否使用main_grad,通常megatron为True,deepspeed为False。默认为True。 | 否 |
|
|
372
445
|
|
|
446
|
+
- 模型挂载monitor工具
|
|
373
447
|
```python
|
|
374
|
-
TrainerMon.
|
|
448
|
+
TrainerMon.set_monitor(model, grad_acc_steps, optimizer, dp_group=None, tp_group=None, start_iteration=0) -> None
|
|
375
449
|
```
|
|
376
|
-
|
|
377
|
-
|
|
|
378
|
-
|
|
|
379
|
-
|
|
|
380
|
-
|
|
|
381
|
-
|
|
|
382
|
-
|
|
|
383
|
-
|
|
450
|
+
| 参数 | 说明 | 是否必选 |
|
|
451
|
+
| --------------- | ------------------------------------------------------------ | -------- |
|
|
452
|
+
| model | 需要监控的模型,需要是一个torch.nn.Module或者mindspore.nn.Cell。 | 是 |
|
|
453
|
+
| grad_acc_steps | 梯度累积步数。 | 是 |
|
|
454
|
+
| optimizer | 需要patch的优化器。 | 否 |
|
|
455
|
+
| dp_group | 数据并行的通信组。<br>dp域通信后,且没有使用分布式优化器时,group内所有rank的梯度相同,落盘数据冗余。<br>提供dp_group后,工具仅保留每个dp_group的第一个rank的梯度。 | 否 |
|
|
456
|
+
| tp_group | 张量并行的通信组。<br/>tp域通信后,group内部分参数所有rank的梯度相同,落盘数据冗余。<br/>提供tp_group后,工具仅保留每个tp_group中冗余参数在第一个rank的梯度。<br/>当前适配Megatron core_r0.6.0, 通过权重属性"tensor_model_parallel"判断是否冗余。 | 否 |
|
|
457
|
+
| start_iteration | 训练的起始iteration,影响工具计数。**仅PyTorch场景支持此参数**。 | 否 |
|
|
458
|
+
|
|
459
|
+
- csv输出件转tensorboard输出件
|
|
384
460
|
```python
|
|
385
|
-
|
|
461
|
+
csv2tensorboard_by_step(monitor_path, time_start, time_end, process_num=1, data_type_list=None) -> None
|
|
386
462
|
```
|
|
387
|
-
| 参数
|
|
388
|
-
|
|
|
389
|
-
|
|
|
390
|
-
|
|
|
391
|
-
|
|
|
392
|
-
|
|
|
393
|
-
|
|
|
394
|
-
|
|
395
|
-
|
|
463
|
+
| 参数 | 说明 | 是否必选 |
|
|
464
|
+
| -------------- | ------------------------------------------------------------ | -------- |
|
|
465
|
+
| monitor_path | 待转换的csv存盘目录。 | 是 |
|
|
466
|
+
| time_start | 起始时间戳。搭配time_end一起使用。指定一个时间范围,会对这个范围内的文件进行转换。左闭右闭的区间。 | 是 |
|
|
467
|
+
| time_end | 结束时间戳。搭配time_start一起使用。指定一个时间范围,会对这个范围内的文件进行转换。左闭右闭的区间。 | 是 |
|
|
468
|
+
| process_num | 指定拉起的进程个数,默认为1,更多的进程个数可以加速转换。 | 否 |
|
|
469
|
+
| data_type_list | 指定需要转换的数据类型, 数据类型应来自输出件文件前缀,所有类型数据:<br/> ["actv", "actv_grad", "exp_avg", "exp_avg_sq", "grad_unreduced", "grad_reduced", "param"]。<br/>不指定就转换全部数据。 | 否 |
|
|
470
|
+
|
|
471
|
+
- 在模型任意位置获取当前参数**梯度**统计量
|
|
396
472
|
```python
|
|
397
|
-
TrainerMon.
|
|
473
|
+
TrainerMon.generate_wgrad_metrics() -> tuple[dict, dict]
|
|
398
474
|
```
|
|
399
|
-
|
|
400
|
-
| 参数 | 说明 | 是否必选 |
|
|
401
|
-
| ----- | -------------------- | -------- |
|
|
402
|
-
| _wrapped_optimizer |megatron、deepspeed创建好的混合精度优化器。 | 是 |
|
|
403
|
-
|
|
475
|
+
具体使用方式如下:
|
|
404
476
|
```python
|
|
405
|
-
|
|
477
|
+
reduced, unreduced = monitor.generate_wgrad_metrics()
|
|
406
478
|
```
|
|
407
479
|
|
|
480
|
+
- 在模型任意位置获取当前参数**激活值**统计量
|
|
408
481
|
```python
|
|
409
|
-
TrainerMon.generate_xy_metrics() -> tuple[dict
|
|
482
|
+
TrainerMon.generate_xy_metrics() -> tuple[dict, dict]
|
|
483
|
+
```
|
|
484
|
+
具体使用方式如下:
|
|
485
|
+
```python
|
|
486
|
+
actv, actv_grad = monitor.generate_xy_metrics()
|
|
410
487
|
```
|
|
411
488
|
|
|
412
489
|
|
|
490
|
+
|
|
413
491
|
## 详细配置
|
|
414
492
|
|
|
415
493
|
```json
|
|
@@ -417,6 +495,10 @@ TrainerMon.generate_xy_metrics() -> tuple[dict[dict]]
|
|
|
417
495
|
"targets": {
|
|
418
496
|
"language_model.encoder.layers.0": {"input": "tuple[2]:0", "output": "tensor", "input_grad":"tuple[2]:0", "output_grad":"tuple[1]:0"}
|
|
419
497
|
},
|
|
498
|
+
"dynamic_on": false,
|
|
499
|
+
"start_step": 0,
|
|
500
|
+
"collect_times": 100000000,
|
|
501
|
+
"step_interval": 1,
|
|
420
502
|
"print_struct": false,
|
|
421
503
|
"module_ranks": [0,1,2,3],
|
|
422
504
|
"ur_distribution": true,
|
|
@@ -432,37 +514,45 @@ TrainerMon.generate_xy_metrics() -> tuple[dict[dict]]
|
|
|
432
514
|
"rules": [{"rule_name": "AnomalyTurbulence", "args": {"threshold": 0.5}}],
|
|
433
515
|
"dump": false
|
|
434
516
|
},
|
|
435
|
-
"format": "
|
|
517
|
+
"format": "csv",
|
|
436
518
|
"ops": ["min", "max", "norm", "zeros", "nans", "mean"],
|
|
437
519
|
"eps": 1e-8,
|
|
438
520
|
"ndigits": 12,
|
|
439
|
-
"step_count_per_record": 1
|
|
521
|
+
"step_count_per_record": 1,
|
|
522
|
+
"append_output": [],
|
|
523
|
+
"squash_name": true
|
|
440
524
|
}
|
|
441
525
|
```
|
|
442
526
|
|
|
443
527
|
下面详细解释各个字段:
|
|
444
528
|
|
|
445
|
-
| 字段名字
|
|
446
|
-
|
|
|
447
|
-
|"targets"|
|
|
448
|
-
|"input"| 可选
|
|
449
|
-
|"output"| 必选
|
|
450
|
-
|"input_grad"| 可选
|
|
451
|
-
|"output_grad"| 必选
|
|
452
|
-
|"
|
|
453
|
-
|"
|
|
454
|
-
|"
|
|
455
|
-
|"
|
|
456
|
-
|"
|
|
457
|
-
|"
|
|
458
|
-
|"
|
|
459
|
-
|"
|
|
460
|
-
|"
|
|
461
|
-
|"
|
|
462
|
-
|"
|
|
463
|
-
|"
|
|
464
|
-
|"
|
|
465
|
-
|"
|
|
466
|
-
|"
|
|
467
|
-
|"
|
|
468
|
-
|"
|
|
529
|
+
| 字段名字 | 是否必选 | 解释 |
|
|
530
|
+
| ----------------------- | -------- |---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
|
531
|
+
| "targets" | 可选 | 指定需要监控的模型层和监控对象, 例如transformer的第0层language_model.encoder.layers.0,可选择监控input、output、input_grad、output_grad。如果不清楚模型结构, 可以将 "print_struct" 字段设置为 true, 监控工具会打印模型中torch module的名字和详细结构,并在第1个step后退出。未配置时默认为全量监控。 |
|
|
532
|
+
| "input" | 可选 | "tuple[2]:0"的意思是目标module的前向input参数为长度为2的tuple, 我们关心的是tuple第0个元素。 |
|
|
533
|
+
| "output" | 必选 | "tensor"的意思是目标module的前向output参数类型为tensor |
|
|
534
|
+
| "input_grad" | 可选 | "tuple[2]:0"的意思是目标module的后向input_grad参数是长度为2的tuple, 我们关心的是tuple的第0个元素。 |
|
|
535
|
+
| "output_grad" | 必选 | "tuple[1]:0"的意思是目标module的后向input_grad参数是长度为1的tuple, 我们关心的是tuple的第0个元素。 |
|
|
536
|
+
| "dynamic_on" | 可选 | 在动态启停时使用,true代表打开监控,false代表关闭监控,默认值为false,且达到collect_times之后会自动将该值置为false待下次改true重启。**仅PyTorch场景支持此参数**。 |
|
|
537
|
+
| "collect_times" | 可选 | 设置采集次数,达到该次数后停止监控,默认值为100000000,目的是一直采集。 |
|
|
538
|
+
| "start_step" | 可选 | 设置开始采集step,模型训练达到start_step后开始监控采集,默认值为0,表示从step0开始监控采集。 |
|
|
539
|
+
| "step_interval" | 可选 | 设置采集step间隔,默认值为1,表示每个step均采集监控数据。 |
|
|
540
|
+
| "print_struct" | 可选 | 设置为true后监控工具会打印模型中torch module的名字和详细结构,并在第1个step后退出。不填默认为false。**仅PyTorch场景支持此参数**。 |
|
|
541
|
+
| "module_ranks" | 可选 | 用于在分布式训练场景中希望控制在哪些rank开启module监控。如果不填,则默认在所有rank开启。 |
|
|
542
|
+
| "ur_distribution" | 可选 | 若为true则会统计adam优化器指定模块(targets中指定)参数的update和ratio向量的数值分布,并展示在heatmap里,默认为false,同时format字段必须设置为tensorboard。<br/>依赖histc算子, 需要CANN8.0.rc2以上版本, 否则会有严重的性能问题。**仅PyTorch场景支持此参数**。 |
|
|
543
|
+
| "xy_distribution" | 可选 | 若为true则会监控指定module(targets中指定)的输入输出张量。 默认为false。 |
|
|
544
|
+
| "all_xy" | 可选 | 开启xy_distribution后生效,若为true,监控所有module。默认为false。<br/>与targets同时生效,all_xy配置为true时,若targets配置module_xx和指定对象,则module_xx按targets配置生效,其他module则监控全部对象,包含input、output、input_grad、output_grad。 |
|
|
545
|
+
| "forward_only" | 可选 | 开启xy_distribution后生效,若为true,仅监控指定module的前向,targets中的input_grad、output_grad不生效。默认为false。 |
|
|
546
|
+
| "backward_only" | 可选 | 开启xy_distribution后生效,若为true,仅监控指定module的反向,targets中的input、output不生效。默认为false。 |
|
|
547
|
+
| "mv_distribution" | 可选 | 若为true则会监控指定模块中的参数的优化器状态, 默认为false。需要在TrainerMon构造函数正确指定opt_ty。 目前支持megatron和Deepspeed的分布式优化器。<br/>-Megatron_DistributedOptimizer:megatron分布式优化器;<br/>-Megatron_Float16OptimizerWithFloat16Params:megatron混合精度优化器;<br/>-Megatron_ChainedDistributedOptimizer:megatron分布式优化器序列;<br/>-Megatron_ChainedFloat16OptimizerWithFloat16Params:megatron混合精度优化器序列;<br/>-DeepSpeedZeroOptimizer_Stage0:DeepSpeed Zero0<br/>-DeepSpeedZeroOptimizer_Stage1_or_2:DeepSpeed Zero1和Zero2;<br/>-DeepSpeedZeroOptimizer_Stage3:DeepSpeed Zero3。<br/>未使用megatron和deepspeed框架时,opt_ty默认为None,无需传入。 |
|
|
548
|
+
| "wg_distribution" | 可选 | 若为true则会监控指定模块的参数梯度, 默认为false。 |
|
|
549
|
+
| "param_distribution" | 可选 | 若为true则会监控指定模块的参数, 默认为false。 |
|
|
550
|
+
| "alert" | 可选 | "rules": 指定自动报警的异常检测机制及其相应的阈值。目前实现的异常检测是AnomalyTurbulence, 如果统计标量超出历史均值的指定浮动范围(threshold 0.5意味着上浮或者下浮50%)则在控制台打印报警信息。当"dump"字段配置为true表示异常事件写入文件,默认为false。**仅PyTorch场景支持此参数**。 |
|
|
551
|
+
| "cc_distribution" | 可选 | 其中"enable"字段控制通信监控模块的开关;需要监控通信算子时,务必尽量早地实例化`TrainerMon`, 因为监控通过劫持原始func后挂hook实现,部分加速库初始化时会保存原始function,避免监控失效。"cc_codeline"字段指定监控的代码行,如:`train.py\\[23\\]`,默认为空列表,不特别指定;"cc_pre_hook"字段控制是否监控通信前的数据; 模块会在第二个optimize.step之前打印通信日志,包括通信api的调用栈、输入dtype、通信group。 "cc_log_only"为true时,仅打印日志,不监控通信的输入输出,并在打印后中断训练。可以根据通信日志设置"cc_codeline",规避与训练过程不相关的通信,比如一些时间、metrics的同步。**仅PyTorch场景支持此参数**。 |
|
|
552
|
+
| "format" | 可选 | 数据落盘格式,默认值为"csv",可选 \["csv", "tensorboard", "api"\]。仅PyThon和MindSpore动态图场景支持此参数,且MindSpore动态图场景仅支持\["csv"\]。 |
|
|
553
|
+
| "ops" | 可选 | 类型为list,与ur_distribution、xy_distribution、mv_distribution、wg_distribution、mg_direction、cc_distribution配合,监控所选张量的统计指标,目前支持"min"、"max"、"norm"、"mean"、"zeros"、"nans"。其中,zeros代表监控所选张量的元素小于eps的比例,nans代表张量中nan的数量。当ops中无有效指标时,默认监控norm指标。 |
|
|
554
|
+
| "eps" | 可选 | 若ops里包含"zeros"则需要配置,默认为1e-8。 |
|
|
555
|
+
| "ndigits" | 可选 | "format"为"csv"时,设置落盘文件中的小数位数,默认为6。**仅PyTorch场景支持此参数**。 |
|
|
556
|
+
| "step_count_per_record" | 可选 | "format"为"csv"时生效,每个csv记录多少个step的数据,默认为1。 |
|
|
557
|
+
| "append_output" | 可选 | 适用于断点续训场景。多卡场景下生效,指定两个时间戳,将输出续写到这两个时间戳范围间的输出件中,不在范围内的rank不被续写。时间戳应来自原有输出件目录前缀,例如["Dec03_21-34-40", "Dec03_21-34-41"]。默认为[],不续写。**仅PyTorch场景支持此参数**。 |
|
|
558
|
+
| "squash_name" | 可选 | 是否简化参数名/模块名,多模态场景建议关闭,默认为True |
|