大模型训练常用数据格式

在CPU计算场景中,我们经常使用双精度浮点类型double,也称为FP64或者float64。但是在机器学习和AI加速器计算场景下,由于参数规模巨大,我们很难也没有必要使用双精度数来存储和计算。

单精度浮点数

FP32或者float32是一种IEEE 754标准定义的浮点格式,它使用32个比特位表示一个浮点数,这些比特位包括一比特正负符号位,8个比特的指数位和23个比特的小数位。比特位结构布局如下:

当指数位不为0时,这32比特表示的浮点数V称为规格数,它由下列公式定义:

当exponent为0时,它表达的浮点数称为非规格数,由下列公式定义:

NPU或主流AI处理器在fast模式下都只能对规格数进行运算,非规格数将被转换为零,并且除法和平方根运算不会被计算到最接近真实值的浮点数值。

当exponent比特位全1时,表达的浮点数有特殊含义。如果此时fraction为0,则V为正负无穷大,如果fraction不为0,则V为NaN。

FP32格式能表示的绝对值最小规范浮点数为2-126,约等于1.18e-38。绝对值最大规范浮点数为2127 * [1 +(223 - 1)/223],约等于3.4e38。在1附近,两个相邻浮点数差距为2-23,约为1.2e-7。所有位置上相邻浮点数的相对差距大约为1.2e-7。可见FP32的浮点精度很高。

半精度浮点数

由于大模型参数规模巨大,对AI加速器设备内存要求很大,所以使用16位半精度格式比32位单精度更有优势。另外半精度运算速度更快,精度对机器学习模型往往也能够满足要求。和主流AI处理器一样,最新的昇腾AI加速器也支持两种半精度浮点格式即FP16和BF16。

综上所述,选择合适的浮点数精度对于优化模型训练过程至关重要,尤其是在处理因浮点精度引起的收敛问题时,需要结合文献研究成果和实践经验,并通过大量的对比实验进行调试和优化。