特征值检测是针对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,上报故障事件。
特征值异常原因可分为硬件错误和软件错误两类:
检测原理:根据预先设置的阈值以及历史值,判断当前激活值梯度是否包含异常大值。
用户可参考故障处理进行后续分析。
export NPU_ASD_ENABLE=2 #开启特征值检测,并告警
出厂默认阈值即为最优值,不推荐客户修改。若发生如下情况可根据实际场景调整阈值,并注意相关影响。
相关影响:调大阈值会导致检出率有所减低,但误检率也会降低。
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控制相对阈值,格式与NPU_ASD_UPPER_THRESH相同。算法会检测特征值跳变幅度,超过阈值时表现与上者相同。
开启检测开关后,若检测到特征值异常,PyTorch会自动终止训练,并上报告警。故障处理流程如下:
npu-smi info -t ecc -i ${device_id}
通过屏显信息判断“片上内存多比特错误隔离内存页数量”和“片上内存多比特错误待隔离内存页数量”有无新增,检查该NPU在训练过程中是否存在片上内存多比特ECC故障。若无,则再通过Ascend-DMI工具执行AICore ERROR压测诊断,检测该设备NPU的AICore是否存在故障。详情请查看《MindCluster Toolbox用户指南》中的“故障诊断”章节。