1. 环境准备:Ubuntu22.04的适配挑战
Ubuntu22.04作为长期支持版本,默认搭载的软件栈较新,这在带来性能提升的同时也埋了不少坑。我最近在RTX 3090显卡上部署OpenPcDet时就遇到了g++版本冲突、CUDA兼容性等问题。先说显卡驱动,虽然系统自带的驱动管理器能一键安装,但要注意两点:第一,通过nvidia-smi显示的CUDA Version只是驱动支持的最高版本,不代表已安装CUDA;第二,Ubuntu22.04默认的g++-11会导致后续编译失败。
降级g++的操作需要特别注意顺序:
sudo apt-get install gcc-7 g++-7 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 9 sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 9执行后务必用gcc --version确认当前版本。我在三台不同配置的机器上测试发现,如果漏掉优先级设置(最后的数字9),系统仍可能默认使用g++-11。
CUDA 11.3的安装包从NVIDIA官网下载经常断连,这里分享个实测可用的国内镜像:
wget http://mirrors.ustc.edu.cn/nvidia-cuda/ubuntu2204/x86_64/cuda-repo-ubuntu2204_11.3.0-1_amd64.deb sudo dpkg -i cuda-repo-ubuntu2204_11.3.0-1_amd64.deb安装时务必取消勾选Driver选项!环境变量配置有个易错点:如果同时存在多个CUDA版本,建议在.bashrc里用绝对路径指定:
export PATH="/usr/local/cuda-11.3/bin:$PATH" export LD_LIBRARY_PATH="/usr/local/cuda-11.3/lib64:$LD_LIBRARY_PATH"2. OpenPcDet的依赖迷宫
创建conda环境时python版本选择很关键。虽然OpenPcDet官方支持3.6-3.8,但在Ubuntu22.04上实测3.8最稳定。有个隐蔽的坑是requirements.txt里的torch版本问题,直接安装会导致CUDA 11.3不兼容。我的解决方案是:
- 先删除requirements.txt里的torch相关行
- 用官方命令安装指定版本:
pip install torch==1.11.0+cu113 torchvision==0.12.0+cu113 --extra-index-url https://download.pytorch.org/whl/cu113spconv的安装堪称最大拦路虎。官方推荐的spconv-cu113在某些环境下会报THC/THC.h错误,这时需要手动编译:
git clone https://github.com/traveller59/spconv.git cd spconv && git checkout v2.1.21 python setup.py bdist_wheel编译过程可能遇到ninja报错,在setup.py中找到BuildExtension,添加参数use_ninja=False即可。
可视化工具mayavi的安装也有讲究,正确的顺序应该是:
pip install vtk==9.0.1 pip install mayavi==4.7.3新版本会导致渲染异常,这个组合在Ubuntu22.04上亲测可用。
3. KITTI数据集实战
数据集目录结构最容易出错。正确的组织方式应该是:
OpenPCDet ├── data │ ├── kitti │ │ ├── ImageSets │ │ ├── training │ │ │ ├── calib │ │ │ ├── velodyne │ │ │ ├── label_2 │ │ ├── testing │ │ │ ├── calib │ │ │ ├── velodyne常见错误是漏掉ImageSets文件夹,或者velodyne数据未解压。数据处理阶段有个关键命令:
python -m pcdet.datasets.kitti.kitti_dataset create_kitti_infos tools/cfgs/dataset_configs/kitti_dataset.yaml如果报numpy.bool错误,需要修改代码中的np.bool为bool。训练时建议先用小批量测试:
python train.py --cfg_file ./cfgs/kitti_models/pointpillar.yaml --batch_size 2 --epochs 5等确认能跑通后再加大batch_size。我在RTX 3090上实测pointpillar模型的合适batch_size是6。
可视化环节要注意demo.py的路径处理:
points = np.fromfile(bin_path, dtype=np.float32).reshape(-1,4) # KITTI用44. nuScenes-mini的差异化处理
nuScenes-mini虽然数据量小,但预处理流程更复杂。目录结构要注意版本后缀:
OpenPCDet ├── data │ ├── nuscenes │ │ ├── v1.0-mini │ │ │ ├── samples │ │ │ ├── sweeps │ │ │ ├── maps │ │ │ ├── v1.0-mini数据处理命令与KITTI不同:
python -m pcdet.datasets.nuscenes.nuscenes_dataset --func create_nuscenes_infos \ --cfg_file tools/cfgs/dataset_configs/nuscenes_dataset.yaml \ --version v1.0-mini这个过程可能耗时30分钟以上,建议用tmux后台运行。配置文件需要手动修改两处:
- 将
VERSION: 'v1.0-trainval'改为v1.0-mini DATA_PATH要指向正确的绝对路径
训练时遇到的最大坑是显存溢出。即使使用mini数据集,batch_size也不宜超过2:
python train.py --cfg_file ./cfgs/nuscenes_models/cbgs_pp_multihead.yaml --batch_size 2多卡训练需要特别注意分布式参数:
CUDA_VISIBLE_DEVICES=0,1 python -m torch.distributed.launch --nproc_per_node=2 train.py \ --cfg_file ./cfgs/nuscenes_models/cbgs_pp_multihead.yaml --launcher pytorch5. 避坑指南与性能优化
环境变量冲突是常见问题。如果遇到libcudart.so找不到,可以尝试:
sudo ldconfig /usr/local/cuda-11.3/lib64训练过程中的内存泄漏往往来自spconv,监控GPU内存使用很关键:
watch -n 1 nvidia-smi对于KITTI数据集,数据增强策略很关键。在pointpillar.yaml中建议修改:
DATA_AUGMENTOR: DISABLE_AUG_LIST: ['placeholder'] AUG_CONFIG_LIST: - NAME: gt_sampling USE_ROAD_PLANE: True DB_INFO_PATH: - kitti_dbinfos_train.pkl PREPARE: { filter_by_min_points: ['Car:5', 'Pedestrian:5', 'Cyclist:5'], filter_by_difficulty: [-1], }nuScenes的评估指标需要特别注意。在验证集上测试时,修改配置文件的TEST部分:
TEST: EVAL_METRICS: ['car_ap', 'pedestrian_ap', 'bicycle_ap'] MAP_POINTS_CLOUD_RANGE: [-50, -50, -5, 50, 50, 3]最后提醒一个隐蔽的版本陷阱:PyTorch 1.12+会导致spconv的SparseModule报错,必须回退到1.11.0。如果已经误升级,可以尝试:
pip install --force-reinstall torch==1.11.0+cu113