保姆级教程:用单张RTX 3090在Ubuntu 20.04上成功复现BEVFusion(附完整配置与调参记录)

保姆级教程:用单张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 python=3.8 -y conda activate bevfusion # 必须锁定的核心依赖版本 pip install setuptools==58.0.4 # 解决distutils.version报错的关键 pip install torch==1.9.0+cu111 torchvision==0.10.0+cu111 -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单卡环境下需要做以下关键调整:

  1. 分布式训练禁用: 修改test.py

    # 注释掉以下两行 # dist.init() # torch.cuda.set_device(dist.local_rank()) # 添加 distributed = False
  2. 关键参数调整: 在bevfusion/configs/nuscenes/det/default.yaml中:

    sweeps_num: 9 # 原代码中0是错误值 batch_size: 1 # 3090显存24G下最大支持
  3. 内存优化技巧: 在mmdet3d/models/vtransforms/base.py中:

    add_depth_features=False # 原True会导致显存爆炸

4. 训练过程中的排雷指南

当看到第一个epoch开始运行时,先别高兴太早。以下是可能遇到的"杀手级"错误及解决方案:

RuntimeError: 通道数不匹配

RuntimeError: Given groups=1, 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参数必须为False

TypeError: CyclicLrUpdaterHook

TypeError: CyclicLrUpdaterHook: __init__() got an unexpected keyword argument 'min_lr_ratio'

解决方法:删除default.yaml最后一行min_lr_ratio: 1.0e-3

ImportError: feature_decorator_ext

cannot 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_grad=4模拟多卡batch效果
  • 混合精度:在config.py中添加fp16 = dict(loss_scale=512.)
  • 显存监控
    watch -n 1 nvidia-smi

训练过程中如果显存接近23GB,可以尝试:

# 修改config中的img_scale img_scale = (704, 256) # 原(1600, 900)对单卡太大

6. 验证与测试技巧

单卡环境下测试需要特别注意:

  1. 修改test.py中的分布式设置:

    distributed = False
  2. 使用以下命令启动测试:

    python tools/test.py configs/bevfusion/bevfusion_base.py --checkpoint latest.pth --eval bbox
  3. 如果遇到OOM错误,可以添加--cfg-options data.test.samples_per_gpu=1

7. 实际训练效果记录

在我的RTX 3090上,完整训练周期约48小时,关键指标如下:

EpochmAPNDS显存占用耗时/epoch
10.320.4122.3GB2.1h
100.450.5322.7GB2.0h
200.510.5822.5GB2.0h

重要发现:将default.yaml中的sweeps_num从0改为9后,mAP提升了约7个百分点,这个细节在原论文代码中没有明确说明。