
# 工具使用
在强化学习训练过程中，往往存在多个模型（Actor、Reward、Reference）和两个阶段（推理、训练），精度问题定界困难。
本工具基于[msprobe](https://gitcode.com/Ascend/mstt/tree/master/debug/accuracy_tools/msprobe)提供关键阶段数据的灵活采集与对比能力，结合系统化定位方法论，助力**VeRL框架**精度问题分析与调优。
- 支持VeRL两种主流训练后端（FSDP、Megatron-LM）的精度数据采集。

- 针对训练过程中的vLLM推理框架打桩，屏蔽推理框架及硬件设备上的固有偏差。
#### 约束限制
本工具当前支持验证或调试**VeRL强化学习框架**精度问题。
#### 前置条件
通过以下命令安装msprobe三方库：
```
pip install mindstudio-probe
```
更多详细内容请参见[msprobe安装指南](https://gitcode.com/Ascend/mstt/blob/master/debug/accuracy_tools/msprobe/docs/zh/msprobe_install_guide.md#3-从源码安装)。
#### 配置说明
精度工具通过[VeRL YAML脚本](https://support.huaweicloud.com/bestpractice-modelarts/modelarts_llm_train_590810.html#ZH-CN_TOPIC_0000002535527223)中的 **ascend_precision_collector 字段** 配置，添加下图红框所示内容。
![](https://support.huaweicloud.com/bestpractice-modelarts/figure/zh-cn_image_0000002512892703.png)
```
+ascend_precision_collector: "precision_collector.yaml"
```
**新建** precision_collector.yaml ，基本内容如下：
```
precision_collector:
  msprobe: False
  memory_dump: False
  dump_path: "./collector_save_path"
  configurations_dump: False
  key_data_dump: False
  reference_dump: False
  actor_train_dump: False
  actor_infer_dump: False
  critic_train_dump: False
  step_start: 0
  step_end: 0
  token_range_start: 0
  token_range_end: 0
  level: "L0"
  task: "statistics"
  enable_mock_inference: False
  mock_random_seed: None
  mock_data_path: "./collector_saved_path"
  mock_step_start: 0 
  mock_step_end: 0
```
**注意：**当不使用 msprobe 采集功能时，以下两种配置均可保证模型正常运行：
- yaml脚本中 不添加ascend_precision_collector字段。
- yaml脚本中 添加ascend_precision_collector字段，但设为None。
  ```
  +ascend_precision_collector: None
  ```
  
工具参数配置说明如[表1]所示。
 表1msprobe工具参数配置说明表 
| 参数                    | 选项值        | 参数说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
|:---|:---|:---|
| msprobe               | True/False | **是否使能msprobe** **，开启后精度数据采集、模拟推理生效**。 默认False，表示不开启。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| memory_dump           | True/False | **是否使能memory_dump** **，开启后内存数据采集生效。** 启用后将生成 dump_path/memory_snapshot文件夹。需配合开启模型层dump。 默认False，表示不采集。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| dump_path             | str        | 数据存盘路径。 默认值"./collector_save_path"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| configurations_dump   | True/False | 是否采集训练配置，开启后，将保存为 configurations.json。 默认False，表示不开启。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| key_data_dump         | True/False | 是否采集关键过程数据，包括response、input_ids、attention_mask、prompts、position_ids、old_log_probs、entropys的统计量信息（最大值、最小值、均值、L2norm值）和真实数据。 默认False，表示不采集。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| reference_dump        | True/False | 是否采集compute_ref_log_prob 阶段的模型层数据。 默认False，表示不采集。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| actor_train_dump      | True/False | 是否采集actor_compute_log_prob、actor_update训练阶段的模型层数据。 默认False，表示不采集。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| actor_infer_dump      | True/False | 是否采集actor_generate_sequences推理阶段的模型层数据，需要与token_range_start、token_range_end搭配使用。默认False，表示不采集。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| critic_train_dump     | True/False | 是否采集critic_compute_values、critic_update阶段的模型层数据。（注：使用critic网络的算法才会采集） 默认False，表示不采集。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| step_start            | int        | 采集开始步数。 默认为0，要求step\>=0。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| step_end              | int        | 采集结束步数。 默认为0，要求step\>=0。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| token_range_start     | int        | 采集推理生成token的开始范围，与token_range_end搭配使用，表示采集推理生成的从第几个到第几个范围内的token数据。 默认为0。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| token_range_end       | int        | 采集推理生成token的结束范围，如果只想采某一个token的数据，设置为与token_range_start相等。 默认为0。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| level                 | str        | dump 级别，根据不同级别采集不同数据，可参考[dump级别配置](https://gitcode.com/Ascend/mstt/blob/master/debug/accuracy_tools/msprobe/docs/zh/dump/config_json_introduct.md)。 默认值L0                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| task                  | str        | dump 的任务类型。 - "statistics"为仅采集统计信息。  - "tensor"为采集统计信息和完全复刻整网真实数据。可参考[dump任务类型配置](https://gitcode.com/Ascend/mstt/blob/master/debug/accuracy_tools/msprobe/docs/zh/dump/config_json_introduct.md#11-通用配置)。   默认值"statistics"。                                                                                                                                                                                                                                                                                                                                    |
| enable_mock_inference | True/False | 是否使能模拟推理（加载标杆Device的推理样本）。默认为False，表示不开启。 开启后，训练的推理阶段将加载存于mock_data_path的标杆Device推理数据。 **注** ：**当仅采集数据，不做mock推理数据加载时，必须禁用mock推理使能，设为False**。 （主要用于：标杆Device采集的推理结果样本在当前执行Device上加载，以避免推理带来的误差，对齐训练loss）详细可见：[后端推理框架打桩](https://support.huaweicloud.com/bestpractice-modelarts/modelarts_llm_train_590818.html#ZH-CN_TOPIC_0000002503967266__zh-cn_topic_0000002480812786_section2053917596335)。                                                                                                                                                                                                                                                                                                                                                                                                            |
| mock_random_seed      | int        | 模拟推理的模式。 - None为使用真实step模式。  - -1 为根据mock_step指定范围使用顺序加载模式。  - ≠-1为根据mock_step指定范围使用随机加载模式 详细可见：[后端推理框架打桩](https://support.huaweicloud.com/bestpractice-modelarts/modelarts_llm_train_590818.html#ZH-CN_TOPIC_0000002503967266__zh-cn_topic_0000002480812786_section2053917596335)。    |
| mock_data_path        | str        | 待加载数据保存路径。 默认值"./collector_saved_path"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| mock_step_start       | int        | 待加载数据开始步数。 默认为0，要求step\>=0。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| mock_step_end         | int        | 待加载数据结束步数。 默认为0，要求step\>=0。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
   
\* 注：LoRA模型调用FSDP后端时，由于同一step内actor_compute_log_prob 阶段会执行两次，因此开启actor_train_dump 采集训练数据时，需将step_end设置为 2\*预采集步数。
#### 落盘数据说明
全量落盘（除enable_mock_inference参数外均设为True） 时，将在dump_path路径生成如下数据：
```
collector_save_path/
├── actor_generate_sequences/  # actor_generate_sequences阶段的模型层数据
├── actor_compute_log_prob/    # actor_compute_log_prob阶段的模型层数据
├── actor_update/  # actor_update阶段的模型层数据
│  └── rank0/  # rank数
│         └── construct.json   
│         └── dump.json   
│         └── stack.json  
├── critic_compute_values/   # critic compute_values阶段的模型层数据
├── critic_update/     # critic_update阶段的模型层数据
├── reference_compute_log_prob/  # reference的模型层数据
├── memory_snapshot/   # memory_snapshot内存使用数据
├── data/    # 训练过程关键数据
│   └── attention_mask/  
│   └── entropys/  
│   └── input_ids/
│   └── old_log_probs/
│   └── position_ids/  
│   └── prompts/  
│   └── prompts/  
│   └── responses/  # 关键数据名称，来自SingleSave.save的时候的key
│           └── step0/   # step数
│               └── rank0/    # rank数
│                     └── micro_step0/   # micro_step数
│                         └── response0.npy   # 存储的关键数据的真实npy文件
│                         └── response0.json  # 存储的关键数据的统计量文件，包括tensor的最大、最小、均值、norm、shape
├── configurations.json  # 训练配置文件
```
