ARTICLE DETAIL

资讯详情

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

mmdet3d环境配置全攻略:PyTorch与CUDA版本匹配及常见报错排查

mmdet3d环境配置全攻略:PyTorch与CUDA版本匹配及常见报错排查 如果你是在深度学习领域干活的人尤其碰过3D视觉、自动驾驶感知或者点云相关的项目那么对mmdet3d这个名字一定不陌生。它是OpenMMLab家族里专门做3D目标检测的库支持单目、双目、纯点云和多模态融合检测像SECOND、PointPillars、CenterPoint、PV-RCNN这些经典模型都包含在内。相比自己从零搭建训练和推理流程基于mmdet3d确实能省掉大量重复造轮子的工作。但话说回来mmdet3d的环境配置在整个OpenMMLab系列里绝对算是最折腾的。PyTorch、CUDA、mmcv、mmdet3d这几个东西版本错一个编译就能让你怀疑人生。我前前后后帮实验室同事和不少网友排查过安装问题踩过的坑基本都摸了一遍。这篇文章就把我自己反复验证过的安装配置流程、版本搭配和各类报错的解决办法一次性写清楚。如果你只是跑一下官方demo或者打算在自己的数据集上做微调训练这篇文章都能直接用。内容可能有点长但我尽量把每个容易出错的地方都标注出来省得你再走弯路。1. 环境配置的核心思路与版本挑选逻辑1.1 为什么mmdet3d的版本匹配这么让人头疼先搞清楚mmdet3d在环境层面的依赖关系后面安装的时候你心里就有底了。简单来说模型训练框架的核心链条是CUDA驱动 - CUDA Toolkit - PyTorch - mmcv - mmdet3d每一层都对下一层有严格的要求。比如PyTorch在编译时就绑定了特定版本的CUDA Toolkit而mmcv在编译时又绑定了特定版本的PyTorch。如果你拿着PyTorch 2.0去配mmcv 1.6大概率会碰到编译报错或者运行时直接崩。另外一点很关键mmdet3d依赖的很多算子是通过CUDA扩展实现的这就意味着你必须安装与自己的CUDA版本、PyTorch版本匹配的mmcv版本。不能想装哪个版本就装哪个版本必须去查官方提供的版本对应表。我自己的原则很简单先定PyTorch版本然后反推其余所有依赖版本全程用conda管理绝不混装。1.2 版本选择推荐的组合方案不同时间点安装合适的版本组合可能略有差异。但截至我写这篇文章时的实测经验最稳妥的组合是组件推荐版本备注Ubuntu20.04 或 22.04Windows也能装但坑多建议先用UbuntuPython3.8 或 3.93.10在某些依赖上还有小毛病CUDA Toolkit11.7 或 11.8看显卡驱动和PyTorch匹配情况PyTorch1.13 或 2.0目前1.13和2.0都很成熟mmcv2.0.0 或 2.1.0配套PyTorch 2.0mmdet3d1.4.0这个版本比较成熟资料也多spconv2.3.6编译安装比较久耐心等如果完全不知道选什么版本直接照抄上面这表格出问题的概率最低。这里额外提醒一句不要在一台机器上折腾多套CUDA Toolkit很容易把系统环境搞乱。最好在系统层面只保留显卡驱动具体用哪个CUDA版本完全由conda环境里的PyTorch决定。2. 从零开始的完整安装步骤2.1 第一步创建干净的conda环境很多人在环境配置中途翻车问题不是出在某一步装错了而是从一开始就在base环境里乱装。base环境里往往有各种互相冲突的依赖包装到一半报错根本查不出原因。所以无论如何先建一个干净的环境再说。conda create -n mmdet3d python3.8 -y conda activate mmdet3d激活环境后顺手把pip的源换成国内镜像速度会快非常多。我在清华源和阿里源之间来回换过建议两个都配上pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple2.2 第二步安装对应版本的PyTorch有了干净的conda环境后下一步就是安装PyTorch。这一步的版本选择直接决定了后面所有依赖的版本范围。以CUDA 11.8 PyTorch 2.0.1为例命令是conda install pytorch2.0.1 torchvision0.15.2 torchaudio2.0.2 pytorch-cuda11.8 -c pytorch -c nvidia装完后一定要先验证PyTorch能不能正常调用GPUpython -c import torch; print(torch.__version__); print(torch.cuda.is_available())如果输出的是True说明PyTorch和CUDA的链路是通的。这一步没通过后面装啥都是白搭先解决这个问题再做下一步。有个细节值得注意有些显卡驱动比较老可能不支持太新的CUDA版本。你可以用nvidia-smi查看驱动支持的最高CUDA版本理论上只要驱动支持的版本不低于你安装的CUDA版本就行。2.3 第三步安装mmcv和mmengine这是整个配置过程中最容易报错的地方因为mmcv有两种安装方式预编译wheel和源码编译。绝大多数人只需要用预编译wheel就足够了根本没必要源码编译。确定PyTorch版本后在OpenMMLab官方提供的索引地址里找到对应的wheel包安装pip install mmengine0.10.1 pip install mmcv2.1.0 -f https://download.openmmlab.com/mmcv/dist/cu118/torch2.0/index.html上面的URL路径中cu118对应CUDA 11.8torch2.0对应PyTorch 2.0要与你实际环境严格匹配。装mmcv时如果你看到编译过程一直在走甚至跑了几分钟还没结束那就说明你装的不是预编译版本而是从源码开始编译。这通常意味着没有匹配到对应的wheel包。我的建议是如果几分钟内装不完就检查URL里的CUDA和PyTorch版本有没有写错然后重来。一个很实用的验证方法python -c import mmcv; from mmcv.ops import get_compiling_cuda_version; print(get_compiling_cuda_version())只有能正常输出CUDA版本号mmcv才算真正装好。如果报错找不到某个so文件或者提示undefined symbol多半是PyTorch和mmcv版本不匹配。2.4 第四步安装spconv稀疏卷积库3D点云处理中稀疏卷积是核心操作spconv就是负责这个的。这个库安装比较慢而且容易出现编译问题。安装它的方法很简单pip install spconv-cu1182.3.6注意cu118要和你之前安装的CUDA版本对应。如果你的CUDA是11.7就找cu117的版本这个命名规则很好理解。如果你需要跑CenterPoint这类模型spconv是必须的如果只是用PointPillars或者简单的单目模型很多场景下可以不装但既然都配环境了我建议还是顺手装上防止后面跑模型时临时报错。spconv这里有个常见的麻烦如果你之前装过spconv后来又装spconv-cu118两者会覆盖冲突导致import时直接段错误。我自己遇到过两次排查到最后发现就是两个包混装了卸干净重装就好。2.5 第五步安装mmdet3d本体mmdet3d有源码安装和pip安装两种方式。如果只是使用现成模型和训练脚本pip安装就够了pip install mmdet3d1.4.0但如果你要改模型结构、加新算子建议用源码方式安装。源码方式也不复杂就是clone代码然后本地模式安装git clone https://github.com/open-mmlab/mmdet3d.git cd mmdet3d pip install -v -e .-e参数表示源码模式安装这样你修改仓库里的任何代码都能立即生效不用每次重新安装。这对我们做研究和调优的人来说非常关键因为改模型结构后不需要反复pip install。2.6 第六步验证mmdet3d是否安装成功装完所有依赖后最后一关是验证整体是否可用。用官方自带的一个demo来验证是最稳妥的办法具体方法是下载一个预训练模型和测试点云数据然后跑一次推理。python tools/test.py configs/pointpillars/pointpillars_hv_secfpn_8xb6-160e_kitti-3d-3class.py \ checkpoints/pointpillars_hv_secfpn_8xb6-160e_kitti-3d-3class.pth \ --show-dir results或者更简单的方式直接在Python里验证关键的包能不能正常导入python -c import mmdet3d; print(mmdet3d.__version__)如果输出正常说明mmdet3d本体没问题。但别急这只是第一层验证我建议再做一个稍微复杂一点的测试确保mmdet3d和mmcv之间真正打通了python -c from mmdet3d.ops import Voxelization; print(Voxelization op loaded)这一步通过才能说明顶层算子的CUDA扩展都能正常加载。3. 实操过程中最常见的报错与排查实录3.1 报错ModuleNotFoundError: No module named mmcv._ext这个报错太经典了。网上搜这个错能搜出大把帖子原因就一个mmcv没有编译成功或者版本与PyTorch不匹配。排查思路分三步走确认PyTorch版本和CUDA版本是否已经匹配在终端跑nvidia-smi和python -c import torch; print(torch.__version__, torch.version.cuda)看看输出确认安装mmcv时用的是正确的wheel索引URL再检查cu118/torch2.0这两个字段是否与你实际情况一致如果上面都对把mmcv卸了重新装一遍装完立刻验证这个报错的本质是C扩展没有被正确编译。PyTorch 2.0以上版本要求mmcv必须使用对应的新版本不能用旧版硬凑。3.2 报错undefined symbol: _ZN2at10ArrayBase...这个报错看起来像是链接问题实际原因往往是mmcv的编译版本和PyTorch运行版本不一致。比如mmcv是用PyTorch 1.13编译的但现在环境里跑的是PyTorch 2.0那C层面的API签名对不上就会出现undefined symbol。检查你当前环境中PyTorch的版本和mmcv的编译信息python -c import torch, mmcv; print(torch.__version__); from mmcv.ops import get_compiler_version; print(get_compiler_version())如果两者对不上不要手动去改什么环境变量那都是治标不治本。直接重新安装匹配版本的mmcv才是正解。3.3 报错spconv编译失败spconv的Windows安装尤其痛苦动不动就报visual studio toolset not found或者C compile failed。所以我的建议是尽量在Linux上操作包括WSL也比Windows原生环境省心。如果是Linux上编译失败常见原因有这几个gcc版本过高比如Ubuntu 22.04默认的gcc 11和某些老版本spconv不兼容缺少依赖库比如libboost-all-dev解决方案sudo apt update sudo apt install libboost-all-dev然后重新pip安装spconv。如果还有问题可以尝试降低gcc版本sudo apt install gcc-9 g-9 export CCgcc-9 CXXg-93.4 报错CUDA out of memory这个报错看似是硬件资源问题但很多时候是环境配置带来的隐性显存开销过大mmcv编译成了debug模式导致算子运行时额外占用显存显存碎片化严重导致明明总量够却分配失败batch size设置过大我的建议是先把batch size调到1显存不够时优先调整voxel_size和point_cloud_range这两个参数对显存影响极大。另外检查一下mmcv是不是debug模式编译的如果是就重装release版。排查显存问题时在代码里加入print(torch.cuda.memory_summary())这样可以把当前显存占用情况完整打印出来找到真正吃显存的模块。3.5 报错gt_boxes相关错误或训练loss异常这个问题不像前面几个是环境层面更多是数据集配置问题但我发现很多人环境配置好以后第一次训练就卡在这里所以也一并说了。这类错误多数是数据集中标注格式和模型配置不一致导致的。比如KITTI数据集的类别顺序和模型配置里的CLASSES列表不一致或者点云范围point_cloud_range没有对应上。解决思路是打开模型配置文件找到CLASSES和point_cloud_range两个字段对比你的数据集标注顺序和范围逐项对上检查数据预处理部分有没有对点云做归一化或体素化如果做了就要同步调整模型配置里的对应参数3.6 实操心得新环境配置后首先要做的几个测试根据我自己的经验环境配好之后不要急着训练花10分钟做一套快速验证更稳妥python -c import torch; print(torch:, torch.__version__, torch.cuda.is_available()) python -c import mmcv; print(mmcv:, mmcv.__version__) python -c import mmdet3d; print(mmdet3d:, mmdet3d.__version__) python -c import spconv; print(spconv:, spconv.__version__)这四条命令全部通过基本可以放心进入训练阶段。如果哪一条报错就针对那一条去排查别回头看其他地方。4. 进阶在vscode和云服务器环境中配置的差别处理4.1 vscode远程连接服务器时的配置要点很多人习惯在本地vscode远程连服务器开发这样确实方便但环境中常出现一些奇怪区别。比如vscode的Python解释器没有选对conda环境导致装好的包全import不上。解决办法是在vscode里按CtrlShiftP输入Python: Select Interpreter选择与我们创建的mmdet3d环境对应的解释器路径。路径通常在~/miniconda3/envs/mmdet3d/bin/python。额外提醒vscode的终端里自动激活conda环境设置也最好提前配好不然每次开新终端都要手动conda activate各种操作容易出错。在.bashrc中加上conda activate mmdet3d是最省事的。4.2 云服务器和Docker环境配置的差异如果用的是云GPU服务器环境配置逻辑基本一致但要注意CUDA驱动版本。云服务器预装的驱动版本可能偏低装PyTorch之前必须先用nvidia-smi确认驱动支持的CUDA版本是否够用。至于Docker方式适合需要复现别人成果的场景。在官方镜像基础上做增量安装会省很多事FROM nvcr.io/nvidia/cuda:11.8.0-cudnn8-devel-ubuntu20.04 RUN apt update apt install -y git wget curl vim build-essential RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh \ bash Miniconda3-latest-Linux-x86_64.sh -b -p /opt/conda ENV PATH/opt/conda/bin:$PATH这样先把基础环境搞定再按照前面步骤逐层安装。4.3 多版本环境共存的管理建议很多人的实际状态是机器上还留着PyTorch 1.10的老环境或者有mmdetection的其他项目。那么不同项目环境和mmdet3d的环境如何共存推荐做法是每个项目单独建conda环境不要试图用一套环境搞定所有项目。实施细节在~/.conda/environments.txt里可以看到当前所有环境列表每个环境内的pip包彼此隔离不会互相干扰如果两个项目依赖同一个mmcv版本可以在各自环境里分别安装磁盘多占点但稳定根据我的经验多版本环境管理最怕的不是环境本身而是切换环境后忘记激活然后在错误的终端里执行了安装命令导致装到别的环境去了。每次安装包之前先跑conda info --envs确认当前环境这个习惯能避免大量返工。5. 环境配置过程中的版本匹配速查5.1 mmdet3d各版本对应依赖关系老规矩这张表是核心中的核心建议保存一份。我整理的对应关系如下mmdet3d版本PyTorch版本mmcv版本mmengine版本spconv版本1.0.01.8 - 1.13mmcv-full 1.6.x不需要2.x1.1.01.8 - 1.13mmcv-full 1.6.x不需要2.x1.3.01.8 - 2.0mmcv 2.x0.10.x2.3.x1.4.01.8 - 2.1mmcv 2.x0.10.x2.3.x注意从1.3版本开始mmdet3d切换到了mmengine框架这是OpenMMLab整体的一次大升级。所以如果你看网上的老教程用的是mmcv-full新资料用mmcv不要以为它们是同一个包两个完全不兼容。5.2 如何确认自己应该用哪个版本的组合如果你装新版mmdet3d报错了先问自己一个问题我到底需要的是新版本的功能还是只需要能跑起来如果只需要跑起来选择1.4.0是稳妥的。这个版本的资料最多各种模型配置文件和预训练权重都齐全出了问题搜一下基本都有答案。如果你需要最新模型或功能改进那就接受新版本的不稳定性做好自己调试的准备。新版本对Python版本的要求通常也会提高比如Python 3.9是基本要求还有可能有其他依赖调整。5.3 版本匹配表的保存与查询方式顺便分享一个我常用的查询技巧在OpenMMLab官网的install.md页面中可以找到当前mmlab所有库的版本兼容矩阵官方比起第三方教程靠谱得多。查找路径是打开对应库的GitHub仓库页面直接访问docs/install.md或者README.md底部的版本匹配表。安装前花30秒查一下这个表大部分坑都能提前绕开。6. 常见可视化工具及依赖配置环境配好了训练跑起来了接下来必然要碰到可视化问题。3D目标检测的可视化和2D不太一样这里顺便说几句实用内容。6.1 open3d和mayavi的安装3D检测结果可视化最常用的库是open3d和mayavi。open3d的安装很简单pip install open3dmayavi的依赖多一点需要vtk和qtpip install mayavimayavi在无显示器环境下比如纯ssh连接服务器会报错但可以通过指定offscreen渲染来解决。6.2 踩坑细节open3d和mmdet3d的版本兼容我在实际工作中发现open3d的版本可能会和某些mmcv版本产生冲突尤其是在import顺序上。当import open3d之后再import mmdet3d某些情况下会报libGL.so.1: cannot open shared object file的错误。遇到这个情况先确认系统装了OpenGL库sudo apt install libgl1 libglib2.0-0另外在代码里尽量先import mmdet3d再import open3d牺牲一点加载顺序可以减少不少莫名其妙的报错。6.3 结果可视化测试命令验证可视化环境时可以直接用mmdet3d自带的demo跑一个可视化的结果python demo/pcd_demo.py configs/pointpillars/pointpillars_hv_secfpn_8xb6-160e_kitti-3d-3class.py \ checkpoints/pointpillars_hv_secfpn_8xb6-160e_kitti-3d-3class.pth \ demo/data/kitti/kitti_000008.bin \ --show如果能看到3D边界框正确画出来说明可视化链路完整。如果出现黑屏或者闪退多半是open3d与显示器/显卡的兼容问题尝试设置如下环境变量export OPEN3D_CPU_RENDERINGtrue这种做法会强制open3d用CPU渲染而不是走GPU渲染虽然帧率会低一些但稳定性好很多服务器上尤其推荐。7. 训练自定义数据时的环境配置注意事项7.1 数据格式转换和依赖环境的关系环境配置不只是安装库的问题数据准备阶段也会暴露很多环境问题。比如KITTI格式转换到mmdet3d格式时需要用到pandas、numpy、scipy、plyfile等依赖库。这些在环境里默认没有最好一次性装齐pip install pandas scipy plyfile当你处理点云数据时尤其注意numpy的版本。numpy 1.24以上版本对部分旧代码不兼容有些mmdet3d旧版本模型在加载时会对numpy的np.float等别名报错。遇到这类问题降低numpy版本通常能解决pip install numpy1.23.57.2 数据集目录结构验证配置好环境后第一次跑自定义数据集通常会卡在数据路径不对的问题上。mmdet3d的数据集加载依赖于严格的目录结构├── data │ ├── kitti │ │ ├── ImageSets │ │ ├── training │ │ ├── testing如果目录结构不对加载数据时悄悄跳过或报错。解决方法是参考官方文档先下载最小的demo数据子集确认环境没问题后再上完整数据。7.3 训练脚本启动前要预检的几个配置项在正式训练之前我建议检查这几个关键配置文件配置里的data_root字段是否指向正确的数据目录配置里的class_names是否覆盖了你的所有类别input_modality字段需要用lidar还是camera和你准备的数据形式保持一致分布式训练的launcher参数单卡训练设为none多卡设为pytorch这些配置项哪怕有一个忽略训练起来要么报形形色色的数据错误要么在几十个epoch之后才发现模型性能完全不对那时候再排查就晚了。8. 我最常用的环境配置经验总结8.1 核心经验锁定版本不做尝鲜派在深度学习环境配置这件事上稳定远大于新鲜。PyTorch 2.1刚发布时我也跟着装过结果mmcv迟迟没有适配项目停滞了好几天。那次的教训让我彻底转变态度新环境配置一律以“能跑通稳定版本组合”为首要目标不追新。新版本等正式发布三个月以上再考虑升级。8.2 核心经验每次配置都做记录我后来养成了一个习惯每次配置环境都会把最终成功的安装命令保存成一个shell脚本比如setup_env.sh。这样无论是新机器还是帮同事配都直接执行脚本即可。这个脚本比任何文档都实在因为它记录的是你自己验证过能用的一整套顺序和版本。这里分享一个简化的脚本模板#!/bin/bash conda create -n mmdet3d python3.8 -y conda activate mmdet3d pip install torch2.0.1 torchvision0.15.2 --index-url https://download.pytorch.org/whl/cu118 pip install mmengine0.10.1 pip install mmcv2.1.0 -f https://download.openmmlab.com/mmcv/dist/cu118/torch2.0/index.html pip install spconv-cu1182.3.6 pip install mmdet3d1.4.0如果你照着这个顺序装完能正常运行说明你的环境是健康的。以后遇到问题也可以在这个脚本基础上做增量修改比起每次从头查文档高效得多。8.3 核心经验数据、代码、环境三者独立管理最后有一点心得值得单独说说。随着项目增多我强烈建议把环境配置、代码仓库、数据集分别管理在三块独立的空间。环境属于conda代码属于git仓库数据单独存放。这样无论哪一块出现问题都能把影响控制在局部不会牵一发动全身。我也见过一些同事数据和代码混在一起模型权重和缓存文件也都放在一起时间长了目录混乱不堪想清理都不知道该删哪些。保持目录的整洁和分离对整个项目的长期维护起到的帮助比想象中大得多。以上就是我在多次mmdet3d环境配置实战中总结出来的完整流程和关键踩坑点。从版本选择、安装顺序到各类报错的排查方法基本覆盖了从零到能跑训练的全过程。如果你按照前面的步骤操作正常情况下一到两小时内就能完成全部配置。万一遇到教程里没覆盖到的问题也欢迎交流毕竟环境配置这门手艺每台机器的脾气都不一样多交流才能少走弯路。
返回列表