ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

AutoDL上跑通BEVFormer:Nuscenes训练全流程实操指南

AutoDL上跑通BEVFormer:Nuscenes训练全流程实操指南 先说结论如果你的目标是“快速在云端把BEVFormer跑起来、用Nuscenes把训练流程完整走通”AutoDL是目前性价比很高的选择。我前后在AutoDL上重装了四回环境把数据下载、软链、依赖编译、分布式训练、断电续训这些坑基本都踩了一遍这篇文章就是整理后的实操记录。文章会从选机器开始到环境搭建、数据集准备、训练启动、常见报错排查全程按步骤来适合已经了解BEVFormer基本原理、但还没完整跑通训练流程的读者。1. 部署前须知BEVFormer是什么为什么要在AutoDL上跑1.1 模型选型与任务背景BEVFormer是2022年提出的基于Transformer的BEV感知方案核心思路是把环视相机采集的多视角图像通过空间交叉注意力Spatial Cross-Attention和时间自注意力Temporal Self-Attention统一到鸟瞰视角的特征空间里然后在BEV特征上直接做3D目标检测。相比当时主流的基于LSS派生的方法BEVFormer不需要深度估计分支而是让模型自己学会把2D图像特征投影到3D空间在Nuscenes验证集上获得了当时SOTA的NDS指标大概在0.448左右BEVFormer-base后续还有tiny版本用于轻量部署。这个模型对入门BEV感知算法的人来说是很好的学习样本因为它把Transformer在视觉任务里的几种经典用法都集成了可变形注意力、稀疏查询、时序融合、多任务头。但对应的部署和训练门槛也比普通单目检测模型高不少主要难在环境依赖版本匹配、数据组织方式、显存和训练时间成本。1.2 为什么选AutoDL而不是本地或其它云平台本地训练BEVFormer-base单卡3090或者4090的情况下Nuscenes的trainval集大概28000帧每个epoch训练时间大约在2到3小时完整训练24个epoch得两到三天中途还不能断否则要么从头来要么得依赖断点续训配置。对于大多数个人开发者本地很难腾出这么长时间的连续资源而且21GB左右的模型显存占用也不是所有显卡都能扛住。AutoDL这类云GPU平台解决的核心问题是“按需租用、即时释放”。你不需要买卡开机即用选好镜像就能进入一个相对标准化的训练环境。我用下来的体感是它比纯云厂商的GPU实例更省心的地方在于内置了常用深度学习镜像PyTorch、CUDA、mmcv相关依赖数据盘可以扩容支持无卡模式开机做环境配置这样环境准备阶段不烧GPU费用只在真正训练的时候开机。另外一个很关键的原因是Nuscenes数据集完整版包括传感器数据CAM、LIDAR、RADAR、Map扩展包和标注文件光trainval的图片解压后就要占100多GB如果算上map extension则要接近200GB。本地磁盘和带宽成本都高而在AutoDL上可以直接用平台提供的数据集迁移工具或者网盘转存内网传输速度快很多。2. 环境搭建全程记录从空机器到能跑源码2.1 基础镜像与实例配置选择在AutoDL上创建实例的时候我建议直接选官方PyTorch镜像框架版本选pytorch-2.0.0-python-3.8-cuda-11.8这个组合如果现在有更新的版本优先选cuda 11.x系列的因为BEVFormer的mmcv-full 1.4.0版本对cuda 11.x兼容性好。显卡方面我自己用的是RTX 4090单卡显存24GB跑BEVFormer-base时batch size设为2、开启gradient checkpoint能稳定训练。如果你预算更紧RTX 3090 24GB也行但速度会比4090慢三分之一左右。注意BEVFormer源码仓库在GitHub上已经很久没更新了它默认适配的是mmcv-full 1.4.0、mmdetection 2.14.0、mmsegmentation 0.14.0、PyTorch 1.9/1.10这一套。如果你直接用最新的PyTorch 2.x和mmcv 2.x几乎肯定会在加载权重或者模型构建阶段报错。所以镜像版本宁旧勿新。2.2 依赖安装与版本对照这是整个部署过程里最容易翻车的一个环节。BEVFormer使用的mmdetection3d并不是官方最新版而是它fork之后的某个commit。所以正确操作是先git clone BEVFormer源码然后按照它docs/install.md里指定的commit去安装mmdet3d。我整理了一份能跑通的版本组合照着装就行组件版本Python3.8PyTorch1.10.0cu113torchvision0.11.0cu113mmcv-full1.4.0mmdetection2.14.0mmsegmentation0.14.0mmdetection3dBEVFormer仓库指定的v0.17.1如果你选的AutoDL镜像是PyTorch 2.0我建议先不要直接用而是基于这个镜像创建一个conda环境在环境里重新装PyTorch 1.10。因为BEVFormer源码里有对旧API的隐式依赖PyTorch 2.0下部分操作会报出AttributeError: module torch has no attribute meshgrid这类问题实际上是torch.meshgrid的indexing参数变了修复成本比直接装老版本更高。安装命令可以参考conda create -n bevformer python3.8 -y conda activate bevformer pip install torch1.10.0cu113 torchvision0.11.0cu113 -f https://download.pytorch.org/whl/torch_stable.html pip install openmim mim install mmcv-full1.4.0 mim install mmdet2.14.0 mim install mmsegmentation0.14.0这里用mim而不是直接pip原因是mmcv-full的预编译包需要严格匹配CUDA和PyTorch版本mim会自动从官方索引里找符合当前环境的版本省去自己翻页面找wheel的麻烦。2.3 编译安装mmdet3d的特殊处理BEVFormer代码里fork的mmdetection3d是0.17.1版但它并不是官方pip源里的那个版本而是带了一些BEVFormer自定义算子的版本比如bevformer_pool。这个算子必须编译通过否则模型构建阶段会直接报ModuleNotFoundError: No module named projects.mmdet3d_plugin.bevformer.modules或者KeyError: bevformer。正确安装步骤是git clone https://github.com/fundamentalvision/BEVFormer.git cd BEVFormer pip install -v -e .这个pip install -v -e .会自动安装setup.py里声明的mmdet3d依赖。但注意它并不会自动帮你处理上述的mmcv、mmdet版本匹配所以务必在运行这行命令前先把上一节里那些依赖都给装好。编译时间通常在5到15分钟取决于机器性能。如果编译过程中报错了不要慌先看是哪一步最常见的是cuDNN版本不对导致某些算子编译不过这种情况建议先conda install cudnn8.2.1再重试。编译完成后验证一下python -c import mmdet3d; print(mmdet3d.__version__)能正常输出0.17.1就说明装好了。另外还有一个非常关键的步骤BEVFormer需要把projects目录添加到Python路径如果你在源码根目录下运行训练命令默认是没问题的但如果换到别的工作目录就需要先执行export PYTHONPATH$PYTHONPATH:/path/to/BEVFormer3. Nuscenes数据集的准备与路径坑3.1 数据集结构与下载方式Nuscenes完整数据集分成几个部分v1.0-trainval包含trainval的CAM、LIDAR、RADAR数据和标注、v1.0-testtest集的传感器数据、Map extension高清地图文件、Can bus扩展包车辆底盘状态信息BEVFormer训练和评估都会用到。BEVFormer官方配置里默认使用trainval map extension如果你后续要提交测试集结果才需要额外下载test部分。数据集的下载推荐用官方提供的nuScenes下载脚本但你也可以直接在AutoDL的学术资源加速区找到公开的Nuscenes镜像。我个人比较建议后者原因很简单Nuscenes官网下载需要逐个子文件夹点选非常烦人而且国内直连官网经常中断。AutoDL的公共数据集目录下如果找不到现成的也可以用平台提供的网盘工具从百度网盘转存或者用wget配合一个速度稳定的HTTP源。无论用什么方式最终目录结构应该是这样data/nuscenes/ ├── v1.0-trainval/ │ ├── samples/ │ ├── sweeps/ │ ├── maps/ │ ├── lidarseg/ │ └── v1.0-trainval_meta.json ├── can_bus/ └── maps/注意这个v1.0-trainval_meta.json是BEVFormer用来生成pkl标注文件的基础它和官方数据集里的v1.0-trainval_meta.json内容一样但你需要额外检查一下是否存在maps子目录下的各类地图png文件。3.2 软链接与目录组织这是最容易踩坑的环节。BEVFormer的配置文件默认从./data/nuscenes读取数据这意味着你必须让这个相对路径指向真实数据所在位置。在AutoDL上数据盘通常挂载在/root/autodl-tmp所以我在实例上创建了一个软链接cd /root/autodl-tmp/BEVFormer mkdir -p data ln -s /root/autodl-tmp/nuscenes ./data/nuscenes如果数据在网盘解压出来的目录结构是嵌套的比如多了一层nuscenes/nuscenes软链之后一定要检查ls ./data/nuscenes确认能看到v1.0-trainval、maps这些目录而不是再套一层。这个错误我在第一次部署时遇到过害得create_data.py直接报FileNotFoundError。3.3 数据检查用小脚本验证加载官方给的流程里第二步就是生成pkl数据信息文件python tools/create_data.py nuscenes --root-path ./data/nuscenes --out-dir ./data/nuscenes --extra-tag nuscenes --version v1.0-trainval --canbus ./data/nuscenes/can_bus这条命令会遍历所有样本生成nuscenes_infos_train.pkl和nuscenes_infos_val.pkl。执行时间大约需要30-60分钟取决于数据集位置和机器IO性能。这里有个经验提醒执行前确认磁盘剩余空间足够因为pkl文件本身可能很大而且中间会生成临时的nuscenes_infos_temporal.pkl它比普通pkl更大因为包含了前后帧的token信息用于时序建模。等待过程中可以检查一件事终端里打印的帧数是否和官方数据一致train应该约28130条val约6019条。如果数量明显不对基本都是传感器数据缺失导致的部分样本被跳过那就回头检查数据完整性不要急着往下走。4. 训练实操配置文件修改、启动命令、显存与评估4.1 配置文件重点参数BEVFormer的配置文件在configs/bevformer/bevformer_base.py。这个配置文件有600多行但你真正需要改的其实没几个地方queue_length默认是4表示时序建模的帧数值越大记忆越久但显存占用越高。batch_size在data.train_dataloader里默认是2。我用4090单卡跑base版2是安全值如果想上4建议打开gradient checkpointing且降低queue_length。max_epochs默认24官方论文里也是24个epoch后模型收敛最好。load_from如果是从头训练这里保持None如果做微调则填预训练权重的路径。work_dir日志和权重保存路径我建议改成绝对路径比如/root/autodl-tmp/BEVFormer/work_dirs/bevformer_base方便断点续训时查找。这里特别解释一下queue_length这个参数的作用。BEVFormer的时间自注意力就是在处理一个长度为queue_length的历史BEV特征序列结合当前帧特征一起做attention。这个值太小时序信息不足模型对遮挡目标检测能力会下降太大显存占用直线上升而且对速度目标容易产生拖影。官方Base模型在4这个值下是个均衡点。4.2 分布式训练启动与日志解读配置好之后启动训练最简单的方式是单机多卡或单卡bash tools/dist_train.sh configs/bevformer/bevformer_base.py 1后面的1代表使用1块GPU。如果是多卡改成对应卡数同时确认CUDA_VISIBLE_DEVICES已经设置好。AutoDL实例默认把GPU暴露为0号直接跑即可。训练过程中的输出大概长这样----------------------------------------------------------------------------------------------------------------------------- | NdS | mAP | mATE | mASE | mAOE | mAVE | mAAE | Car | Truck | Bus | Trailer | ... -----------------------------------------------------------------------------------------------------------------------------这是每个epoch结束后在验证集上的评估结果。前几个epoch mAP会非常低0.01甚至0都有可能不用紧张BEVFormer大概要到第8-10个epoch才开始明显上升到第20个epoch左右趋于稳定。我自己训练到第24个epoch时NDS大约在0.41到0.44之间mAP在0.36左右受随机种子和queue_length微调影响会有一些浮动。如果看到loss变成NaN第一反应是学习率设太高或者数据有异常先降低lr到默认值以下比如从2e-4调到1e-4再检查一下pkl里有没有空标注的异常帧。4.3 显存优化与checkpoint管理BEVFormer-base在batch size2时的显存占用大约在18到21GB如果显存不够优先打开gradient checkpointing在配置文件里找到model dict( ... use_grid_maskTrue, ... )添加checkpointTrue,具体做法是在model里的对应模块主要是encoder和decoder设置with_cpTrue或者直接用环境中已有的bevformer_base.py变体配置。这个操作会把部分计算图重算训练时间大约增加15%到20%但显存能降到14GB左右。另一个技巧是开启自动混合精度AMPbash tools/dist_train.sh configs/bevformer/bevformer_base.py 1 --amp不过官方源码里AMP支持和部分自定义算子有兼容问题如果训练中途出现loss梯度异常建议关掉AMP回归FP32。checkpoint方面默认配置是每个epoch存一个epoch_*.pth。我建议不要手动删得太勤至少保留最近三个epoch的权重因为后面画曲线、做消融实验都会需要不同阶段的模型。AutoDL的数据盘容量一般有50GB存BEVFormer的checkpoint绰绰有余但如果同时存了多个预训练权重和解压后的数据记得定期清理临时文件。5. 常见问题与排查技巧实录5.1 高频报错与解法速查表我把部署和训练过程中被问了无数遍的报错信息整理成了一张表基本覆盖了从环境配置到训练异常的大部分情况。报错信息可能原因解决办法ModuleNotFoundError: No module named mmcv._extmmcv-full未正确安装或与PyTorch版本不匹配删除当前mmcv用mim install mmcv-full1.4.0重新安装确保与PyTorch版本对应KeyError: bevformerprojects目录未加入PYTHONPATH或者mmdet3d版本不对在BEVFormer根目录运行训练命令或export PYTHONPATH/root/autodl-tmp/BEVFormer:$PYTHONPATHFileNotFoundError: data/nuscenes/nuscenes_infos_train.pkl未生成pkl或数据路径软链错误检查data/nuscenes软链接重新执行create_data.pyRuntimeError: CUDA out of memory显存不足降低batch size、打开gradient checkpoint、降低queue_length或者换更大显存的实例ValueError: box q is NaN或 loss为NaN数据异常或学习率过大检查pkl生成过程中是否有异常帧降低学习率关闭AMPAttributeError: NoneType object has no attribute shape某个sensor数据缺失或路径损坏检查对应帧的sensor数据是否完整重新解压损坏文件error: command gcc failed编译mmdet3d时缺少系统依赖安装gcc编译套件apt-get install build-essentialSegmentation fault在评估阶段某些numpy或mmcv算子与cuda版本不兼容纯cpu验证集评估也可能触发尝试退出所有进程、清空显存后再跑5.2 排查方法论与避坑心得在我被BEVFormer折腾到几乎放弃的过程中总结出了三条很实用的排查心得第一条先跑demo再跑训练。不要一上来就启动完整训练环境问题在几十秒内就能让你白白浪费一个小时的GPU机时。先把源码目录下自带的demo流程跑一遍比如在projects/mmdet3x_plugin里可能会有简单的from_ckpt推理脚本或者直接用官方权重跑一次可视化验证。只有推理通了才说明模型结构、权重加载、数据预处理链路都是通的训练才不会有隐藏雷。第二条善用AutoDL的“无卡模式”。AutoDL支持无卡开机这个模式下不扣GPU费用只收少量CPU内存费。环境配置、数据拷贝、pkl生成、配置文件检查都在无卡模式下做全部准备妥了再切换成有卡模式正式训练。这个过程看起来不起眼但长期看能省下不少钱尤其当环境调试需要反复重启的时候。第三条学会看log而不是看心情。BEVFormer的work_dirs里会输出log.txt和log.jsonjson文件可以直接用pandas.read_json读取画loss曲线。但有一点要注意如果训练中途崩溃重启log会被覆盖所以崩溃前把旧的log复制一份存档。我习惯隔一段时间就cp -r work_dirs work_dirs_backup避免最后想看训练过程曲线时傻眼了。最后再分享一个非常适合AutoDL场景的小技巧如果你的磁盘空间紧张可以在解压Nuscenes数据后把压缩包删掉或者移到冷的存储盘上。这个数据集解压后体积比压缩包大很多别让压缩包白白占着空间。另外数据拷贝最怕的就是源文件本身损坏拷贝完做个简单的MD5校验或者挑几个samples目录下的大文件比对大小能省去之后看着训练loss异常却不知道数据已经烂了的尴尬。如果按照上述流程操作环境搭建加数据准备大约需要半天训练过程根据显卡不同需要一到三天。等训完第一版base模型你就可以开始尝试修改backbone、加深encoder层数、调整时序长度或者把BEVFormer迁移到自己的数据集上做适配了。这个过程中最有价值的不是最终的NDS数字而是你把整套现代BEV感知训练链路彻底打通的经验这比看十篇论文都管用。
返回列表