定位步骤概述
- 定位问题根本原因。
AI Core Error必定为某个task运行时输出,但并不一定为该task执行异常导致,其他并行的task异常终止、task依赖的输入或者运行环境等异常都会导致最终以AI Core Error的形式输出,尤其是遇到其它并行的任务异常导致的问题。无法直接按照AI Core Error的定位思路进行定位,因此应该先排查在AI Core Error之前是否有错误信息。
- 定位异常算子。
根据问题分析和定位的“1. Basic Information”模块中的device id、core id、task id、stream id、node name、kernel name、算子地址等信息找到对应的出错算子。
- 定位异常指令。
根据问题分析和定位的“3. Instructions”中给出的start pc与current pc,两者做差得到异常终止运行的指令节点,进入反编译文件.o.txt文件中找到对应指令,查看对应指令进行了什么数据存储操作。
- 定位错误类型。
查看AI Core Error报错的错误码,定位报错类型。
- 定位具体问题。
表1 问题排查说明 问题分类
排查方法
具体说明
算子功能
单算子网络复现
基于网络中的规格和数据构造单算子网络尝试复现问题。如果能复现,基本可锁定是当前算子节点的问题。
节点信息排查
排查计算图中报错节点的信息,重点排查节点的shape推导,format、内存申请大小等信息,内存访问越界类的问题,要首先看下GE申请的内存size大小是否符合预期。
cce代码排查
先分析cce代码逻辑的正确性,重点检查offset、mask、burst_lenth等参数取值是否正确,有些报错例如除零、指令遇到inf/NAN等更可能是输入数据问题。
寄存器数据排查
寄存器数据可辅助做cce代码正确性排查,尤其是offset,mask等信息,可根据反汇编指令,获取指令中对应寄存器中的数据,来反推cce代码的正确性。寄存器数据可以从黑匣子日志中获取。
溢出问题
输入输出数据排查
出错节点的输入输出数据一般无法dump,可以先排查出错的上游节点是否存在溢出数据,如果附近节点无溢出数据,全量排查网络比较耗时,可以使用放开增加溢出判断的调测版本全网排查首次出现溢出的节点。
单算子网络比对
基于网络中的数据比对NPU/CPU的计算结果。
中间计算结果排查
读取UB、片上内存等对应位置上的过程数据。通过调测版本,一般可快速定位到发生溢出或引入inf/NAN数据的算子。
向上溯源
- 放开中断屏蔽,排查上游节点。
- 打开溢出检测,排查出现溢出的节点。