news 2026/5/22 9:36:20

模型训练中数据类型BF16、FP32、FP16

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
模型训练中数据类型BF16、FP32、FP16

模型训练中的浮点数格式:FP32、FP16、BF16

1. 浮点数基础

IEEE 754 浮点数由三部分组成:

x=(−1)sign×2exponent−bias×(1+mantissa)x = (-1)^{sign} \times 2^{exponent - bias} \times (1 + mantissa)x=(1)sign×2exponentbias×(1+mantissa)

  • 符号位 (Sign):决定正负
  • 指数位 (Exponent):决定数值范围
  • 尾数位 (Mantissa/Fraction):决定数值精度

直觉理解:尺子比喻

可以把浮点数想象成一把刻度尺

指数位 = 尺子的长度(能量到多远、多近的地方) 尾数位 = 尺子的刻度密度(相邻两个可表示数之间有多细)
FP32: ||||||||||||||||||||||||||||||||||||||||||||||||| 很长的尺子,刻度极密 FP16: ||||||||||| 短尺子,刻度中等 BF16: |||| |||| |||| |||| |||| |||| |||| |||| |||| 和 FP32 一样长,但刻度稀疏
  • 指数位越多→ 尺子越长,能量到极大和极小的数(范围大,不容易溢出)
  • 尾数位越多→ 刻度越密,相邻两个数的间距越小(精度高,舍入误差小)
  • BF16 的设计哲学:宁可刻度粗一点,也要保证尺子够长——对深度学习来说,“量不到”(下溢为 0)比"量得粗"(精度低)危害大得多

2. 三种格式详解

2.1 FP32(单精度浮点数)

| 1 bit sign | 8 bits exponent | 23 bits mantissa | | S | EEEEEEEE | MMMMMMMMMMMMMMMMMMMMMMM |
  • 总位宽:32 bits(4 bytes)
  • 指数位:8 bits → 范围≈±3.4×1038\approx \pm 3.4 \times 10^{38}±3.4×1038
  • 尾数位:23 bits → 精度约7 位有效十进制数字
  • 深度学习中的默认格式,精度高但显存占用大

2.2 FP16(半精度浮点数)

| 1 bit sign | 5 bits exponent | 10 bits mantissa | | S | EEEEE | MMMMMMMMMM |
  • 总位宽:16 bits(2 bytes)
  • 指数位:5 bits → 范围≈±6.5×104\approx \pm 6.5 \times 10^{4}±6.5×104
  • 尾数位:10 bits → 精度约3 位有效十进制数字
  • 范围窄,容易出现上溢 (overflow)下溢 (underflow)

2.3 BF16(Brain Floating Point 16)

| 1 bit sign | 8 bits exponent | 7 bits mantissa | | S | EEEEEEEE | MMMMMMM |
  • 总位宽:16 bits(2 bytes)
  • 指数位:8 bits → 范围≈±3.4×1038\approx \pm 3.4 \times 10^{38}±3.4×1038(与 FP32 相同)
  • 尾数位:7 bits → 精度约2 位有效十进制数字
  • 由 Google Brain 提出,专为深度学习设计

3. 特性对比

特性FP32FP16BF16
总位宽32 bits16 bits16 bits
符号位111
指数位858
尾数位23107
数值范围±3.4×1038\pm 3.4 \times 10^{38}±3.4×1038±6.5×104\pm 6.5 \times 10^{4}±6.5×104±3.4×1038\pm 3.4 \times 10^{38}±3.4×1038
精度~7 位十进制~3 位十进制~2 位十进制
显存占用1× (基准)0.5×0.5×
计算速度1× (基准)~2×~2×
溢出风险
精度损失中等较大
硬件支持所有 GPU大部分 GPUA100+, TPU, AMD MI300X GPU( 最近我train model 在使用的)

4. BF16 vs FP16 下溢特性对比

4.1 什么是下溢 (Underflow)

当一个数的绝对值小于格式能表示的最小正数时,就会发生下溢——该值被截断为 0,信息彻底丢失。

∣x∣<ϵmin⇒x→0|x| < \epsilon_{min} \Rightarrow x \to 0x<ϵminx0

4.2 最小可表示正数

属性FP16BF16
指数位5 bits8 bits
指数偏移 (bias)15127
最小正规数 (normal)2−14≈6.1×10−52^{-14} \approx 6.1 \times 10^{-5}2146.1×1052−126≈1.18×10−382^{-126} \approx 1.18 \times 10^{-38}21261.18×1038
最小非正规数 (subnormal)2−24≈5.96×10−82^{-24} \approx 5.96 \times 10^{-8}2245.96×1082−133≈9.18×10−412^{-133} \approx 9.18 \times 10^{-41}21339.18×1041

BF16 的最小可表示数比 FP16 小了约33 个数量级,下溢空间远大于 FP16。

4.3 训练中的下溢场景

场景典型数值量级FP16BF16
小梯度值10−5∼10−810^{-5} \sim 10^{-8}105108容易下溢为 0安全
学习率 × 梯度10−4×10−5=10−910^{-4} \times 10^{-5} = 10^{-9}104×105=109下溢安全
权重衰减项λ⋅w≈10−7\lambda \cdot w \approx 10^{-7}λw107边缘危险安全
Softmax 中间值e−xe^{-x}ex可达10−2010^{-20}1020下溢安全
BatchNorm 方差可能极小有风险安全

4.4 实际影响

