简单记一次NaN loss的调试

LLM,神奇,太神奇了。

事情是这样的。

做LLM微调,同样一份代码,我重构了一下,loss就变NaN了。。。

第一次Loss NaN

选择的模型是Openbuddy-llama2-13b,使用shared-gpt数据进行微调。

现象是这样的,模型在第一个step的时候train loss是正常的,在第二个step开始就变为NaN了。

先进行了一些检查,排除了常见的一些原因:

  • 输入包含NaN

  • 权重包含NaN

  • 学习率过大

反复思考了一下,模型本身前向的过程应该是没问题的,从loss到回传梯度,到优化器优化中必有一处出现了NaN。默认的eps是1e-8。

最后,确定了Adam优化器中eps参数过小(1e-9)导致了NaN loss。

第二次Loss NaN

这一次直接第一个step就发生了loss为NaN的情况。这次定位原因更简单一些。

这一次是因为tokenizer padding side是在左侧,且pad token为eos,导致第一个token就是eos,后面的全部token都被mask掉了。