bev-project/archive/docs_old/项目进展与问题解决总结_20251030.md

28 KiB
Raw Blame History

BEVFusion项目进展与问题解决总结

生成时间: 2025-10-30 13:15
用途: 完整记录项目进展、问题及解决方法,便于后续训练参考


📊 项目整体进展

Phase 1-2: 基础训练

  • 时间: Epoch 1-19
  • 目标: 建立基础多任务模型3D检测 + BEV分割
  • 成果: epoch_19.pth基础checkpoint
  • 状态: 已完成

Phase 3: 增强分割头训练

训练信息

  • 时间: 2025-10-21 至 10-29
  • Epoch: 20-23 (4个epochs)
  • GPU: 8张 Tesla V100S-PCIE-32GB
  • Batch: 2/GPU, Workers: 4/GPU
  • 训练时间: ~8天 (约15小时/epoch)

技术配置

分割头: EnhancedBEVSegmentationHead
  - ASPP (Atrous Spatial Pyramid Pooling)
  - Channel Attention
  - Spatial Attention
  - GroupNorm (替代BatchNorm修复分布式死锁)
  
分辨率:
  - BEV: 0.3m (360×360)
  - GT标签: 0.25m (400×400)
  
Decoder: 2层 [256, 128]
Deep Supervision: false (关闭)
Dice Loss: false (关闭)

最终性能 (epoch_23.pth)

3D检测:
  NDS: 0.6941 (+1.3% vs baseline)
  mAP: 0.6446 (+0.9% vs baseline)
  
BEV分割:
  整体mIoU: 0.41
  
  大类别(优秀):
    Drivable Area: 0.83
    Ped. Crossing: 0.57
    Walkway: 0.49
  
  小类别(需提升):
    Stop Line: 0.27     ⚠️
    Carpark Area: 0.36  ⚠️
    Divider: 0.19       ⚠️

Phase 3成功要素

  • GroupNorm解决了分布式训练死锁
  • ASPP提供了多尺度特征
  • Attention机制增强了特征表达
  • 训练稳定,无环境问题
  • 3D检测性能保持领先

Phase 4A: 分辨率提升与深度优化 🔄

总体目标

通过提高分辨率和深化模型来提升细线类Stop Line, Divider的IoU

预期提升:

  • Stop Line IoU: 0.27 → 0.42+ (+55%)
  • Divider IoU: 0.19 → 0.35+ (+84%)
  • 整体mIoU: 0.41 → 0.54+ (+32%)

实施策略:渐进式分辨率训练

由于800×800分辨率导致显存不足采用两阶段训练

Stage 1: 600×600分辨率 (进行中 )
  • 启动时间: 2025-10-30 13:08
  • 配置:
    BEV分辨率: 0.2m (540×540)
    GT标签: 0.167m (600×600)
    Decoder: 4层 [256, 256, 128, 128]
    Deep Supervision: true 
    Dice Loss: true 
    GPU: 4张
    Batch: 1/GPU
    Epochs: 10
    
  • 预计时间: ~9天
  • 预期性能: Stop Line 0.35+, Divider 0.28+, mIoU 0.48+
  • 状态: 🚀 正在训练 (Epoch 1, iter 100/30895)
Stage 2: 800×800分辨率 (待规划)
  • 从Stage 1最佳checkpoint继续
  • 可能需要Gradient Checkpointing或3张GPU
  • 预计时间: ~10.5天

⚠️ 遇到的问题与解决方法

问题1: Docker重启后mmcv无法加载

问题描述

Docker重启后训练脚本报错

ImportError: libtorch_cuda_cu.so: cannot open shared object file: No such file or directory

根本原因

mmcv-full 1.4.0编译时期望的PyTorch库文件命名与实际安装的PyTorch 1.10.1+cu102文件命名不匹配

mmcv期望的库文件:

  • libtorch_cuda_cu.so
  • libtorch_cuda_cpp.so
  • libtorch_cpu_cpp.so

