bev-project/archive/docs_old/FP16混合精度训练说明_20251101.md

8.1 KiB
Raw Blame History

FP16混合精度训练配置说明

创建时间: 2025-11-01 22:15 UTC
用途: 使用FP16混合精度加速Phase 4A Stage 1训练


🎯 为什么使用FP16

核心优势

  1. 显存节省: 30-50%

    FP32: 29GB/GPU
    FP16: 18-20GB/GPU (节省9-11GB)
    
  2. 训练加速: 30-50%

    FP32: 2.65秒/iteration
    FP16: 1.8-2.0秒/iteration (加速约35%)
    
    总时间:
    FP32: 9天完成10 epochs
    FP16: 6-7天完成10 epochs ⭐
    
  3. Tensor Core加速

    V100S GPU支持: CUDA Capability 7.0
    ✓ 支持高效Tensor Cores
    ✓ FP16矩阵运算可达到FP32的2-3倍速度
    

⚙️ FP16配置详解

配置文件

# configs/.../multitask_BEV2X_phase4a_stage1_fp16.yaml

_base_: ./multitask_BEV2X_phase4a_stage1.yaml

work_dir: /data/runs/phase4a_stage1_fp16

# 核心配置启用FP16
fp16:
  loss_scale: dynamic  # 动态调整loss scaling

FP16工作原理

混合精度训练

  • 前向传播: FP16快速
  • 权重更新: FP32精确
  • 梯度计算: FP16快速
  • 权重存储: FP32防止精度丢失

动态Loss Scaling

  • 自动调整scale因子
  • 防止梯度下溢underflow
  • 保持数值稳定性

🚀 启动FP16训练

方法1: 使用脚本(推荐)

cd /workspace/bevfusion

# 1. 先清理僵尸进程(如果有)
pkill -9 -f "train.py"

# 2. 等待GPU释放
sleep 5

# 3. 启动FP16训练
bash RESTART_PHASE4A_STAGE1_FP16.sh

方法2: 手动命令

cd /workspace/bevfusion

export PATH=/opt/conda/bin:$PATH
export LD_LIBRARY_PATH=/opt/conda/lib/python3.8/site-packages/torch/lib:/opt/conda/lib:/usr/local/cuda/lib64:$LD_LIBRARY_PATH
export PYTHONPATH=/workspace/bevfusion:$PYTHONPATH

torchpack dist-run -np 8 python tools/train.py \
  configs/nuscenes/det/transfusion/secfpn/camera+lidar/swint_v0p075/multitask_BEV2X_phase4a_stage1_fp16.yaml \
  --model.encoders.camera.backbone.init_cfg.checkpoint /data/pretrained/swint-nuimages-pretrained.pth \
  --load_from /data/runs/phase4a_stage1/epoch_1.pth \
  --data.samples_per_gpu 1 \
  --data.workers_per_gpu 0 \
  --cfg-options work_dir=/data/runs/phase4a_stage1_fp16 \
  2>&1 | tee phase4a_stage1_fp16_$(date +%Y%m%d_%H%M%S).log

📊 预期性能对比

训练速度

指标 FP32 FP16 改进
速度/iter 2.65s ~1.9s +35%
Epoch 1时间 ~11小时 ~7.5小时 -32%
10 epochs ~9天 ~6.5天 -28%

显存占用

指标 FP32 FP16 节省
显存/GPU 29GB ~19GB 10GB
利用率 91% ~60% 更安全
可用显存 3GB 13GB 可选增加batch

数值精度

类型 FP32 FP16 说明
Loss精度 1e-7 1e-4 混合精度保持稳定
收敛性 标准 相同 动态scaling保证
最终性能 基准 持平或略优 通常无损

⚠️ 注意事项

可能遇到的问题

  1. Loss出现NaN

    原因: 梯度溢出或下溢
    解决: 
    - 检查loss_scale是否合适
    - 降低学习率
    - 增加warmup步数
    
  2. Loss震荡

    原因: FP16精度有限
    解决:
    - 使用dynamic loss_scale (已启用)
    - 适当降低学习率到1.5e-5
    
  3. 性能轻微下降

    原因: 数值精度略有影响
    预期: 最终mIoU可能差0.1-0.3%
    可接受: 换取30%速度提升 ✅
    

监控要点

启动后立即检查5分钟内

# 1. 查看最新日志
tail -50 $(ls -t phase4a_stage1_fp16*.log | head -1)

# 2. 确认FP16启用
grep -i "fp16\|amp\|loss_scale" $(ls -t phase4a_stage1_fp16*.log | head -1)

# 3. 检查显存占用
nvidia-smi
# 预期: 18-20GB/GPU (如果仍是29GB说明FP16未生效)

