MDAnalysis专题

MDAnalysis可选Dask后端

在自己的算例目录准备固定Dask依赖,比较三个原生后端的真实RMSD与逐帧质量分析。

更新于 2026-11-09约 4 分钟阅读按任务与环境选择适用配置
阅读本篇目录

MDAnalysis的部分分析类支持Dask后端。本篇把可选依赖放进算例自己的 .deps 目录,在同一真实泛素轨迹上比较串行、multiprocessing与Dask,给出从准备环境到提交、提取的完整步骤。

1. 下载并准备自己的依赖#

下载固定依赖清单、完整真实输入和结果图包,保存为 example.zip:

python3 -m zipfile -e example.zip .
cd mdanalysis-dask-private
bash setup.sh

setup.sh联网从官方PyPI准备Dask2025.5.1及其固定依赖,逐包校验 requirements.lock 中的SHA256,安装到当前目录 .deps。此清单针对集群x86_64 Linux与Python3.11;不应拿它作为其他平台的通用锁文件。已有 .deps时脚本拒绝覆盖,需要更换依赖请另建目录。

若已经有与锁文件一致的离线wheel目录,可用 bash setup.sh wheelhouse;离线目录并不随资料包分发。在线与离线方式任选一种,准备完成后再提交,计算阶段无需额外下载。

本例使用公共环境中的MDAnalysis2.9.0、Python3.11.16,通过当前目录的Python搜索路径增加可选Dask。用户无需修改公共模块或其他项目的环境;env.sh也将本例的Dask配置路径放在当前目录。

2. 提交一次完成六个原生分析分支#

sbatch job.slurm

CPU分区按56核整节点申请,本例实际最多2个分析工作进程;分区维护时等待恢复,在已分配CPU作业内可 bash run.sh。重复整套分析用新目录,已有 VALIDATION.json时程序拒绝覆盖。

输入是已完成的真实GROMACS泛素数据:1231原子、76残基,完整分子预处理后51帧,时间0—100ps、间隔2ps。本篇只重新分析这些真实坐标,没有新增MD。PDB_CONECT与原生GROMACS导出的质量、荷电及残基顺序同时保留,避开当前版本无法直接解析的TPR138格式。

3. Dask后端的关键调用#

from MDAnalysis.analysis.rms import RMSD
r=RMSD(u,reference,select='name CA',ref_frame=0).run(
    backend='dask',n_workers=2,n_parts=4)
values=r.results.rmsd

n_workers=2为两个工作进程,n_parts=4为四个任务块,不是四个进程。这个内置后端使用Dask的本机processes调度,示例没有启动跨节点distributed服务;它仍在当前分配的CPU资源内执行。

同样通过原生 AnalysisFromFunction运行质量质心和回转半径平方,函数写法见逐帧分析与并行框架。普通串行、multiprocessing、Dask三种后端各执行RMSD与该逐帧函数,共六个原生分析分支。

脚本的主流程使用 if __name__=='__main__':,函数定义在模块顶层。把自己的函数交给进程后端之前,先确认它可以逐帧独立计算,并避免传入不可序列化的临时文件句柄。

4. 实际结果与完整字段核对#

原生backend 工作进程 分片 帧数 RMSD与独立Kabsch最大差/Å
serial 1 1 51 2.1879e-07
multiprocessing 2 4 51 2.1879e-07
dask 2 4 51 2.1879e-07

三种后端返回的全部RMSD列、帧号、时间以及逐帧函数的4列结果逐项对应,后端间完整字段差小于1e−10;RMSD另外与独立Kabsch几何计算比较,质心与Rg²另外从原坐标和质量重建。数据顺序与数值都检查,不能只凭曲线看起来重合就认为一致。

三个原生后端的RMSD与回转半径、独立几何比较和实际Cα参考结构

这里的很小数值差是同一输入的算法比较,不代表MD轨迹具有该物理精度。小数据的进程开销也可能超过计算本身,本篇不据此报告一般性能加速比或已收敛蛋白动力学。

5. 激活本目录环境并导出比较表#

source env.sh
python - <<'PYDATA'
import numpy as np
x=np.load('analysis-fields.npz')
a=np.column_stack([x['original_times_ps'],x['serial_RMSD'][:,2],x['multiprocessing_RMSD'][:,2],x['dask_RMSD'][:,2],np.sqrt(x['dask_moments'][:,3])])
np.savetxt('backend-comparison.csv',a,delimiter=',',header='time_ps,serial_CA_RMSD_A,multiprocessing_CA_RMSD_A,dask_CA_RMSD_A,dask_Rg_A',comments='')
print('RMSD后端最大差:',abs(x['serial_RMSD']-x['dask_RMSD']).max())
print('逐帧函数后端最大差:',abs(x['serial_moments']-x['dask_moments']).max())
PYDATA
head -n 5 backend-comparison.csv

已有结果只重新画图:

source env.sh
python plot.py

完整数组在 analysis-fields.npz,汇总在 VALIDATION.json,图在 plots/,原件在 reference-results/。实际使用其他分析类时先查看该类 get_supported_backends(),不能因为RMSD与AnalysisFromFunction通过比较,就假定所有分析类、历史状态依赖的算法或所有并行方式都可直接照用。

参考:MDAnalysis2.9后端接口、本例固定Dask版本与Python要求。

需要根据你的体系选择资源?联系讨论计算需求。实际可用软件与权限,以当前账户和运行环境为准。

查看配图

放大后可滚动查看细节,按 Esc 关闭。

100%查看原图 ↗