大模型中的精度划分
1. 传统双精度与单精度(FP64 & FP32)
- 结构:
- FP32(单精度):1位符号位 + 8位指数位 + 23位尾数位(共32位)
- FP64(双精度):1位符号位 + 11位指数位 + 52位尾数位(共64位)
- 特点:数值范围广,精度极高。
- 用途:大模型预训练中的反向传播梯度累积、优化器状态(如Adam)通常必须使用FP32/FP32主权重,以保证数值稳定性,防止梯度下溢。
2. 半精度与脑浮点(FP16 & BF16)
- 结构:
- FP16:1+5+10(共16位)。指数位少,尾数位中等。
- BF16(Brain Float 16):1+8+7(共16位)。指数位与FP32相同,尾数位缩减。
- 特点对比:
- FP16:精度高但范围窄,容易溢出(上溢/下溢),训练时需要配合动态损失缩放(Loss Scaling)。
- BF16:范围广但精度稍低,能直接覆盖FP32的数值范围,不易溢出,且硬件(如英伟达Ampere架构及后续、Intel CPU)支持良好。
- 用途:大模型的训练前向传播和激活值、微调(LoRA等)和推理加速。BF16现已成为大模型训练的主流选择。
3. 新兴的8位浮点数(FP8)
你图片中列出了三种变体,这是目前最前沿的推理和轻量级训练技术:
- E4M3(4位指数,3位尾数):
- 精度更高(尾数多1位),动态范围较小。
- 常用于:权重和激活值的前向传播(需要精细数值)。
- E5M2(5位指数,2位尾数):
- 动态范围更大(能表示更大的数),但精度较低(尾数少1位),存在特殊值(Inf/NaN)。
- 常用于:梯度的反向传播(需要防止梯度爆炸)。
- UE8M0(无符号8位,无指数/尾数):
- 实际上就是整数格式(范围0-255)。
- 常用于:大模型中的KV Cache(键值缓存)量化,用于在长上下文场景下极大幅度节省显存。
终极总结(核心结论)
| 精度格式 | 适用场景 | 核心地位 |
|---|---|---|
| FP32 | 主权重、优化器状态(Adam)、损失缩放 | 训练的“定海神针”,保证精度 |
| FP16 | 早期训练前向、推理 | 因易溢出,正被BF16取代 |
| BF16 | 现阶段大模型训练(前向+反向)、微调 | 当前主流黄金标准(平衡了范围和硬件效率) |
| FP8 | 最新架构(如H100)的加速训练、极速推理 | 下一代趋势,大幅降低显存和带宽 |
| UE8M0 | KV Cache量化、输入值存储 | 专门为超长上下文(百万token) 优化,节省显存 |