bev-project/project/docs/EVAL_DEPLOYMENT_ANALYSIS.md

8.0 KiB
Raw Blame History

Epoch 23部署测试方案分析

时间: 2025-10-30 15:15
需求: 对epoch_23.pth进行evaluation/deployment测试


🔍 当前环境状态

GPU资源

GPU 0-3: Stage 1训练中 (30GB显存, 100%利用率)
GPU 4-7: 完全空闲 (可用于测试)

可用资源: 4张GPU (GPU 4-7)

Docker环境

PyTorch: 1.10.1+cu102  ✅
mmcv: 1.4.0  ✅
符号链接: 已修复  ✅
工作目录: /workspace/bevfusion  ✅

之前评估失败原因

问题1: MASTER_HOST环境变量缺失
问题2: DataLoader workers共享内存错误
  → RuntimeError: unable to write to file </torch_xxx>

💡 两种方案对比

方案A: 同Docker并行测试 (推荐 )

配置

使用GPU: 4-7 (4张避开训练GPU)
Workers: 0 (避免共享内存问题)
进程隔离: CUDA_VISIBLE_DEVICES=4,5,6,7

优点

✅ 无需额外Docker容器
✅ 直接访问checkpoint和数据
✅ 环境已配置好(符号链接等)
✅ 可以实时对比训练进度
✅ 资源利用率100% (8张GPU全用)

缺点

⚠️ 需要确保GPU隔离通过CUDA_VISIBLE_DEVICES
⚠️ 需要workers=0避免共享内存冲突
⚠️ 可能的资源竞争IO, CPU

风险评估

GPU冲突风险: 极低 (CUDA_VISIBLE_DEVICES隔离)
共享内存风险: 低 (workers=0)
训练影响风险: 极低 (独立GPU)
IO竞争风险: 低 (评估2-3小时vs训练9天)

总体风险: 低
成功概率: 85%

方案B: 新Docker容器测试

配置

新容器: 独立的BEVFusion环境
挂载: 共享/workspace/bevfusion目录
GPU: 可以使用4-7或独立分配

优点

✅ 完全隔离,零干扰风险
✅ 可以使用不同配置
✅ 更灵活的资源分配

缺点

❌ 需要启动新Docker容器
❌ 需要重新配置环境(符号链接等)
❌ 可能需要重新安装依赖
❌ 数据访问需要挂载配置
❌ 增加管理复杂度

实施成本

环境准备: 30-60分钟
  - 启动Docker
  - 配置环境
  - 创建符号链接
  - 验证mmcv等

vs 同Docker方案: 5分钟

🎯 我的推荐

推荐: 方案A - 同Docker并行测试

核心理由

1. 环境已就绪

当前Docker中:
  ✓ PyTorch 1.10.1已配置
  ✓ mmcv符号链接已修复
  ✓ 所有依赖已安装
  ✓ checkpoint和数据已就位

新Docker需要:
  ✗ 重新配置所有环境
  ✗ 30-60分钟准备时间

2. GPU隔离很简单

# 通过CUDA_VISIBLE_DEVICES完全隔离
CUDA_VISIBLE_DEVICES=4,5,6,7 运行评估
→ 评估进程只能看到GPU 4-7
→ 训练进程只能看到GPU 0-3
→ 零冲突风险

3. 共享内存问题可解决

# 之前失败的原因: workers=4
# 解决方法: workers=0

torchpack dist-run -np 4 python tools/test.py \
  --cfg-options data.workers_per_gpu=0  # ← 关键

4. 风险可控

最坏情况: 评估失败
影响: 无(训练继续运行)
成本: 浪费2-3小时GPU时间
恢复: 立即(停止评估即可)

vs 新Docker方案:
  最坏情况: 环境配置失败
  成本: 浪费1-2小时调试

🚀 推荐实施方案

修复后的评估脚本

创建: EVAL_EPOCH23_FIXED.sh

#!/bin/bash
# Epoch 23评估 - 修复版同Docker并行

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

cd /workspace/bevfusion

echo "========================================================================"
echo "Phase 3 Epoch 23 评估 (GPU 4-7, workers=0)"
echo "========================================================================"
echo ""

EVAL_DIR="eval_results/epoch23_$(date +%Y%m%d_%H%M%S)"
mkdir -p "$EVAL_DIR"

CONFIG="configs/nuscenes/det/transfusion/secfpn/camera+lidar/swint_v0p075/multitask_enhanced_phase1_HIGHRES.yaml"
CHECKPOINT="runs/enhanced_from_epoch19/epoch_23.pth"

