Bert训练(非报错节点问题,向上溯源)

  1. 定位异常算子与指令。

    排查到报错算子为sum算子,分析算子反编译文件与CCE文件后,未发现逻辑问题,排除算子自身问题;考虑到sum算子涉及atomic add操作,怀疑数据中包含nan导致atomic溢出。

  2. 使用放开屏蔽版本重新跑网络,发现报除零AIC_ERROR:0X10000000000000,错误算子为truediv,由此推测是除零引入的NAN。
  3. 排查除零发生的原因。

    读取UB数据,trudiv的第二个输入中确实存在部分为0的数据,从原始模型的算法看,无法保证不除零,但通过great+select可以保证不使用除零的结果,也就是即便发生除零,inf/NAN不会往下传递。进一步排查inf/NAN被错误向下传递的原因。

  4. 怀疑是great+select算子实现问题,导致数据中存在NAN时未被过滤掉,排查算子实现,发现select算子通过vmin vmul一系列组合指令间接实现的select功能,当输入数据中存在NAN时,不管condition是true还是false,都会输出NAN,没有得到算法原始想要的结果。
  5. 根本原因。

    select算子实现问题,导致网络中针对除零做的保护失效,将除零结果NAN向下传递,最终导致atomic累加溢出。