总体思路
精度问题排查需要找出具体引起问题的原因,主要根据以下方面进行精度问题排查:
- 模型网络计算错误。
- 定位思路:在网络中加入hook进行排查判断是哪个地方有较大嫌疑,然后构建单算子样例构建逐渐缩小错误范围,证明该算子在当前网络场景下计算有误,可以对比CPU或GPU结果证明。
- 规避方案:使用同等语义其他算子替代。
- 解决方案:改进算子精度或功能问题。
- Loss计算错误。
- 定位思路:由于Loss的特殊性和可以自定义,在判断Loss计算错误后,建议dump网络中Loss的输入来测试,而不是使用相同shape的随机tensor测试,这样才能更好地复现证明。
- 规避方案:使用同等语义其他算子替代。
- 解决方案:改进算子精度或功能问题(Loss也是由算子构成)。
- 参数更新错误。
- 多卡计算错误。
- 定位思路:在保证单卡精度OK的前提下,稳定复现多卡训练时梯度不收敛的问题。
- 解决方案:建议联系华为方支撑人员,提供稳定复现的单P和多P脚本。
- 其他要点。
- 若不收敛或精度相差较大,着重在于算子精度问题,使用精度比对工具查看详细信息。
- 若精度无法对齐,仅差少量几个点,可以调小Loss Scale。
- 若精度波动较大且收敛慢,可以少量调小学习率。
- 若训练精度正常,推理精度为0或较低,则优先排查在推理时是否正确执行了model.eval(),DDP中broadcast_buffers是否已被置为False。
- 若Loss较大或部分Loss异常,可以在Loss函数中打点打印,确认异常的具体位置。
父主题: 精度调测