核心洞察:大多数神经网络计算不需要32位精度。权重、激活值和梯度可以用16位表示而不会产生有意义的质量损失。但某些操作(损失计算、权重更新)需要更高的精度以避免数值不稳定。混合精度在FP32中保留一份主权重副本用于更新,同时使用FP16/BF16进行前向和反向传播。
FP16(IEEE半精度)有5个指数位和10个尾数位。BF16(Brain Float 16)有8个指数位和7个尾数位。BF16更宽的指数范围意味着它可以表示与FP32相同的值范围(避免溢出/下溢),而FP16较窄的范围需要损失缩放来防止梯度下溢为零。对于训练,BF16更简单且更稳定。对于推理,FP16有时在相同内存成本下提供略好的精度。
最新的GPU(NVIDIA H100、H200)支持FP8(8位浮点)以实现更快的计算。FP8将内存减半并将吞吐量比FP16翻倍,但需要谨慎处理以避免质量下降。当前实践:在BF16下训练,在FP16或FP8下服务,并量化到INT4/INT8用于边缘部署。每降低一级精度都是以微小的质量代价换取显著的速度和内存收益。