8.1 KiB
8.1 KiB
FP16混合精度训练配置说明
创建时间: 2025-11-01 22:15 UTC
用途: 使用FP16混合精度加速Phase 4A Stage 1训练
🎯 为什么使用FP16?
核心优势
-
显存节省: 30-50%
FP32: 29GB/GPU FP16: 18-20GB/GPU (节省9-11GB) -
训练加速: 30-50%
FP32: 2.65秒/iteration FP16: 1.8-2.0秒/iteration (加速约35%) 总时间: FP32: 9天完成10 epochs FP16: 6-7天完成10 epochs ⭐ -
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保证 ✅ |
| 最终性能 | 基准 | 持平或略优 | 通常无损 ✅ |
⚠️ 注意事项
可能遇到的问题
-
Loss出现NaN
原因: 梯度溢出或下溢 解决: - 检查loss_scale是否合适 - 降低学习率 - 增加warmup步数 -
Loss震荡
原因: FP16精度有限 解决: - 使用dynamic loss_scale (已启用) - 适当降低学习率到1.5e-5 -
性能轻微下降
原因: 数值精度略有影响 预期: 最终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天时间!⚡