Ubuntu18.04下部署BEVFusion(阿里北大版)保姆级教程
目录
一、配置及准备工作
二、下载源码
三、创建conda环境
四、环境配置
1. 安装pytorch
2. 安装mmcv-1.4.0
3. 安装mmdetection-2.11.0
4. 安装mmdetection3D
5. 编译BEVFusion
6. 准备数据,生成数据
7. 准备训练
8. 准备测试
五、待解决问题
一、配置及准备工作
这里说一下博主的情况,一开始在单卡RTX3060,windows下的WSL2子系统(Ubuntu20.04)配置运行,结果单卡显存根本不够,看github上说至少要24G显存,显存不够的小伙伴可以尝试别的项目了
后来在阿里云免费申请了一块24G显存的A10显卡,具体怎么申请参照教程
CUDA版本:11.1(相应的cuDNN记得装)
代码:BEVFusion(阿里北大版本,注意还有一个MIT版本的)
数据集:nuScenes数据集的Mini版本
二、下载源码
阿里北大版本BEVFusion
git clone https://github.com/ADLab-AutoDrive/BEVFusion.git
三、创建conda环境
conda create -n bevfusion python=3.8.3
四、环境配置
1. 安装pytorch
conda install pytorch==1.8.0 torchvision==0.9.0 torchaudio==0.8.0 cudatoolkit=11.1 -c pytorch -c conda-forge
2. 安装mmcv-1.4.0
这里以包的形式安装,下载地址里的数字代表版本,可以下自己需要的版本
wget https://download.openmmlab.com/mmcv/dist/cu111/torch1.8.0/mmcv_full-1.4.0-cp38-cp38-manylinux1_x86_64.whl
pip install mmcv_full-1.4.0-cp38-cp38-manylinux1_x86_64.whl
3. 安装mmdetection-2.11.0
cd mmdetection-2.11.0
pip install -r requirements.txt
这里可能有两项报错:
1)把mmdetection-2.11.0/requirements/optional.txt里的sklearn改成scikit-learn即可
2)mmpycocotools安装不上,报错gcc: error: ../common/maskApi.c: No such file or directory;这里需要重新安装cython
pip install cython==0.29.33
编译安装项目
pip install -v -e .
4. 安装mmdetection3D
安装前退回到上一级目录下载文件夹
git clone https://github.com/open-mmlab/mmdetection3d.git
cd mmdetection3d
python setup.py develop
执行这个指令的时候经常卡在某个包下载不下来,这里建议指定清华源下载:
pip install -r requirements/runtime.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
再执行setup.py会发现包都已经安装好了
5. 编译BEVFusion
以上都安装完成后,回到BEVFusion目录,执行:
python setup.py develop
这里可能会报一堆版本号不匹配的错误,每个人情况不一样,我这里建议把握几个关键包的版本,剩下的按照系统提示的版本重装就行
建议这几个包固定版本,剩下的按系统推荐版本来安装,宁可调整其他包的版本,不要动这几个:
pip install numpy==1.19.5
pip install numba==0.48.0
pip install networkx==2.2
pip install scikit-image==0.19.3
pip install albumentations==1.3.1
pip install nuscenes-devkit==1.1.10
pip install trimesh==2.35.39
pip install pandas==1.4.4
把pip_list也贴出来,需要的自己校对一下吧:
Package Version
------------------------- ---------------
absl-py 2.2.1
addict 2.4.0
albucore 0.0.17
albumentations 1.3.1
annotated-types 0.7.0
anyio 4.5.2
appdirs 1.4.4
argon2-cffi 23.1.0
argon2-cffi-bindings 21.2.0
arrow 1.3.0
asttokens 3.0.0
async-lru 2.0.4
asynctest 0.13.0
attrs 25.3.0
autocommand 2.2.2
babel 2.17.0
backcall 0.2.0
backports.tarfile 1.2.0
beautifulsoup4 4.13.3
black 24.8.0
bleach 6.1.0
blinker 1.8.2
cachetools 5.5.2
certifi 2025.1.31
cffi 1.17.1
charset-normalizer 3.4.1
cityscapesScripts 2.2.4
click 8.1.8
codecov 2.1.13
colorama 0.4.6
coloredlogs 15.0.1
comm 0.2.2
ConfigArgParse 1.7
contourpy 1.1.1
coverage 7.6.1
cycler 0.12.1
Cython 0.29.33
dash 3.0.2
debugpy 1.8.13
decorator 5.2.1
defusedxml 0.7.1
descartes 1.1.0
eval_type_backport 0.2.2
exceptiongroup 1.2.2
executing 2.2.0
fastjsonschema 2.21.1
filelock 3.16.1
fire 0.7.0
flake8 7.1.2
Flask 3.0.3
fonttools 4.56.0
fqdn 1.5.1
fsspec 2025.3.0
google-auth 2.38.0
google-auth-oauthlib 1.0.0
grpcio 1.70.0
h11 0.14.0
httpcore 1.0.7
httpx 0.28.1
huggingface-hub 0.30.1
humanfriendly 10.0
idna 3.10
imagecorruptions 1.1.2
imageio 2.35.1
importlib_metadata 8.5.0
importlib_resources 6.4.5
inflect 7.3.1
iniconfig 2.1.0
interrogate 1.7.0
ipykernel 6.29.5
ipython 8.12.3
ipywidgets 8.1.5
isoduration 20.11.0
isort 4.3.21
itsdangerous 2.2.0
jaraco.collections 5.1.0
jaraco.context 5.3.0
jaraco.functools 4.0.1
jaraco.text 3.12.1
jedi 0.19.2
Jinja2 3.1.6
joblib 1.4.2
json5 0.10.0
jsonpointer 3.0.0
jsonschema 4.23.0
jsonschema-specifications 2023.12.1
jupyter 1.1.1
jupyter_client 8.6.3
jupyter-console 6.6.3
jupyter_core 5.7.2
jupyter-events 0.10.0
jupyter-lsp 2.2.5
jupyter_server 2.14.2
jupyter_server_terminals 0.5.3
jupyterlab 4.3.6
jupyterlab_pygments 0.3.0
jupyterlab_server 2.27.3
jupyterlab_widgets 3.0.13
kiwisolver 1.4.7
kwarray 0.7.1
lazy_loader 0.4
llvmlite 0.31.0
lyft-dataset-sdk 0.0.8
Markdown 3.7
MarkupSafe 2.1.5
matplotlib 3.5.2
matplotlib-inline 0.1.7
mccabe 0.7.0
mistune 3.1.3
mmcv-full 1.4.0
mmdet 2.11.0
mmdet3d 0.11.0
mmlvis 10.5.3
mmpycocotools 12.0.3
more-itertools 10.3.0
mypy-extensions 1.0.0
narwhals 1.33.0
nbclient 0.10.1
nbconvert 7.16.6
nbformat 5.10.4
nest-asyncio 1.6.0
networkx 2.2
notebook 7.3.3
notebook_shim 0.2.4
numba 0.48.0
numpy 1.19.5
nuscenes-devkit 1.1.10
oauthlib 3.2.2
onnx 1.7.0
onnxruntime 1.5.1
open3d 0.18.0
opencv-python 4.11.0.86
opencv-python-headless 4.11.0.86
overrides 7.7.0
packaging 24.2
pandas 1.4.4
pandocfilters 1.5.1
parso 0.8.4
pathspec 0.12.1
pexpect 4.9.0
pickleshare 0.7.5
Pillow 9.3.0
pip 24.2
pkgutil_resolve_name 1.3.10
platformdirs 4.3.6
plotly 6.0.1
pluggy 1.5.0
plyfile 1.0.3
prometheus_client 0.21.1
prompt_toolkit 3.0.50
protobuf 5.29.4
psutil 7.0.0
ptyprocess 0.7.0
pure_eval 0.2.3
py 1.11.0
pyasn1 0.6.1
pyasn1_modules 0.4.2
pycocotools 2.0.7
pycodestyle 2.12.1
pycparser 2.22
pydantic 2.10.6
pydantic_core 2.27.2
pyflakes 3.2.0
Pygments 2.19.1
pyparsing 3.1.4
pyquaternion 0.9.9
pytest 8.3.5
python-dateutil 2.9.0.post0
python-json-logger 3.3.0
pytz 2025.2
PyWavelets 1.4.1
PyYAML 6.0.2
pyzmq 26.3.0
qudida 0.0.4
referencing 0.35.1
requests 2.32.3
requests-oauthlib 2.0.0
retrying 1.3.4
rfc3339-validator 0.1.4
rfc3986-validator 0.1.1
rpds-py 0.20.1
rsa 4.9
safetensors 0.5.3
scikit-image 0.19.3
scikit-learn 1.3.2
scipy 1.10.1
Send2Trash 1.8.3
setuptools 75.1.0
Shapely 1.8.5
six 1.17.0
sniffio 1.3.1
soupsieve 2.6
stack-data 0.6.3
tabulate 0.9.0
tensorboard 2.14.0
tensorboard-data-server 0.7.2
termcolor 2.4.0
terminado 0.18.1
terminaltables 3.1.10
threadpoolctl 3.5.0
tifffile 2023.7.10
timm 1.0.15
tinycss2 1.2.1
tomli 2.2.1
torch 1.8.0
torchaudio 0.8.0a0+a751e1d
torchvision 0.9.0
tornado 6.4.2
tqdm 4.67.1
traitlets 5.14.3
trimesh 2.35.39
typeguard 4.3.0
types-python-dateutil 2.9.0.20241206
typing 3.7.4.3
typing_extensions 4.12.2
tzdata 2025.2
ubelt 1.3.7
uri-template 1.3.0
urllib3 2.2.3
wcwidth 0.2.13
webcolors 24.8.0
webencodings 0.5.1
websocket-client 1.8.0
Werkzeug 3.0.6
wheel 0.44.0
widgetsnbextension 4.0.13
xdoctest 1.2.0
yapf 0.32.0
zipp 3.20.2
6. 准备数据,生成数据
nuScenes数据集
自己注册下账号,空间大可以下完整的数据集,内存有限可以下Mini版本
下载解压下来文件夹结构如图:
在BEVFusion根目录下新建data文件夹,在data文件夹下新建nuscenes文件夹,将以上文件全部拷贝进去,建议用cp指令更快,拷贝完成后在根目录下执行指令:
python tools/create_data.py nuscenes --root-path ./data/nuscenes --version v1.0-mini --out-dir ./data/nuscenes --extra-tag nuscenes
生成文件如下:
7. 准备训练
打开根目录下的README,最下面有训练的指令,一条条来执行就可以
第一条指令是训练预训练模型,供第二条指令训练视觉流使用的,不想训练的小伙伴可以直接使用官网训练好的
链接放这里
所有的模型以及日志会在生成的BEVFusion/work_dirs文件夹下被保存,如果直接使用这个预训练模型,建议放在BEVFusion/work_dirs/mask_rcnn_dbswin-t_fpn_3x_nuim_cocopre文件夹下,记得修改第二条指令配置文件里读取预训练模型的路径,如图所示:
有可能出现一些报错
1)import DCN failed
这个不用管,不影响训练,如果有好的解决办法麻烦大家评论区提供
2)ModuleNotFoundError: No module named 'timm'
pip install timm==1.0.15
3) FileNotFoundError: default_runtime.py does not exist
修改该文件BEVFusion/configs/bevfusion/cam_stream/mask_rcnn_dbswin-t_fpn_3x_nuim_cocopre.py中的一个路径如图所示:
4)FormatCode() got an unexpected keyword argument 'verify'
pip install yapf==0.32.0
5)subprocess.CalledProcessError: Command [...] died with
进程被kill最可能的原因就是显存爆了,CUDA显存超了
解决方式:
1)就是调小这两个数,samples_per_gpu是batch_size,workers_per_gpu是并行的线程数
2)包括执行指令时的最后一个数字代表GPU并行训练的数量,如果只有一块GPU,设置成1就行
8. 准备测试
# 前者是配置文件,后者是GPU个数
./tools/dist_test.sh configs/bevfusion/bevf_pp_2x8_1x_nusc.py work_dirs/bevf_pp_2x8_1x_nusc/epoch_12.pth 1 --eval bbox
# 如需可视化
./tools/dist_test.sh configs/bevfusion/bevf_pp_2x8_1x_nusc.py work_dirs/bevf_pp_2x8_1x_nusc/epoch_12.pth 1 --eval bbox --show --show-dir work_dirs/results/ --launcher none
可视化出来的结果默认是obj格式的mesh,可以下载到本地,利用3D Viewer Online在线查看,结果大概是这样的:
没有图像作为背景,看的不够直观,可以修改文件BEVFusion/mmdet3d/models/detectors/mvx_two_stage.py
把倒数第二行注释,倒数第一行解注释
这里的show_results用的open3d做的可视化,需要有显示设备,在服务器上运行可能会报错,如果实在有需求可以尝试用matplotlib做下可视化,这里不再赘述了
五、待解决问题
目前还存在训练视觉数据时训练若干轮后所有指标变为nan的问题,看了官方issue也没有好的解决办法,欢迎各位在评论区一起讨论交流
2025.04.11更新:目前该问题已解决,原因是当时直接按照bevf_pp_4x8_2x_nusc_cam.py配置文件进行训练还是会爆显存,所以我进行了一些修改,具体如下:
我将batch_size改为了1,又开启了fp16混合精度训练,这就导致按照源文件的学习率我在前几轮很容易梯度爆炸,后面我将fp16这行注释掉,又修改了学习率为3e-4,如果还不放心害怕梯度爆炸,可以增加梯度裁剪,如图所示:
直接加到optimizer下面就行
optimizer_config = dict(grad_clip=dict(max_norm=35, norm_type=2))
按照这个配置目前博主24G显存是可以平稳训完24个epoch的