28 KiB
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] # ✅ 保持float,focal 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可行 |
🔍 问题诊断流程
遇到环境问题时
-
验证PyTorch:
python -c "import torch; print(torch.__version__, torch.cuda.is_available())" -
验证mmcv:
python -c "from mmcv.ops import nms_match; import mmcv; print(mmcv.__version__)" -
检查符号链接:
ls -la /opt/conda/lib/python3.8/site-packages/torch/lib/libtorch*.so -
如果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时
-
查看当前配置:
grep -E "(xbound|samples_per_gpu)" CONFIG_FILE -
估算显存需求:
分辨率² × channels × 4 bytes ≈ 单层feature map大小 总显存 ≈ (BEV + Decoder中间层) × 2 (梯度) + 模型权重 -
调整策略 (按优先级):
- 减少GPU数量(增加每GPU可用显存)
- 降低分辨率
- 减少decoder层数
- 启用gradient checkpointing
- 关闭deep supervision
遇到Shape不匹配时
-
检查所有分辨率配置:
grep -n -E "(xbound.*ybound|output_scope)" CONFIG_FILE -
验证配置一致性:
vtransform.xbound (BEV分辨率) ↓ grid_transform.output_scope (Model输出分辨率) ↓ LoadBEVSegmentation.xbound (GT标签分辨率) 这三者应该形成合理的上采样链路 -
添加自适应插值 (保险):
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 lossloss/map/divider/focal- Divider focal lossloss/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训练期间 (当前)
监控重点
-
每500 iters: 检查loss趋势
tail -f phase4a_stage1_*.log | grep "Epoch \[" -
Epoch 1完成: 验证性能是否提升
# 查看validation结果 grep -A 20 "val_step" runs/run-326653dc-c038af2c/20*.log -
Epoch 5: 评估是否达到预期 (Stop Line IoU >0.32)
-
显存监控: 确保稳定在~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准备
- 创建配置:
multitask_BEV2X_phase4a_stage2.yaml - 修改分辨率到800×800
- 添加gradient checkpointing (可选)
- 从Stage 1最佳checkpoint加载
🎯 成功经验总结
什么有效 ✅
-
GroupNorm替代BatchNorm
- 完全解决分布式死锁
- Phase 3稳定训练4个epochs
-
渐进式分辨率提升
- 避免显存瓶颈
- 更稳定的收敛
-
ASPP + Attention机制
- 提升了大类别性能
- 3D检测性能保持
-
Class-specific loss weighting
- 小类别(Stop Line, Divider)权重3-4x
- 平衡训练效果
什么需要小心 ⚠️
-
分辨率大幅跳跃
- 直接2x会导致OOM
- 建议1.5x或渐进式
-
Deep Supervision的类型处理
- 必须使用float进行插值
- 不能假设所有loss都接受long target
-
环境一致性
- Docker重启可能丢失运行时配置
- 需要脚本化所有环境设置
-
配置文件同步
- 多处分辨率设置必须一致
- 建议使用变量避免重复
📞 快速参考
环境验证 (每次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天后
🎓 经验教训
成功关键因素
-
问题定位要准确
- 使用Python验证每个组件
- 逐步缩小问题范围
- 参考成功的配置(Phase 3)
-
环境一致性很重要
- 文档化所有环境设置
- 脚本化所有操作
- Docker重启后重新验证
-
显存规划要充分
- 提前计算显存需求
- 测试边界情况
- 渐进式而非激进式
-
代码修改要验证
- 清除缓存
- 小范围测试
- 检查日志确认生效
建议的开发流程
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/