第2章 环境搭建:安装AlphaFold所需依赖、CUDA、OpenMM、JAX等

环境搭建这一步,说实话,可能是整个AlphaFold落地过程里最容易翻车的环节,没有之一。我自己就吃过不少亏——有次因为cuDNN版本和JAX差了0.1,跑了一天的训练直接崩掉,日志上就一行Illegal instruction,排查到半夜才发现是CUDA <-> JAX的版本对不上。这一章我把坑都标出来,你跟着走,能少折腾好几个晚上。

2.1 硬件与系统要求

别急着敲命令,先看看自己手里的家伙行不行。AlphaFold对GPU显存的要求很硬——单卡推理最少要16 GB显存,如果是做批量预测或参数调优,建议上24 GB以上。CPU要求不算高,但内存至少32 GB,推荐64 GB。磁盘么,一个AlphaFold全套数据(PDB库、UniRef、BFD、MGnify等)大概要2.5 TB,SSD能大大减少预处理时间。

系统方面,我建议用Ubuntu 20.04 LTS或22.04 LTS。CentOS 7也能跑,但驱动和库的兼容性会让你多掉不少头发。

组件 最低要求 推荐配置
GPU NVIDIA GPU, 16 GB显存, 算力≥7.0 NVIDIA A100 / RTX 4090, 40 GB显存
CPU 8核 16核及以上
内存 32 GB 64 GB
系统 Ubuntu 18.04+ / CentOS 7+ Ubuntu 22.04 LTS
CUDA版本 CUDA 11.0+ CUDA 11.8 / 12.1

我曾经在CentOS 7上装CUDA 11.8,结果系统自带的glibc版本太低,OpenMM编译到一半直接报cannot find -lcuda。最后不得不升级系统库,折腾了整整两天。如果你不是必须用CentOS,直接上Ubuntu 22.04吧。

2.2 CUDA与cuDNN安装

CUDA版本的选择是整条依赖链的锚点。AlphaFold官方推荐CUDA 11.0,但我实测下来CUDA 11.8 + cuDNN 8.6最稳,JAX和OpenMM都支持得很好。CUDA 12.1也行,但要注意JAX的CUDA 12 wheel当时还是RC版,我踩过坑。

安装步骤很简单,官方runfile或deb包都行,我习惯用deb包,方便后续管理。

# 安装CUDA 11.8 (deb方式)
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.0-1_all.deb
sudo dpkg -i cuda-keyring_1.0-1_all.deb
sudo apt-get update
sudo apt-get -y install cuda-11-8

# 设置环境变量(写入~/.bashrc)
export PATH=/usr/local/cuda-11.8/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:$LD_LIBRARY_PATH

cuDNN我建议用tar包手动安装,避免apt仓库里的版本混乱。

# 下载cudnn-linux-x86_64-8.6.0.163_cuda11-archive.tar.xz
tar -xvf cudnn-linux-x86_64-8.6.0.163_cuda11-archive.tar.xz
sudo cp cudnn-*-archive/include/cudnn*.h /usr/local/cuda-11.8/include/
sudo cp -P cudnn-*-archive/lib/libcudnn* /usr/local/cuda-11.8/lib64/
sudo chmod a+r /usr/local/cuda-11.8/include/cudnn*.h /usr/local/cuda-11.8/lib64/libcudnn*

用 nvidia-smi 和 nvcc --version 检查驱动和CUDA版本是否一致。有时候驱动版本老,装高版本CUDA也能跑,但OpenMM的JIT编译会静默失败——我在项目里碰到过两次,后来强制统一才解决。

2.3 OpenMM安装

OpenMM是AlphaFold做结构优化的核心引擎。我建议通过conda安装,省去手动编译的麻烦。但要注意,conda默认的OpenMM是CPU版,你需要指定CUDA支持的版本。

# 创建独立环境(强烈推荐)
conda create -n alphafold python=3.9
conda activate alphafold

# 安装OpenMM与CUDA支持
conda install -c conda-forge openmm cudatoolkit=11.8

验证安装:运行一个简单的测试脚本,看看是否能正确调用GPU。

python -c "import openmm; print(openmm.Platform.getPlatformByName('CUDA').getName())"

如果输出CUDA,恭喜你,OpenMM已经能和GPU对话了。如果报错No module named 'openmm',检查一下环境是否激活。如果报Platform not found,大概率是cuDNN没装对或者链接失效。

