直接回答:ESMFold 本地部署失败,八成都不是显卡的问题,而是”依赖版本”问题。 它依赖的 openfold 需要现场编译,必须用官方 README 指定的那个 revision;而 pip 上的 fair-esm 包与 GitHub 源码打包内容并不一致。
三句话记住:
- openfold 不是随便装一个版本:官方贡献者在 issue 里明确要求使用 README 里指定的那个 revision;
- PyPI 发布版 ≠ 仓库源码版:
pip install fair-esm[esmfold]在某些发行版上会直接报”没有这个 extra”; - 验收看命令,不看文档:装完要能
which esm-fold、能加载esmfold_v1()才算过。
一、坑 1:openfold 必须用官方指定的版本
官方仓库的 issue(facebookresearch/esm#456,2023-01-21 创建)里,用户按 README 安装 openfold 时卡在编译:
pip ... bdist_wheel did not run successfully
(输出 176 行)
官方贡献者(author_association = CONTRIBUTOR,Meta/FAIR 侧)给出的不是”根因分析”,而是一条明确指令:
please use openfold revision 4b41059694619831a7db195b7e0988fc4ff3a307 as in the readme
也就是:openfold 必须用 README 指定的那个 commit 来编译,换别的版本就是装不上。
同一条 issue 里还有第二个用户的现象,更值得记下来:按官方 conda yml 建好环境后,import torch 直接失败:
ImportError: .../site-packages/torch/lib/libtorch_cuda_cpp.so: invalid ELF header
官方对这条的回复是反问 nvcc --version —— 也就是说,官方认为 nvcc 版本是关键变量:环境里的 torch 与 CUDA 对不上,就会表现为”import 就崩”。
二、坑 2:pip 包和源码不一样
另一条官方 issue(facebookresearch/esm#460)里,用户按 extra 写法安装,直接报:
fair-esm 1.0.3 does not provide the extra 'esmfold'
事实核对(本库已在官方仓库核实过):
| 项 | 情况 |
|---|---|
| GitHub 仓库源码 | setup.py 里确实定义了 extras_require = {"esmfold": [...]} |
| PyPI 发布版 | 用户报告 1.0.3 不提供该 extra |
| 结论 | 两者打包内容不一致:文档上写的 extras,在你 pip 装到的那个版本里可能根本不存在 |
官方 setup.py 里这个 extra 包含的依赖是:biopython、deepspeed==0.5.9、dm-tree、pytorch-lightning、omegaconf、ml-collections、einops、scipy。
所以不要相信”pip install fair-esm[esmfold] 一定能成”——版本不同表现不同,交付前必须实测。
三、官方环境长什么样(先对齐版本)
| 项 | 官方口径 |
|---|---|
| Python | 3.7 |
| PyTorch | 1.12 |
| cudatoolkit | 11.3 |
| 依赖 | openfold(按指定 revision 现场编译)+ 一组 extra 依赖 |
| 官方 CLI | esm-fold |
这一串的意义是:ESMFold 属于”锁定旧版本栈”的软件。在这类软件上,新卡(新架构)不是优势,反而更容易卡在”编译不出旧架构的扩展”上——下面那篇 DiffDock 就是同一个坑。
四、排查与验收(照这张表走)
| 阶段 | 命令 / 动作 | 期望 |
|---|---|---|
| 装前 | nvcc --version |
与官方口径对齐(cudatoolkit 11.3 一线) |
| 装前 | 记录安装来源:PyPI 版还是 git 源码版 | 后面出问题才好定位 |
| 装 openfold | 严格用 README 指定的 revision | 官方原文要求 |
| 装后 | pip show fair-esm |
看实际装到的版本与来源 |
| 装后 | which esm-fold |
官方 CLI 真的装上了 |
| 装后 | python -c "import torch; print(torch.version.cuda, torch.cuda.is_available())" |
CUDA 版 torch + 能看到卡 |
| 装后 | python -c "import esm; esm.pretrained.esmfold_v1()" |
权重能加载 |
| 报错 | libtorch_cuda_cpp.so: invalid ELF header |
先报 nvcc --version(官方流程) |
核心原则:验收以”实际装上、实际跑通”为准,不以文档为准。
五、给课题组的三句实话
- ESMFold 不是”一条 pip 命令”:它依赖 openfold 现场编译,而且要用指定 revision;
- “跑不起来”多数是环境问题:换卡解决不了,先把版本对齐更实际;
- 最好把环境做成可复现的镜像/容器:否则三个人三台机器会出现三种报错。
常见问题
ESMFold 装不上,是不是我的显卡不支持?
大多数情况不是。官方 issue 里”装不上”的直接原因是依赖 openfold 的编译(必须用官方 README 指定的 revision),另一类是pip 包与源码打包内容不一致(fair-esm 1.0.3 does not provide the extra 'esmfold')。和硬件相关的只出现在驱动/CUDA 版本这一层,而不是”卡型号不支持”。所以排查顺序应该是:先对齐 openfold revision 与 nvcc/CUDA 版本,再谈硬件。
pip install fair-esm[esmfold] 报 does not provide the extra 怎么办?
这条报错说明你装到的那个发布版里没有这个 extra(虽然 GitHub 仓库的 setup.py 里定义了)。可行做法有两条:一是改从官方仓库源码安装;二是按官方 extra 清单手工装那组依赖(biopython、deepspeed==0.5.9、dm-tree、pytorch-lightning、omegaconf、ml-collections、einops、scipy)。无论走哪条,装完都要用 which esm-fold 和 esm.pretrained.esmfold_v1() 验证,而不是只看安装过程中没报错。
import torch 报 libtorch_cuda_cpp.so: invalid ELF header 是什么原因?
这是环境里 torch 与 CUDA 库不一致的典型表现,官方对这类报错的流程是先提供 nvcc --version 再定位。实际排查看三点:一是 nvcc --version 与官方口径是否一致;二是 python -c "import torch; print(torch.version.cuda)" 是不是 CUDA 版、版本对不对;三是环境是否用的官方 yml(Python 3.7 / PyTorch 1.12 / cudatoolkit 11.3)。这类问题换卡是无效的。
ESMFold 和 ColabFold、AlphaFold 该怎么选?
三者定位不同:AlphaFold 3 精度最好,但对显卡计算能力有硬要求(只支持特定架构的卡);ColabFold 是 AlphaFold2 的高效实现,本地用容器部署,显存需求由你最长的那条序列决定;ESMFold 不需要多序列比对,单卡也能跑,但安装链更”脆”(依赖 openfold 编译)。选择顺序建议是:先看最长序列与显存,再看要不要 MSA 数据库,最后看维护成本——谁能把环境长期维护住,往往比多一张卡更影响出结果的速度。
如果你们正在给课题组或实验室看机器,把 要跑的软件 / 模型、大概几个人用、预算范围 发我一句,我按这个给你一份带参数清单的配置思路——不推销最高配,只帮你把钱花在真正影响出结果的地方。
