For AI agents: the complete site index is available at https://www.juniortree.com/llms.txt, and this page is available as Markdown at https://www.juniortree.com/blog/self-hosted-colabfold.md.
JuniorTree

Back

前人指路#

有一个项目叫做 LocalColabFold,但是在国内服务器上安装各种依赖和解决依赖冲突实在是灾难,项目在这里:GitHub - YoshitakaMo/localcolabfold: ColabFold on your local PC

一个很好的解决办法是使用 Docker/Singularity 来运行 ColabFold:Running ColabFold in Docker · sokrypton/ColabFold Wiki · GitHub

拉取镜像#

ghcr.io 替换为 ghcr.nju.edu.cn 即可,用南大的镜像站

singularity pull docker://ghcr.nju.edu.cn/sokrypton/colabfold:1.5.5-cuda12.2.2
bash

权重文件下载#

singularity run -B ./cache:/cache \
  colabfold_1.5.5-cuda12.2.2.sif \
  python -m colabfold.download
bash

这个会在当前目录下创建一个 cache ,里面会下载权重文件,速度忽好忽慢

运行预测#

我写了俩脚本,一个用于快速预测,另外一个用来精细化预测,而且因为实验室的卡有两张 A100,所以我还尝试做了并行优化

这个优化的逻辑其实很简单,就是在一个文件夹下面放多个蛋白的 fasta 文件,然后脚本去取两个蛋白,分别丢到两个 GPU 上,这个过程并不涉及交火,所以其实性能损耗很小

但是似乎效果不太好

运行脚本大概是:

bash run_parallel_colabfold.sh --input liueic/protein_data --out liueic/output_dir --cache liueic/colabfold_cache --work-bind liueic/protein_data --sif liueic/colabfold_1.5.5-cuda12.2.2.sif --gpus 1 --tasks-per-gpu 1 --colabfold-args "--num-models 5 --num-recycle 6 --max-seq 256 --max-extra-seq 512 --msa-mode mmseqs2_uniref_env --pair-mode unpaired_paired --model-type auto --stop-at-score 90 --zip"
bash

刚开始预测的时候速度比较慢,但是我能看到显存已经被占用了,打开日志可以看到,是因为请求 MSA 服务:

[00:23:21] [GPU 0] [] WARNING: You are welcome to use the default MSA server, however keep in mind that it's a
[00:23:21] [GPU 0] [] limited shared resource only capable of processing a few thousand MSAs per day. Please
[00:23:21] [GPU 0] [] submit jobs only from a single IP address. We reserve the right to limit access to the
[00:23:21] [GPU 0] [] server case-by-case when usage exceeds fair use. If you require more MSAs: You can 
[00:23:21] [GPU 0] [] precompute all MSAs with `colabfold_search` or host your own API and pass it to `--host-url`
bash

如果是要做高通量并行这样是不行的,比较好的方法是自部署一个 MSA 服务,可以参考:GitHub - sokrypton/ColabFold: Making Protein folding accessible to all!

但是这个磁盘需求比较大,应该需要一台专门的服务器来做这个:

First create a directory for the databases on a disk with sufficient storage (940 GB (!)). Depending on where you are, this will take a couple of hours

目前即使不自己部署 MSA,其实也是能接受的,大不了晚上睡一觉起来又好了,因为也就几百个蛋白(?可能)

自部署MSA服务#

安装 MMseqs 2 (带 AVX 2 支持)#

需要安装最新版的 MMseqs 2,建议使用静态编译版本以获得最佳性能

# 下载静态编译版本 (Linux AVX2)
wget https://mmseqs.com/latest/mmseqs-linux-avx2.tar.gz
tar xvf mmseqs-linux-avx2.tar.gz
export PATH=$(pwd)/mmseqs/bin/:$PATH

# 验证安装
mmseqs -h
bash

下载并构建数据库#

可以前往这个网站进行下载:Steinegger Lab Dataset

需要下载的数据库有:uniref30_2302.db.tar.gzcolabfold_envdb_2023.tar.gz

数据库非常大

解压,创建索引#

创建对应的目录:

mkdir MMSeqs # 创建目录
cd MMSeqs
tar -I pigz -xvf /48T/software/colabfold_envdb_2023.tar.gz -C .
tar -I pigz -xvf /48T/software/uniref30_2302.db.tar.gz -C .
bash

然后等待,这一步等待时间非常长,建议使用 tmux 或者其他的东西挂起终端,怕意外中断

padding,(对 colabfold_envdb_2023 同理):

# 语法: mmseqs makepaddedseqdb <输入数据库> <输出数据库名称>
mmseqs makepaddedseqdb uniref30_2302_db uniref30_2302_db_padded
bash

这一步发生了什么? 它会生成一个新的数据库(uniref 30_2302_db_padded),里面的序列长度会被补齐(Pad)到特定的倍数,这会占用额外的磁盘空间,但对于 A 100 这种大卡来说,能极大地减少显存访问的碎片化,速度至关重要

这一步无法使用 GPU 进行加速,只能使用 CPU

开始推理#

可以直接参考我写的这个脚本,你可能需要根据自己的需求来更改,MMseqs 本身应该是支持多序列单文件的输入的:

查看是否运行成功,查看显卡调用 nvidia-smi

运行结束后的目录结构:

MSA_Results_P450/
├── Manduca_sexta/                <-- 自动根据文件名创建的文件夹
│   ├── query_db                  <-- 保留了 DB 以备不时之需
│   └── final_a3m/                <-- 这里是可以直接喂给 ColabFold 的!
│       ├── SeqA.a3m              
│       ├── SeqB.a3m
│       └── SeqC.a3m
├── Papilio_xuthus/
│   └── final_a3m/
│       ├── ...
└── ...
plaintext

MMseqs 2 的工作流是: FASTA -> Createdb -> Search (生成 ResultDB) -> Result 2 MSA (转换) -> UnpackDB (解压出文件)

后话#

ColabFold 里面允许我们自定义 host-url,于是我就病急乱投医,我真的去找了 MSA Search 的容器镜像,在英伟达的官网这里可以找到:Overview — NVIDIA NIM for MSA Search

然后非常令人哭笑不得的是,如果你直接使用中国大陆的 IP 去拉这个容器,他会告诉你说让你去找大陆的代理商

但是据我测试这个代理商国内如果你要使用的话,需要以机构/企业的身份去申请,就很离谱,因为英伟达上面下载只需要个人开发者申请一个 key 就可以了

所以我整了个花活,我用了 Azure 东京地区的服务器,去拉这个容器,然后再把容器中转到阿里云的容器仓库,再用集群从阿里云容器仓库拉这个容器

虽然我最后没有跑起来,因为我用的是 singularity,这个东西有各种奇奇怪怪的文件系统写入的问题,很无语

gpuserver#

因为这个 MMseqs 每次都需要重新读取数据,导致速度非常慢!需要启动一个守护进程,把数据写入到显存/内存中,以一个服务端的形式提供服务

然后这个坑点在于,新版本的 MMseqs 的参数已经改了,不能使用启动 http 服务器这种方式处理任务了,我也没想好要怎么处理这个问题

本地部署的 ColabFold
https://www.juniortree.com/blog/self-hosted-colabfold
Authorliueic
Published at2025年9月26日
Comment seems to stuck. Try to refresh?✨