我先把 真实可装通的版本矩阵 查清楚,重点核对三件事: mmrotate↔mmdet↔mmcv 的代码断言、 torch/cu121 对应的 mmcv 预编译轮子、以及 numpy/opencv 的已知坑。
已经确认到关键点了: 不是 CUDA 12.1 不行,而是你之前那组版本把自己卡在了 mmrotate<=3.2.0 与 mmdet 3.1.0 要求 mmcv<2.1.0 的交叉死角里。 最直接的解法不是继续往 3.1.0 回退,而是把 mmdet 提到 3.2.0 ,这样它对 mmcv 的上限变成 <2.2.0 ,就能和 mmcv 2.1.0 对上。 raw.githubusercontent.com+2raw.githubusercontent.com+2
有, 完整可装通的方案 我给你收窄成一套了。你现在最该走的是:
结论
不要再用 :
mmdet==3.1.0 + mmcv==2.1.0
因为 mmdet 3.1.0 的源码断言明确要求 mmcv < 2.1.0 。
也不要再用 :
mmdet==3.3.0GitHub+2GitHub+2 卡在 3.2.0 。同时,它对mmcv的上限是 2.1.0 。更关键的是,mmrotate的实际断言代码对mmdet==3.2.0和mmcv==2.1.0是 允许的 ;只是报错字符串里把上限文字写成了< 3.2.0,这和断言本身不完全一致。 GitHub 现在这条 CUDA 12.1 路线下,最稳的闭环是:
推荐版本矩阵
- Linux :Ubuntu 22.04 LTS
- Python :3.10
- PyTorch :2.1.2
- CUDA runtime :cu121
- NumPy : 1.26.4
- MMEngine :0.10.3
- MMCV : 2.1.0
- MMDetection : 3.2.0
- MMRotate :
dev-1.x源码 editable 安装
这组版本能把三方约束闭合起来:
mmrotate 允许 mmdet<=3.2.0 、 mmcv<=2.1.0 ; mmdet 3.2.0 允许 mmcv<2.2.0 ,因此和 mmcv 2.1.0 是相容的。 GitHub+2GitHub+2
为什么这组比你之前那组稳
你之前爆掉的根因不是 CUDA 12.1,而是:
1. mmdet 3.1.0 把 mmcv 2.1.0 排除了
mmdet v3.1.0 的源码里写的是:
mmcv >= 2.0.0rc4mmcv < 2.1.0
所以你装到 mmcv==2.1.0 一定会被它拒绝。 GitHub+1 2. mmrotate 又不允许你随便升到 mmdet 3.3.0
mmrotate dev-1.x 的源码断言把 mmdet 上限卡在 3.2.0 。 GitHub 3. mmdet 3.2.0 正好把这个结打通
mmdet 3.2.0 的源码要求:
mmcv >= 2.0.0rc4mmcv < 2.2.0
因此 mmcv==2.1.0 正好落在允许区间。 GitHub+1
还要不要坚持 mmcv 2.0.x
在你这条 torch 2.1 + cu121 路线上,我 不建议强行追 mmcv 2.0.x 了。
原因很实际:
- OpenMMLab 当前公开的
cu121 / torch2.1下载索引页面列出了mmcv 2.1.0和2.2.0的预编译 wheel。 OpenMMLab CV 官方文档明确说:如果安装时不是下载.whl,而是掉到.tar.gz,通常就说明当前组合 没有对应预编译包 ,接下来会进入源码构建。 MMCV cu121 + torch2.1 下,继续死磕mmcv 2.0.x,大概率会把你重新带回: - 没有 wheel
- 现场编译
- 环境继续被拖脏
而 mmdet 3.2.0 + mmcv 2.1.0 正好绕开这个坑。 OpenMMLab+1
NumPy 和 OpenCV 怎么定
NumPy
你当前这条线是 PyTorch 2.1.2 。PyTorch 官方 issue 明确写了:
- PyTorch <= 2.1 与 NumPy 2 可以共存,但
.numpy()/from_numpy()这类功能只有在 NumPy < 2.0 时才完全正常; - 对这类用户,最稳妥就是用 NumPy 1.x 。 GitHub 里直接锁:
numpy==1.26.4OpenCV
MMCV 官方文档说明:
- 有 CUDA 时建议装完整
mmcv - 不要把
mmcv和mmcv-lite混装 - 如果你想用
opencv-python-headless,要 先装它 ,这样可以跳过opencv-python。 MMCV 务器环境我建议直接:
opencv-python-headless==4.9.0.80这样比 GUI 版更干净。 MMCV
不要在旧环境上修,直接新建干净环境
你前面已经被多轮安装污染过了。
现在最稳的是 重新建环境 ,不要在旧 mmrotate 环境里继续修。
可直接执行的完整安装方案
下面这套是我建议你直接用的。
1)新建环境
conda create -n mmrotate_fix python=3.10 -y
conda activate mmrotate_fix2)先把 pip 基础工具升一下
python -m pip install -U pip setuptools wheel3)安装 PyTorch 2.1.2 + cu121
pip install torch==2.1.2 torchvision==0.16.2 torchaudio==2.1.2 \
--index-url https://download.pytorch.org/whl/cu121PyTorch 官方提供历史版本安装入口,这组版本是标准可装组合。 PyTorch 4)先锁死 NumPy 和 headless OpenCV
pip install numpy==1.26.4 opencv-python-headless==4.9.0.805)装 MMEngine
pip install mmengine==0.10.3mmdet 3.2.0 和 mmrotate 1.x 对 mmengine 的上限都是 <1.0.0 , 0.10.3 在允许范围内。 GitHub+1 6) 显式从 cu121/torch2.1 wheel 源装 MMCV 2.1.0
这一句很关键,不要再让 mim 自己乱解:
pip install mmcv==2.1.0 \
-f https://download.openmmlab.com/mmcv/dist/cu121/torch2.1/index.htmlcu121 / torch2.1 的公开索引页面明确列出了 mmcv-2.1.0 的 Linux wheel。 OpenMMLab 7)安装 MMDetection 3.2.0
pip install mmdet==3.2.0因为 mmdet 3.2.0 允许 mmcv < 2.2.0 ,所以这一步不会再把 mmcv 2.1.0 判死。 GitHub+1 8)源码安装 MMRotate,但 不要让它再解依赖
git clone -b dev-1.x https://github.com/open-mmlab/mmrotate.git
cd mmrotate
pip install -v -e . --no-deps--no-deps 是为了防止这一步重新把你前面已经锁好的依赖改乱。
装完立即做的验证
A. 基础导入验证
python -c "import torch; print(torch.__version__, torch.version.cuda, torch.cuda.is_available())"
python -c "import numpy; print(numpy.__version__)"
python -c "import cv2; print(cv2.__version__)"
python -c "import mmcv, mmengine, mmdet, mmrotate; print(mmcv.__version__, mmengine.__version__, mmdet.__version__, mmrotate.__version__)"你最后一行应该看到的核心结果是类似:
2.1.0 0.10.3 3.2.0 1.0.0rc1B. 检查是不是装成了错误的 mmcv-lite
python -c "import mmcv; print(mmcv.__file__)"如果后面再报 mmcv._ext 之类问题,首先怀疑的是:
- 装成了
mmcv-lite - 或环境里同时有
mmcv和mmcv-lite
而 MMCV 官方文档明确说了 不要混装 。 MMCV
如果还报错,优先看哪三类
1. AssertionError: MMCV==… incompatible
说明版本没锁住。
重点检查:
pip show mmcv mmdet mmrotate mmengine只要不是:
mmcv 2.1.0mmdet 3.2.0mmrotate dev-1.x / 1.0.0rc1
就说明有包被改写了。
2. ModuleNotFoundError: mmcv._ext
这通常不是你代码问题,而是:
- 装到了
mmcv-lite - 或 wheel 没装对
- 或环境里有双版本残留
MMCV 文档对这类风险有明确提醒。 MMCV 3. A module that was compiled using NumPy 1.x cannot be run in NumPy 2.x
这时不要再查模型代码,先把 NumPy 拉回:
pip install "numpy<2" --force-reinstall因为对 PyTorch 2.1.x ,这是已知兼容边界。 GitHub
我不建议你现在再用的安装方式
不建议 1:宽泛版本
mim install "mmdet>=3.0.0rc2"这个范围太宽,容易直接装到 3.3.0 ,而 mmrotate 不接受。 GitHub 不建议 2:继续拿 mmdet 3.1.0 配 mmcv 2.1.0
这是明确冲突。 GitHub+1 不建议 3:在脏环境上补丁式修复
你现在最怕的不是“再装一次”,而是 环境状态不可解释 。
新环境重装,远比在旧环境里拔河省时间。
备选方案
如果你 必须 用 mmdet 3.1.x ,那就得把 mmcv 压到 <2.1.0 。
但在你当前 cu121 + torch2.1 路线上,这往往会让你更容易掉进 mmcv 2.0.x 的源码构建坑里。MMCV 官方文档已经说明:没有对应 wheel 时,会退化成源码包安装。 MMCV 你现在这个目标, 首选还是 mmdet 3.2.0 + mmcv 2.1.0 。
最后一版可执行答案
你要的“完整版本方案”,就是这组:
Python 3.10
torch 2.1.2
torchvision 0.16.2
torchaudio 2.1.2
CUDA cu121
numpy 1.26.4
opencv-python-headless 4.9.0.80
mmengine 0.10.3
mmcv 2.1.0
mmdet 3.2.0
mmrotate dev-1.x (editable, --no-deps)这组不是拍脑袋,是把:
mmrotate源码断言mmdet 3.2.0源码断言cu121/torch2.1的mmcvwheel 可用性PyTorch 2.1对NumPy 2的兼容边界
一起闭合出来的。 GitHub+3GitHub+3GitHub+3 现在环境里 pip show mmcv mmdet mmengine mmrotate numpy opencv-python opencv-python-headless 的输出贴给我,我可以直接帮你判断要不要重建,还是能原地抢救。