张芷铭的个人博客

数值精度选择是平衡计算效率、内存占用和模型精度的关键技术决策。BF16 统治训练,INT8 主导部署。

浮点精度对比

格式结构数值范围适用场景
FP321+8+23±3.4e38科学计算、主权重存储
FP161+5+10±65504推理加速、混合精度训练
BF161+8+7±3.4e38大模型训练标配
FP8E4M3/E5M2变体不同边缘 AI、下一代硬件

FP32:传统黄金标准

结构:1位符号 + 8位指数 + 23位尾数

适用:科学计算、混合精度训练主权重存储、精度敏感任务

FP16:推理加速利器

优势:内存占用减半,计算速度提升

挑战:数值范围有限,易梯度下溢

解决方案:混合精度训练 + 动态损失缩放

1
2
3
4
5
6
7
8
9
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+

1
2
3
# 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

验证检查清单

1
2
3
4
5
checklist = {
    'BF16': ['梯度范围监控', '损失函数稳定性', 'NaN 检测'],
    'FP16': ['动态损失缩放', '梯度裁剪', '精度累加'],
    'INT8': ['校准数据集', '精度损失评估', '硬件兼容性']
}

未来趋势

  • 精度自适应训练:动态选择不同层精度
  • 混合精度推理:关键层高精度,其余低精度
  • FP8 硬件:NVIDIA H100 原生支持

关键洞察:没有"最好"的精度,只有"最适合"的精度。

Comments