数值精度选择是平衡计算效率、内存占用和模型精度的关键技术决策。BF16 统治训练,INT8 主导部署。
浮点精度对比
| 格式 | 结构 | 数值范围 | 适用场景 |
|---|---|---|---|
| FP32 | 1+8+23 | ±3.4e38 | 科学计算、主权重存储 |
| FP16 | 1+5+10 | ±65504 | 推理加速、混合精度训练 |
| BF16 | 1+8+7 | ±3.4e38 | 大模型训练标配 |
| FP8 | E4M3/E5M2 | 变体不同 | 边缘 AI、下一代硬件 |
FP32:传统黄金标准
结构:1位符号 + 8位指数 + 23位尾数
适用:科学计算、混合精度训练主权重存储、精度敏感任务
FP16:推理加速利器
优势:内存占用减半,计算速度提升
挑战:数值范围有限,易梯度下溢
解决方案:混合精度训练 + 动态损失缩放
from torch.cuda.amp import autocast, GradScaler
scaler = GradScaler()
with autocast():
outputs = model(inputs)
loss = criterion(outputs, labels)
scaler.scale(loss).backward()
scaler.step(optimizer)
scaler.update()BF16:大模型训练标配
设计:牺牲精度换范围,指数位与 FP32 对齐
优势:数值范围与 FP32 相当,避免梯度溢出/下溢
硬件支持:NVIDIA A100+、TPU v3+
# BF16 vs FP16 数值范围
fp16_range = (-65504, 65504) # 易溢出
bf16_range = (-3.39e38, 3.39e38) # 与 FP32 一致整数量化
INT8:部署主流
压缩率:模型大小减少 75%
量化方案:
| 方案 | 说明 |
|---|---|
| 动态量化 | 推理时实时计算缩放因子 |
| 静态量化 | 训练后校准,性能最优 |
| 量化感知训练 | 训练中模拟量化,精度损失最小 |
INT4:极致压缩
前沿技术:
- GPTQ:后训练量化,175B 模型量化为 3/4-bit
- AWQ:激活感知权重量化
- QLoRA:4-bit 微调,低成本大模型调优
精度选择决策
| 场景 | 推荐精度 |
|---|---|
| 大模型训练(>7B) | BF16 |
| 小模型训练 | FP32 或 FP16 混合精度 |
| 云服务器推理 | FP16 |
| 边缘设备部署 | INT8 |
| 资源极度受限 | INT4/GPTQ |
验证检查清单
checklist = {
'BF16': ['梯度范围监控', '损失函数稳定性', 'NaN 检测'],
'FP16': ['动态损失缩放', '梯度裁剪', '精度累加'],
'INT8': ['校准数据集', '精度损失评估', '硬件兼容性']
}未来趋势
- 精度自适应训练:动态选择不同层精度
- 混合精度推理:关键层高精度,其余低精度
- FP8 硬件:NVIDIA H100 原生支持
关键洞察:没有”最好”的精度,只有”最适合”的精度。