FP16 下溢链: 小梯度 → 下溢为 0 → 权重停止更新 → 训练停滞或 loss 发散 ↳ 必须用 Loss Scaling 放大梯度来缓解 BF16 下溢链: 小梯度 → 仍在可表示范围内 → 正常更新(但精度较低) ↳ 不需要 Loss Scaling

4.5 总结对比

对比维度FP16BF16
下溢阈值≈10−8\approx 10^{-8}108≈10−41\approx 10^{-41}1041
下溢风险(训练中频繁触发)极低(与 FP32 一致)
是否需要 Loss Scaling必须,否则训练不稳定不需要
精度表现不下溢时精度更高 (10 bit 尾数)精度略低 (7 bit 尾数),但不会丢失为 0
核心取舍高精度,窄范围 → 易丢失小值低精度,宽范围 → 小值保留但精度粗

关键结论:FP16 的下溢问题是混合精度训练复杂性的根源(需要 GradScaler + Loss Scaling)。BF16 通过保留 FP32 的 8 位指数,从根本上消除了下溢问题,以牺牲少量精度换取训练的稳定性和简洁性。


5. 训练中的实际应用

4.1 纯 FP32 训练

  • 最安全,精度最高
  • 显存占用大,速度慢
  • 适合小模型或对精度要求极高的场景

4.2 混合精度训练 (Mixed Precision, FP16)

  • 前向 & 反向传播:用 FP16 加速计算
  • 权重主副本 (Master Weights):用 FP32 保存,防止梯度更新丢失
  • Loss Scaling:将 loss 放大后再反向传播,防止小梯度下溢为 0, 所以deepspeed 中有loss scale的参数
  • 框架支持:PyTorchtorch.cuda.amp、TFtf.keras.mixed_precision
# PyTorch 混合精度示例scaler=torch.cuda.amp.GradScaler()withtorch.cuda.amp.autocast():# 自动选择 FP16/FP32output=model(input)loss=criterion(output,target)scaler.scale(loss).backward()# loss scalingscaler.step(optimizer)scaler.update()

4.3 BF16 训练

  • 范围与 FP32 相同,无需 loss scaling
  • 使用更简单,直接替换即可
  • 大模型训练的主流选择(GPT-3、LLaMA 等均使用 BF16)
# PyTorch BF16 示例withtorch.cuda.amp.autocast(dtype=torch.bfloat16):output=model(input)loss=criterion(output,target)loss.backward()# 不需要 GradScaleroptimizer.step()

6. 如何选择

场景推荐格式
硬件不支持半精度FP32
旧 GPU (V100 等)FP16 混合精度
新 GPU (A100/H100)BF16(首选)
大语言模型训练BF16
推理部署FP16 或 INT8/INT4 量化

一句话总结

BF16 = FP32 的范围 + FP16 的速度,是当前大模型训练的最佳平衡点。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/22 9:35:40

ChocolateyGUI 开发者指南:理解项目架构与代码实现原理

ChocolateyGUI 开发者指南&#xff1a;理解项目架构与代码实现原理 【免费下载链接】ChocolateyGUI A delicious GUI for Chocolatey 项目地址: https://gitcode.com/gh_mirrors/ch/ChocolateyGUI ChocolateyGUI 是一款为 Chocolatey 包管理器打造的可视化界面工具&…

作者头像 李华
网站建设 2026/5/22 9:34:11

3个简单步骤掌握M3U8视频下载:N_m3u8DL-CLI-SimpleG终极实战指南

3个简单步骤掌握M3U8视频下载&#xff1a;N_m3u8DL-CLI-SimpleG终极实战指南 【免费下载链接】N_m3u8DL-CLI-SimpleG N_m3u8DL-CLIs simple GUI 项目地址: https://gitcode.com/gh_mirrors/nm3/N_m3u8DL-CLI-SimpleG N_m3u8DL-CLI-SimpleG是一款基于N_m3u8DL-CLI命令行工…

作者头像 李华
网站建设 2026/5/22 9:33:27

3个步骤轻松制作启动U盘:Rufus高效解决方案全解析

3个步骤轻松制作启动U盘&#xff1a;Rufus高效解决方案全解析 【免费下载链接】rufus The Reliable USB Formatting Utility 项目地址: https://gitcode.com/GitHub_Trending/ru/rufus 你是否曾为系统安装而烦恼&#xff1f;找不到合适的工具&#xff0c;担心操作复杂&a…

作者头像 李华
网站建设 2026/5/22 9:31:14

Noto Emoji字体:跨平台表情符号显示问题的专业解决方案

Noto Emoji字体&#xff1a;跨平台表情符号显示问题的专业解决方案 【免费下载链接】noto-emoji Noto Emoji fonts 项目地址: https://gitcode.com/gh_mirrors/no/noto-emoji 在当今全球化数字通信时代&#xff0c;表情符号已成为不可或缺的交流元素。然而&#xff0c;开…

作者头像 李华
网站建设 2026/5/22 9:28:51

Kubicorn 入门教程:5分钟在 DigitalOcean 上部署 Kubernetes 集群

Kubicorn 入门教程&#xff1a;5分钟在 DigitalOcean 上部署 Kubernetes 集群 【免费下载链接】kubicorn Simple, cloud native infrastructure for Kubernetes. 项目地址: https://gitcode.com/gh_mirrors/ku/kubicorn Kubicorn 是一个简单、云原生的 Kubernetes 基础…

作者头像 李华