直接回答:DiffDock 装不上,最常见的两个原因是”新卡 + 旧 CUDA 栈”。 它的环境里有 openfold 这类需要现场编译的组件,而官方环境锁的是 PyTorch cu117 一线,所以在 RTX 40 系这样的新架构上,编译阶段就会失败。
三句话记住:
- 新卡不等于好装:
nvcc fatal : Unsupported gpu architecture 'compute_89'就是不支持新架构的编译错误; - 宿主机 CUDA 与 PyTorch 编译版本必须一致:报错会直接写
The detected CUDA version (12.0) mismatches the version that was used to compile PyTorch (11.7); - 这类软件优先用官方容器交付:DiffDock 官方提供 Dockerfile,不要在新卡上现场编译 openfold。
一、真实报错长这样(两条官方 issue)
报错 A:新卡编译失败 + CUDA 版本不匹配(gcorso/DiffDock#228,2024-05-24)
按官方 README 建环境,卡在 openfold 这一步,关键原文:
nvcc fatal : Unsupported gpu architecture 'compute_89'
RuntimeError: The detected CUDA version (12.0) mismatches the version that was used to compile PyTorch (11.7). Please make sure to use the same CUDA versions.
ERROR: Failed building wheel for openfold
三点判读:
compute_89= Ada 架构(RTX 40 系、L40 一类),说明报错者用的是新卡;- 两条原因互相独立又叠加:一是 nvcc 不支持新架构 → 编译不过;二是宿主机 CUDA 12.0 与 torch 的 cu117 不一致 → torch 的扩展构建直接拒绝;
- 这条 issue 至今没有官方结论(最后回复 2025-03-09),所以不要指望”照着文档改改就能过”。
报错 B:conda env create 第一步就失败(gcorso/DiffDock#44)
按 README 建环境,pip 阶段崩溃:
error: subprocess-exited-with-error
× python setup.py bdist_wheel did not run successfully.
╰─> [73 lines of output]
CondaEnvException: Pip failed
这条 issue 有 18 条评论——评论多通常说明撞的人多,属高频问题。
二、三个硬约束(装之前先核对)
| # | 约束 | 怎么查 | 不满足会怎样 |
|---|---|---|---|
| 1 | 卡的计算能力要与 CUDA 工具链支持的架构匹配 | nvidia-smi --query-gpu=name,compute_cap --format=csv |
Unsupported gpu architecture 'compute_89' |
| 2 | 宿主机 CUDA 版本要与 PyTorch 编译版本一致 | nvcc --version 对比 python -c "import torch; print(torch.version.cuda)" |
detected CUDA version (12.0) mismatches ... (11.7) |
| 3 | 需现场编译的组件能否编译成功 | 看报错卡在哪个包(PyG 系列扩展、openfold、prody 最容易) | Failed building wheel for openfold / CondaEnvException: Pip failed |
官方环境口径:PyTorch 1.13.1+cu117。
三、正确做法:容器优先
DiffDock 官方提供了 Dockerfile。对这类”多组件 + 现场编译”的软件,容器优先不是偷懒,而是把失败风险隔离:
| 做法 | 结果 |
|---|---|
| 在新卡上现场编译 openfold | 大概率失败,且排查要几个小时 |
| 用官方容器(配好 GPU 直通) | 不受宿主机 CUDA 小版本干扰,交付时间可控 |
| 裸装但强制对齐 cu117 | 可行但脆弱,系统升级驱动/内核后容易复发 |
容器交付的检查项:
① nvidia-container-toolkit 已装
② docker run --gpus all <image> nvidia-smi 能看到卡
③ import torch / torch_geometric / e3nn 正常
④ python -m inference --help 能跑起来(官方入口)
⑤ 记录镜像版本与提交(tag / digest)
四、同族的软件有哪些(一起记)
下面这几个软件都是”锁定旧 CUDA 栈 + 需要现场编译”的类型,在新卡上的表现高度相似:
| 软件 | 典型症状 |
|---|---|
| DiffDock | openfold 编译失败、CUDA 12 与 cu117 冲突 |
| ESMFold | openfold 必须用指定 revision;pip 包 extra 缺失 |
| RFdiffusion | 官方 yml 只为 CUDA 11.1,装完退回 CPU |
| ProteinMPNN | 装了显卡却在用 CPU |
采购含义:如果课题组要用这一类工具,“新卡”不是卖点,交付能力才是——同样是 4090,能不能把环境装通、能不能在容器里跑起来,直接决定这台机器多久能出结果。
五、询价前问清这 5 件事
| # | 要问的 | 为什么 |
|---|---|---|
| 1 | 用哪张卡?(是否 RTX 40 系 / Ada 架构) | 决定编译路线能不能走通 |
| 2 | 有没有用过官方 Docker? | 有容器路线就不用现场编译 |
| 3 | 只跑对接,还是要连带训练/微调? | 训练对显存与驱动的要求更高 |
| 4 | 数据规模多大(蛋白 / 配体数量)? | 决定跑批时间与存储 |
| 5 | 谁来长期维护这套环境? | 环境脆弱,得有负责人 |
常见问题
DiffDock 装不上是不是显卡太新了?
恰好相反——往往是”卡太新”导致的。官方 issue 里的报错 nvcc fatal : Unsupported gpu architecture 'compute_89',说明当时使用的 CUDA 工具链不支持新架构(compute_89 指 Ada,也就是 RTX 40 系这一档),编译 openfold 时直接失败。可行的做法不是硬编译,而是走官方容器:容器里已经配好匹配的 CUDA 与依赖,不受宿主机 CUDA 小版本影响。
报 CUDA version (12.0) mismatches PyTorch (11.7) 怎么解决?
这是”宿主机 CUDA 与 PyTorch 编译所用 CUDA 不一致”的标准报错。官方环境锁的是 PyTorch 1.13.1+cu117,如果机器上装的是 CUDA 12.0 的工具链,torch 的扩展构建会直接拒绝。解决方向有两个:一是让环境与官方口径对齐(cu117 一线);二是直接用官方容器(更推荐,改动面最小)。先跑 nvcc --version 和 python -c "import torch; print(torch.version.cuda)",把两个版本摆出来再动手。
conda env create 报 CondaEnvException: Pip failed 是哪里错了?
报错停在 pip 的 wheel 构建阶段(bdist_wheel did not run successfully),说明是某个需要现场编译的组件没编过。DiffDock 的环境里有多个这类组件(PyG 系列扩展、openfold、prody 一类),只要 CUDA 工具链与 torch 版本对不上就会失败。这条 issue 有 18 条评论,说明是高频情况。实践建议是:先试一次 conda env create,失败就直接切官方 Docker,不要在现场排查几个小时。
跑这类工具到底需不需要买新卡?
要看你跑什么。如果主要是推理/跑批(分子对接、结构预测),那么”显存够用 + 环境能装通”比最新架构重要得多;如果要自己训练/微调,才需要综合看显存与算力。所以更稳妥的顺序是:先确认要用的软件在什么环境下能跑通,再按显存与并发定卡,而不是先买卡再想办法装环境。
如果你们正在给课题组或实验室看机器,把 要跑的软件 / 模型、大概几个人用、预算范围 发我一句,我按这个给你一份带参数清单的配置思路——不推销最高配,只帮你把钱花在真正影响出结果的地方。
