mindstudio-probe 1.0.4__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.0.4.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.0.4.dist-info → mindstudio_probe-1.1.1.dist-info}/WHEEL +1 -1
- {mindstudio_probe-1.0.4.dist-info → mindstudio_probe-1.1.1.dist-info}/entry_points.txt +0 -1
- msprobe/README.md +84 -18
- msprobe/__init__.py +16 -1
- msprobe/config.json +1 -5
- msprobe/core/advisor/advisor.py +16 -11
- msprobe/core/advisor/advisor_const.py +6 -7
- msprobe/core/advisor/advisor_result.py +12 -12
- msprobe/core/common/const.py +164 -3
- msprobe/core/common/exceptions.py +26 -4
- msprobe/core/common/file_utils.py +196 -27
- msprobe/core/common/inplace_op_checker.py +53 -0
- msprobe/core/common/inplace_ops.yaml +251 -0
- msprobe/core/common/log.py +46 -18
- msprobe/core/common/utils.py +308 -209
- msprobe/core/common_config.py +60 -38
- msprobe/core/compare/acc_compare.py +332 -94
- msprobe/core/compare/check.py +104 -22
- msprobe/core/compare/compare_cli.py +42 -5
- msprobe/core/compare/highlight.py +162 -57
- 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/multiprocessing_compute.py +33 -8
- msprobe/core/compare/npy_compare.py +73 -29
- msprobe/core/compare/utils.py +306 -247
- msprobe/core/data_dump/data_collector.py +44 -43
- msprobe/core/data_dump/data_processor/base.py +88 -35
- msprobe/core/data_dump/data_processor/factory.py +20 -3
- msprobe/core/data_dump/data_processor/mindspore_processor.py +14 -8
- msprobe/core/data_dump/data_processor/pytorch_processor.py +180 -66
- msprobe/core/data_dump/json_writer.py +63 -42
- msprobe/core/data_dump/scope.py +143 -48
- msprobe/core/grad_probe/constant.py +31 -13
- msprobe/core/grad_probe/grad_compare.py +20 -4
- msprobe/core/grad_probe/utils.py +44 -3
- 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 +29 -9
- msprobe/docs/02.config_introduction.md +83 -84
- msprobe/docs/03.config_examples.md +3 -20
- msprobe/docs/04.kernel_dump_PyTorch.md +73 -0
- msprobe/docs/05.data_dump_PyTorch.md +143 -13
- msprobe/docs/06.data_dump_MindSpore.md +197 -88
- msprobe/docs/07.accuracy_checker_PyTorch.md +69 -46
- msprobe/docs/08.accuracy_checker_online_PyTorch.md +52 -17
- msprobe/docs/09.accuracy_checker_MindSpore.md +51 -15
- msprobe/docs/10.accuracy_compare_PyTorch.md +187 -99
- msprobe/docs/11.accuracy_compare_MindSpore.md +253 -31
- 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 +60 -55
- msprobe/docs/16.free_benchmarking_MindSpore.md +159 -0
- msprobe/docs/17.grad_probe.md +19 -22
- msprobe/docs/18.online_dispatch.md +89 -0
- 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_PyTorch.md → FAQ.md} +25 -10
- 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/docs/img/ms_dump.png +0 -0
- msprobe/docs/img/ms_layer.png +0 -0
- msprobe/docs/img/pt_dump.png +0 -0
- msprobe/mindspore/__init__.py +16 -0
- msprobe/mindspore/api_accuracy_checker/api_accuracy_checker.py +130 -138
- msprobe/mindspore/api_accuracy_checker/api_info.py +27 -5
- 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 +58 -13
- msprobe/mindspore/common/const.py +35 -13
- msprobe/mindspore/common/log.py +5 -9
- msprobe/mindspore/common/utils.py +60 -5
- msprobe/mindspore/compare/distributed_compare.py +15 -28
- msprobe/mindspore/compare/ms_compare.py +319 -158
- msprobe/mindspore/compare/ms_graph_compare.py +99 -49
- msprobe/mindspore/debugger/debugger_config.py +20 -14
- msprobe/mindspore/debugger/precision_debugger.py +43 -13
- msprobe/mindspore/dump/dump_tool_factory.py +18 -1
- msprobe/mindspore/dump/hook_cell/api_registry.py +23 -3
- msprobe/mindspore/dump/hook_cell/primitive_hooks.py +203 -0
- msprobe/mindspore/dump/hook_cell/support_wrap_ops.yaml +107 -10
- msprobe/mindspore/dump/hook_cell/wrap_api.py +21 -13
- msprobe/mindspore/dump/jit_dump.py +56 -20
- msprobe/mindspore/dump/kernel_graph_dump.py +19 -5
- msprobe/mindspore/dump/kernel_kbyk_dump.py +19 -6
- 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 +162 -41
- msprobe/mindspore/free_benchmark/common/config.py +15 -0
- msprobe/mindspore/free_benchmark/common/handler_params.py +15 -1
- msprobe/mindspore/free_benchmark/common/utils.py +37 -8
- msprobe/mindspore/free_benchmark/data/support_wrap_ops.yaml +0 -204
- msprobe/mindspore/free_benchmark/handler/base_handler.py +20 -5
- msprobe/mindspore/free_benchmark/handler/check_handler.py +21 -7
- msprobe/mindspore/free_benchmark/handler/fix_handler.py +18 -3
- msprobe/mindspore/free_benchmark/handler/handler_factory.py +21 -6
- msprobe/mindspore/free_benchmark/perturbation/add_noise.py +23 -8
- msprobe/mindspore/free_benchmark/perturbation/base_perturbation.py +29 -5
- msprobe/mindspore/free_benchmark/perturbation/bit_noise.py +25 -10
- msprobe/mindspore/free_benchmark/perturbation/exchange_value.py +45 -19
- msprobe/mindspore/free_benchmark/perturbation/improve_precision.py +29 -8
- msprobe/mindspore/free_benchmark/perturbation/no_change.py +16 -1
- msprobe/mindspore/free_benchmark/perturbation/perturbation_factory.py +22 -7
- msprobe/mindspore/free_benchmark/self_check_tool_factory.py +17 -2
- msprobe/mindspore/grad_probe/global_context.py +44 -14
- 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 +20 -6
- msprobe/mindspore/overflow_check/overflow_check_tool_factory.py +15 -0
- msprobe/mindspore/runtime.py +15 -0
- msprobe/mindspore/service.py +75 -150
- msprobe/mindspore/task_handler_factory.py +15 -0
- msprobe/msprobe.py +24 -7
- msprobe/pytorch/__init__.py +23 -3
- msprobe/pytorch/api_accuracy_checker/common/config.py +81 -2
- msprobe/pytorch/api_accuracy_checker/common/utils.py +53 -21
- msprobe/pytorch/api_accuracy_checker/compare/algorithm.py +19 -2
- msprobe/pytorch/api_accuracy_checker/compare/api_precision_compare.py +50 -25
- msprobe/pytorch/api_accuracy_checker/compare/compare.py +51 -21
- msprobe/pytorch/api_accuracy_checker/compare/compare_column.py +23 -6
- msprobe/pytorch/api_accuracy_checker/compare/compare_utils.py +28 -8
- msprobe/pytorch/api_accuracy_checker/config.yaml +1 -1
- 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 +73 -33
- msprobe/pytorch/api_accuracy_checker/run_ut/multi_run_ut.py +44 -18
- msprobe/pytorch/api_accuracy_checker/run_ut/run_overflow_check.py +32 -11
- msprobe/pytorch/api_accuracy_checker/run_ut/run_ut.py +122 -172
- msprobe/pytorch/api_accuracy_checker/run_ut/run_ut_utils.py +158 -4
- msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/attl.py +30 -24
- msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/client.py +68 -31
- msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/device_dispatch.py +27 -4
- msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/dump_dispatch.py +115 -0
- msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/server.py +26 -9
- msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/torch_ops_config.yaml +63 -0
- msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/utils.py +44 -0
- msprobe/pytorch/bench_functions/__init__.py +18 -3
- msprobe/pytorch/bench_functions/apply_adam_w.py +15 -0
- msprobe/pytorch/bench_functions/confusion_transpose.py +20 -1
- msprobe/pytorch/bench_functions/fast_gelu.py +15 -0
- msprobe/pytorch/bench_functions/layer_norm_eval.py +15 -0
- msprobe/pytorch/bench_functions/linear.py +15 -0
- msprobe/pytorch/bench_functions/matmul_backward.py +33 -6
- msprobe/pytorch/bench_functions/npu_fusion_attention.py +280 -157
- msprobe/pytorch/bench_functions/rms_norm.py +15 -0
- msprobe/pytorch/bench_functions/rotary_mul.py +32 -9
- msprobe/pytorch/bench_functions/scaled_mask_softmax.py +15 -0
- msprobe/pytorch/bench_functions/swiglu.py +29 -6
- msprobe/pytorch/common/__init__.py +15 -0
- msprobe/pytorch/common/log.py +18 -6
- msprobe/pytorch/common/parse_json.py +31 -16
- msprobe/pytorch/common/utils.py +96 -40
- msprobe/pytorch/compare/distributed_compare.py +13 -14
- msprobe/pytorch/compare/match.py +15 -0
- msprobe/pytorch/compare/pt_compare.py +44 -10
- msprobe/pytorch/debugger/debugger_config.py +69 -52
- msprobe/pytorch/debugger/precision_debugger.py +72 -24
- msprobe/pytorch/dump/kernel_dump/kernel_config.py +33 -0
- msprobe/pytorch/free_benchmark/__init__.py +20 -5
- 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 +43 -0
- msprobe/pytorch/free_benchmark/common/params.py +23 -1
- msprobe/pytorch/free_benchmark/common/utils.py +43 -5
- msprobe/pytorch/free_benchmark/compare/grad_saver.py +47 -9
- msprobe/pytorch/free_benchmark/compare/single_benchmark.py +17 -0
- msprobe/pytorch/free_benchmark/main.py +19 -4
- msprobe/pytorch/free_benchmark/perturbed_layers/base_layer.py +15 -0
- msprobe/pytorch/free_benchmark/perturbed_layers/layer_factory.py +19 -4
- msprobe/pytorch/free_benchmark/perturbed_layers/npu/add_noise.py +18 -1
- msprobe/pytorch/free_benchmark/perturbed_layers/npu/bit_noise.py +21 -4
- msprobe/pytorch/free_benchmark/perturbed_layers/npu/change_value.py +28 -2
- msprobe/pytorch/free_benchmark/perturbed_layers/npu/improve_precision.py +19 -0
- msprobe/pytorch/free_benchmark/perturbed_layers/npu/no_change.py +15 -0
- msprobe/pytorch/free_benchmark/perturbed_layers/npu/npu_base_layser.py +15 -0
- msprobe/pytorch/free_benchmark/perturbed_layers/run_cpu.py +15 -0
- msprobe/pytorch/free_benchmark/result_handlers/base_handler.py +65 -16
- msprobe/pytorch/free_benchmark/result_handlers/check_handler.py +15 -0
- msprobe/pytorch/free_benchmark/result_handlers/fix_handler.py +21 -5
- msprobe/pytorch/free_benchmark/result_handlers/handler_factory.py +15 -0
- msprobe/pytorch/free_benchmark/result_handlers/preheat_handler.py +19 -4
- msprobe/pytorch/function_factory.py +17 -2
- msprobe/pytorch/functional/module_dump.py +84 -0
- msprobe/pytorch/grad_probe/grad_monitor.py +23 -6
- msprobe/pytorch/grad_probe/grad_stat_csv.py +40 -10
- msprobe/pytorch/hook_module/__init__.py +16 -1
- msprobe/pytorch/hook_module/api_registry.py +13 -8
- msprobe/pytorch/hook_module/hook_module.py +17 -19
- msprobe/pytorch/hook_module/support_wrap_ops.yaml +1 -0
- msprobe/pytorch/hook_module/utils.py +4 -6
- msprobe/pytorch/hook_module/wrap_aten.py +12 -11
- msprobe/pytorch/hook_module/wrap_distributed.py +6 -7
- msprobe/pytorch/hook_module/wrap_functional.py +21 -20
- msprobe/pytorch/hook_module/wrap_npu_custom.py +9 -17
- msprobe/pytorch/hook_module/wrap_tensor.py +4 -6
- msprobe/pytorch/hook_module/wrap_torch.py +4 -6
- msprobe/pytorch/hook_module/wrap_vf.py +4 -6
- msprobe/pytorch/module_processer.py +18 -6
- msprobe/pytorch/monitor/anomaly_analyse.py +201 -0
- msprobe/pytorch/monitor/anomaly_detect.py +340 -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 +38 -48
- msprobe/pytorch/online_dispatch/dispatch.py +50 -25
- msprobe/pytorch/online_dispatch/dump_compare.py +21 -9
- msprobe/pytorch/online_dispatch/single_compare.py +60 -39
- msprobe/pytorch/online_dispatch/torch_ops_config.yaml +9 -1
- msprobe/pytorch/online_dispatch/utils.py +48 -23
- msprobe/pytorch/parse.py +15 -0
- msprobe/pytorch/parse_tool/cli.py +5 -6
- msprobe/pytorch/parse_tool/lib/compare.py +19 -26
- msprobe/pytorch/parse_tool/lib/config.py +1 -1
- msprobe/pytorch/parse_tool/lib/parse_tool.py +4 -2
- msprobe/pytorch/parse_tool/lib/utils.py +40 -55
- msprobe/pytorch/parse_tool/lib/visualization.py +3 -1
- msprobe/pytorch/pt_config.py +192 -40
- msprobe/pytorch/service.py +110 -35
- 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.0.4.dist-info/RECORD +0 -276
- msprobe/docs/04.acl_config_examples.md +0 -76
- msprobe/mindspore/free_benchmark/decorator/dec_forward.py +0 -43
- msprobe/mindspore/free_benchmark/decorator/decorator_factory.py +0 -107
- msprobe/pytorch/api_accuracy_checker/tensor_transport_layer/ssl_config.py +0 -10
- msprobe/pytorch/functional/dump_module.py +0 -39
- {mindstudio_probe-1.0.4.dist-info → mindstudio_probe-1.1.1.dist-info}/LICENSE +0 -0
- {mindstudio_probe-1.0.4.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
- /msprobe/pytorch/{functional/data_processor.py → monitor/distributed/__init__.py} +0 -0
|
@@ -0,0 +1,468 @@
|
|
|
1
|
+
# Monitor 训练状态轻量化监控工具
|
|
2
|
+
|
|
3
|
+
## 简介
|
|
4
|
+
|
|
5
|
+
训练状态轻量化监控工具,能够在较低性能损耗下收集和记录模型训练过程中的激活值、权重梯度、优化器状态和通信算子的中间值,实时呈现训练状态。
|
|
6
|
+
|
|
7
|
+
- [快速上手](#快速上手)
|
|
8
|
+
- [权重监控](#权重监控)
|
|
9
|
+
- [权重梯度监控](#权重梯度监控)
|
|
10
|
+
- [激活值监控](#激活值监控)
|
|
11
|
+
- [优化器状态监控](#优化器状态监控)
|
|
12
|
+
- [详细配置](#详细配置)
|
|
13
|
+
|
|
14
|
+
## 安装
|
|
15
|
+
参见[msprobe安装](./01.installation.md)
|
|
16
|
+
|
|
17
|
+
## 快速上手
|
|
18
|
+
根据需求监控相应对象。比如在loss上扬,grad norm正常的异常训练过程中,优先考虑监控模型前向过程;在grad norm异常的训练过程中,监控权重和激活值的梯度。
|
|
19
|
+
推荐使用方式:权重梯度的监控性能损耗小(20B dense模型全量权重梯度监控,时间增加<1%,内存增加<1%),可以长期开启。激活值监控性能损耗大,在必要时开启或者仅监控部分。
|
|
20
|
+
|
|
21
|
+
### 工具使能
|
|
22
|
+
在训练脚本中使能工具,在配置文件(json)中控制工具行为。
|
|
23
|
+
```python
|
|
24
|
+
# megatorn中构建初始化模型和优化器。在实际训练代码中找到模型、优化器(optional)定义的位置
|
|
25
|
+
# Megatron-LM(core_r0.6.0) megatron/training.py, def pretrain:
|
|
26
|
+
model, optimizer, opt_param_scheduler = setup_model_and_optimizer(
|
|
27
|
+
model_provider, model_type)
|
|
28
|
+
|
|
29
|
+
# 使能工具
|
|
30
|
+
from msprobe.pytorch import TrainerMon
|
|
31
|
+
# 监控工具初始化
|
|
32
|
+
monitor = TrainerMon(
|
|
33
|
+
config_file_path="./monitor_config.json",
|
|
34
|
+
process_group=None,
|
|
35
|
+
params_have_main_grad=True, # 权重是否使用main_grad,通常megatron为True,deepspeed为False。默认为True。
|
|
36
|
+
opt_ty=None # 优化器类型,默认为None,具体取值参考公开接口
|
|
37
|
+
)
|
|
38
|
+
monitor.set_wrapped_optimizer(optimizer)
|
|
39
|
+
# 挂载监控对象
|
|
40
|
+
monitor.monitor_gnorm_with_ad(
|
|
41
|
+
model,
|
|
42
|
+
grad_acc_steps=args.global_batch_size//args.data_parallel_size//args.micro_batch_size,
|
|
43
|
+
optimizer=None,
|
|
44
|
+
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()
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
补充deepspeed下常用框架的使能位置,提供参考
|
|
56
|
+
|
|
57
|
+
- accelerate
|
|
58
|
+
|
|
59
|
+
```python
|
|
60
|
+
model, optimizer, trainloader, evalloader, schedular = accelerator.prepare(...)
|
|
61
|
+
|
|
62
|
+
monitor = TrainerMon(...)
|
|
63
|
+
monitor.set_wrapped_optimizer(optimizer.optimizer) # optimizer.optimizer为DeepSpeedZeroOptimizer
|
|
64
|
+
monitor.monitor_gnorm_with_ad(....optimizer=optimizer.optimizer)
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
- transformers
|
|
68
|
+
|
|
69
|
+
```python
|
|
70
|
+
# src/transformers/trainer.py
|
|
71
|
+
class Trainer:
|
|
72
|
+
def _inner_training_loop:
|
|
73
|
+
...
|
|
74
|
+
monitor = TrainerMon(...)
|
|
75
|
+
monitor.set_wrapped_optimizer(self.optimizer.optimizer)
|
|
76
|
+
monitor.monitor_gnorm_with_ad(....optimizer=self.optimizer.optimizer)
|
|
77
|
+
|
|
78
|
+
for epoch in range(epochs_trained, num_train_epochs):
|
|
79
|
+
...
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### 指定监控对象
|
|
83
|
+
|
|
84
|
+
工具支持对nn.Module(**激活值监控**)和nn.Parameter(**梯度监控、优化器监控**)对象实现相应的监控行为,在配置文件的"targets"(dict)字段指定,targets格式为{module_name/param_name: {filed: format}}。
|
|
85
|
+
|
|
86
|
+
- 打印模型结构
|
|
87
|
+
工具提供可选项"print_struct"打印模型结构,帮助配置targets。工具会在在第一个step后打印结构并停止训练进程。
|
|
88
|
+
```json
|
|
89
|
+
{
|
|
90
|
+
"print_struct": true
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
输出样例:
|
|
95
|
+
"config"字段用于配置文件中指定module target。其余为各个元素的shape和dtype。
|
|
96
|
+
|
|
97
|
+
```json
|
|
98
|
+
"0:63.mlp.linear_fc2": {
|
|
99
|
+
"input": {
|
|
100
|
+
"config": "tuple[1]",
|
|
101
|
+
"0": "size=(4096, 4, 1024), dtype=torch.bfloat16"
|
|
102
|
+
},
|
|
103
|
+
"output": {
|
|
104
|
+
"config": "tuple[2]",
|
|
105
|
+
"0": "size=(2048, 4, 512), dtype=torch.bfloat16",
|
|
106
|
+
"1": "size=(512,), dtype=torch.bfloat16"
|
|
107
|
+
},
|
|
108
|
+
"input_grad": {
|
|
109
|
+
"config": "tuple[1]",
|
|
110
|
+
"0": "size=(4096, 4, 1024), dtype=torch.bfloat16"
|
|
111
|
+
},
|
|
112
|
+
"output_grad": {
|
|
113
|
+
"config": "tuple[2]",
|
|
114
|
+
"0": "size=(2048, 4, 512), dtype=torch.bfloat16",
|
|
115
|
+
"1": "size=(512,), dtype=torch.bfloat16"
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
- Module
|
|
121
|
+
对于module对象,通常关心其前向的输入(input)输出(output)和反向的输入--前向输出的梯度(output_grad)和输出--前向输入的梯度(input_grad)。同时需要声明这些对象的类型,通常为"tensor"或"tuple\[length]"。
|
|
122
|
+
|
|
123
|
+
"tensor"可以直接用来计算统计量,"tuple"需要进一步指定监控的索引。如"tuple[2]:0",表示该对象为长度2的tuple,对第0元素进行监控;不指定索引时,默认对第0元素进行监控。
|
|
124
|
+
|
|
125
|
+
module_name可以通过nn.Module的接口`named_modules()`获取。
|
|
126
|
+
```json
|
|
127
|
+
// 示例:对一个名为"module.encoder.layers.0.mlp"的module,监控其前向输入第0元素和输出。
|
|
128
|
+
{
|
|
129
|
+
"targets": {
|
|
130
|
+
"module.encoder.layers.0.mlp": {
|
|
131
|
+
"input": "tuple[2]:0",
|
|
132
|
+
"output": "tensor"
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
```
|
|
137
|
+
**Module全量监控**:工具提供简便的全量module监控方式。
|
|
138
|
+
|
|
139
|
+
```json
|
|
140
|
+
{
|
|
141
|
+
"targets": {},
|
|
142
|
+
"all_xy": true
|
|
143
|
+
}
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
- Parameter
|
|
148
|
+
对于parameter对象,通常会关注其在一个训练迭代中的梯度(weight grad)、adam类优化器中的动量(1st moment, 2nd moment)。
|
|
149
|
+
parameter归属于某一module,也可以通过指定module_name来监控包含在这一module中的**所有**parameter。
|
|
150
|
+
|
|
151
|
+
param_name可以通过nn.Module的接口`named_parameters()`获取。
|
|
152
|
+
```json
|
|
153
|
+
// 示例:监控"module.encoder.layers.0.mlp"的所有参数和"module.embedding.word_embedding.weight"这一参数
|
|
154
|
+
{
|
|
155
|
+
"targets": {
|
|
156
|
+
"module.encoder.layers.0.mlp": {},
|
|
157
|
+
"module.embedding.word_embedding.weight": {}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
**Parameter全量监控**:工具提供简便的全量parameter监控方式。
|
|
163
|
+
|
|
164
|
+
```json
|
|
165
|
+
{
|
|
166
|
+
"targets": {"":{}}
|
|
167
|
+
}
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### 输出格式和统计量
|
|
171
|
+
工具配置示例:
|
|
172
|
+
```json
|
|
173
|
+
{
|
|
174
|
+
"format": "csv",
|
|
175
|
+
"ops": ["norm", "min", "max", "mean", "nans", "zeros"],
|
|
176
|
+
"ndigits": 12
|
|
177
|
+
}
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
- 输出路径
|
|
181
|
+
通过环境变量`MONITOR_OUTPUT_DIR`设置,默认为"monitor_output"。
|
|
182
|
+
```shell
|
|
183
|
+
export MONITOR_OUTPUT_DIR=/xxx/output_dir
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
- 输出格式
|
|
187
|
+
通过可选配置项`format`指定。可以是\["tensorboard"(缺省值), "csv", "api"\]。
|
|
188
|
+
|
|
189
|
+
- format: tensorboard
|
|
190
|
+
监控结果写入tensorboard的event文件,启动tensorboard查看
|
|
191
|
+
```shell
|
|
192
|
+
tensorboard --logdir=$MONITOR_OUTPUT_DIR
|
|
193
|
+
```
|
|
194
|
+
之后,运行以下SSH命令来建立端口转发,可以在本地通过http://localhost:6006访问tensorboard:
|
|
195
|
+
```shell
|
|
196
|
+
ssh -N -L localhost:6006:localhost:6006 your_username@remote_server_address
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
- format: csv
|
|
200
|
+
监控结果写入csv文件中,可以通过`ndigits`字段设置小数位数.
|
|
201
|
+
|
|
202
|
+
- format: api
|
|
203
|
+
监控结果不落盘,在训练过程中可以通过`generate_wgrad_metrics`、`generate_xy_metrics`等接口获取。
|
|
204
|
+
|
|
205
|
+
- 统计量
|
|
206
|
+
通过必选配置项"ops"指定。可以是["norm", "min", "max", "mean", "nans","zeros"]。其中"nans"统计tensor中nan的数量,"zeros"统计tensor中数值小于"eps"的比例。
|
|
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
|
+
|
|
234
|
+
|
|
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`)开启梯度监控功能。
|
|
249
|
+
|
|
250
|
+
使用deepspeed的zero优化器时,需要在工具中指定优化器类型并传入优化器,获取梯度切分行为已还原参数梯度。
|
|
251
|
+
```python
|
|
252
|
+
from msprobe.pytorch import TrainerMon
|
|
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
|
+
```
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
### 梯度异常时序判断
|
|
263
|
+
1. 训练前配置相关参数
|
|
264
|
+
|
|
265
|
+
工具支持自动判断训练过程中的梯度异常,需要在配置文件中设置alert相关字段。"AnomalyTurbulence"会将当前数值与历史均值比较,如果相对偏差超过阈值,会在打屏信息中提示用户。如果打开"dump"选项,则会将异常梯度相关信息落盘到目录`monitor_output/anomaly_detected`,用于后续时序判断。
|
|
266
|
+
```json
|
|
267
|
+
"alert": {
|
|
268
|
+
"rules": [{"rule_name": "AnomalyTurbulence", "args": {"threshold": 0.5}}],
|
|
269
|
+
"dump": true
|
|
270
|
+
},
|
|
271
|
+
```
|
|
272
|
+
2. 实例化工具时传入流水线并行group
|
|
273
|
+
```python
|
|
274
|
+
monitor = TrainerMon("./monitor_config.json", process_group=mpu.get_pipeline_model_parallel_group(), params_have_main_grad=True)
|
|
275
|
+
```
|
|
276
|
+
照常开始训练
|
|
277
|
+
|
|
278
|
+
3. 启动异常分析脚本:
|
|
279
|
+
|
|
280
|
+
```shell
|
|
281
|
+
python3 -m msprobe.pytorch.monitor.anomaly_analyse -d $MONITOR_OUTPUT_DIR/anomaly_detected
|
|
282
|
+
```
|
|
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范围,默认为[]| 否 |
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
### 激活值监控
|
|
294
|
+
|
|
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激活值。
|
|
314
|
+
|
|
315
|
+
forward_only和backward_only均为true时,触发warning,前反向均不采集;均为false时,前反向均采集。
|
|
316
|
+
```python
|
|
317
|
+
from msprobe.pytorch import TrainerMon
|
|
318
|
+
# 以zero1优化器举例,opt_ty取值DeepSpeedZeroOptimizer_Stage1_or_2
|
|
319
|
+
# 示例为deepspeed,params_have_main_grad取值False
|
|
320
|
+
monitor = TrainerMon("./monitor_config.json", params_have_main_grad=False, opt_ty="DeepSpeedZeroOptimizer_Stage1_or_2")
|
|
321
|
+
monitor.set_wrapped_optimizer(optimizer) # optimzier为训练框架自定义的优化器
|
|
322
|
+
monitor.monitor_gnorm_with_ad(
|
|
323
|
+
model, grad_acc_steps=model.grad_acc_steps, optimizer=optimizer)
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
|
|
327
|
+
|
|
328
|
+
### 功能重载
|
|
329
|
+
- 统计量
|
|
330
|
+
可以在训练过程中修改`TrainerMon`实例的`ops`属性, 调整监控的统计量。
|
|
331
|
+
```python
|
|
332
|
+
if {some condition}:
|
|
333
|
+
monitor.ops = ["min", "max"]
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
- 训练过程中开关激活值监控
|
|
337
|
+
激活值监控的性能损耗较大, 推荐仅在必要时开启, 比如发现loss出现尖刺, 根据loss的异常开启激活值监控.
|
|
338
|
+
```python
|
|
339
|
+
if {some condition}:
|
|
340
|
+
monitor.reload_xy(xy_distribution=True)
|
|
341
|
+
```
|
|
342
|
+
|
|
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
|
+
|
|
361
|
+
```python
|
|
362
|
+
from msprobe.pytorch import TrainerMon
|
|
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)
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
## 公开接口
|
|
372
|
+
|
|
373
|
+
```python
|
|
374
|
+
TrainerMon.__init__(config_file_path, process_group=None, params_have_main_grad=True, opt_ty=None) -> None
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
| 参数 | 说明 | 是否必选 |
|
|
378
|
+
| ----- | -------------------- | -------- |
|
|
379
|
+
| config_file_path |json配置文件路径。 | 是 |
|
|
380
|
+
| process_group | 传入ProcessGroup对象,用以确定pipeline并行不同rank异常间时序,megatron下通过core.parallel_state.get_pipeline_model_parallel_group()获得。 | 否 |
|
|
381
|
+
| params_have_main_grad |权重是否使用main_grad,通常megatron为True,deepspeed为False。默认为True。 | 否 |
|
|
382
|
+
| opt_ty |优化器类型,默认为None。<br>-Megatron_DistributedOptimizer:megatron分布式优化器;<br/>-Megatron_Float16OptimizerWithFloat16Params:megatron混合精度优化器;<br/>-DeepSpeedZeroOptimizer_Stage1_or_2:DeepSpeed Zero1和Zero2;<br/>-DeepSpeedZeroOptimizer_Stage3:DeepSpeed Zero3。 | 否 |
|
|
383
|
+
|
|
384
|
+
```python
|
|
385
|
+
TrainerMon.monitor_gnorm_with_ad(model, grad_acc_steps, optimizer, dp_group, tp_group) -> None
|
|
386
|
+
```
|
|
387
|
+
| 参数 | 说明 | 是否必选 |
|
|
388
|
+
| ----- | -------------------- | -------- |
|
|
389
|
+
| model |需要监控的模型,需要是一个torch.nn.Module。 | 是 |
|
|
390
|
+
| grad_acc_steps | 梯度累积步数。 | 是 |
|
|
391
|
+
| optimizer | 需要patch的优化器 | 否 |
|
|
392
|
+
| dp_group | 数据并行的通信组。<br>dp域通信后,且没有使用分布式优化器时,group内所有rank的梯度相同,落盘数据冗余。<br>提供dp_group后,工具仅保留每个dp_group的第一个rank的梯度。 | 否 |
|
|
393
|
+
| tp_group | 张量并行的通信组。<br/>tp域通信后,group内部分参数所有rank的梯度相同,落盘数据冗余。<br/>提供tp_group后,工具仅保留每个tp_group中冗余参数在第一个rank的梯度。<br/>当前适配Megatron core_v0.6.0, 通过权重属性"tensor_model_parallel"判断是否冗余。 | 否 |
|
|
394
|
+
|
|
395
|
+
|
|
396
|
+
```python
|
|
397
|
+
TrainerMon.set_wrapped_optimizer(_wrapped_optimizer) -> None
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
| 参数 | 说明 | 是否必选 |
|
|
401
|
+
| ----- | -------------------- | -------- |
|
|
402
|
+
| _wrapped_optimizer |megatron、deepspeed创建好的混合精度优化器。 | 是 |
|
|
403
|
+
|
|
404
|
+
```python
|
|
405
|
+
TrainerMon.generate_wgrad_metrics() -> tuple[dict[dict]]
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
```python
|
|
409
|
+
TrainerMon.generate_xy_metrics() -> tuple[dict[dict]]
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
|
|
413
|
+
## 详细配置
|
|
414
|
+
|
|
415
|
+
```json
|
|
416
|
+
{
|
|
417
|
+
"targets": {
|
|
418
|
+
"language_model.encoder.layers.0": {"input": "tuple[2]:0", "output": "tensor", "input_grad":"tuple[2]:0", "output_grad":"tuple[1]:0"}
|
|
419
|
+
},
|
|
420
|
+
"print_struct": false,
|
|
421
|
+
"module_ranks": [0,1,2,3],
|
|
422
|
+
"ur_distribution": true,
|
|
423
|
+
"xy_distribution": true,
|
|
424
|
+
"all_xy": true,
|
|
425
|
+
"forward_only": false,
|
|
426
|
+
"backward_only": false,
|
|
427
|
+
"mv_distribution": true,
|
|
428
|
+
"param_distribution": true,
|
|
429
|
+
"wg_distribution": true,
|
|
430
|
+
"cc_distribution": {"enable":true, "cc_codeline":[]},
|
|
431
|
+
"alert": {
|
|
432
|
+
"rules": [{"rule_name": "AnomalyTurbulence", "args": {"threshold": 0.5}}],
|
|
433
|
+
"dump": false
|
|
434
|
+
},
|
|
435
|
+
"format": "tensorboard",
|
|
436
|
+
"ops": ["min", "max", "norm", "zeros", "nans", "mean"],
|
|
437
|
+
"eps": 1e-8,
|
|
438
|
+
"ndigits": 12,
|
|
439
|
+
"step_count_per_record": 1
|
|
440
|
+
}
|
|
441
|
+
```
|
|
442
|
+
|
|
443
|
+
下面详细解释各个字段:
|
|
444
|
+
|
|
445
|
+
| 字段名字 | 是否必选 | 解释 |
|
|
446
|
+
| ------------------------------------------------------------ | -------- | -------- |
|
|
447
|
+
|"targets"| 必选 |指定需要监控的模型层, 例如transformer的第0层language_model.encoder.layers.0。如果不清楚模型结构, 可以将 "print_struct" 字段设置为 true, 监控工具会打印模型中torch module的名字和详细结构,并在第1个step后退出。|
|
|
448
|
+
|"input"| 可选 |"tuple[2]:0"的意思是目标module的前向input参数为长度为2的tuple, 我们关心的是tuple第0个元素。|
|
|
449
|
+
|"output"| 必选 |"tensor"的意思是目标module的前向output参数类型为tensor|
|
|
450
|
+
|"input_grad"| 可选 |"tuple[2]:0"的意思是目标module的后向input_grad参数是长度为2的tuple, 我们关心的是tuple的第0个元素。|
|
|
451
|
+
|"output_grad"| 必选 |"tuple[1]:0"的意思是目标module的后向input_grad参数是长度为1的tuple, 我们关心的是tuple的第0个元素。|
|
|
452
|
+
|"print_struct"| 可选 |设置为true后监控工具会打印模型中torch module的名字和详细结构,并在第1个step后退出。不填默认为false。|
|
|
453
|
+
|"module_ranks"| 可选 |用于在分布式训练场景中希望控制在哪些rank开启module监控。如果不填,则默认在所有rank开启。|
|
|
454
|
+
|"ur_distribution"| 可选 |若为true则会统计adam优化器指定模块(targets中指定)参数的update和ratio向量的数值分布,并展示在heatmap里,默认为false,同时format字段必须设置为tensorboard。<br/>依赖histc算子, 需要CANN8.0.rc2以上版本, 否则会有严重的性能问题。 |
|
|
455
|
+
|"xy_distribution"| 可选 |若为true则会监控指定module(targets中指定)的输入输出张量。 默认为false。|
|
|
456
|
+
|"all_xy"| 可选 |开启xy_distribution后生效,若为true,监控所有module。默认为false。|
|
|
457
|
+
|"forward_only"| 可选 |开启xy_distribution后生效,若为true,仅监控指定module的前向,targets中的input_grad、output_grad不生效。默认为false。|
|
|
458
|
+
|"backward_only"| 可选 |开启xy_distribution后生效,若为true,仅监控指定module的反向,targets中的input、output不生效。默认为false。|
|
|
459
|
+
|"mv_distribution"| 可选 |若为true则会监控指定模块中的参数的优化器状态, 默认为false。需要在TrainerMon构造函数正确指定opt_ty。 目前支持megatron和Deepspeed的分布式优化器。<br/>-Megatron_DistributedOptimizer:megatron分布式优化器;<br/>-Megatron_Float16OptimizerWithFloat16Params:megatron混合精度优化器;<br/>-DeepSpeedZeroOptimizer_Stage0:DeepSpeed Zero0<br/>-DeepSpeedZeroOptimizer_Stage1_or_2:DeepSpeed Zero1和Zero2;<br/>-DeepSpeedZeroOptimizer_Stage3:DeepSpeed Zero3。 |
|
|
460
|
+
|"wg_distribution"| 可选 |若为true则会监控指定模块的参数梯度, 默认为false。 |
|
|
461
|
+
|"param_distribution"| 可选 |若为true则会监控指定模块的参数, 默认为false。 |
|
|
462
|
+
|"alert"| 可选 | "rules": 指定自动报警的异常检测机制及其相应的阈值。目前实现的异常检测是AnomalyTurbulence, 如果统计标量超出历史均值的指定浮动范围(threshold 0.5意味着上浮或者下浮50%)则在控制台打印报警信息。当"dump"字段配置为true表示异常事件写入文件,默认为false。 |
|
|
463
|
+
|"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的同步。|
|
|
464
|
+
|"format"| 可选 | 数据落盘格式,默认为tensorboard,可选 \["tensorboard", "csv", "api"\]。 |
|
|
465
|
+
|"ops"| 必选 |类型为list,与ur_distribution、xy_distribution、mv_distribution、wg_distribution、mg_direction、cc_distribution配合,监控所选张量的统计指标,目前支持"min"、"max"、"norm"、"mean"、"zeros"、"nans"。其中,zeros代表监控所选张量的元素小于eps的比例,nans代表张量中nan的数量。|
|
|
466
|
+
|"eps"| 可选 |若ops里包含"zeros"则需要配置,默认为1e-8。|
|
|
467
|
+
|"ndigits"| 可选 |"format"为"api"时,设置落盘文件中的小数位数,默认为6。|
|
|
468
|
+
|"step_count_per_record"| 可选 | "format"为"csv"时生效,每个csv记录多少个step的数据,默认为1。|
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# 训练状态监控工具标准性能基线报告
|
|
2
|
+
|
|
3
|
+
## 环境信息
|
|
4
|
+
|
|
5
|
+
NPU:Atlas A2 训练系列产品
|
|
6
|
+
|
|
7
|
+
CPU:
|
|
8
|
+
|
|
9
|
+

|
|
10
|
+
|
|
11
|
+
Torch:2.1.0
|
|
12
|
+
|
|
13
|
+
CANN:8.0.RC2
|
|
14
|
+
|
|
15
|
+
除上述环境信息影响性能外,被检控的模块的数量和结构会对性能产生影响,因此本次选取典型网络进行测试,并且选取耗时稳定后的步数进行测试。工具输出键小,对内存无要求。
|
|
16
|
+
|
|
17
|
+
## 模型信息和性能基线
|
|
18
|
+
|
|
19
|
+
以下场景的性能基线测试数据均为多次测试后取平均值,因此实际运行时性能数据可能会根据环境状态稍有浮动。
|
|
20
|
+
|
|
21
|
+
### LLAMA2-13B
|
|
22
|
+
|
|
23
|
+
主要数据类型:BFLOAT16
|
|
24
|
+
|
|
25
|
+
模型层数:40
|
|
26
|
+
|
|
27
|
+
配置文件(采了10层):
|
|
28
|
+
```
|
|
29
|
+
{
|
|
30
|
+
"targets": {
|
|
31
|
+
"language_model.encoder.layers.0": {"input": "tuple[2]:0", "output": "tensor", "input_grad":"tuple[2]:0", "output_grad":"tuple[1]:0"},
|
|
32
|
+
"language_model.encoder.layers.1": {"input": "tuple[2]:0", "output": "tensor", "input_grad":"tuple[2]:0", "output_grad":"tuple[1]:0"},
|
|
33
|
+
"language_model.encoder.layers.2": {"input": "tuple[2]:0", "output": "tensor", "input_grad":"tuple[2]:0", "output_grad":"tuple[1]:0"},
|
|
34
|
+
"language_model.encoder.layers.3": {"input": "tuple[2]:0", "output": "tensor", "input_grad":"tuple[2]:0", "output_grad":"tuple[1]:0"},
|
|
35
|
+
"language_model.encoder.layers.4": {"input": "tuple[2]:0", "output": "tensor", "input_grad":"tuple[2]:0", "output_grad":"tuple[1]:0"},
|
|
36
|
+
"language_model.encoder.layers.5": {"input": "tuple[2]:0", "output": "tensor", "input_grad":"tuple[2]:0", "output_grad":"tuple[1]:0"},
|
|
37
|
+
"language_model.encoder.layers.6": {"input": "tuple[2]:0", "output": "tensor", "input_grad":"tuple[2]:0", "output_grad":"tuple[1]:0"},
|
|
38
|
+
"language_model.encoder.layers.7": {"input": "tuple[2]:0", "output": "tensor", "input_grad":"tuple[2]:0", "output_grad":"tuple[1]:0"},
|
|
39
|
+
"language_model.encoder.layers.8": {"input": "tuple[2]:0", "output": "tensor", "input_grad":"tuple[2]:0", "output_grad":"tuple[1]:0"},
|
|
40
|
+
"language_model.encoder.layers.9": {"input": "tuple[2]:0", "output": "tensor", "input_grad":"tuple[2]:0", "output_grad":"tuple[1]:0"}
|
|
41
|
+
},
|
|
42
|
+
"module_ranks": "0"
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
启动命令参数:python3 -u pretrain_gpt.py --local-rank=1 --tensor-model-parallel-size 8 --pipeline-model-parallel-size 1 --sequence-parallel --num-layers 40 --hidden-size 5120 --ffn-hidden-size 13824 --num-attention-heads 40 --tokenizer-type Llama2Tokenizer --tokenizer-model /new_data/LLM/checkpoint_origin/llama2-13b-hf/tokenizer.model --seq-length 4096 --max-position-embeddings 4096 --micro-batch-size 2 --global-batch-size 16 --make-vocab-size-divisible-by 1 --lr 1e-6 --train-iters 5000 --lr-decay-style cosine --untie-embeddings-and-output-weights --disable-bias-linear --attention-dropout 0.0 --init-method-std 0.01 --hidden-dropout 0.0 --position-embedding-type rope --normalization RMSNorm --use-fused-rmsnorm --swiglu --use-flash-attn --no-masked-softmax-fusion --attention-softmax-in-fp32 --min-lr 1e-8 --weight-decay 1e-1 --lr-warmup-fraction 0.01 --clip-grad 1.0 --adam-beta1 0.9 --initial-loss-scale 4096 --adam-beta2 0.95 --no-gradient-accumulation-fusion --load /data/LLM/checkpoint_magatron/llama2_13b_tp1_pp8 --no-load-optim --no-load-rng --use-fused-swiglu --use-fused-rotary-pos-emb --use-mc2 --bf16 --data-path /data/LLM/data_modellink/llama2_13b/alpaca_text_document --split 949,50,1 --log-interval 1 --save-interval 10000 --eval-interval 1000 --eval-iters 10 --distributed-backend nccl --save ./ckpt
|
|
47
|
+
|
|
48
|
+
不加工具原始耗时:**4s**
|
|
49
|
+
|
|
50
|
+
加工具后单卡耗时:**4.25s**
|
|
51
|
+
|
|
52
|
+
加工具后多卡耗时:**4.35s**
|