最近我在 AutoDL 上尝试复现 MapQR 项目。MapQR 是一个面向在线矢量化高精地图构建的模型,基于 MMDetection3D、BEVFormer 和 MapTRv2。本文记录从零开始配置环境、下载 nuScenes mini 数据、生成数据索引,到最终完成 24 epoch 训练的完整流程。
1. 创建 Conda 环境
MapQR 依赖的是比较老的一套 OpenMMLab 环境,因此不能直接使用 AutoDL 默认的新版本 PyTorch 镜像。我新建了一个 Python 3.8 环境:
conda create -n mapqr python=3.8 -y conda activate mapqr python -V
确认版本:
Python 3.8.20
2. 安装 PyTorch 和 OpenMMLab 依赖
安装 PyTorch 1.9.1 + CUDA 11.1:
pip install torch==1.9.1+cu111 torchvision==0.10.1+cu111 torchaudio==0.9.1 \ -f https://download.pytorch.org/whl/torch_stable.html
检查:
python -c "import torch; print(torch.__version__); print(torch.version.cuda); print(torch.cuda.is_available())"
输出:
1.9.1+cu111 11.1 True
安装 mmcv、mmdet、mmseg:
pip install mmcv-full==1.4.0 \ -f https://download.openmmlab.com/mmcv/dist/cu111/torch1.9.0/index.html pip install mmdet==2.14.0 pip install mmsegmentation==0.14.1 pip install timm
检查:
python -c "import mmcv, mmdet, mmseg; print(mmcv.__version__, mmdet.__version__, mmseg.__version__)"
输出:
1.4.0 2.14.0 0.14.1
3. 下载 MapQR 代码
cd /root/autodl-tmp git clone https://github.com/HXMap/MapQR.git cd MapQR
目录结构如下:
assets docs figs LICENSE mmdetection3d projects README.md requirement.txt tools
4. 安装 mmdetection3d
cd /root/autodl-tmp/MapQR/mmdetection3d python setup.py develop
检查:
python -c "import mmdet3d; print(mmdet3d.__version__)"
输出:
0.17.2
5. 编译 MapQR 自定义 CUDA 算子
MapQR 使用了 GeometricKernelAttention 自定义 CUDA 扩展,需要单独编译:
cd /root/autodl-tmp/MapQR/projects/mmdet3d_plugin/maptr/modules/ops/geometric_kernel_attn python setup.py build install
之后发现运行时找不到 PyTorch 动态库 libc10.so,需要设置:
export LD_LIBRARY_PATH=/root/miniconda3/envs/mapqr/lib/python3.8/site-packages/torch/lib:$LD_LIBRARY_PATH echo 'export LD_LIBRARY_PATH=/root/miniconda3/envs/mapqr/lib/python3.8/site-packages/torch/lib:$LD_LIBRARY_PATH' >> ~/.bashrc
检查 CUDA 扩展:
cd /root/autodl-tmp/MapQR python -c "import GeometricKernelAttention; print('cuda op ok')"
输出:
cuda op ok
检查项目 plugin:
python -c "import projects.mmdet3d_plugin; print('plugin ok')"
输出:
plugin ok
6. 处理依赖兼容问题
过程中遇到了一些老项目常见的依赖问题,最终使用的关键包包括:
pip install plyfile==0.7.4 scikit-image==0.19.3 pip install networkx==2.5.1 pip install Pillow==8.4.0 pip install yapf==0.32.0 pip install future protobuf==3.19.6 tensorboard==2.10.1
由于项目只跑 nuScenes,不跑 Argoverse 2,因此注释掉了 AV2 数据集导入,避免 av2 与老版 numpy 的类型标注冲突:
sed -i 's/^from \.av2_map_dataset/# from .av2_map_dataset/' projects/mmdet3d_plugin/datasets/__init__.py sed -i 's/^from \.av2_offlinemap_dataset/# from .av2_offlinemap_dataset/' projects/mmdet3d_plugin/datasets/__init__.py
同时,为了让 Python 能找到 projects 包,设置:
export PYTHONPATH=/root/autodl-tmp/MapQR:$PYTHONPATH echo 'export PYTHONPATH=/root/autodl-tmp/MapQR:$PYTHONPATH' >> ~/.bashrc
7. 下载并解压 nuScenes Mini 数据
创建数据目录:
mkdir -p /root/autodl-tmp/data/nuscenes cd /root/autodl-tmp/data/nuscenes
下载 nuScenes mini:
wget -c --show-progress https://www.nuscenes.org/data/v1.0-mini.tgz tar -zxvf v1.0-mini.tgz
下载 map expansion:
wget -c --show-progress -O nuScenes-map-expansion-v1.3.zip \ "https://zenodo.org/records/15667707/files/nuScenes-map-expansion-v1.3.zip?download=1" unzip nuScenes-map-expansion-v1.3.zip
地图包解压后目录结构需要整理为:
/root/autodl-tmp/data/nuscenes/maps/expansion /root/autodl-tmp/data/nuscenes/maps/basemap /root/autodl-tmp/data/nuscenes/maps/prediction
因此执行:
mv /root/autodl-tmp/data/nuscenes/expansion /root/autodl-tmp/data/nuscenes/maps/ mv /root/autodl-tmp/data/nuscenes/basemap /root/autodl-tmp/data/nuscenes/maps/ mv /root/autodl-tmp/data/nuscenes/prediction /root/autodl-tmp/data/nuscenes/maps/
下载 CAN bus 数据:
cd /root/autodl-tmp/data wget -c --show-progress -O can_bus.zip \ "https://zenodo.org/records/15667420/files/can_bus.zip?download=1" unzip can_bus.zip
解压后发现多了一层目录,整理为:
mv /root/autodl-tmp/data/can_bus/can_bus/* /root/autodl-tmp/data/can_bus/ rmdir /root/autodl-tmp/data/can_bus/can_bus
最终数据目录包括:
/root/autodl-tmp/data/nuscenes/samples /root/autodl-tmp/data/nuscenes/sweeps /root/autodl-tmp/data/nuscenes/v1.0-mini /root/autodl-tmp/data/nuscenes/maps /root/autodl-tmp/data/can_bus
8. 生成 nuScenes Mini 数据索引
先生成基础 temporal info:
cd /root/autodl-tmp/MapQR python tools/create_data.py nuscenes \ --root-path /root/autodl-tmp/data/nuscenes \ --out-dir /root/autodl-tmp/data/nuscenes \ --extra-tag nuscenes \ --version v1.0-mini \ --canbus /root/autodl-tmp/data
生成结果:
nuscenes_infos_temporal_train.pkl nuscenes_infos_temporal_val.pkl nuscenes_infos_temporal_train_mono3d.coco.json nuscenes_infos_temporal_val_mono3d.coco.json
然后生成 MapQR/MapTR 所需的 map info。原脚本默认不支持 mini,需要修改 tools/maptrv2/custom_nusc_map_converter.py,增加 v1.0-mini 分支:
available_vers = ['v1.0-trainval', 'v1.0-test', 'v1.0-mini'] if version == 'v1.0-trainval': train_scenes = splits.train val_scenes = splits.val elif version == 'v1.0-test': train_scenes = splits.test val_scenes = [] elif version == 'v1.0-mini': train_scenes = splits.mini_train val_scenes = splits.mini_val else: raise ValueError('unknown')
并让 args.version == 'mini' 时直接使用:
version='v1.0-mini'
之后运行:
python tools/maptrv2/custom_nusc_map_converter.py \ --root-path /root/autodl-tmp/data/nuscenes \ --out-dir /root/autodl-tmp/data/nuscenes \ --extra-tag nuscenes_map \ --version mini \ --canbus /root/autodl-tmp/data
输出:
train sample: 323, val sample: 81
生成:
nuscenes_map_map_infos_temporal_train.pkl nuscenes_map_map_infos_temporal_val.pkl
9. 修改配置文件
修改配置:
projects/configs/mapqr/mapqr_nusc_r50_24ep.py
主要改三处。
数据路径:
data_root = '/root/autodl-tmp/data/nuscenes/'
训练/验证 pkl:
ann_file=data_root + 'nuscenes_map_map_infos_temporal_train.pkl' ann_file=data_root + 'nuscenes_map_map_infos_temporal_val.pkl'
预训练 ResNet50 权重:
pretrained=dict(img='ckpts/resnet50-19c8e357.pth')
下载权重:
cd /root/autodl-tmp/MapQR mkdir -p ckpts wget -c -O ckpts/resnet50-19c8e357.pth \ https://download.pytorch.org/models/resnet50-19c8e357.pth
10. 开始训练
由于 mini 数据暂时没有完整处理评估 json,所以先关闭验证:
cd /root/autodl-tmp/MapQR python tools/train.py projects/configs/mapqr/mapqr_nusc_r50_24ep.py --no-validate
训练成功启动后可以看到:
workflow: [('train', 1)], max: 24 epochs
最终完成 24 epoch:
Saving checkpoint at 24 epochs
训练产物保存在:
work_dirs/mapqr_nusc_r50_24ep
查看:
ls work_dirs/mapqr_nusc_r50_24ep
输出:
20260509_191052.log 20260509_191052.log.json 20260509_191327.log 20260509_191327.log.json epoch_24.pth latest.pth mapqr_nusc_r50_24ep.py tf_logs
其中:
epoch_24.pth latest.pth
就是训练得到的模型权重。
11. 当前结果
至此,MapQR 已经在 AutoDL 上使用 nuScenes mini 完成了完整训练闭环:
环境配置完成 CUDA 算子编译成功 nuScenes mini 数据准备完成 MapQR 数据索引生成完成 训练成功跑完 24 epoch checkpoint 成功保存
需要注意的是,mini 数据主要用于调通代码流程,不适合用于报告论文指标。如果要复现论文结果,还需要下载完整 nuScenes trainval 数据,并按照相同流程重新生成完整数据索引与训练。