我记得有一次在DGX上装OpenMM,明明CUDA环境变量都设了,但OpenMM始终检测不到CUDA平台。最后发现是LD_LIBRARY_PATH里少了/usr/local/cuda-11.8/lib64——环境变量更新后没重新source,这种低级错误能让人哭笑不得。

2.4 JAX安装

JAX是AlphaFold深度学习推理的核心框架。它的安装是最大的变数——JAX的wheel必须和CUDA版本精确对应,差一个次版本号都可能出问题。

官方推荐用pip安装预编译wheel,不要手动编译!我吃过手动编译的亏,折腾两天没编出来,最后还是换回官方wheel。

# CUDA 11.8 + cuDNN 8.6
pip install jax==0.4.16 jaxlib==0.4.16+cuda11.cudnn86 -f https://storage.googleapis.com/jax-releases/jax_cuda_releases.html

# CUDA 12.1 + cuDNN 8.9
pip install jax==0.4.16 jaxlib==0.4.16+cuda12.cudnn89 -f https://storage.googleapis.com/jax-releases/jax_cuda_releases.html

安装完后,务必验证GPU是否正常工作:

python -c "import jax; print(jax.devices()); print(jax.numpy.ones(3))"

如果输出类似[cuda(id=0)],说明JAX能调用GPU。如果显示[cpu(id=0)],说明JAX没找到CUDA库。最常见的两个原因:要么JAX wheel版本和CUDA不匹配,要么LD_LIBRARY_PATH没包含cuDNN库。

我曾经在升级cuDNN到8.7后,忘记更新JAX的wheel,结果jax运行任何模型都直接segfault。折腾了一下午才发现是JAX内部调用了旧版本的cuDNN符号。所以切记:每次动cuDNN,都要同步检查JAX的版本兼容性。

2.5 AlphaFold源码安装与依赖

拿到AlphaFold源码后,需要安装它的Python依赖。我建议先用conda装好核心科学计算库,再用pip装剩下的。这样可以避免conda和pip在numpy、scipy上的版本冲突。

git clone https://github.com/deepmind/alphafold.git
cd alphafold

# 安装核心依赖(conda通道)
conda install -c conda-forge numpy scipy pandas absl-py matplotlib

# 安装剩余依赖(pip)
pip install -r requirements.txt

# 额外装一个hmmer(多序列比对需要)
conda install -c bioconda hmmer hhsuite kalign

注意,requirements.txt里可能锁定了某些包的版本,但实际跑的时候,JAX和OpenMM已经提前装好了,有版本冲突可以更新requirements.txt里的版本号。我个人习惯先把=版本号删掉,让pip自己解析兼容版本。

跑AlphaFold之前,记得下载好全部数据库(约2.5 TB)。alphafold/scripts/download_all_data.sh 可以一键下载,但建议先配好download.config,只下载你需要的数据库。如果你只做单体结构预测,可以跳过BFD和MGnify,节省约1 TB空间。

2.6 验证安装——跑一个迷你测试

不要一上来就跑长序列,先用一个小型蛋白(比如PDB ID: 1L2Y, 20个残基)验证整个流程。AlphaFold自带一个脚本run_alphafold.sh,但需要配置数据库路径。我建议先手动写一个Python调用来测试。

# test_alphafold.py
import jax
import openmm
from alphafold.model import model
from alphafold.data import pipeline

# 打印关键组件版本
print(f"JAX devices: {jax.devices()}")
print(f"OpenMM platform: {openmm.Platform.getDefaultPlatform().getName()}")

# 加载一个小模型参数
params = model.RunModel("monomer_ptm", use_jax=True)
print("Model loaded successfully!")

如果这个脚本无误,说明你的环境搭建成功了90%。剩下的10%是数据库路径和特征生成,到实际跑任务时再调就行。

AlphaFold 环境依赖关系图 GPU + 驱动 + 系统 CUDA Toolkit cuDNN OpenMM JAX + jaxlib AlphaFold 源码 + 依赖 (pipeline, model, 数据库) 箭头方向:底层依赖 → 上层框架;虚线表示 CUDA 对 JAX 的直接编译依赖(非运行时必需) 全部深色节点文字为白色,保证高对比可读

环境搭好的标志是什么?你执行python -c "import alphafold"不报错,且能跑完上面的迷你测试。到这一步,后面的参数调优和故障恢复才有意义。