bev-project/archive/docs_old/问题诊断_Batch2不支持_20251102.md

2.9 KiB
Raw Blame History

Batch=2训练失败问题诊断

时间: 2025-11-02 11:50 UTC
问题: FP16+Batch2训练启动失败


🚨 问题描述

错误信息

AssertionError at bevfusion.py:334
assert len(features) == 1, features

错误原因

当前BEVFusion模型不支持batch size > 1

代码路径: /workspace/bevfusion/mmdet3d/models/fusion_models/bevfusion.py

# 第334行
if self.fuser is not None:
    x = self.fuser(features)
else:
    assert len(features) == 1, features  # ← 这里断言失败
    x = features[0]

当batch size=2时features列表包含2个元素导致断言失败。


解决方案

已执行: 降回batch=1保持FP16

修改内容:

  1. 配置文件: 移除batch=2设置
  2. 启动脚本: 恢复为batch=1
  3. work_dir: 改为 /data/runs/phase4a_stage1_fp16

新配置:

fp16:
  loss_scale: dynamic  # FP16启用 ✅

# batch保持为1模型限制
data:
  samples_per_gpu: 1  
  workers_per_gpu: 0

optimizer:
  lr: 2.0e-5  # 恢复原学习率

📊 性能预期FP16单batch

指标 FP32原始 FP16 Batch=1 改进
训练速度 2.65s/iter ~1.9s/iter +30%
显存占用 29GB/GPU ~19GB/GPU 节省10GB
Epoch时间 11小时 ~7.5小时 -32%
10 epochs 9天 6.5天 节省2.5天

虽然比batch=2慢一些仍然有显著加速效果


🔍 技术分析

为什么不支持batch>1

原因: 模型架构限制

  1. Features处理逻辑: 代码假设单个样本处理
  2. Fuser可能为None: 在某些配置下没有fusion模块
  3. 历史设计: 原始实现针对batch=1优化

是否可以修改代码支持batch>1

理论可行,但风险高:

  • 需要修改核心forward逻辑
  • 可能影响模型精度
  • 需要大量测试验证
  • 不推荐在训练中途修改

当前最优方案

FP16单batch已经很好

优势:

  1. 稳定可靠(已验证)
  2. 显著加速30%提升)
  3. 节省显存10GB
  4. 无需修改代码
  5. 总时间: 9天 → 6.5天

结论: FP16单batch是最佳选择


🚀 下一步行动

立即执行

cd /workspace/bevfusion

# 清理失败的进程
pkill -9 -f "train.py"
sleep 5

# 启动FP16 batch=1训练
bash RESTART_PHASE4A_STAGE1_FP16.sh

预期时间表

启动: 现在
Epoch 1完成: ~7.5小时后
全部完成: ~6.5天后 (11/8 下午)

📝 经验教训

  1. 模型限制: 不是所有模型都支持大batch
  2. 先验证再优化: 应该先测试batch=1的FP16
  3. 代码断言: 注意检查代码中的限制
  4. 优化策略: FP16本身已经很好不必强求更大batch

状态: 问题已解决,配置已修正
下一步: 启动FP16 batch=1训练

建议: 立即执行清理并重启训练!