单细胞RNA测序能看到转录状态,却不能直接等同于细胞表面蛋白状态;CITE-seq把RNA与抗体标签同时测出来,又会增加实验和数据处理复杂度。于是,能够从转录组学习RNA—蛋白对应关系的多模态基础模型很有吸引力。但看到“基础模型”三个字,课题组常犯两个相反的错误:要么以为下载权重后普通电脑就能完成所有任务,要么把论文预训练使用的整套集群配置,误当成每次推理都必须复刻的门槛。
2026年发表于《Nature Communications》的CAPTAIN,给出了一个难得清楚的算力样本。论文汇总超过420万对共同测量的单细胞RNA—蛋白数据,来自249个独立样本,并建立382种表面蛋白的标准词表。基础模型预训练10个epoch,连续运行约7天,使用4张NVIDIA H800(每张80GB显存)、5TB系统内存和437TB存储;训练时单卡峰值显存约75GB,系统内存峰值约100GB。数字很大,但论文也明确:这套开销对应一次性预训练,不能直接套到零样本推理或下游微调。

先分清三类任务,服务器才不会配错
| 任务层级 | 典型输入与目标 | 论文或官方信息 | 资源判断 |
|---|---|---|---|
| 零样本推理 | 仅用RNA预测标准词表内表面蛋白 | 不进行目标数据集微调 | 先用小批量测显存和吞吐,不照搬预训练集群 |
| 下游微调 | 新CITE-seq数据做蛋白填补、注释或整合 | 论文常用9:1划分、15个epoch;任务参数不同 | 需要GPU、训练日志和独立验证集,资源随细胞数增长 |
| 从头预训练 | 重新训练跨组织RNA—蛋白基础模型 | 4×H800 80GB、约7天;单卡峰值约75GB | 属于多GPU分布式训练,需高速存储和可靠断点 |
真正决定配置的不是“CAPTAIN”这个名称,而是你要做哪一层。如果只是对自己的scRNA-seq做标准词表内蛋白推理,直接从作者预训练权重开始;如果有成对RNA—蛋白数据并希望适配组织或平台,再做微调;只有研究目标涉及新词表、新模态或大规模预训练语料时,才需要接近论文级多卡训练。
为什么模型参数之外,数据与I/O同样吃资源
CAPTAIN采用双编码器:RNA模块为12层Transformer,蛋白模块为6层Transformer,嵌入维度均为512、每层8个注意力头。预训练时RNA最多输入1200个非零表达基因,掩码比例0.15;蛋白输入长度对应标准词表。看上去序列不算长,但420万细胞、10轮训练、跨模态注意力和多目标损失会放大读取、预处理、梯度同步与检查点写入压力。
论文使用的437TB是机构高性能计算系统的总存储配置,不应解释成CAPTAIN单个项目必然占用437TB;同理,5TB系统内存也不是论文报告的实际峰值,论文给出的系统内存峰值约100GB。服务器规划要区分“节点拥有多少资源”和“任务实际用了多少资源”,否则很容易把预算放大一个数量级。
可执行的部署预检:先验证环境,再下载大文件
官方仓库推荐PyTorch 2.1.2、Python 3.10和CUDA 12.8,并提供Docker镜像;FlashAttention可加速训练,但不是模型运行的强制条件。正式导入数据前,先记录驱动、容器和GPU状态:
nvidia-smi --query-gpu=name,memory.total,driver_version --format=csv
docker pull crpi-nzg91d1psypntvav.cn-beijing.personal.cr.aliyuncs.com/jiboya/captain_image:latest
docker run --gpus all --rm -it \
-v /data/captain:/workspace \
crpi-nzg91d1psypntvav.cn-beijing.personal.cr.aliyuncs.com/jiboya/captain_image:latest /bin/bash
conda activate captain
python -c "import torch; print(torch.__version__, torch.cuda.is_available(), torch.cuda.device_count())"
若要复现实验预训练,仓库示例使用torchrun --nproc_per_node=4启动四卡分布式任务。实际操作前应先以少量细胞完成一次端到端试跑,确认MuData中的RNA与蛋白细胞一一对应、基因名能映射到词表、蛋白名称经过标准化、输出检查点可重新载入。不要一开始就把全部样本塞进训练队列。
输入检查至少要输出四张清单:RNA与蛋白共有细胞数、无法映射的基因数、无法映射的蛋白数,以及每个样本的细胞与蛋白面板规模。若使用作者的跨物种映射,还应保留转换前后基因名,检查一对多和缺失映射。归一化、对数转换、高变基因选择与分箱步骤要与对应下游教程一致;同一个对象不要在上游脚本和模型代码中重复归一化。版本记录至少包含代码提交号、镜像摘要、权重文件校验值和词表文件校验值,否则后续即使参数相同,也可能因为权重或词表更新而得不到同一结果。
一套更稳妥的资源画像方法
先从1万、5万和10万细胞做三级试跑,每一级记录GPU峰值、系统内存、每秒细胞数、临时目录增长和单个检查点大小。显存接近上限时,优先调整批量大小或使用梯度累积;GPU利用率低而I/O等待高时,应把预处理数据和检查点放到本地NVMe,而不是继续增加显卡。多卡训练还要检查卡间通信,持续保存可恢复检查点,并把原始数据、缓存和最终模型分层存放。
对于微调,最重要的不是把训练准确率做高,而是保持训练集与测试集边界。CAPTAIN论文在蛋白推断任务中专门控制了预训练、微调和测试数据的泄漏;其他任务由于成对多组学数据稀缺,部分数据与预训练语料存在重叠。复用模型时,应记录样本来源、组织、物种、平台和预训练覆盖情况,避免把“见过相似数据”误解成真正的外部泛化。
结果能用到哪里,不能越过什么边界
CAPTAIN可用于表面蛋白预测、细胞类型注释、多组学整合、批次校正和蛋白辅助的细胞通讯分析。论文在一个人PBMC CITE-seq任务中报告96.1%的总体注释准确率,但这不是所有组织、平台和标注体系的固定表现。其零样本蛋白预测受标准词表限制,不能推断词表外蛋白;训练数据仍偏向免疫相关组织,稀有细胞和低覆盖蛋白需要谨慎解释。
作者论文以382种表面蛋白描述标准词表,而当前GitHub说明的个别位置出现387这一数字。部署时必须以所用检查点配套的csp_token_dict.pickle为准,不能只照文章数字手工建矩阵。预测蛋白也不是实验测量值,更不能直接替代抗体检测或功能验证;它适合提出候选、补充证据和设计后续实验。
把任务信息带来,先判断该用哪一级算力
如果你准备运行CAPTAIN,可先整理物种、组织、细胞数、是否有配对蛋白数据、目标任务、现有GPU与期望完成时间。云生信可以先判断适合零样本推理、微调还是预训练,再分别确认服务器环境部署并交接、租用算力自行操作,或委托完成约定范围的分析;三种方式的交付边界和资源需求分别确认。
