DPDispatcher专题

DPDispatcher 任务配置与批量运行

用实际LJ小算例认识Machine、Resources、Task和Submission,查看配置文件、输入传递及结果。

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

下载DPDispatcher任务配置与恢复实例包。本包是实际任务工作流,不是只画已有数据的离线脚本:完整运行会执行3个本地CPU小任务,并通过Slurm在P100和V100资源上各运行3个GPU小任务,另有1次受控失败后的重试。

unzip dpdispatcher-config-slurm-recovery-wave252.zip -d dispatcher-practice
cd dispatcher-practice
bash run.sh

请在自己的普通账号与工作目录运行,并确认对应计算资源可用。脚本使用dpgen/0.14.0环境中的DPDispatcher1.1.0,以及LAMMPS30Sep2026;每个调度任务请求1个CPU和1张相应GPU,本地CPU小例使用单线程。计算节点始终由Slurm分配,脚本不会SSH进入计算节点。

CPU版LAMMPS使用Intel oneAPI2024.2/Intel MPI2021.13;GPU版使用GCC13.3/OpenMPI5.0.10/CUDA12.8,为GPU包mixed精度。绘图使用ase/3.29.0环境。脚本自动填写当前账号,不需要修改公共Python或环境模块。

完整流程生成shell/、p100/、v100/、analysis/和figures/。已有输出目录不作为新的练习目录反复运行;需要从头练习时重新解压,已有任务则沿原目录恢复。

1 它负责哪一段工作#

DPDispatcher负责准备任务目录、生成调度脚本、提交和跟踪任务、取回指定输出。它本身不训练势,也不把科学输入自动变成正确的物理模型;本例真正计算能量和力的程序是LAMMPS。

四个主要对象分别是:

对象 本例作用 生成的配置
Machine 选择执行上下文、调度类型和数据目录 machine.json
Resources 选择队列、CPU/GPU、任务打包和环境 resources.json
Task 指定执行命令、每个任务的目录及往返文件 tasks.json
Submission 将前面三类组合成一次可恢复提交 各阶段state.json

本包worker.py连接这些对象;生成的JSON会由原生加载接口读取,方便从一个小例子逐步改成自己的工作流。

2 三个真实计算输入#

例子是盒长20、两个粒子的LJ静态单点,ε=σ=1、截断半径2.5、不平移势能,距离分别为1.05、2^(1/6)≈1.12246205、1.4,均为LJ约化单位。

cat shell/local/task-0/param.json
cat shell/machine.json
cat shell/resources.json
cat shell/tasks.json

每个任务的param.json包含距离和计算后端。payload.py据此写出完整LAMMPS输入并运行。以距离1.05的CPU输入为例:

units lj
atom_style atomic
boundary p p p
region box block 0 20 0 20 0 20
create_box 1 box
create_atoms 1 single 9.475 10 10 units box
create_atoms 1 single 10.525 10 10 units box
mass 1 1
pair_style lj/cut 2.5
pair_coeff * * 1.0 1.0
neighbor .3 bin
thermo_style custom step atoms pe
thermo_modify norm no
run 0

GPU输入增加对应GPU包设置,使用lj/cut/gpu。这里执行真实单点计算,没有推进MD,不把一次单点结果当作材料动力学或GPU性能测试。

3 文件怎样传递#

from dpdispatcher import Machine, Resources, Task, Submission

machine = Machine.load_from_json("machine.json")
resources = Resources.load_from_json("resources.json")
task = Task(command="python3 payload.py", task_work_path="task-0",
            forward_files=["payload.py", "param.json"],
            backward_files=["result.json", "native.out", "final.dump",
                            "energy.dat", "attempts.jsonl"])
submission = Submission(work_base=".", machine=machine,
                        resources=resources, task_list=[task])
submission.run_submission(clean=False)

这是对象连接方式的简化说明;本包已有完整的worker.py,可以先运行它,不必从空文件开始写。forward_files是每任务必须准备的输入;backward_files是希望取回的输出,名字应与实际程序写出的文件一致。

ls shell/local/task-0
cat shell/local/task-0/result.json
head -n 20 shell/local/task-0/final.dump

native.out为LAMMPS输出,final.dump含实际坐标和力,result.json是脚本整理出的简表,attempts.jsonl记录该任务的执行次数。读取物理结果时先分清原生输出与脚本整理文件。

4 实际能量与力#

距离 CPU能量 P100能量 CPU左侧原子的Fx
1.05 −0.757511914 −0.757505417 −8.399072908
2^(1/6) −1.000000000 −1.000000000 约0
1.4 −0.460686922 −0.460687578 1.671996900

完整实际数值见CSV,本例GPU包为mixed精度,实际输出与CPU存在小差别;图中同时与解析LJ势和独立能量差分比较。

head -n 10 analysis/dimer-dispatch-results.csv
ls figures

通过工作流运行后的真实能量、力及独立参考

DPDispatcher顺利提交并取回文件,只说明工作流这一步完成,仍应像本例一样检查原子数、结构、单位和数值。把payload.py换成自己的VASP、ABACUS或势训练程序后,科学检查也应随任务类型改变。

继续看Slurm提交与结果取回及重试、中断与续传。原生接口见DPDispatcher Python API。

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

查看配图

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

100%查看原图 ↗