随着昇腾AI处理器(以下简称为NPU)在深度学习中的广泛应用, 用户在使用NPU训练各种深度学习模型尤其是训练大语言模型时可能会遇到各种问题和困惑。NPU在AI处理器领域属于后来者,并且NPU与主流AI处理器在硬件、指令计算过程和浮点舍入截断模式方面存在差异。因此客户遇到问题和困惑时,往往会将原因归咎于这些天然差异,并且对这些差异存在很深的疑虑和担心。
本文中我们将介绍NPU与主流AI处理器之间的计算差异,并通过一些实验证明计算差异对训练结果没有显著影响,参见计算差异对训练结果的影响。大规模分布式训练所遇到的问题和困难也并非昇腾平台独有,精度调试过程案例中将介绍问题的来源、现象以及解决问题的思路和方法。
NPU与主流AI处理器之间的计算差异主要为浮点舍入模式差异和计算过程差异。
默认模式是最近舍入(Round to Nearest),它与四舍五入只有一点不同,对.5的舍入上,采用取偶数的方式。最近舍入模式:Round(0.5) = 0;Round(1.5) = 2;Round(2.5) = 2。四舍五入模式:Round(0.5) = 1;Round(1.5) = 2;Round(2.5) = 3。
计算过程的差异包括计算使用的浮点精度、累加运算的顺序等。计算过程中的细微差异都能引起最终输出结果的不同,从而产生跟标杆比对程度不一的误差。
小的计算差异在某些超参配置下(例如大学习率、 大adam_beta1、大adam_beta2)以及某些场景下(例如浅层参数中极小数值的梯度)会被放大,从而在训练稳定性的表现上出现很大差异。例如主流AI处理器或NPU其中一方不稳定(很多loss尖刺),或者双方都不稳定,这在大规模训练和训练对比实践中都非常常见。
实验中,将82.3%~90.3%的比特翻转故障注入实验,发现训练loss不会有显著差异,其中还有65.5%~86.3%的loss甚至略微优于无故障基准。故障产生了噪声,相当于在模型结构中引入了正则层。所以计算或者通信的某些精度差异,并不一定会导致训练更不稳定。
实验步骤和结果如下:
实验设置和结论如下:
用户使用高学习率1e-3训练LLaMA2-13B模型,在主流AI处理器和NPU上都发生训练不稳定问题,两者在loss尖刺处始终不能对齐。后来改为低学习率1e-4后,训练稳定性得到极大提升,并且两者的loss也能很好对齐。
DeepSpeed分布式优化器中存在计算通信同步bug,会导致脏数据进入,从而引起训练不稳定。这在主流AI处理器和NPU表现是等同的。
一开始使用了错误的adam_beta2导致训练不稳定,修复后在13B语言模型上又遇到训练稳定性问题,调低学习率到1e-4并且关闭dropout后成功训练13B大语言模型,并且在各种下游评测任务上超出预期,实现了业务目标。