🧬 AlphaFold 2.3.2 从零配置使用指南
快速导航
1. 背景与技术特点 为什么用容器?
AlphaFold是由Google DeepMind开发的人工智能系统,能够从蛋白质的氨基酸序列高精度预测其三维结构。 2.3.2版本在准确性和效率上进一步优化,是结构生物学和药物发现的重要工具。
为什么用 Singularity 容器?
AlphaFold依赖大量软件包(Python、JAX、OpenMM、HH-suite 等),版本冲突和环境配置极其复杂。 Singularity将整套环境打包成一个只读镜像文件(.sif),在集群任意节点上即拉即用,无需安装任何依赖,且与宿主机完全隔离。
核心优势
一次构建,到处运行(CPU/GPU节点)
环境完全隔离,无依赖冲突
支持
--nv直接调用NVIDIA GPU与Slurm等调度系统无缝集成
镜像只读,保证可复现性
镜像包含内容
AlphaFold 2.3.2源码
Python 3.10 +全部依赖
JAX/OpenMM/HH-suite
jackhmmer/hmmsearch等工具
不含模型参数和数据库
2. 环境准备 动手前必看
2.1 硬件与软件要求
硬件
Linux x86_64 架构
约 10 GB 磁盘空间(制作镜像)
(可选)NVIDIA GPU 用于加速
软件
Singularity 3.x或更高版本
mksquashfs(squashfs-tools)(可选)Environment Modules
2.2 检查环境
在终端中依次执行以下命令,确认环境就绪:
$ singularity --versionsingularity version 3.11.0$ command -v mksquashfs/usr/sbin/mksquashfs
mksquashfs未安装:• Rocky/CentOS/RHEL:
sudo dnf install -y squashfs-tools• Ubuntu/Debian:
sudo apt-get update && sudo apt-get install -y squashfs-tools如果集群使用Environment Modules,加载Singularity:
$ source /etc/profile.d/modules.sh$ module load singularity/3.11.0
3. 制作Singularity镜像,核心步骤
我们从Docker Hub拉取预构建的AlphaFold 2.3.2容器(catgumag/alphafold:2.3.2),转换为Singularity 的.sif格式镜像文件。整个过程只需一条命令。
3.1 创建目录结构
$ export AF2_HOME="$HOME/software/alphafold"$ mkdir -p "$AF2_HOME"/{cache,tmp}$ export SINGULARITY_CACHEDIR="$AF2_HOME/cache"$ export SINGULARITY_TMPDIR="$AF2_HOME/tmp"$ cd "$AF2_HOME"cache — 存放拉取过程中的临时层文件,可复用 tmp — 构建时的临时工作空间 alphafold-2.3.2.sif — 最终生成的镜像文件(约 4-6 GB)3.2 拉取并生成镜像
方式A:直连Docker Hub(推荐)
$ singularity pull alphafold-2.3.2.sif docker://catgumag/alphafold:2.3.2
方式B:使用镜像代理(网络受限时)
$ singularity pull alphafold-2.3.2.sif docker://docker.1ms.run/catgumag/alphafold:2.3.2
3.3 校验完整性
$ sha256sum alphafold-2.3.2.sif > alphafold-2.3.2.sif.sha256$ sha256sum -c alphafold-2.3.2.sif.sha256alphafold-2.3.2.sif: OK
4. CPU环境验证,基础测试
在任何节点(登录节点或计算节点)上执行以下命令,验证镜像是否可用,以及AlphaFold环境是否正常。
4.1 验证Python环境和JAX
$ IMAGE="$HOME/software/alphafold/alphafold-2.3.2.sif"$ singularity exec --cleanenv --pwd /app/alphafold "$IMAGE" python -c 'import alphafoldimport jaximport jax.numpy as jnptry: import openmmexcept ModuleNotFoundError: from simtk import openmmprint("AlphaFold:", alphafold.__file__)print("JAX:", jax.__version__)print("devices:", jax.devices())x = jnp.arange(16, dtype=jnp.float32).reshape(4,4)y = x @ xassert y.shape == (4,4)print("AlphaFold CPU environment: PASS")'AlphaFold: /app/alphafold/alphafold/__init__.pyJAX: 0.4.20devices: [CpuDevice(id=0)]AlphaFold CPU environment: PASSPASS即表示CPU环境正常。显示CpuDevice是预期行为。4.2 验证外部工具
$ singularity exec --cleanenv "$IMAGE" bash -c 'for cmd in hhblits hhsearch jackhmmer hmmbuild hmmsearch kalign; do command -v "$cmd" || exit 1doneecho "External tools: PASS"'External tools: PASS
5. GPU环境验证(Slurm)加速必备
在NVIDIA GPU节点上,通过Slurm提交作业来验证镜像是否能调用GPU。你需要根据集群实际情况修改分区 (--partition) 和QOS参数。
5.1 创建 Slurm 脚本
新建文件test-alphafold-gpu.slurm,内容如下:
#!/bin/bash#SBATCH -J af2-gpu-test#SBATCH -o af2-gpu-test-%j.out#SBATCH -e af2-gpu-test-%j.err#SBATCH -p GPU-8A100 # ⚠️ 改成你集群的GPU分区#SBATCH --qos=gpu_8a100 # ⚠️ 改成你集群的QOS#SBATCH -N 1#SBATCH -n 1#SBATCH --cpus-per-task=4#SBATCH --gres=gpu:1#SBATCH --mem=16G#SBATCH -t 00:10:00source /etc/profile.d/modules.sh
module purge
module load singularity/3.11.0
IMAGE="$HOME/software/alphafold/alphafold-2.3.2.sif"
test -r "$IMAGE" || { echo "ERROR: cannot read $IMAGE"; exit 1; }
echo "node=$(hostname)"
nvidia-smi -L
export SINGULARITYENV_XLA_PYTHON_CLIENT_PREALLOCATE=false
export SINGULARITYENV_TF_CPP_MIN_LOG_LEVEL=2
singularity exec \
--nv \
--cleanenv \
--pwd /app/alphafold \
"$IMAGE" \
python -c '
import alphafold
import jax
import jax.numpy as jnp
print("AlphaFold:", alphafold.__file__)
print("JAX:", jax.__version__)
devices = jax.devices()
print("devices:", devices)
gpu_devices = [d for d in devices if d.platform == "gpu"]
assert gpu_devices, "JAX did not detect a GPU"
x = jnp.ones((2048, 2048), dtype=jnp.float32)
y = jnp.dot(x, x)
y.block_until_ready()
assert float(y[0, 0]) == 2048.0
print("AlphaFold GPU environment: PASS")
'-p和--qos参数必须替换为你集群中实际可用的GPU分区和QOS。如果不确定,咨询集群管理员或使用sinfo查看。5.2 提交作业
$ sbatch test-alphafold-gpu.slurmSubmitted batch job 123456
5.3 查看结果
$ squeue -u "$USER"$ cat af2-gpu-test-123456.out
成功日志中应包含:
node=gpu-node-01GPU 0: NVIDIA A100-PCIE-40GB ...AlphaFold: /app/alphafold/alphafold/__init__.pyJAX: 0.4.20devices: [GpuDevice(id=0), ...]AlphaFold GPU environment: PASS
6. 实际预测,跑起来!
6.1 查看所有参数
$ singularity exec --cleanenv --pwd /app/alphafold "$IMAGE" \ python /app/alphafold/run_alphafold.py --helpfull
6.2 预测命令模板
在GPU节点上执行预测(需挂载数据库、输入、输出目录):
$ singularity exec --nv \ -B /path/to/database:/database \ -B /path/to/input:/input \ -B /path/to/output:/output \ --cleanenv \ --pwd /app/alphafold \ "$IMAGE" \ python /app/alphafold/run_alphafold.py \ --fasta_paths=/input/target.fasta \ --output_dir=/output \ --data_dir=/database \ --model_preset=monomer \ --use_gpu_relax=True
--fasta_paths — 输入序列文件(FASTA 格式) --output_dir — 输出目录(结果、PDB 文件等) --data_dir — 数据库根目录(需包含所有依赖数据库) --model_preset — monomer(单体)或 multimer(多聚体) --use_gpu_relax — 使用 GPU 进行结构松弛(加速)7. 常用命令与参数详解
7.1 Singularity核心命令
| 命令 | 作用 | 示例 |
|---|---|---|
| singularity pull | 从 Docker Hub 或其他源拉取镜像并生成 .sif 文件 | singularity pull image.sif docker://repo/name:tag |
| singularity exec | 在容器内执行一条命令 | singularity exec image.sif python script.py |
| singularity run | 执行容器的默认入口点 | singularity run image.sif |
| singularity shell | 在容器内启动一个交互式 shell | singularity shell image.sif |
7.2 exec常用选项
| 选项 | 作用 | 说明 |
|---|---|---|
| --nv | 启用 NVIDIA GPU 支持 | 将宿主机 GPU 驱动和 CUDA 库映射到容器 |
| --cleanenv | 清空环境变量 | 避免宿主机环境变量干扰容器 |
| --pwd /path | 设置容器内工作目录 | 确保 Python 能找到当前目录的模块 |
| -B /host:/container | 绑定挂载目录 | 将宿主机目录映射到容器内 |
| --writable-tmpfs | 临时可写文件系统 | 容器内 /tmp 可写,用于临时文件 |
7.3 AlphaFold run_alphafold.py常用参数
| 参数 | 作用 | 示例值 |
|---|---|---|
| --fasta_paths | 输入 FASTA 序列文件路径 | /input/target.fasta |
| --output_dir | 输出结果目录 | /output/results |
| --data_dir | 数据库根目录 | /database |
| --model_preset | 预测模式:monomer / multimer | monomer |
| --use_gpu_relax | 是否使用 GPU 进行结构松弛 | True / False |
| --num_multimer_predictions_per_model | 多聚体每个模型的预测数 | 5 |
| --max_template_date | 模板最大日期(格式 YYYY-MM-DD) | 2022-01-01 |
8. 注意事项 避坑指南
镜像只读
SIF镜像是只读的,所有数据(数据库、输入、输出)必须放在容器外部并通过-B挂载。
GPU必须加--nv
在GPU节点上运行,必须添加--nv参数,否则JAX无法识别GPU,会退化为CPU模式。
数据库自行准备
镜像不包含模型参数和数据库。你需要从官方下载或使用集群已有的数据库目录。
--pwd必须正确
--pwd /app/alphafold确保Python的import alphafold能找到源码。如果路径不对,会报 ModuleNotFoundError。
环境变量传递
使用SINGULARITYENV_VARNAME=value可将环境变量传入容器。例如:
SINGULARITYENV_XLA_PYTHON_CLIENT_PREALLOCATE=false
这样容器内的程序就能读取该变量。
Slurm 参数适配
脚本中的 -p、--qos、--gres 需要根据集群实际配置修改,不要照抄。
9. 常见问题 FAQ
Q1: 制作镜像时网络连接失败怎么办?
A: 尝试使用代理镜像:docker://docker.1ms.run/catgumag/alphafold:2.3.2。如果仍失败,检查集群网络或使用 --no-https 参数。
Q2: 执行验证时提示 "ModuleNotFoundError: No module named 'alphafold'"?
A: 检查是否添加了 --pwd /app/alphafold。AlphaFold 源码位于镜像内的 /app/alphafold,必须将工作目录切换到该路径。
Q3: GPU 验证时显示 "CpuDevice" 而不是 "GpuDevice"?
A: 原因可能:① 没有添加 --nv 参数;② 节点没有 NVIDIA GPU;③ 驱动程序不兼容。检查 nvidia-smi 输出。
Q4: Slurm 作业提交后一直 PENDING?
A: 可能是资源不足,或分区/QOS 参数不正确。用 sinfo 查看可用分区,用 squeue 查看作业状态。
Q5: 预测时内存不足(OOM)?
A: AlphaFold 需要较大内存(单体约 16-32GB,多聚体更大)。在 Slurm 中增加 --mem 参数,或使用 --writable-tmpfs 让容器使用更多临时空间。
Q6: 镜像文件太大,可以压缩吗?
A: SIF 格式本身已经压缩。如果空间紧张,可以删除 cache 目录(拉取时的临时层文件),只保留 .sif 文件。
Q7: 本教程的验证是否等同于完整预测?
A:绝对不等同。 本教程只验证环境(JAX 能跑、GPU 可见),并未加载任何模型参数或数据库。实际预测需要大量数据和计算,请务必单独测试。
