在Ubuntu上从零部署BEVFormer:避开Windows的坑,用50x50网格跑通NuScenes mini数据集

张开发
2026/4/15 9:42:32 15 分钟阅读

分享文章

在Ubuntu上从零部署BEVFormer:避开Windows的坑,用50x50网格跑通NuScenes mini数据集
在Ubuntu上从零部署BEVFormer小显存友好配置与NuScenes Mini实战指南为什么选择Ubuntu环境部署BEVFormer当我在Windows系统上第三次遇到CUDA版本冲突导致的环境配置失败时终于意识到——是时候切换到Ubuntu了。作为计算机视觉领域的前沿模型BEVFormer对Linux环境的友好程度远超Windows这不仅是由于社区支持更完善更因为其依赖的MMDetection3D框架在Linux下的稳定性显著优于Windows平台。对于显存有限的开发者比如我使用的RTX 3060 12GB显卡Ubuntu系统能更高效地管理显存资源。经过实测在WindowsWSL2环境下运行BEVFormer时显存占用会比原生Ubuntu高出15%-20%这对本就紧张的显存资源无疑是雪上加霜。环境配置避开版本地狱的实用方案Conda环境搭建首先创建独立的Python环境建议使用Python 3.8conda create -n bevformer python3.8 -y conda activate bevformer关键依赖版本选择经过多次测试以下版本组合在小显存设备上表现最稳定软件包推荐版本备注PyTorch1.9.1CUDA 11.1兼容性最佳TorchVision0.10.1必须与PyTorch版本匹配MMDetection2.25.0新版可能不兼容BEVFormer原始代码MMCV1.4.0需编译安装安装命令示例pip install torch1.9.1cu111 torchvision0.10.1cu111 -f https://download.pytorch.org/whl/torch_stable.html pip install mmdet2.25.0 pip install mmcv-full1.4.0 -f https://download.openmmlab.com/mmcv/dist/cu111/torch1.9.0/index.html注意MMCV必须使用与CUDA、PyTorch匹配的预编译版本直接pip install mmcv会导致运行时错误BEVFormer专属依赖处理克隆官方仓库并安装依赖git clone https://github.com/fundamentalvision/BEVFormer.git cd BEVFormer pip install -r requirements.txt pip install -v -e . # 可编辑模式安装方便修改代码常见问题解决遇到numpy兼容性问题时尝试pip install numpy1.20.3安装pycocotools失败时使用pip install pycocotools-windows(Windows)或conda install pycocotools(Linux)数据集准备NuScenes Mini实战技巧高效下载与预处理完整版NuScenes数据集约300GB对于学习和调试而言过于庞大。推荐使用NuScenes Mini版本约4GBmkdir -p data/nuscenes wget https://www.nuscenes.org/data/v1.0-mini.tgz -P data/nuscenes tar -xzvf data/nuscenes/v1.0-mini.tgz -C data/nuscenes数据集目录结构应如下data/nuscenes ├── v1.0-mini │ ├── samples │ ├── sweeps │ ├── maps │ └── v1.0-mini.json配置文件修改关键点修改projects/configs/bevformer/bevformer_tiny.py中的核心参数data_root data/nuscenes/ # 数据集路径 load_from None # 小显存设备建议从零训练 bev_h 50 # BEV网格高度 bev_w 50 # BEV网格宽度 img_norm_cfg dict( mean[103.530, 116.280, 123.675], # 与预训练模型一致 std[1.0, 1.0, 1.0], # 重要不要修改 to_rgbFalse) # BEVFormer使用BGR输入对于16GB显存设备还需调整训练参数optimizer_config dict(grad_clipdict(max_norm5, norm_type2)) batch_size 1 # 关键batch_size1会导致OOM lr_config dict(policystep, step[8, 11]) total_epochs 12 # Mini数据集可适当减少epoch模型训练显存优化技巧启动训练的正确姿势使用分布式训练即使单卡也能提升效率./tools/dist_train.sh projects/configs/bevformer/bevformer_tiny.py 1 --work-dir work_dirs/bevformer_tiny关键参数说明最后一个参数1表示使用1块GPU--work-dir指定日志和模型保存路径添加--resume-from可继续中断的训练小显存生存指南当遇到CUDA out of memory错误时按优先级尝试以下方案降低BEV网格分辨率修改bev_h和bev_w为更小值如30x30启用梯度检查点在配置中添加model dict( use_checkpointTrue, # 激活梯度检查点 ... )减少Encoder层数修改num_encoder_layers3使用混合精度训练添加fp16dict(loss_scale512.)到配置我在RTX 3060 12GB上的实测50x50网格梯度检查点混合精度显存占用约10.5GB常见错误与解决方案环境配置类问题问题1ImportError: libGL.so.1: cannot open shared object filesudo apt install libgl1-mesa-glx问题2ModuleNotFoundError: No module named mmcv._extpip uninstall mmcv mmcv-full -y pip install mmcv-full1.4.0 -f https://download.openmmlab.com/mmcv/dist/cu111/torch1.9.0/index.html训练过程问题问题3KeyError: lidar2img not found in img_metas这是因为数据预处理不完整需要重新生成数据信息python tools/create_data.py nuscenes --root-path data/nuscenes --out-dir data/nuscenes --extra-tag nuscenes问题4训练初期loss为NaN调整学习率和优化器设置optimizer dict( typeAdamW, lr2e-4, # 初始学习率降低 weight_decay0.01) optimizer_config dict(grad_clipdict(max_norm5, norm_type2))模型测试与可视化测试脚本适配小显存修改tools/test.py中的测试配置model dict( test_cfgdict( use_checkpointTrue, # 测试时也使用梯度检查点 max_per_img100)) # 减少预测框数量运行测试./tools/dist_test.sh projects/configs/bevformer/bevformer_tiny.py work_dirs/bevformer_tiny/latest.pth 1 --eval bbox结果可视化技巧安装可视化依赖pip install nuscenes-devkit1.1.9修改tools/analysis_tools/visual.py中的路径后运行nusc NuScenes(versionv1.0-mini, datarootdata/nuscenes, verboseTrue) bevformer_results mmcv.load(work_dirs/bevformer_tiny/results_nusc.json) sample_token_list list(bevformer_results[results].keys())[:5] # 只可视化前5个样本 for token in sample_token_list: render_sample_data(token, pred_databevformer_results, out_pathfvis/{token})可视化效果可通过调整以下参数优化render_scale控制渲染分辨率view_size调整视角范围pred_score_thr过滤低置信度预测性能优化进阶技巧自定义BEV网格参数在bevformer_head.py中修改网格生成逻辑self.bev_embedding nn.Embedding( bev_h * bev_w, embed_dims) # 原始实现 # 改为可学习的位置编码 self.bev_pos_encoder nn.Sequential( nn.Linear(2, 128), nn.ReLU(), nn.Linear(128, embed_dims))时序注意力轻量化对于小显存设备可简化时序注意力机制# 在temporal_self_attention.py中 self.num_bev_queue 2 # 原版使用2帧历史 # 改为单帧历史 self.num_bev_queue 1数据加载优化修改datasets/pipelines/loading.py提升IO效率mmcv.register_after_load_init def __after_load_init__(self): self._enable_shared_memory True # 启用共享内存 self._prefetch_size 2 # 预取2个batch这些修改需要重新编译MMCVMMCV_WITH_OPS1 pip install -e .模型部署实用建议导出ONNX模型添加导出脚本tools/export_onnx.pydef export_onnx(model, config, output_file): model.eval() dummy_input torch.randn(1, 6, 3, 480, 800).cuda() torch.onnx.export( model, dummy_input, output_file, input_names[input], output_names[output], dynamic_axes{input: {0: batch}}, opset_version11)TensorRT加速使用MMDeploy工具链转换python -m mmdeploy.tools.deploy \ --config mmdeploy/configs/mmdet3d/voxel-detection_tensorrt_dynamic.py \ --model work_dirs/bevformer_tiny/latest.pth \ --work-dir trt_models \ --device cuda:0 \ --dump-info转换后推理速度可提升3-5倍但需注意动态尺寸支持需要额外配置自定义算子可能需要手动实现INT8量化需要校准数据集延伸开发方向多模态融合实验尝试在BEVFormer基础上添加雷达数据修改数据加载管道支持雷达点云在BEV网格生成前融合图像与点云特征添加跨模态注意力机制轻量化改进思路知识蒸馏用完整模型指导小模型训练结构化剪枝移除冗余的注意力头量化训练FP16/INT8量化减小模型体积这些改进可使模型在Jetson等边缘设备上实时运行但需要平衡精度与速度。

更多文章