bev-project/archive/docs_old/训练失败根因分析_20251031.md

6.9 KiB
Raw Blame History

训练失败根因分析

分析时间: 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.yaml800×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,而是启动配置错误

  1. 使用了800×800配置过高
  2. 使用了mpirun启动不稳定
  3. 使用了6个GPU未测试

解决方案

pkill -f "train.py" && \
sleep 3 && \
cd /workspace/bevfusion && \
bash START_PHASE4A_STAGE1.sh

成功标志

  • 配置文件:stage1.yaml
  • GPU数量4
  • 启动方式torchpack
  • Loss趋势继续下降

下一步:立即用正确的脚本重启训练!