4. 高通量分子计算硬件与运行环境

高通量分子计算流水线通常不是单一程序,而是由分子预处理、构象搜索、能量评估、打分排序、结果聚合等多个阶段组成。不同阶段的算术密度、访存模式、并行粒度和精度要求差异很大,因此硬件选型不能简单追求“最快的一台机器”,而应围绕流水线各阶段的特征,把 CPU、GPU、FPGA、ASIC 组织成互补的异构资源池。理解这四类资源的定位,是后续容器化、集群调度和配额隔离的前提。

一、四类计算资源的定位与匹配

CPU 的优势在于通用控制流、复杂分支、稀疏数据结构和串行逻辑,适合分子文件解析、任务编排、数据库检索、结果合并以及带大量条件判断的预处理步骤。GPU 拥有数千个流式处理器和高带宽显存,适合规则化的稠密计算,例如批量构象的能量评估、矩阵运算、分子指纹相似度计算和神经网络打分。FPGA 通过可编程逻辑实现定制数据通路,适合固定但吞吐要求高的算子,例如固定精度打分函数、流式过滤和低延迟预处理,其优势是确定性延迟与较低功耗。ASIC 则是为特定算法固化的芯片,能效和单位成本吞吐最高,但灵活性最低,只适合已经稳定、调用量极大的核心算子。

一个实用的判断方法是看三个维度:并行度是否规则、数据复用是否充分、算法是否长期稳定。规则且长期稳定的高吞吐算子优先考虑 GPU 或 ASIC;规则但仍在迭代的算子适合 GPU 或 FPGA;不规则、分支多、频繁变更的部分留在 CPU。实际流水线往往是“CPU 编排 + GPU 主力计算 + FPGA 预处理 + ASIC 加速固定内核”的组合。

高通量分子计算流水线的异构资源分工 分子预处理 解析/清洗/去重 构象生成 采样/枚举 能量评估 打分/力场 排序筛选 Top-K/阈值 结果聚合 合并/入库 CPU 通用控制 / 分支 文件解析 · 编排 数据库检索 · 聚合 适合:不规则、频繁变更 GPU 稠密并行 / 高带宽 批量能量评估 矩阵运算 · 指纹相似度 适合:规则、数据复用高 FPGA 可编程数据通路 流式过滤 · 定精度打分 确定性低延迟 适合:固定算子、低功耗 ASIC 算法固化 / 高能效 固定内核加速 单位成本吞吐最高 适合:稳定、超大调用量 选型判断三问 ① 并行是否规则?规则 → GPU/ASIC;不规则 → CPU ② 数据复用是否充分?充分 → GPU;流式 → FPGA ③ 算法是否长期稳定?稳定 → ASIC;迭代中 → GPU/FPGA 典型组合:CPU 编排 + GPU 主力计算 + FPGA 预处理 + ASIC 固定内核

二、容器化与虚拟化:让异构资源可复现

分子计算软件依赖复杂,常见问题包括 CUDA 版本与驱动不匹配、Python 包冲突、编译工具链差异。容器化通过镜像把运行时、库和依赖一起打包,使同一镜像在开发机、集群和云上行为一致。对 GPU 任务,需要 NVIDIA Container Toolkit 把宿主机驱动和 GPU 设备暴露给容器;对 FPGA,通常通过设备节点或厂商运行时接口透传。虚拟化则提供更强的隔离和整机迁移能力,但 GPU 直通和 FPGA 透传会带来额外开销,因此高通量计算更常用“容器 + 裸金属/轻量虚拟机”的组合。

一个可复现的镜像应固定基础镜像、CUDA 版本、关键库版本和入口脚本。例如:

FROM nvidia/cuda:12.2.0-runtime-ubuntu22.04
RUN apt-get update && apt-get install -y python3.10 python3-pip
COPY requirements.txt /app/requirements.txt
RUN pip install --no-cache-dir -r /app/requirements.txt
COPY pipeline /app/pipeline
ENTRYPOINT ["python3", "/app/pipeline/run_stage.py"]

这样,同一镜像在本地用 docker run --gpus all 验证,在集群上由调度器以相同镜像启动,避免“换机器就失败”。

三、集群与云环境选型

集群选型要看任务形态。若流水线以大批量短任务为主,调度器需要支持高并发、快速启动和细粒度配额,Kubernetes 配合 GPU 设备插件是常见选择;若以长时 MPI 并行任务为主,Slurm 更成熟。云环境适合弹性峰值和短期大规模筛选,但要注意数据出云成本、GPU 实例的可用性和计费粒度。混合部署时,把稳定高频的核心计算放在自建集群,把突发峰值放到云上,是较务实的策略。

四、资源配额与隔离

配额与隔离决定集群能否稳定共享。CPU 侧用 requests/limits 控制核数和内存;GPU 侧按卡分配,必要时用 MIG 或时间片共享;FPGA/ASIC 按设备节点独占或分时复用。隔离还要覆盖显存、临时磁盘和网络带宽,避免一个任务把节点拖垮。下面是一份可直接参考的配额示例:

阶段资源类型requestslimits隔离要点
预处理CPU2 核 / 4Gi4 核 / 8Gi限制临时磁盘
构象生成CPU4 核 / 8Gi8 核 / 16Gi限制进程数
能量评估GPU1 卡 / 16Gi 显存1 卡 / 16Gi 显存独占或 MIG 切片
流式过滤FPGA1 设备1 设备设备节点独占
结果聚合CPU1 核 / 2Gi2 核 / 4Gi限制网络带宽
配额不是越小越好。requests 过小会导致调度器把过多任务塞到同一节点,引发显存或内存争抢;limits 过小会让任务被 OOM 杀死。建议先用单任务压测得到峰值,再按峰值的 1.2~1.5 倍设置 limits。
GPU 共享时,显存隔离比算力隔离更难。若多个任务共享同一张卡,必须显式限制每个任务的显存上限,否则一个任务泄漏显存会导致同卡其他任务全部失败。对延迟敏感的阶段,优先独占 GPU。

把硬件分工、容器镜像、集群调度和配额隔离四件事对齐后,流水线才能在吞吐、成本和稳定性之间取得平衡。下一阶段的工作,就是把这些资源真正编排成可重复执行的流水线。