我先把 真实可装通的版本矩阵 查清楚,重点核对三件事: mmrotate↔mmdet↔mmcv 的代码断言、 torch/cu121 对应的 mmcv 预编译轮子、以及 numpy/opencv 的已知坑。

已经确认到关键点了: 不是 CUDA 12.1 不行,而是你之前那组版本把自己卡在了 mmrotate<=3.2.0mmdet 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.0 GitHub+2GitHub+2 卡在 3.2.0 。同时,它对 mmcv 的上限是 2.1.0 。更关键的是, mmrotate 的实际断言代码对 mmdet==3.2.0mmcv==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
  • NumPy1.26.4
  • MMEngine :0.10.3
  • MMCV2.1.0
  • MMDetection3.2.0
  • MMRotatedev-1.x 源码 editable 安装

这组版本能把三方约束闭合起来:
mmrotate 允许 mmdet<=3.2.0mmcv<=2.1.0mmdet 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.0rc4
  • mmcv < 2.1.0

所以你装到 mmcv==2.1.0 一定会被它拒绝。 GitHub+1 2. mmrotate 又不允许你随便升到 mmdet 3.3.0
mmrotate dev-1.x 的源码断言把 mmdet 上限卡在 3.2.0GitHub 3. mmdet 3.2.0 正好把这个结打通
mmdet 3.2.0 的源码要求:

  • mmcv >= 2.0.0rc4
  • mmcv < 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.02.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.xGitHub 里直接锁:
numpy==1.26.4

OpenCV

MMCV 官方文档说明:

  • 有 CUDA 时建议装完整 mmcv
  • 不要把 mmcvmmcv-lite 混装
  • 如果你想用 opencv-python-headless ,要 先装它 ,这样可以跳过 opencv-pythonMMCV 务器环境我建议直接:
opencv-python-headless==4.9.0.80

这样比 GUI 版更干净。 MMCV

不要在旧环境上修,直接新建干净环境

你前面已经被多轮安装污染过了。
现在最稳的是 重新建环境 ,不要在旧 mmrotate 环境里继续修。


可直接执行的完整安装方案

下面这套是我建议你直接用的。

1)新建环境

conda create -n mmrotate_fix python=3.10 -y
conda activate mmrotate_fix

2)先把 pip 基础工具升一下

python -m pip install -U pip setuptools wheel

3)安装 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/cu121

PyTorch 官方提供历史版本安装入口,这组版本是标准可装组合。 PyTorch 4)先锁死 NumPy 和 headless OpenCV

pip install numpy==1.26.4 opencv-python-headless==4.9.0.80

5)装 MMEngine

pip install mmengine==0.10.3

mmdet 3.2.0mmrotate 1.xmmengine 的上限都是 <1.0.00.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.html

cu121 / 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.0rc1

B. 检查是不是装成了错误的 mmcv-lite

python -c "import mmcv; print(mmcv.__file__)"

如果后面再报 mmcv._ext 之类问题,首先怀疑的是:

  • 装成了 mmcv-lite
  • 或环境里同时有 mmcvmmcv-lite

而 MMCV 官方文档明确说了 不要混装MMCV

如果还报错,优先看哪三类

1. AssertionError: MMCV==… incompatible

说明版本没锁住。
重点检查:

pip show mmcv mmdet mmrotate mmengine

只要不是:

  • mmcv 2.1.0
  • mmdet 3.2.0
  • mmrotate 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.0mmcv 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.1mmcv wheel 可用性
  • PyTorch 2.1NumPy 2 的兼容边界

一起闭合出来的。 GitHub+3GitHub+3GitHub+3 现在环境里 pip show mmcv mmdet mmengine mmrotate numpy opencv-python opencv-python-headless 的输出贴给我,我可以直接帮你判断要不要重建,还是能原地抢救。