什么是 BF16(bfloat16 脑浮点数)?
想象你是一家大超市的会计:算买菜钱不用精确到 0.0001 分(精度舍弃),但账本最大金额必须能记下几百亿(范围绝不能爆表)!BF16 专为大模型训练量身定制,把数值溢出率瞬间降为零。
精度够细,但极易“爆表”或“归零”
给尾数留了 10 位(很精确),但指数位只有 5 位(最大只能表达到 65504)。在万亿大模型训练中,梯度稍一大就瞬间溢出变成 NaN(炸模)!
- ❌ 动态范围极其狭窄:$10^{-5} \sim 65504$,极易发生下溢与上溢
- ❌ 必须搭配复杂缩放:需要 Loss Scaling(损失缩放)动态调参防止溢出
- ❌ 大模型训练痛点:千亿模型反向传播极易不稳定
牺牲毛毛雨精度,换取海阔天空
Google Brain 提出的天才构想:直接保留与 FP32 一模一样的 8 位指数(最大达到 $10^{38}$),只缩减尾数。大模型训练完全不惧爆表!
- ✨ 动态范围与 FP32 相同:$10^{-38} \sim 10^{38}$,彻底根治数值上溢
- ✨ 无需调参开箱即用:不需要 Loss Scaling,训练流程大幅简化
- ✨ 截断转换零成本:FP32 转 BF16 只要“抹掉后 16 位”,硬件极轻量
拆解 BF16 与常见浮点数的 4 大底牌
从 16 位比特分配到现代硬件支持,搞懂混合精度训练的底层密码
1. 符号位 (Sign: 1 bit)
决定数字的正负号(0 代表正数,1 代表负数),所有浮点格式均保留 1 位。
2. 指数位 (Exponent: 8 bits)
决定数值的宏观量级(动态范围)。BF16 与 FP32 同样拥有 8 位指数,确保大模型梯度绝不爆表。
3. 尾数位 (Mantissa: 7 bits)
决定数值的微观精度。BF16 仅保留 7 位,将显存占用减半,同时将矩阵乘法吞吐翻倍!
4. 现代硬件黄金标配
从 Google TPU v2/v3/v4、Nvidia Ampere (A100/H100) 到华为昇腾 910B,BF16 已成为全球大模型预训练的行业标准。
🕹️ 浮点格式比特位显微镜 (Bit Layout Inspector)
点击选择不同格式,直观观察 32 位与 16 位浮点数的比特结构差异:
TPU 的秘密武器
Google Brain 团队在研发 TPU v2/v3 芯片时,敏锐察觉到标准 FP16 的 5 位指数在深度学习反向传播中过于脆弱。
于是他们打破 IEEE 传统,创造了 bfloat16,一举奠定了现代超大模型稳定训练的基石。
训练吞吐的大飞跃
相比 FP32,BF16 将模型参数、激活值与优化器缓存所占显存直接减少 50%。
这意味着显卡可以装下 2 倍大的 Batch Size,同时极大缓解 GPU 与 HBM 之间的数据搬运带宽瓶颈。
混合精度训练 (Mixed Precision)
在实际训练中,前向传播与反向求导使用 BF16 飞速计算;
而在更新模型权重的主副本(Master Weights)时,依然保留一份 FP32 累加微小更新,实现“速度与精度”的完美统一。