PyTorch实际提供的库文件:

  • libtorch_cuda.so
  • libtorch_cpu.so
  • libtorch.so

解决方法

创建符号链接bridging库文件命名差异

cd /opt/conda/lib/python3.8/site-packages/torch/lib

ln -sf libtorch_cuda.so libtorch_cuda_cu.so
ln -sf libtorch_cuda.so libtorch_cuda_cpp.so  
ln -sf libtorch_cpu.so libtorch_cpu_cpp.so

验证

python -c "from mmcv.ops import nms_match; print('✅ mmcv正常')"

重要性

关键
每次Docker重启如果遇到类似问题都需要检查这些符号链接是否存在。

持久化

这些符号链接会在Docker重启后保留在conda环境中但如果重新安装PyTorch或mmcv需要重新创建。


问题2: 800×800分辨率显存不足 (CUDA OOM)

问题描述

尝试启动Phase 4A (800×800)训练时报错:

RuntimeError: CUDA out of memory. 
Tried to allocate 626.00 MiB 
(GPU 0; 31.73 GiB total capacity; 18.04 GiB already allocated; 616.25 MiB free)

根本原因

显存需求指数增长

项目 Phase 3 (400×400) Phase 4A (800×800) 增长倍数
BEV features 512×400×400 = 81.92 MB 512×800×800 = 327.68 MB 4x
Decoder中间层 ~300 MB ~1.2 GB 4x
梯度 + Optimizer ~600 MB ~2.4 GB 4x
单样本总计 ~1 GB ~4 GB 4x

测试结果:

  • 6 GPU配置: ~6 GB/GPU → OOM
  • 4 GPU配置: ~8 GB/GPU → OOM

解决方法

采用渐进式分辨率训练

Stage 1: 600×600分辨率

BEV: 0.2m (540×540)
GT: 0.167m (600×600)
显存需求: ~2.25 GB/sample
GPU配置: 4张
状态: ✅ 成功启动

Stage 2: 800×800分辨率 (待实施)

可能需要:
  - Gradient Checkpointing (节省40%显存降速30%)
  - 或减少到3张GPU
  - 或简化模型结构

重要性

关键
高分辨率训练必须考虑显存限制,不能一次性跳跃过大。


问题3: Model输出与GT标签Shape不匹配

问题描述

训练时报错:

ValueError: Target size (torch.Size([1, 800, 800])) must be the same as input size (torch.Size([1, 400, 400]))

根本原因

配置文件中的grid_transform.output_scope设置错误:

# 错误配置
output_scope: [[-50, 50, 0.25], [-50, 50, 0.25]]  # 400×400

# GT标签
xbound: [-50.0, 50.0, 0.125]  # 800×800

# 结果: Model输出400×400, GT是800×800

解决方法

方法1: 修改配置使output_scope与GT一致

output_scope: [[-50, 50, 0.125], [-50, 50, 0.125]]  # 800×800

方法2: 在模型forward中添加自适应插值已采用

# mmdet3d/models/heads/segm/enhanced.py
def forward(self, x, target=None):
    # ... decoder ...
    
    # 确保输出尺寸与target匹配
    if self.training and target is not None:
        if x.shape[-2:] != target.shape[-2:]:
            x = F.interpolate(x, size=target.shape[-2:], 
                            mode='bilinear', align_corners=False)
    
    # ... classification ...

重要性

重要
分辨率配置必须全链路一致BEV → GridTransform → GT标签


问题4: Deep Supervision插值类型错误

问题描述

启用deep supervision后报错

RuntimeError: "upsample_nearest2d_out_frame" not implemented for 'Long'

根本原因

PyTorch的F.interpolate不支持整型(Long)tensor的插值操作。

原代码:

target_aux = F.interpolate(
    target_cls.unsqueeze(1),  # Long型tensor
    size=aux_pred.shape[-2:],
    mode='nearest'
)[:, 0].long()

解决方法

先转float进行插值保持float用于focal loss

# mmdet3d/models/heads/segm/enhanced.py

