计算精度说明
随着昇腾AI处理器(以下简称为NPU)在深度学习中的广泛应用, 用户在使用NPU训练各种深度学习模型尤其是训练大语言模型时可能会遇到各种问题和困惑。NPU在AI处理器领域属于后来者,并且NPU与主流AI处理器在硬件、指令计算过程和浮点舍入截断模式方面存在差异。因此客户遇到问题和困惑时,往往会将原因归咎于这些天然差异,并且对这些差异存在很深的疑虑和担心。
本文中我们将介绍NPU与主流AI处理器之间的计算差异,并通过一些实验证明计算差异对训练结果没有显著影响,参见计算差异对训练结果的影响。大规模分布式训练所遇到的问题和困难也并非昇腾平台独有,精度调试过程案例中将介绍问题的来源、现象以及解决问题的思路和方法。
NPU与主流AI处理器之间的计算差异
NPU与主流AI处理器之间的计算差异主要为浮点舍入模式差异和计算过程差异。
- 浮点舍入模式的差异
在浮点舍入模式方面,主流AI处理器支持四种舍入模式,NPU在主流AI处理器的四种模式基础上,增加了A模式和O模式。舍入都会带来数值精度误差,相比主流AI处理器,NPU的舍入模式更丰富。
- A模式:最近舍入并在尾数为五时选择远离零舍入(正数选择更大数的方向,负数选择更小数的方向)。
- O模式:最近舍入并在尾数为五时向奇数舍入。
- 向最接近的可表示的值。
- 当有两个最接近的可表示的值时首选“偶数”值。
- 向负无穷大(向下)。
- 向正无穷大(向上)以及向零(截断)。
默认模式是最近舍入(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尖刺),或者双方都不稳定,这在大规模训练和训练对比实践中都非常常见。
计算差异对训练结果的影响
- Google TPU上的实验证明了计算精度和模型精度的复杂关系。
实验中,将82.3%~90.3%的芯片比特翻转故障注入实验,发现训练Loss不会有显著差异,其中还有65.5%~86.3%的loss甚至略微优于无故障基准。故障产生了噪声,相当于在模型结构中引入了正则层。所以计算或者通信的某些精度差异,并不一定会导致训练更不稳定。
- 华为内部也做了大量计算精度误差模拟实验。
- 实验1,在LLaMA2 -1B模型上,对一些算子或者torch模块(正向和反向)注入各种程度不一的无偏误差(误差均值为0),实验结果证明可控的计算误差对最终的loss收敛没有影响。
实验步骤和结果如下:
- 开启确定性计算,在NPU上两次训练loss误差很小,反向传播时权重梯度方向对比相似度也在99%,以此正常训练作为基准。
- 在基准实验设置基础上,对ParallelTransformerLayer的每层输出,每步都加入正负1%的无偏误差(实际的计算误差远小于1%),训练1000步的loss差异大约在1.5%,如果注入正负0.48%的无偏误差,训练1000步的误差小于1% ,如图2所示。
- 对比正常训练时和注入误差训练时,迭代1000步的最终模型参数,发现两者的余弦相似度几乎为1。注入误差训练的模型只是在优化路径上落后于正常训练的模型。
- 以上实验证明,即便人为注入一个很大的无偏误差,对训练结果的影响仍然在可接受范围内,并且对训练稳定性不会造成影响,即loss尖刺跟计算误差无关。对反向过程中的激活值梯度与权重梯度注入误差,也会有非常类似的结果。
- 实验2,在LLaMA2 (7B,32层transformer)模型上,对主流AI处理器和NPU进行对比实验,为保证计算差异实验中未开确定性计算。实验在一个能够保持训练稳定性的合理超参配置下,从同一个初始权重训练,能精确对齐loss,并且在检查点的模型参数对比结果显示,两者相似度很高。
实验设置和结论如下:
- 实验1,在LLaMA2 -1B模型上,对一些算子或者torch模块(正向和反向)注入各种程度不一的无偏误差(误差均值为0),实验结果证明可控的计算误差对最终的loss收敛没有影响。
用户使用案例
- NPU在用户使用的过程中, 其训练结果优于主流AI处理器的情况也很常见。用户的Qwen-1.8B模型在小学习率下进行训练,NPU的loss表现比主流AI处理器更好。更高的蓝线为主流AI处理器的loss,更低的红线为NPU的loss,如图4所示。
精度调试过程案例
- 案例一:主流AI处理器/NPU的loss对齐
用户使用高学习率1e-3训练LLaMA2-13B模型,在主流AI处理器和NPU上都发生训练不稳定问题,两者在loss尖刺处始终不能对齐。后来改为低学习率1e-4后,训练稳定性得到极大提升,并且两者的loss也能很好对齐。
- 案例二:DeepSpeedbug引起的偶发loss尖刺
DeepSpeed分布式优化器存在计算通信同步bug,通信bug导致脏数据进入,从而引起训练不稳定。这在主流AI处理器和NPU表现是等同的。
- 案例三:LLaMA2-1B, 7B, 13B的训练稳定性问题和下游评测不达标问题
一开始使用了错误的adam_beta2导致训练不稳定,修复后在13B语言模型上又遇到训练稳定性问题,调低学习率到1e-4并且关闭dropout后成功训练13B大语言模型,并且在各种下游评测任务上超出预期,取得业务成功。