保姆级教程:用单张RTX 3090在Ubuntu 20.04上成功复现BEVFusion(附完整配置与调参记录)
单卡RTX 3090实战Ubuntu 20.04环境下的BEVFusion完整复现指南当我在实验室角落发现那台闲置的RTX 3090工作站时一个大胆的想法浮现——能否用这块过气旗舰卡完整复现BEVFusion这个多模态3D检测框架经过72小时不眠不休的调试这份血泪经验或许能帮你少走弯路。本文将手把手带你用单卡完成从环境配置到模型训练的全流程特别针对Ubuntu 20.04系统和NVIDIA 30系显卡的兼容性问题提供独家解决方案。1. 基础环境搭建避开那些版本陷阱在开始前请确保你的Ubuntu 20.04系统已安装NVIDIA驱动510.85.02及以上版本。这个看似简单的第一步实则暗藏杀机——太新的驱动可能导致CUDA 11.1不兼容而太旧的驱动又无法充分发挥3090的性能。必备组件清单# 创建隔离的conda环境Python 3.8最佳 conda create -n bevfusion python3.8 -y conda activate bevfusion # 必须锁定的核心依赖版本 pip install setuptools58.0.4 # 解决distutils.version报错的关键 pip install torch1.9.0cu111 torchvision0.10.0cu111 -f https://download.pytorch.org/whl/torch_stable.html注意不要直接使用pip安装最新版setuptools否则会遇到AttributeError: module distutils has no attribute version这个经典错误。这个问题在Ubuntu 20.04上尤其常见。安装MMDetection3D时推荐使用以下特定commit版本git clone https://github.com/open-mmlab/mmdetection3d.git cd mmdetection3d git checkout 5e4a7b4 # 这个commit与BEVFusion兼容性最佳 pip install -v -e .2. 数据集配置NuScenes的路径迷宫下载好的NuScenes数据集建议放在/data/nuscenes目录下这是大多数配置文件的默认查找路径。如果你像我一样喜欢自定义路径需要修改以下关键文件路径修改对照表原路径新路径修改文件./data/nuscenes/your_path/nuscenesnuscenes_converter.py./data/nuscenes_infos_train.pkl/your_path/nuscenes_infos_train.pklbase.py具体到代码层面需要调整nuscenes_converter.py第95-100行# 修改前 info_path osp.join(root_path, nuscenes_infos_train.pkl) info_val_path osp.join(root_path, nuscenes_infos_val.pkl) # 修改后 info_path osp.join(root_path, {}_infos_train.pkl.format(info_prefix)) info_val_path osp.join(root_path, {}_infos_val.pkl.format(info_prefix))3. 单卡训练的特殊配置BEVFusion原始配置是为8卡训练设计的在RTX 3090单卡环境下需要做以下关键调整分布式训练禁用 修改test.py# 注释掉以下两行 # dist.init() # torch.cuda.set_device(dist.local_rank()) # 添加 distributed False关键参数调整 在bevfusion/configs/nuscenes/det/default.yaml中sweeps_num: 9 # 原代码中0是错误值 batch_size: 1 # 3090显存24G下最大支持内存优化技巧 在mmdet3d/models/vtransforms/base.py中add_depth_featuresFalse # 原True会导致显存爆炸4. 训练过程中的排雷指南当看到第一个epoch开始运行时先别高兴太早。以下是可能遇到的杀手级错误及解决方案RuntimeError: 通道数不匹配RuntimeError: Given groups1, weight of size [8, 1, 1, 1], expected input[24, 6, 256, 704] to have 1 channels, but got 6 channels instead.解决方法检查base.py中的add_depth_features参数必须为FalseTypeError: CyclicLrUpdaterHookTypeError: CyclicLrUpdaterHook: __init__() got an unexpected keyword argument min_lr_ratio解决方法删除default.yaml最后一行min_lr_ratio: 1.0e-3ImportError: feature_decorator_extcannot import name feature_decorator_ext from partially initialized module mmdet3d.ops.feature_decorator需要修改两个__init__.py文件# mmdet3d/ops/__init__.py # 注释掉以下行 # from .feature_decorator import feature_decorator # mmdet3d/models/backbones/__init__.py # 注释掉 # from .radar_encoder import *5. 性能调优与监控在24GB显存的限制下这些技巧能让训练更稳定梯度累积设置accumulate_grad4模拟多卡batch效果混合精度在config.py中添加fp16 dict(loss_scale512.)显存监控watch -n 1 nvidia-smi训练过程中如果显存接近23GB可以尝试# 修改config中的img_scale img_scale (704, 256) # 原(1600, 900)对单卡太大6. 验证与测试技巧单卡环境下测试需要特别注意修改test.py中的分布式设置distributed False使用以下命令启动测试python tools/test.py configs/bevfusion/bevfusion_base.py --checkpoint latest.pth --eval bbox如果遇到OOM错误可以添加--cfg-options data.test.samples_per_gpu17. 实际训练效果记录在我的RTX 3090上完整训练周期约48小时关键指标如下EpochmAPNDS显存占用耗时/epoch10.320.4122.3GB2.1h100.450.5322.7GB2.0h200.510.5822.5GB2.0h重要发现将default.yaml中的sweeps_num从0改为9后mAP提升了约7个百分点这个细节在原论文代码中没有明确说明。