文档
注册

特征值检测

简介

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

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

检测原理:开启检测开关后,针对Transformer结构模型训练的反向阶段,采集Layernorm层、Embedding层的激活值梯度,并通过算法判断是否异常。若出现异常,则终止训练,并将检测到异常的设备上的NPU状态置为Warning,上报故障事件。

特征值异常原因可分为两类:硬件错误与软件错误,可参考故障处理进行后续分析。

模型脚本适配

特征值检测的原理是通过对指定网络层注册hook从而调用检测算子实现,因此,针对未使用昇腾提供的三方框架(ModelLink、MindSpeed、Megatron、DeepSpeed)的用户,在使用特征值检测功能时,需要对模型脚本做对应适配。若使用了昇腾提供的三方框架,则已集成该功能,无需适配。

  1. 自定义layernorm层、embedding层注册hook。

    当前PyTorch框架中,开启特征值检测开关后,会对torch.nn.functional.layer_norm\torch.nn.functional.embedding注册hook,因此用户如果自定义实现layer_norm层或embedding层的能力,需要自行注册hook。

    对于自定义layer_norm层,需要对input tensor注册hook,以rms_norm为例:

    class RMSNorm(torch.nn.Module):
        def __init__(self,
                     dim: int,
                     eps: float = 1e-6,
                     sequence_parallel: bool = False):
            """RMS Normaliation module
            Arguments:
                dim (int): The width of input, i.e. hidden size
                eps (float): epsilon to use for the norm, default to 1e-6
                sequence_parallel (bool): Set to true if sequence parallelism is being used,
                  this marks the weights as needing to be allreduced.
            """
            super().__init__()
            args = get_args()
            self.use_fused_rmsnorm = args.use_fused_rmsnorm
            self.eps = eps
            self.weight = nn.Parameter(torch.ones(dim))
            setattr(self.weight, 'sequence_parallel', sequence_parallel)
        def _norm(self, x):
            return x * torch.rsqrt(x.pow(2).mean(-1, keepdim=True) + self.eps)
        def forward(self, x):
            if int(os.getenv('NPU_ASD_ENABLE', '0')):
                from torch_npu.utils import register_asd_hook
                register_asd_hook(x, self.weight)
            if self.use_fused_rmsnorm:
                return torch_npu.npu_rms_norm(x, self.weight, epsilon=self.eps)[0]
            output = self._norm(x.float()).type_as(x)
            return output * self.weight

    对于自定义embedding层,需要对weight tensor注入hook,同上。

开启检测开关

  1. 训练前,配置如下环境变量,使能特征值检测:

    开启特征值检测会导致训练性能损失小于2%。

    export NPU_ASD_ENABLE=1                      #开启特征值检测

    环境变量设置为0时,表示开关未打开;设置为1时,表示开关打开。未配置环境变量时,默认开关未打开。

  2. 特征值采集后,会通过算法判断是否超出正常阈值范围。默认检测阈值无需配置,仅在需要修改阈值时,通过配置环境变量修改。
    export NPU_ASD_UPPER_THRESH=1000000,10000    #配置特征值检测极值的一、二级阈值
    export NPU_ASD_SIGMA_THRESH=100000,5000      #配置特征值检测跳变的一、二级阈值

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

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

故障处理

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

  1. 通过搜索应用类日志(默认存放在“$HOME/ascend/log”路径下)、或监控NPU健康状态、或查看Ascend Device Plugin事件,定位到异常设备,错误码:80818C00。
    • 应用类日志: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. 将异常设备隔离,继续训练;同时在异常设备上,通过Ascend-DMI工具执行AICore ERROR压测诊断,检测该设备上是否存在故障NPU。详情请查看《MindX DL ascend-dmi用户指南》中的“故障诊断”章节
  3. 若异常设备上检测到故障卡,请联系华为工程师维修更换;若异常设备上所有NPU均正常,则为软件类问题触发特征值溢出,建议排查用户和算子原因。
搜索结果
找到“0”个结果

当前产品无相关内容

未找到相关内容,请尝试其他搜索词