更新时间:2025-09-08 GMT+08:00
分享

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的情形可按照顺序再做二次问题排查。

图1 terminal打印示例

通过上述信息,您可以快速定位并解决训练过程中出现的异常值问题。

优化建议与注意事项

通过以下优化建议和注意事项,可以更高效地进行训练过程中的异常值分析,快速定位问题并解决问题。

优化建议
  • 选择合适的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服务读取数据。

相关文档