# Auxiliary Loss (deep supervision)
if aux_pred is not None:
    # 转float进行插值
    target_aux = F.interpolate(
        target_cls.unsqueeze(1).float(),  # ✅ 转float
        size=aux_pred.shape[-2:],
        mode='nearest'
    )[:, 0]  # ✅ 保持floatfocal loss接受float target
    
    aux_focal = sigmoid_focal_loss(
        aux_pred[:, idx],
        target_aux,  # Float target
        alpha=self.focal_alpha,
        gamma=self.focal_gamma,
    )

关键点:

  • sigmoid_focal_loss可以接受float型的target (0.0或1.0)
  • 不需要转回long
  • Dice loss同样使用float target

重要性

重要
任何涉及插值的操作都要注意tensor类型。


问题5: Python代码缓存导致修改不生效

问题描述

修改了enhanced.py代码后,训练仍然报相同的错误,代码修改没有生效。

根本原因

Python会缓存编译后的.pyc文件在__pycache__目录中,修改源代码后如果不清除缓存,会继续使用旧版本。

解决方法

清除Python缓存

cd /workspace/bevfusion

# 清除特定模块的缓存
find . -type d -name "__pycache__" -path "*/mmdet3d/models/heads/*" -exec rm -rf {} +
find . -name "*.pyc" -path "*/mmdet3d/models/heads/*" -delete

# 或清除全部缓存
find . -type d -name "__pycache__" -exec rm -rf {} +
find . -name "*.pyc" -delete

重要性

建议
修改核心模型代码后,建议清除缓存再启动训练。


问题6: DataLoader共享内存错误

问题描述

使用workers_per_gpu=4时报错:

RuntimeError: unable to write to file </torch_15756_0>

根本原因

PyTorch DataLoader在多进程模式下使用共享内存(/dev/shm)Docker容器的共享内存空间可能不足。

解决方法

设置workers_per_gpu=0,使用单进程数据加载:

torchpack dist-run -np 4 python tools/train.py \
  --data.workers_per_gpu 0  # ✅ 设置为0

