01 · dtype 是什么
dtype 是每个元素采用的数据类型。例如 FP32 通常每元素 4 字节,FP16 / BF16 每元素 2 字节。同样元素个数下,较少字节能节省存储与部分搬运,但不保证所有操作更快。
浮点数用符号、指数和有效数值位表示范围很大的实数。指数位影响动态范围,有效数值位影响可区分的精细程度。
02 · 两种 16 bit 浮点格式
| 格式 | 指数 / 显式尾数位 | 直观取舍 |
|---|---|---|
| FP16 | 5 / 10 | 相对更多尾数位,动态范围较窄。 |
| BF16 | 8 / 7 | 动态范围接近 FP32,同数量级附近精度更粗。 |
两者位数相同,不代表数值行为相同。小梯度可能下溢,大数值可能溢出,训练需要观察梯度和收敛。
依据:PyTorch · torch.amp(main) ↗ · Mixed Precision Training · 原始论文 ↗
03 · 乘法输入与累加器可以不同
矩阵乘法的一个输出要加很多乘积。输入可能采用低精度,而内部累加采用更高精度。参数更新的状态、归一化或 Loss 也可能使用不同格式。只看到输入 Tensor 的 dtype,无法确定整条执行链的精度。
04 · Loss Scaling 与 FP8 配方
Loss Scaling 在反向前放大 Loss,扩大梯度量级,更新前再把梯度除回。它主要帮助控制低精度梯度下溢。FP8 还需要选择格式、缩放与适配内核;较低位数并不自动保持相同质量。
依据:PyTorch · torch.amp(main) ↗ · Transformer Engine 2.8 · FP8 / FP4 配方 ↗