🧬 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 可见),并未加载任何模型参数或数据库。实际预测需要大量数据和计算,请务必单独测试。
