6.9 KiB
6.9 KiB
训练失败根因分析
分析时间: 2025-10-31 09:00
对比对象: epoch23成功脚本 vs 当前失败训练
🔍 关键发现
当前运行的训练 ≠ START_PHASE4A_STAGE1.sh脚本!
实际运行的是一个错误的配置,这解释了为什么会卡死。
📊 配置对比表
| 项目 | epoch23成功 | 应该用(stage1) | 实际运行 | 状态 |
|---|---|---|---|---|
| 启动方式 | torchpack | torchpack | mpirun | ❌ |
| GPU数量 | 8 | 4 | 6 | ❌ |
| 配置文件 | phase1_HIGHRES | phase4a_stage1 | phase4a | ❌ |
| BEV分辨率 | 400×400 | 600×600 | 800×800 | ❌ |
| workers_per_gpu | 4 | 0 | 0 | ✅ |
| samples_per_gpu | 2 | 1 | 1 | ✅ |
| LD_LIBRARY_PATH | 无 | ✅ 有 | ? | ⚠️ |
❌ 三大错误
错误1: 使用了错误的配置文件
实际运行: multitask_BEV2X_phase4a.yaml (800×800)
应该使用: multitask_BEV2X_phase4a_stage1.yaml (600×600)
影响: 分辨率过高导致显存压力过大
错误2: 使用了mpirun而非torchpack
实际运行: mpirun -np 6 python tools/train.py ...
应该使用: torchpack dist-run -np 4 python tools/train.py ...
影响: 环境变量传递不完整,进程管理不稳定
错误3: GPU数量不匹配
实际运行: 6个GPU
应该使用: 4个GPU
影响: 未经测试的配置,通信拓扑可能有问题
🔬 为什么会卡死
1. 800×800分辨率压力
- BEV特征图: 800×800远大于epoch23的400×400
- 4层Decoder: 每层都需要处理大尺寸特征图
- 显存需求: ~30GB/GPU(接近V100 32GB上限)
- 6-GPU分布式: 进程间通信压力巨大
2. mpirun vs torchpack差异
torchpack (epoch23成功):
- 完整的环境变量传递
- 自动处理分布式配置
- 错误处理和日志管理
mpirun (当前失败):
- 需要手动配置环境
- LD_LIBRARY_PATH可能在子进程中丢失
- 进程通信配置可能不完整
3. 未测试的GPU配置
- 4-GPU: 已测试,稳定
- 6-GPU: 未测试,可能触发不同的OOM场景
- 8-GPU (epoch23): 已验证,成功
✅ epoch23为什么成功
保守的配置
分辨率: 400×400 (保守,显存压力小)
GPU数量: 8个 (压力分散)
启动方式: torchpack (环境完整)
测试充分: epoch 19→23 稳定运行4个epoch
完整的环境
# epoch23的启动脚本
/opt/conda/bin/torchpack dist-run -np 8 /opt/conda/bin/python tools/train.py \
configs/.../multitask_enhanced_phase1_HIGHRES.yaml \
--load_from runs/.../epoch_19.pth \
--data.samples_per_gpu 2 \
--data.workers_per_gpu 4
特点:
- ✅ 直接使用torchpack
- ✅ 配置文件经过验证
- ✅ 所有参数都是命令行传递
🎯 实际启动命令推测
当前卡死的训练可能是这样启动的:
# 错误的启动方式
mpirun --allow-run-as-root -np 6 -H localhost:6 \
-bind-to none -map-by slot \
-x PATH -x LD_LIBRARY_PATH ... \
python tools/train.py \
configs/.../multitask_BEV2X_phase4a.yaml \
--model.encoders.camera.backbone.init_cfg.checkpoint pretrained/swint-nuimages-pretrained.pth \
--load_from runs/enhanced_from_epoch19/epoch_23.pth \
--data.samples_per_gpu 1 \
--data.workers_per_gpu 0
问题:
- 使用了
multitask_BEV2X_phase4a.yaml(800×800) - 使用了mpirun包装
- 6个GPU配置
🛠️ 正确的启动方式
Step 1: 清理错误进程
pkill -f "train.py"
pkill -f "mpirun"
sleep 3
Step 2: 验证环境
nvidia-smi # 确认GPU空闲
python -c "import torch; print('GPU:', torch.cuda.device_count())"
cd /workspace/bevfusion
ls START_PHASE4A_STAGE1.sh # 确认脚本存在
Step 3: 使用正确的脚本
cd /workspace/bevfusion
bash START_PHASE4A_STAGE1.sh
不要:
- ❌ 直接运行mpirun命令
- ❌ 使用multitask_BEV2X_phase4a.yaml
- ❌ 使用6个GPU
应该:
- ✅ 通过START_PHASE4A_STAGE1.sh脚本启动
- ✅ 使用multitask_BEV2X_phase4a_stage1.yaml
- ✅ 使用4个GPU
Step 4: 验证启动正确
# 检查进程
ps aux | grep train.py | grep stage1
# 应该看到类似输出:
# python tools/train.py configs/.../multitask_BEV2X_phase4a_stage1.yaml
Step 5: 监控训练
# 实时监控
tail -f phase4a_stage1_*.log | grep "Epoch \["
# 或使用监控脚本
bash monitor_phase4a_stage1.sh
📋 验证Checklist
启动后检查以下内容:
配置验证
- 配置文件是
multitask_BEV2X_phase4a_stage1.yaml - BEV分辨率是600×600
- 使用4个GPU
- workers_per_gpu=0
进程验证
- 使用torchpack启动(不是mpirun)
- 4个训练进程正在运行
- GPU 0-3全部100%利用率
- GPU 4-7空闲
性能验证
- Loss从~4.0开始(接续之前的训练趋势)
- 每次iteration ~2.6秒
- 显存使用~19GB/GPU
- 无OOM错误
📈 预期表现
如果一切正确,应该看到:
2025-10-31 09:XX:XX - mmdet3d - INFO - Epoch [1][50/30895]
lr: 2.000e-05, eta: 18 days, XX:XX:XX, time: 2.6XX,
data_time: 0.4XX, memory: 18782,
loss/map/stop_line/dice: 0.7XXX,
loss/map/divider/dice: 0.8XXX,
loss: 4.XXXX, grad_norm: 1X.XXXX
关键指标:
- Loss: 4.0-4.5之间(继续下降)
- time: ~2.6秒/iter
- memory: ~18782 MB
- GPU利用率: 100%
🔧 长期改进建议
1. 防止配置混淆
# 重命名危险配置
mv multitask_BEV2X_phase4a.yaml multitask_BEV2X_phase4a_800x800_DANGEROUS.yaml.bak
2. 脚本启动强制检查
在START_PHASE4A_STAGE1.sh中添加:
# 检查是否有其他训练在运行
if pgrep -f "train.py" > /dev/null; then
echo "❌ 错误:已有训练进程在运行!"
echo "请先停止: pkill -f 'train.py'"
exit 1
fi
# 检查配置文件
CONFIG="configs/.../multitask_BEV2X_phase4a_stage1.yaml"
if [ ! -f "$CONFIG" ]; then
echo "❌ 配置文件不存在: $CONFIG"
exit 1
fi
3. 自动监控脚本
# 检测训练卡死并自动重启
while true; do
LAST_UPDATE=$(stat -c %Y phase4a_stage1_*.log)
CURRENT_TIME=$(date +%s)
DIFF=$((CURRENT_TIME - LAST_UPDATE))
if [ $DIFF -gt 300 ]; then # 5分钟无更新
echo "⚠️ 训练可能卡死,准备重启..."
pkill -f "train.py"
sleep 5
bash START_PHASE4A_STAGE1.sh
fi
sleep 60
done
总结
问题根源
训练卡死不是代码bug,而是启动配置错误:
- 使用了800×800配置(过高)
- 使用了mpirun启动(不稳定)
- 使用了6个GPU(未测试)
解决方案
pkill -f "train.py" && \
sleep 3 && \
cd /workspace/bevfusion && \
bash START_PHASE4A_STAGE1.sh
成功标志
- 配置文件:
stage1.yaml✅ - GPU数量:4 ✅
- 启动方式:torchpack ✅
- Loss趋势:继续下降 ✅
下一步:立即用正确的脚本重启训练!