短期监控1小时后

# 检查Loss稳定性
tail -100 $(ls -t phase4a_stage1_fp16*.log | head -1) | grep "loss:" | tail -20

# 预期:
# ✓ Loss在2.5-2.8范围
# ✓ 无NaN或Inf
# ✓ 梯度范数10-20正常
# ✓ 速度约1.8-2.0s/iter

🔧 高级优化选项(可选)

选项1: 增加Batch Size

如果FP16显存节省明显降到20GB以下

# 修改配置文件
data:
  samples_per_gpu: 2  # 从1增加到2
  workers_per_gpu: 0  # 保持0

optimizer:
  lr: 4.0e-5  # 相应增加学习率 (2倍batch → 2倍lr)

预期效果

  • 速度: 进一步提升20-30%
  • 总时间: 6.5天 → 5天
  • 风险: 可能需要调整学习率

选项2: 固定Loss Scale如果dynamic不稳定

fp16:
  loss_scale: 512.0  # 或128.0, 1024.0
  # 移除dynamic

选项3: 启用Gradient Checkpointing如果还需要更多显存

# 在模型配置中添加
model:
  encoders:
    camera:
      backbone:
        with_cp: true  # 启用checkpoint

效果: 节省额外30-40%显存但速度降低10-15%


📈 FP16 vs FP32对比表

完整对比

维度 FP32训练 FP16训练 评价
性能
训练速度 2.65s/iter ~1.9s/iter
Epoch时间 11小时 7.5小时
总完成时间 9天 6.5天
资源
显存/GPU 29GB 19GB
GPU利用率 100% 100%
磁盘占用 相同 相同
质量
Loss精度 1e-7 1e-4
收敛性 标准 相同
最终mIoU 基准 -0.1~0.3%
稳定性
数值稳定 优秀 良好
OOM风险 极低
NaN风险 极低

启动前检查清单

环境准备

  • GPU支持FP16 (CUDA Capability >= 7.0) 已确认
  • PyTorch版本 >= 1.6 当前1.10.1
  • mmcv版本支持FP16 当前1.4.0

文件准备

  • 配置文件存在: multitask_BEV2X_phase4a_stage1_fp16.yaml
  • 启动脚本存在: RESTART_PHASE4A_STAGE1_FP16.sh
  • Checkpoint存在: /data/runs/phase4a_stage1/epoch_1.pth
  • 预训练模型存在: /data/pretrained/swint-nuimages-pretrained.pth

系统状态

  • 清理僵尸进程
  • GPU显存已释放
  • 磁盘空间充足 (/data > 400GB可用)

🎯 建议执行方案

推荐方案A: 直接使用FP16推荐

优势:

  • 速度提升30-35%
  • 显存节省35%
  • 配置简单
  • 风险低

步骤:

# 1. 清理僵尸进程
pkill -9 -f "train.py"
sleep 5

# 2. 启动FP16训练
cd /workspace/bevfusion
bash RESTART_PHASE4A_STAGE1_FP16.sh

备选方案B: FP16 + 增大Batch

适用: 如果FP16显存节省到20GB以下

修改: 在配置文件中增加batch到2 优势: 额外20-30%加速 风险: 需要调试学习率

保守方案C: 继续FP32

适用: 如果FP16出现不稳定 优势: 最稳定 劣势: 速度较慢


📊 预期训练时间表FP16

Epoch级别

Epoch 1:  ~7.5小时  (11/2 06:00完成)
Epoch 2:  ~7.5小时  (11/2 13:30完成)
Epoch 5:  ~37小时   (11/3 20:00完成)
Epoch 10: ~6.5天    (11/8 10:00完成) ⭐

相比FP32节省: 2.5天 🚀


🔍 故障排查

Q1: FP16未生效显存仍是29GB

检查:

grep -i "fp16\|amp" 最新日志文件.log

可能原因:

  • 配置文件未正确加载
  • mmcv版本不支持
  • PyTorch版本过旧

解决:

# 确认配置生效
cat configs/.../multitask_BEV2X_phase4a_stage1_fp16.yaml | grep fp16

Q2: Loss出现NaN

解决:

# 降低学习率
optimizer:
  lr: 1.5e-5  # 从2e-5降低

# 或使用固定loss_scale
fp16:
  loss_scale: 512.0

Q3: 速度没有明显提升

可能原因:

  • 数据加载瓶颈workers=0
  • GPU不支持Tensor Cores
  • I/O瓶颈

检查:

# 查看GPU利用率
nvidia-smi dmon -s u

文档版本: 1.0
最后更新: 2025-11-01 22:15 UTC
状态: FP16配置ready可立即启动

建议: 立即使用FP16重启训练预计节省2.5天时间!