权衡:

  • 避免共享内存问题
  • ⚠️ 数据加载稍慢(~0.5秒/iter但总体影响不大

重要性

可选
如果遇到DataLoader错误首先尝试workers=0。


问题7: LD_LIBRARY_PATH环境变量未设置

问题描述

使用torchpack dist-run启动训练时虽然shell中设置了环境变量但训练进程仍然找不到CUDA库。

根本原因

torchpack dist-run使用mpirun启动多进程环境变量传递可能不完整。

解决方法

在启动脚本中明确设置并在torchpack命令前再次声明

#!/bin/bash
set -e

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

# 在命令行中再次声明
LD_LIBRARY_PATH=/opt/conda/lib/python3.8/site-packages/torch/lib:/opt/conda/lib:/usr/local/cuda/lib64:$LD_LIBRARY_PATH \
PATH=/opt/conda/bin:$PATH \
/opt/conda/bin/torchpack dist-run -np 4 /opt/conda/bin/python tools/train.py ...

重要性

建议
分布式训练脚本应该明确设置所有必要的环境变量。


问题8: 配置文件total_epochs未修改

问题描述

创建Stage 1配置时total_epochs仍然是20而不是10。

根本原因

从800×800配置复制时没有修改epoch数量。

解决方法

total_epochs: 10  # Stage 1: 10 epochs

手动检查配置:

grep "total_epochs" configs/.../multitask_BEV2X_phase4a_stage1.yaml

重要性

注意
复制配置文件时,必须检查所有相关参数。


🔧 技术改进与最佳实践

1. 环境配置最佳实践

完整的启动脚本模板

#!/bin/bash
set -e  # 遇到错误立即停止

# 环境变量
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

# 验证符号链接
if [ ! -L "/opt/conda/lib/python3.8/site-packages/torch/lib/libtorch_cuda_cu.so" ]; then
    echo "创建必要的符号链接..."
    cd /opt/conda/lib/python3.8/site-packages/torch/lib
    ln -sf libtorch_cuda.so libtorch_cuda_cu.so
    ln -sf libtorch_cuda.so libtorch_cuda_cpp.so
    ln -sf libtorch_cpu.so libtorch_cpu_cpp.so
fi

cd /workspace/bevfusion

# 环境验证
python -c "import torch; print('PyTorch:', torch.__version__)"
python -c "from mmcv.ops import nms_match; print('mmcv正常')" || exit 1

# 启动训练
LD_LIBRARY_PATH=... \
PATH=... \
/opt/conda/bin/torchpack dist-run -np 4 /opt/conda/bin/python tools/train.py \
  CONFIG_FILE \
  --load_from CHECKPOINT \
  --data.workers_per_gpu 0 \
  2>&1 | tee LOG_FILE

2. 分辨率配置一致性检查清单

在修改分辨率时,必须同步修改以下所有配置:

Encoder (vtransform):

model.encoders.camera.vtransform:
  xbound: [-54.0, 54.0, RESOLUTION]  # BEV分辨率
  ybound: [-54.0, 54.0, RESOLUTION]

Segmentation Head (grid_transform):

model.heads.map.grid_transform:
  output_scope: [[-50, 50, GT_RESOLUTION], [-50, 50, GT_RESOLUTION]]

Data Pipeline (LoadBEVSegmentation):

train_pipeline:
  - type: LoadBEVSegmentation
    xbound: [-50.0, 50.0, GT_RESOLUTION]
    ybound: [-50.0, 50.0, GT_RESOLUTION]

Validation Pipeline:

test_pipeline:
  - type: LoadBEVSegmentation
    xbound: [-50.0, 50.0, GT_RESOLUTION]
    ybound: [-50.0, 50.0, GT_RESOLUTION]

配置验证命令:

grep -E "(xbound|ybound|output_scope)" CONFIG_FILE | grep -v "#"

3. 显存优化策略

分辨率 vs 显存对照表

分辨率 BEV尺寸 GT尺寸 显存/sample 适用GPU
0.3m 360×360 400×400 ~1 GB 4-8张 @ 8GB+
0.2m 540×540 600×600 ~2.25 GB 4-6张 @ 16GB+
0.15m 720×720 800×800 ~4 GB 2-4张 @ 32GB+

GPU数量选择策略

显存需求 = 单样本显存 × samples_per_gpu + 模型权重(~2GB)

# 规则显存使用率保持在90%以下
推荐GPU数量 = ceil(总batch_size / 每GPU可支持的samples)

例如:
  600×600, 32GB GPU: 可支持 (32-2)/2.25  13 samples
  建议batch_size=4-8, 使用4-8张GPU
  
  800×800, 32GB GPU: 可支持 (32-2)/4  7 samples
  建议batch_size=3-6, 使用3-6张GPU (紧张)

Gradient Checkpointing使用

当显存紧张时可以启用gradient checkpointing

# mmdet3d/models/heads/segm/enhanced.py

import torch.utils.checkpoint as checkpoint

class EnhancedBEVSegmentationHead(nn.Module):
    def __init__(self, ..., use_checkpoint=False):
        self.use_checkpoint = use_checkpoint
        # ...
    
    def forward(self, x, target=None):
        # ... transform ...
        
        # ASPP with checkpointing
        if self.use_checkpoint:
            x = checkpoint.checkpoint(self.aspp, x)
        else:
            x = self.aspp(x)
        
        # Decoder with checkpointing
        if self.use_checkpoint:
            x = checkpoint.checkpoint_sequential(self.decoder, 4, x)
        else:
            x = self.decoder(x)

效果:

  • 节省显存: ~40%
  • 训练速度: -30%
  • 适用场景: 显存不足但可以接受速度下降

4. Deep Supervision与插值的正确使用

Phase 3 vs Phase 4A

Phase 3 (无Deep Supervision):

deep_supervision: false
use_dice_loss: false
  • 只有主分类器输出
  • 不需要aux_classifier
  • 不需要插值操作
  • 简单稳定

Phase 4A (有Deep Supervision):

deep_supervision: true
use_dice_loss: true
  • 有aux_classifier在ASPP后输出
  • aux输出可能与最终输出尺寸不同
  • 需要插值target以匹配aux输出
  • ⚠️ 需要处理类型转换

正确的插值代码模板

# 对于Focal Loss (接受float target)
if aux_pred is not None:
    target_aux = F.interpolate(
        target_cls.unsqueeze(1).float(),  # 转float
        size=aux_pred.shape[-2:],
        mode='nearest'
    )[:, 0]  # 保持float
    
    aux_loss = sigmoid_focal_loss(pred, target_aux)  # ✅

# 对于Dice Loss (也接受float)
    aux_dice = sigmoid_dice_loss(pred, target_aux.float())  # ✅

重要原则

  • ⚠️ Long型tensor不能插值
  • Float型target (0.0/1.0) 可用于focal loss和dice loss
  • 保持float避免多次类型转换

5. 分布式训练稳定性

GroupNorm vs BatchNorm

Phase 1-2问题: 使用BatchNorm导致分布式训练死锁

Phase 3解决: 全部替换为GroupNorm

# 错误
nn.BatchNorm2d(channels)

# 正确 (15处替换)
nn.GroupNorm(32, channels)  # 32个group

效果:

  • 分布式训练稳定
  • 性能几乎无影响
  • 避免了BN的同步死锁问题

建议

所有自定义模型模块都使用GroupNorm特别是在分布式训练中。


📂 重要文件与位置

Checkpoint文件

Phase 3最终checkpoint:
  runs/enhanced_from_epoch19/epoch_23.pth (516MB)
  → NDS: 0.6941, mAP: 0.6446, mIoU: 0.41

Phase 4A Stage 1 (训练中):
  runs/run-326653dc-c038af2c/
  → Epoch 1+ checkpoints将保存在这里

配置文件

Phase 3:
  configs/.../multitask_enhanced_phase1_HIGHRES.yaml
  → 400×400, 2层decoder, 无deep supervision

Phase 4A Stage 1:
  configs/.../multitask_BEV2X_phase4a_stage1.yaml
  → 600×600, 4层decoder, 有deep supervision

Phase 4A Stage 2 (待创建):
  configs/.../multitask_BEV2X_phase4a_stage2.yaml
  → 800×800, 可能需要gradient checkpointing

启动脚本

Phase 3:
  start_enhanced_training_fixed.sh
  → 8 GPU, workers=4, samples=2/GPU

Phase 4A Stage 1:
  START_PHASE4A_STAGE1.sh
  → 4 GPU, workers=0, samples=1/GPU

Phase 4A Stage 2 (待创建):
  START_PHASE4A_STAGE2.sh
  → 待根据Stage 1结果决定

核心代码文件

分割头:
  mmdet3d/models/heads/segm/enhanced.py
  → EnhancedBEVSegmentationHead
  → ASPP, Attention, Decoder
  → 关键修改: 插值类型转换fix

📋 配置参数速查表

BEV分辨率 → 空间尺寸

分辨率 xbound/ybound 输出尺寸 说明
0.3m [-54.0, 54.0, 0.3] 360×360 Phase 3
0.2m [-54.0, 54.0, 0.2] 540×540 Stage 1
0.15m [-54.0, 54.0, 0.15] 720×720 Stage 2

GT标签分辨率 → 空间尺寸

分辨率 xbound/ybound 输出尺寸 说明
0.25m [-50.0, 50.0, 0.25] 400×400 Phase 3
0.167m [-50.0, 50.0, 0.167] 600×600 Stage 1
0.125m [-50.0, 50.0, 0.125] 800×800 Stage 2

GPU配置建议

场景 GPU数量 samples/GPU workers/GPU 说明
Phase 3 (400×400) 8 2 4 高效训练
Stage 1 (600×600) 4 1 0 显存优化
Stage 2 (800×800) 3-4 1 0 紧张but可行

🔍 问题诊断流程

遇到环境问题时

  1. 验证PyTorch:

    python -c "import torch; print(torch.__version__, torch.cuda.is_available())"
    
  2. 验证mmcv:

    python -c "from mmcv.ops import nms_match; import mmcv; print(mmcv.__version__)"
    
  3. 检查符号链接:

    ls -la /opt/conda/lib/python3.8/site-packages/torch/lib/libtorch*.so
    
  4. 如果mmcv失败:

    # 创建符号链接
    cd /opt/conda/lib/python3.8/site-packages/torch/lib
    ln -sf libtorch_cuda.so libtorch_cuda_cu.so
    ln -sf libtorch_cuda.so libtorch_cuda_cpp.so
    ln -sf libtorch_cpu.so libtorch_cpu_cpp.so
    

遇到OOM时

  1. 查看当前配置:

    grep -E "(xbound|samples_per_gpu)" CONFIG_FILE
    
  2. 估算显存需求:

    分辨率² × channels × 4 bytes ≈ 单层feature map大小
    总显存 ≈ (BEV + Decoder中间层) × 2 (梯度) + 模型权重
    
  3. 调整策略 (按优先级):

    • 减少GPU数量增加每GPU可用显存
    • 降低分辨率
    • 减少decoder层数
    • 启用gradient checkpointing
    • 关闭deep supervision

遇到Shape不匹配时

  1. 检查所有分辨率配置:

    grep -n -E "(xbound.*ybound|output_scope)" CONFIG_FILE
    
  2. 验证配置一致性:

    vtransform.xbound (BEV分辨率)
      ↓
    grid_transform.output_scope (Model输出分辨率)
      ↓
    LoadBEVSegmentation.xbound (GT标签分辨率)
    
    这三者应该形成合理的上采样链路
    
  3. 添加自适应插值 (保险):

    if x.shape[-2:] != target.shape[-2:]:
        x = F.interpolate(x, size=target.shape[-2:], 
                         mode='bilinear', align_corners=False)
    

📈 性能预期与追踪

性能历史

Checkpoint NDS mAP mIoU Stop Line Divider 说明
epoch_19 0.6850 0.6389 - - - Phase 2基础
epoch_23 0.6941 0.6446 0.41 0.27 0.19 Phase 3增强
Stage 1 Epoch 5 ? ? ? 目标0.32+ 目标0.24+ 待验证
Stage 1 Epoch 10 ? ? 目标0.48+ 目标0.35+ 目标0.28+ 待验证

Loss收敛趋势追踪

关键指标:

  • loss/map/stop_line/focal - Stop line focal loss
  • loss/map/divider/focal - Divider focal loss
  • loss/map/*/dice - Dice loss (新增)
  • stats/object/matched_ious - 3D检测IoU

健康标准:

  • Total loss稳定下降
  • Dice loss: 大类别<0.4, 小类别<0.9 (越小越好)
  • Focal loss: <0.05 (越小越好)
  • Grad norm: <20 (稳定)

🛠️ Troubleshooting速查

常见错误与快速解决

错误信息 原因 快速解决
libtorch_cuda_cu.so: cannot open 符号链接缺失 创建符号链接 (见问题1)
CUDA out of memory 显存不足 减少GPU数量或降低分辨率
Target size ... must be same as input size Shape不匹配 检查分辨率配置一致性
upsample_nearest2d_out_frame not implemented for Long 插值类型错误 使用.float()插值
unable to write to file </torch_xxx> 共享内存不足 workers_per_gpu=0
代码修改不生效 Python缓存 清除__pycache__

📝 后续训练注意事项

Stage 1训练期间 (当前)

监控重点

  1. 每500 iters: 检查loss趋势

    tail -f phase4a_stage1_*.log | grep "Epoch \["
    
  2. Epoch 1完成: 验证性能是否提升

    # 查看validation结果
    grep -A 20 "val_step" runs/run-326653dc-c038af2c/20*.log
    
  3. Epoch 5: 评估是否达到预期 (Stop Line IoU >0.32)

  4. 显存监控: 确保稳定在~30GB

    watch -n 10 nvidia-smi
    

潜在问题

  • 如果loss不下降: 检查学习率schedule
  • 如果GPU利用率低: 可能是数据加载瓶颈workers=0的影响
  • 如果出现nan: 检查grad_clip设置

Stage 1完成后

评估决策点

if Stage1_StopLine_IoU >= 0.35 and Stage1_Divider_IoU >= 0.28:
    # 效果好继续Stage 2 (800×800)
    建议: 启用gradient checkpointing
else:
    # 效果一般,优化当前配置
    建议: 调整loss weight或继续训练更多epochs

Stage 2准备

  1. 创建配置: multitask_BEV2X_phase4a_stage2.yaml
  2. 修改分辨率到800×800
  3. 添加gradient checkpointing (可选)
  4. 从Stage 1最佳checkpoint加载

🎯 成功经验总结

什么有效

  1. GroupNorm替代BatchNorm

    • 完全解决分布式死锁
    • Phase 3稳定训练4个epochs
  2. 渐进式分辨率提升

    • 避免显存瓶颈
    • 更稳定的收敛
  3. ASPP + Attention机制

    • 提升了大类别性能
    • 3D检测性能保持
  4. Class-specific loss weighting

    • 小类别(Stop Line, Divider)权重3-4x
    • 平衡训练效果

什么需要小心 ⚠️

  1. 分辨率大幅跳跃

    • 直接2x会导致OOM
    • 建议1.5x或渐进式
  2. Deep Supervision的类型处理

    • 必须使用float进行插值
    • 不能假设所有loss都接受long target
  3. 环境一致性

    • Docker重启可能丢失运行时配置
    • 需要脚本化所有环境设置
  4. 配置文件同步

    • 多处分辨率设置必须一致
    • 建议使用变量避免重复

📞 快速参考

环境验证 (每次Docker重启后)

cd /workspace/bevfusion
export PATH=/opt/conda/bin:$PATH

# 1. 检查PyTorch
python -c "import torch; print('PyTorch:', torch.__version__)"

# 2. 检查mmcv (如果失败,创建符号链接)
python -c "from mmcv.ops import nms_match; print('mmcv正常')"

# 3. 检查GPU
nvidia-smi

# 4. 验证完整导入
python -c "from mmdet3d.apis import train_model; print('所有依赖OK')"

启动训练标准流程

# 1. 验证配置
grep -E "(xbound|ybound|output_scope|total_epochs)" CONFIG_FILE

# 2. 估算显存
# 600×600约需2.25GB/sample, 800×800约需4GB/sample

# 3. 选择GPU数量
# 建议让显存使用率在85-95%之间

# 4. 清除缓存(如果修改了代码)
find . -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null

# 5. 启动训练
bash START_SCRIPT.sh

# 6. 初始监控 (等待2-3分钟)
tail -100 LOG_FILE | grep -E "(load|workflow|Epoch)"

# 7. 持续监控
bash monitor_script.sh

紧急停止与重启

# 停止训练
pkill -9 -f "torchpack\|mpirun"

# 检查是否完全停止
ps aux | grep train.py

# 清理GPU显存
nvidia-smi --gpu-reset-ecc-errors=0

# 检查最新checkpoint
ls -lht runs/LATEST_RUN/epoch_*.pth

# 重启训练 (从最新checkpoint)
bash START_SCRIPT.sh --load_from runs/LATEST_RUN/latest.pth

📊 当前训练状态 (2025-10-30 13:15)

运行中

任务: Phase 4A Stage 1
配置: 600×600分辨率, 10 epochs
进度: Epoch 1, iter 100/30895
GPU: 4张 @ 100%利用率
显存: ~30GB/GPU
Loss: 6.3177 (下降中)
ETA: 20天6小时 (会随训练加速而减少)

日志文件

主日志: phase4a_stage1_20251030_130707.log
训练目录: runs/run-326653dc-c038af2c/
监控命令: bash monitor_phase4a_stage1.sh

下一检查点

  • Epoch 1完成: ~21小时后
  • Epoch 5验证: ~4.5天后
  • Stage 1完成: ~9天后

🎓 经验教训

成功关键因素

  1. 问题定位要准确

    • 使用Python验证每个组件
    • 逐步缩小问题范围
    • 参考成功的配置(Phase 3)
  2. 环境一致性很重要

    • 文档化所有环境设置
    • 脚本化所有操作
    • Docker重启后重新验证
  3. 显存规划要充分

    • 提前计算显存需求
    • 测试边界情况
    • 渐进式而非激进式
  4. 代码修改要验证

    • 清除缓存
    • 小范围测试
    • 检查日志确认生效

建议的开发流程

1. 修改配置/代码
   ↓
2. 清除Python缓存 (如果改了代码)
   ↓
3. 小batch测试 (1 GPU, 1 sample)
   ↓
4. 检查第一个iteration日志
   ↓
5. 确认无误后,扩展到全量训练
   ↓
6. 持续监控前100 iters
   ↓
7. Epoch 1完成后验证性能

📚 文档完整列表

已生成的文档(按用途分类):

项目状态报告

  • PROJECT_SUMMARY_20251030_FINAL.md - 最终总结
  • PROJECT_STATUS_FULL_REPORT_20251030.md - 完整状态
  • PROJECT_PROGRESS_REPORT_20251030.md - 进展报告
  • 项目状态总览_20251030.md - 中文索引

Phase 4A专项文档

  • PHASE4A_STATUS_AND_ENVIRONMENT.md - 技术配置详解
  • PHASE4A_STAGE1_LAUNCHED_SUCCESS.md - Stage 1启动记录
  • PHASE4A_ANALYSIS.md - 分辨率问题分析
  • PHASE4A_GPU_MEMORY_ISSUE.md - 显存问题分析
  • PHASE4A_QUICK_START.md - 快速启动指南

问题解决记录

  • ENVIRONMENT_FIX_RECORD.md - 环境修复记录
  • ENVIRONMENT_CHANGE_DETECTED.md - 环境变化检测
  • ENVIRONMENT_ISSUE_RECORD.md - 环境问题详细记录

操作指南

  • RESTART_AND_LAUNCH_PHASE4A.md - Docker重启指南
  • monitor_phase4a_stage1.sh - Stage 1监控脚本
  • START_PHASE4A_STAGE1.sh - Stage 1启动脚本
  • START_PHASE4A_FIXED.sh - 修复版启动脚本

🚀 下一步行动建议

短期 (1-2天)

  • 训练正常运行中
  • 📊 每天检查loss趋势
  • 📊 监控GPU稳定性

中期 (Epoch 5, ~4.5天后)

  • 📊 评估性能提升
  • 📊 决定是否继续或调整参数
  • 📋 如果效果好开始规划Stage 2

长期 (Stage 1完成, ~9天后)

  • 📊 完整性能评估
  • 📋 规划Stage 2 (800×800)
  • 📋 考虑gradient checkpointing实现

核心checklist (后续训练必查)

启动训练前:

  • 验证PyTorch和mmcv可用
  • 检查符号链接存在
  • 验证配置文件分辨率一致性
  • 估算显存需求
  • 确认checkpoint路径正确
  • 清除Python缓存(如果改了代码)

训练启动后:

  • 查看前50 iters日志无错误
  • 确认GPU显存使用正常(不OOM)
  • 确认loss在下降
  • 确认grad_norm正常(不是nan)

Epoch 1完成后:

  • 检查validation性能
  • 对比Phase 3性能变化
  • 评估是否达到预期

状态: Phase 4A Stage 1正在稳定训练中 🚀

关键文件:

  • 配置: configs/.../multitask_BEV2X_phase4a_stage1.yaml
  • 启动: START_PHASE4A_STAGE1.sh
  • 监控: monitor_phase4a_stage1.sh
  • Checkpoint: runs/run-326653dc-c038af2c/