echo "配置: $CONFIG"
echo "Checkpoint: $CHECKPOINT"
echo "输出: $EVAL_DIR"
echo ""

# 关键修复:
# 1. 使用GPU 4-7通过CUDA_VISIBLE_DEVICES
# 2. workers=0避免共享内存问题
# 3. 明确设置环境变量

CUDA_VISIBLE_DEVICES=4,5,6,7 \
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/test.py \
  "$CONFIG" \
  "$CHECKPOINT" \
  --eval bbox \
  --out "$EVAL_DIR/results.pkl" \
  --cfg-options data.workers_per_gpu=0 \
  2>&1 | tee "$EVAL_DIR/eval.log"

echo ""
echo "========================================================================"
echo "评估完成!"
echo "========================================================================"
echo "结果: $EVAL_DIR/results.pkl"
echo "日志: $EVAL_DIR/eval.log"
echo ""
echo "提取性能指标:"
grep -E "(NDS|mAP|mIoU)" "$EVAL_DIR/eval.log" | tail -20
echo "========================================================================"

📋 实施步骤

Step 1: 验证训练不受影响

# 检查训练GPU隔离
nvidia-smi | grep -A 1 "GPU 0\|GPU 1\|GPU 2\|GPU 3"

# 确认训练正常
tail -5 phase4a_stage1_*.log | grep "Epoch \["

Step 2: 启动评估

bash EVAL_EPOCH23_FIXED.sh

Step 3: 监控并行任务

# 终端1: 监控训练
tail -f phase4a_stage1_*.log | grep "Epoch \["

# 终端2: 监控评估  
tail -f eval_results/epoch23_*/eval.log

# 终端3: GPU状态
watch -n 5 nvidia-smi

Step 4: 评估完成后

# 查看结果
cat eval_results/epoch23_*/eval.log | grep -A 50 "Evaluation"

# 对比baseline
# (我们已有baseline数据)

⚠️ 注意事项

必须设置的参数

1. CUDA_VISIBLE_DEVICES=4,5,6,7

作用: 限制评估进程只能看到GPU 4-7
重要性: ⭐⭐⭐ 防止GPU冲突

2. data.workers_per_gpu=0

作用: 避免DataLoader共享内存错误
重要性: ⭐⭐⭐ 之前失败的根本原因

3. 环境变量

LD_LIBRARY_PATH: 必须设置
PATH: 使用conda Python
重要性: ⭐⭐ 保证库加载正常

风险预防

如果评估导致训练变慢:

# 立即停止评估
pkill -f "test.py"

# 不会影响训练(训练进程独立)

如果出现GPU冲突:

# 检查GPU分配
nvidia-smi

# 确认CUDA_VISIBLE_DEVICES生效
echo $CUDA_VISIBLE_DEVICES

# 停止评估重新启动

📊 方案对比表

指标 方案A: 同Docker并行 方案B: 新Docker
准备时间 5分钟 30-60分钟
环境配置 已就绪 需重新配置
GPU隔离 CUDA_VISIBLE_DEVICES 物理隔离
风险等级 极低
资源利用 100% (8GPU) 取决于分配
管理复杂度
训练影响 极低
成功概率 85% 95%
推荐指数

🎯 最终建议

推荐: 方案A - 同Docker并行 (85%确信)

实施步骤:

# 1. 创建修复后的评估脚本
# (见上文 EVAL_EPOCH23_FIXED.sh)

# 2. 启动评估
bash EVAL_EPOCH23_FIXED.sh

# 3. 监控(新终端)
bash monitor_all_tasks.sh

# 4. 等待完成 (2-3小时)

预期结果:

评估时间: 2-3小时
训练影响: 无
GPU利用率: 100% (8张全用)
成功概率: 85%

如果失败:

降级方案: 等Epoch 1完成后再评估
  - 训练暂停期间评估
  - 可以使用全部8张GPU
  - 1小时完成
  - 成功概率: 95%

备选: 方案B - 新Docker (15%推荐)

仅在以下情况使用:

  • 方案A尝试失败
  • 对训练干扰零容忍
  • 有时间配置新环境

实施成本: 30-60分钟


🔧 修复后的评估脚本

关键改进:

  1. 使用GPU 4-7 (CUDA_VISIBLE_DEVICES)
  2. workers=0 (避免共享内存)
  3. 完整环境变量设置

脚本已准备好,随时可以启动!


推荐: 使用同Docker并行测试
备选: 新Docker容器 (如果并行失败)
监控: monitor_all_tasks.sh