第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%是数据库路径和特征生成,到实际跑任务时再调就行。
环境搭好的标志是什么?你执行python -c "import alphafold"不报错,且能跑完上面的迷你测试。到这一步,后面的参数调优和故障恢复才有意义。