学做网站难吗郑州网站优化汉狮网络
学做网站难吗,郑州网站优化汉狮网络,雄安微网站开发,网站建设与推广 范文1、问题背景
torch_npu.fused_linear_online_max_sum接口在批量执行多个用例的过程中#xff0c;存在几条用例精度偶现不达标的现象#xff0c;且每次失败的用例位置可能不一致#xff0c;接口的多个输出中仅predicted_logits_local输出参数存在精度问题(有精度问题的输出值…1、问题背景torch_npu.fused_linear_online_max_sum接口在批量执行多个用例的过程中存在几条用例精度偶现不达标的现象且每次失败的用例位置可能不一致接口的多个输出中仅predicted_logits_local输出参数存在精度问题(有精度问题的输出值数值较大且与cpu对比精度相对误差几十~几千倍不等)需要这一概率性精度失败的原因。2、定位过程由于在批跑用例时是存在概率性精度问题导致这种现象最有可能的因素就是内存踩踏或者同步问题因此从这两个方面进行排查。2.1、注释掉其他输出的写入排除内存踩踏影响首先是被其他参数的内存踩踏问题算子本身存在多个输出tensor有可能predicted_logits_local输出tensor所占的空间被其他输出数据踩踏导致数值输出不正确。笔者通过将其他输出的写入即搬出到GM注释掉保证只有predicted_logits_local进行搬出同时依据指令排查对应的地址、拷贝元素判定指令无越界可能。但经过测试问题依然存在非内存踩踏导致。2.2、predicted_logits_local的计算逻辑进一步排查是否为同步问题笔者将predicted_logits_local所涉及到的所有操作包含搬入、搬出、计算过程简化了一下计算逻辑主要有下面红框中从上往下①~④四个部分其中绿框部分①InitOutputAndWorkspace、③CVProcess、④AllReduceProces过程都涉及到了拷贝结果到predicted_logits_local上的操作我们根据这一过程分步进行定位。2.2.1、初始化的尝试从①InitOutputAndWorkspace初始化部分尝试定位1仅保留predicted_logits_local初始化0的操作注释掉InitOutputAndWorkspace后续predicted_logits_local的搬出操作此时批跑predicted_logits_local结果都是0符合预期。2初始化时不初始化为0而是将predicted_logits_local初始化为shape大小的固定元素值使多个用例初始化成不同的固定值便于定位是否有异常同样注释掉InitOutputAndWorkspace后续predicted_logits_local的搬出操作批跑后结果都为固定元素值也符合预期。基于上述两点排除初始化的问题初始化值正确并且也和2.1相互印证确实没有被其他参数搬出过程踩踏。2.2.2、CV融合计算过程中的尝试1注释掉④AllReduceProces中的predicted_logits_local搬出操作即predicted_logits_local仅输出③CVProcess中的临时计算结果在输入数据相同情况下多次批跑后仍存在精度不一致的现象确认问题由③CVProcess这一部分引入。2观察③CVProcess中关于predicted_logits_local的计算依赖于②TargetProcess中的计算结果maskedTarget和③CVProcess中的Cube计算结果vocabParallelLogitsOutOptional1中已经判断出③CVProcess计算后predicted_logits_local搬出结果存在问题因此首先怀疑是③中predicted_logits_local计算过程中可能存在同步问题。笔者尝试在predicted_logits_local计算过程中的所有指令间都插入PipeBarrierPIPE_ALL()发现依然存在概率性精度不达标现象因此可以排除此处同步问题。3在2的基础上笔者注释掉predicted_logits_local计算逻辑直接将其依赖参数vocabParallelLogitsOutOptional、maskedTarget分别拷贝到predicted_logits_local中输出保持相同输入数据多次批跑发现将maskedTarget拷贝出predicted_logits_local的时候predicted_logits_local出现前后精度不一致的的现象这说明predicted_logits_local计算时获取到的maskedTarget数据问题。maskedTarget自身最终输出没有精度问题但在predicted_logits_local计算时获取到的maskedTarget数值不正确基于这一现象问题确认为是predicted_logits_local计算时maskedTarget数据未计算完成导致计算错误。由于maskedTarget数据是在②TargetProcess中vec核上计算得到而③CVProcess中predicted_logits_local数据计算涉及matmul过程而matmul使用到了cube核计算那么问题基本就缩小到了核间未同步导致。在vec核cube计算之间插入syncall(false)核间同步再次批跑概率性精度失败问题消失。3、问题根因predicted_logits_local依赖maskedTarget结算结果maskedTarget在vec核上还未完全计算完情况下便使用cube核进行了相关matmul计算导致predicted_logits_local计算过程中读取到了脏数据每次批跑用例出现概率性失败的现象发生。4、解决方案在TargetProcess和CVProcess中间插入全核同步保证maskedTarget计算完成后再进行predicted_logits_local相关计算。重新批跑执行用例此时结果都pass。5、经验总结1同步问题不仅存在单核内计算过程中当kernel计算过程中涉及到cube和vector的协同此次精度失败的点或者多个核之间数据依赖通常在初始化操作或者某个核计算的结果需要提供给其他核使用时也需要关注核与核之间的同步。2对于概率性失败问题可以罗列出问题参数涉及的运算过程从初始化到结果搬出过程逐步注释掉后续的一部分计算过程定位到异常产生的地方针对异常的发生的位置进行数据依赖、数据空间复用、数据指针越界等检查确保数据计算前置依赖已经完成空间之间不会相互踩踏指针不会越界影响到其他参数。