昇腾社区首页
中文
注册

特征值检测

简介

特征值检测是针对NPU的PyTorch API,作用是检测在训练过程中激活值的梯度特征值是否存在异常。当前仅能识别数据类型为BF16或FP32的模型在训练过程中出现的收敛异常。

PyTorch图模式(TorchAir)不支持此特性。

CANN版本为8.0.RC2及之前,或Ascend Extension for PyTorch版本为6.0.rc2及之前,需参考CANN或者Ascend Extension for PyTorch相应版本的资料进行操作。

特征值检测需要计算激活值梯度的统计值,会产生额外的显存占用,用户显存紧张情况下可能导致OOM(Out of Memory,内存不足)。

开启检测开关后,针对模型训练的反向阶段,采集通信算子和模型最外层的输入Tensor,并通过算法判断是否异常。若出现异常,当“NPU_ASD_ENABLE”设置为“1”时,只打印异常日志,不上报故障事件;当“NPU_ASD_ENABLE”设置为“2”“3”时,则终止训练,并将检测到异常的设备上的NPU状态置为Warning,上报故障事件。

特征值异常原因可分为硬件错误和软件错误两类:

  • 硬件错误:硬件故障导致激活值梯度出现异常大值。
  • 软件错误:模型异常操作或算子越界,导致出现Inf或NaN等异常特征值。

检测原理:根据预先设置的阈值以及历史值,判断当前激活值梯度是否包含异常大值。

用户可参考故障处理进行后续分析。

开启检测开关

  1. 训练前,配置如下环境变量,使能特征值检测并上报告警:
    • 开启特征值检测会导致性能损失,建议在满足如下所有条件时开启,否则性能损失可能大于2%。
      • 模型规模:70B及以上;
      • 集群规模:64卡及以上;
      • torch.npu.set_compile_mode设置:jit_compile=False。
    • 满足以上条件下,在模型上下文并行(Context Parallel)较大时,ring attention特性会在模型反向传播过程中引入大量P2P通信,性能损失可能大于2%。
    export NPU_ASD_ENABLE=2                      #开启特征值检测,并告警
    • 未设置或者设置为“0”时,表示关闭特征值检测。此环境变量默认值为“0”
    • 设置为“1”时,表示开启特征值检测,只打印异常日志,不告警。
    • 设置为“2”时,表示开启特征值检测,并告警。
    • 设置为“3”时,表示开启特征值检测,并告警,同时会在device侧info级别日志中记录过程数据。
  2. 特征值采集后,会通过算法判断是否超出正常阈值范围。默认检测阈值无需配置,若需要修改阈值可通过配置环境变量修改。

    出厂默认阈值即为最优值,不推荐客户修改。若发生如下情况可根据实际场景调整阈值,并注意相关影响。

    • 需要调大阈值场景:若发生告警,并且确认此次数值波动为正常,不影响训练,则调大阈值。
      • 若val超过NPU_ASD_UPPER_THRESH导致告警,则需根据val值调大阈值NPU_ASD_UPPER_THRESH(推荐为val*2);
      • 若跳变幅度超过NPU_ASD_SIGMA_THRESH触发告警,则需根据(val-pre_val)和(max-min)的比值调大阈值NPU_ASD_SIGMA_THRESH(推荐为(val-pre_val)/(max-min)*2 )。

      相关影响:调大阈值会导致检出率有所减低,但误检率也会降低。

    • 需要调小阈值场景:若频繁出现loss spike/grad norm spike影响训练,重新拉起依然有spike,但无告警,则按照一定比例(如10)逐渐调小阈值。

      相关影响:调小阈值能够提高检出率,但也容易引发误检。

    export NPU_ASD_UPPER_THRESH=1000000,10000    #配置特征值检测极值的一、二级阈值,一、二级阈值最小取值为3
    export NPU_ASD_SIGMA_THRESH=100000,5000      #配置特征值检测跳变的一、二级阈值,一、二级阈值最小取值为3

    环境变量NPU_ASD_UPPER_THRESH控制绝对阈值,格式为整型数据对。其中第一个元素控制一级阈值,特征值绝对值超过一级阈值时,会终止训练并上报告警;第二个元素控制二级阈值,特征值绝对值超过二级阈值且“ASCEND_GLOBAL_LOG_LEVEL”设置为“0”“1”“2”时,会打印Warning级别日志预警。减小阈值可以检出波动更小的异常数据,增加检出率,增大阈值与之相反。

    环境变量NPU_ASD_SIGMA_THRESH控制相对阈值,格式与上者相同。算法会检测特征值跳变幅度,超过阈值时表现与上者相同。

故障处理

开启检测开关后,若检测到特征值异常,PyTorch会自动终止训练,并上报告警。故障处理流程如下:

  1. 通过搜索应用类日志(默认存放在“~/ascend/log”路径下)、或监控NPU健康状态、或查看Ascend Device Plugin事件,定位到异常设备。
    • 应用类日志:ERROR级别日志,关键词“feature abnormal”
    • NPU健康状态:Health Status显示“Warning”,Error Code显示“80818C00”,Error Information显示“node type=SoC, sensor type=Check Sensor, event state=check fail”
    • Ascend Device Plugin:上报错误码80818C00,事件类型为故障事件,故障级别次要。
  2. 针对Atlas A2 训练系列产品/Atlas A3 训练系列产品,确定异常设备后将其隔离,继续训练;同时在异常设备上,先执行如下命令进行ECC计数查询:
    npu-smi info -t ecc -i ${device_id}

    通过屏显信息判断“片上内存多比特错误隔离内存页数量”“片上内存多比特错误待隔离内存页数量”有无新增,检查该NPU在训练过程中是否存在片上内存多比特ECC故障。若无,则再通过Ascend-DMI工具执行AICore ERROR压测诊断,检测该设备NPU的AICore是否存在故障。详情请查看《MindCluster Toolbox用户指南》中的“故障诊断”章节

    Atlas A2 训练系列产品ECC计数详情,可查看《Atlas A2 中心推理和训练硬件 24.1.0 npu-smi 命令参考》中的“查询所有芯片ECC错误计数”章节

    Atlas A3 训练系列产品ECC计数详情,可查看《Atlas A3 中心推理和训练硬件 24.1.RC3 npu-smi 命令参考》中的“查询所有芯片ECC错误计数”章节

  3. 若异常设备上检测到故障卡,请联系华为工程师维修更换;若异常设备上所有NPU均正常,则为软件类问题触发特征值溢出,建议排查用户和算子原因。