题目重点:FP32、FP16与BF16的范围/有效位,区分溢出、量化与累加误差,给受控精度实验路径。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 比较IEEE FP32/FP16与常见BF16浮点表示,舍入采用nearest-even;不假设芯片所有算子都用同一低精度累加。
- 训练例固定模型/数据/seed与batch,先以FP32作参考;FP32也非精确数学真值,关键局部可再用FP64/解析参考。
- 题目未明确FP8格式/芯片型号/精度容忍阈值,保留待核,不能指定一个万能容差。
解题路线
- 先分范围与精度:FP32 sign/exponent/fraction为1/8/23,FP16为1/5/10,BF16为1/8/7。BF16有较大指数范围但较少有效位,FP16近1时粒度更细但更易大值overflow;同为16bit不等于同误差。
- 观察首个异常位置:forward层输出min/max/nan/inf、相对误差分位数、梯度norm、更新与权重比、loss曲线。仅最终accuracy不能定位哪层发生精度丧失;比较应核同输入、同mask、相同数据顺序与有效token。
- 控制单一变化,先只降权重读取精度,再降激活/矩阵乘,最后改变累加/归一化/softmax等路径;逐层恢复FP32,看异常在哪次消失。注意dropout随机与不同kernel非确定性是混杂变量,短程可关随机/固定mask,长期验收再恢复真实训练设置。
- FP16小梯度underflow可用loss scaling,优化器step前unscale后再clip;overflow时按scaler合同跳过更新并调尺度。scaling不能修复forward阶段已经出现inf,也不能恢复权重舍入丢失的小差异。BF16通常无需相同动态缩放,仍需核实现合同。
- 低精度乘法配较高精度累加是一种方案,master weights/optimizer states也可保持FP32。量化误差可能在加法中吞小增量,在消减近等大数时放大相对误差;不把这些问题全部叫gradient vanishing。
- 验收先查局部可容忍误差,再比较多个seed的完整训练质量/资源/吞吐。加精度改变通信字节与kernel选择,耗时测量须同步、warmup并把编译单列。官方AMP参考:https://docs.pytorch.org/docs/stable/accelerator/amp.html;原项目Ablation结果并未公开。
手动走一遍
near 1,FP16相邻正常数间隔2^−10≈0.0009766,BF16间隔2^−7=0.0078125;nearest-even下1.001在FP16约为1.0009765625,BF16为1.0。70000超FP16最大有限65504,却仍在BF16/FP32范围。若forward已inf,单纯乘loss scale不能让它变有限。均为表示格式训练算例,不是Neuron实测。
规模与取舍
低精度权重占用每参数2bytes而FP32为4bytes,但总显存还含主权重/梯度/优化器/激活。Ablation K个配置训练S步至少约K·S步成本;局部误差hook会增加IO/同步,不应把带hook耗时当最终吞吐。
易错点与追问
容易失分的边界
- 较宽范围等同较高精度。
- 只检查最终loss。
- 改变多个训练变量。
- scale修复所有精度错误。
- 把权重2bytes说成总训练内存减半。
继续深挖
- softmax为何要减最大值且选择累加精度?
- loss scale何时unscale与clip?
- 第一处误差不大却后层被放大怎样查?
- FP32参考也不稳定时怎样构造局部真值?
技术参考
- PyTorch AMP 官方文档:公开方法/语言合同参考,本文示例参数自拟,不代表题目数据或实际项目实现。
