在上一篇中,我们过了一遍(非常非常基础+终极简化版本)的浮点数计算是怎么在硬件上实际进行的。结尾部分提到,随着 AI 的兴起,硬件的浮点数数据类型已经从科学计算中常用的 double(FP64)和最常规的数据类型 FP32 开始一路下探到了 FP4。本文尝试把这些数据类型的位级表示、单次运算误差、点积误差和端到端模型精度四个层次拆开,给出一个全景式的理解。
这里先抛出来几个我拍脑袋想到的问题来做一下探讨:
- TF32 是怎么来的,它是不是一种真正的 32 位存储格式?
- FP16 和 BF16 都是 16 位,谁更“准”?
- 我们用 TF32 来做矩阵乘法的时候会有一种工程上的 trick:单次 TF32 乘法的精度在敏感情况下会掉的比较厉害,可以通过三次 TF32 乘法来逼近一次 FP32 乘法。那如果把 TF32 换成更快的 BF16,能做出来类似的精度逼近方案吗?
- 在一块只有 FP16 Tensor Core、没有 BF16 Tensor Core的硬件上,怎样尽量准确而高效地模拟 BF16 模型?