
# advisor异常值分析
msprobe advisor异常值分析功能可快速定位训练过程中出现的异常值（例如NaN、Infinity等），通过分析msprobe dump的统计量数据，结合通信建模和联立分析，能够自动定位问题发生的初始位置。
#### 适用场景
该功能主要针对以下训练问题现象：
- 训练日志中出现loss、grad norm等关键指标异常：
  - 出现Nan、Infinity等无效值。
  
  - 数值异常增大，超出常规认知范围。
   
- 存量模型训练中发现：
  - 当前loss与历史loss差异显著。
  
  - loss值突然异常波动（"loss飞掉"现象）。
   
此类异常现象可能由以下原因引起：
- 硬件层面：可能存在硬件静默故障（如坏卡）。
- 软件层面：可能是算子或软件栈问题。
 
#### 环境准备
msprobe advisor已集成到ModelArts发布的镜像环境中，建议使用以下镜像进行相关操作。
```
swr.cn-southwest-2.myhuaweicloud.com/atelier/pytorch_ascend:pytorch_2.5.1-cann_8.1.rc1-py_3.10-hce_2.0.2503-aarch64-snt9b-20250514161205-a9c5055
```
#### 获取NPU和GPU的dump数据
在PyTorch训练脚本中插入dump接口的方式如下：
```
from msprobe.pytorch import PrecisionDebugger
debugger = PrecisionDebugger(config_path='./config.json')
...
debugger.start() # 一般在训练循环开头启动工具。
... # 循环体
debugger.stop() # 一般在训练循环末尾结束工具。
debugger.step() # 在训练循环的最后需要重置工具，非循环场景不需要。
```
此处config.json配置使用统计量dump方式，示例如下：
```
{
    "task": "statistics",
    "dump_path": "./dump_path", 
    "rank": [],  
    "step": [3, 4, 5],  
    "level": "L1", 
    "enable_dataloader": false,
    "async_dump": false,
    "statistics": {
        "scope": [], 
        "list":[], 
        "data_mode": ["all"],
        "summary_mode": "statistics"
    }
}
```
这里指定了在第3、4、5个step进行数据dump。具体的step可以根据实际怀疑有精度问题的step前后进行调整。
#### 执行advisor分析命令
使用以下命令执行msprobe advisor分析：
```
msprobe -f pytorch advisor -i ${dump_path}  -o ${log_path}
```
- -i参数指定的目录是采集到指定step的dump数据（例如step4）。
- -o参数指定输出advisor建议落盘到文本文件（例如advisor.log）。
命令执行后会回显类似下图的terminal打印，其中包含了根因节点、异常函数名称、位置、置信度等信息。置信度从1到0按照大小依次排列，为1表示分析到根因，小于1的情形可按照顺序再做二次问题排查。
图1terminal打印示例   
![](https://support.huaweicloud.com/bestpractice-modelarts/figure/zh-cn_image_0000002239938813.png "点击放大")
通过上述信息，您可以快速定位并解决训练过程中出现的异常值问题。
#### 优化建议与注意事项
通过以下优化建议和注意事项，可以更高效地进行训练过程中的异常值分析，快速定位问题并解决问题。
**优化建议**
- 选择合适的step：根据实际怀疑有精度问题的step前后进行dump，确保采集到足够的数据用于分析。例如，如果怀疑在step4附近出现精度问题，可以dump step3、step4和step5的数据，以便更全面地分析。
- 检查dump数据路径：确保${dump_path}指向正确的dump数据目录，避免因路径错误导致分析失败。例如，如果dump数据存储在/data/dump/step4，则${dump_path}应设置为/data/dump/step4。
- 分析结果解读：根据置信度值优先排查置信度高的异常，逐步缩小问题范围。例如，如果置信度为1的异常显示在某个节点的某个函数中，应优先检查该节点和函数的实现是否正确。
- 优化数据读取效率：如果数据集存在较多小文件，建议将小文件压缩打包（如.zip格式），上传至OBS，训练时直接下载压缩文件至/cache目录，避免反复与OBS交互导致效率低下。例如，可以使用以下代码将压缩文件下载并解压：
  ```
  import moxing as mox
  TMP_CACHE_PATH = '/cache/data'
  mox.file.copy_parallel('OBS_path/your_data.zip', TMP_CACHE_PATH)
  # 解压文件
  ```
  
 
**注意事项**
- 确保训练环境与镜像版本兼容：确保使用的msprobe版本与昇腾环境和其他相关软件版本兼容。版本不兼容可能会导致分析工具无法正常工作。
- 配置文件中的路径和参数需根据实际训练场景进行调整：确保配置文件中的路径（如数据路径、日志路径）和参数（如batch_size、train_steps）与实际训练场景一致。例如，如果数据存储在/cache/data，则代码中读取数据的路径应设置为/cache/data。
- 检查数据路径和权限：确保数据路径正确，并且ModelArts服务有权限访问数据存储的位置（如OBS桶）。例如，确保OBS桶的权限设置允许ModelArts服务读取数据。
 
