LAMMPS 专题

LAMMPS Fenix:备用进程与检查点恢复

从构建独立环境、写入restart到恢复计算,使用32原子模型演示备用MPI进程接替。

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

Fenix 用于 MPI 进程故障后的在线恢复。本例先在第 10 步保存检查点,再让当前示例中的一个 MPI 进程退出,由备用进程接替,从检查点继续到第 50 步。你可以对照完整输入和轨迹,理解如何给自己的计算准备恢复入口。

1. 下载,先看结果#

下载输入、结果、源码与绘图脚本(约 11.4 MiB),保存为 example.zip:

python3 -m zipfile -e example.zip .
cd lammps-fenix-recovery
bash show-reference.sh
bash plot-results.sh
ls -lh plots/*.png

32原子结构与五组进程恢复流程

模型是 32 原子的周期 FCC 点阵,盒长 4,数密度 0.5,质量为 1。使用 LJ 约化单位,ε=σ=1,截断 1.8,并把截断处势能平移到零;初温 0.1、质心动量为零。输入文件直接保存相同的原子编号和速度,因此改变 MPI 分解后仍能比较轨迹。它用于解释恢复流程,不对应某一种材料的拟合参数。

2. 在自己的计算目录构建#

本例使用 LAMMPS 30 Sep 2026、GNU GCC/G++ 13.3、C++20、OpenMPI 5.0.10 的 ULFM 功能,以及 Fenix 2.0 API 的固定提交 fe22a98ef66d5d1d3ed84f6c19bde521a1d80427。

普通 LAMMPS 模块未必包含 FENIX 包。下载包提供专用源码,会在当前示例的 runtime/ 内构建独立程序。所附 LAMMPS 源码包含三处文件的进程生命周期兼容调整,涉及备用进程初始化、故障后通信域及恢复后的输入退出;不修改力、积分或检查点内容。补丁是 lammps30Sep2026-fenix-lifecycle.patch,不要把本例结论套到未经这些调整的其他构建。

在获得的 CPU 计算资源内运行:

bash prepare-runtime.sh
ls -lh runtime/bin/lmp

脚本最多使用 8 核编译,源码随包提供,无需联网下载,不需要 root 权限。已有完整 runtime/ 会核对后复用;不完整的构建目录会停止,先检查原输出再决定如何处理。集群常规模块和其他软件不会被替换。

需要经 Slurm 申请 CPU 资源时:

sbatch job.slurm

脚本采用 cpu-8173m,申请一个完整 56 核节点(4 个任务、每任务 14 核),随后顺序构建、计算、绘图。实际模拟为 4 个 MPI 进程、每进程 1 个线程。以分区可用状态及账户权限为准;不要在未申请的登录节点直接运行生产模拟。

3. 设置正常计算与检查点#

inputs/normal.in 第一行:

fenix spares 1 restart_file recover.in restart_label resume

4 个启动进程中,1 个留作备用,3 个参加计算。fenix 放在初始化模型和通信之前;它指定恢复后读取 recover.in,从 label resume 开始。后续相同命令可以更新恢复文件与标签,但不能重新调整初次预留的备用进程数。

模型的核心输入为:

units lj
atom_style atomic
boundary p p p
read_data input.data
pair_style lj/cut 1.8
pair_coeff 1 1 1 1
pair_modify shift yes
neighbor 0.3 bin
neigh_modify delay 0 every 1 check yes
atom_modify sort 0 0.0
fix integrate all nve
timestep 0.001
thermo 10
thermo_style custom step atoms pe ke etotal temp press
thermo_modify norm no format float %.17g
run 10
write_restart checkpoint.10
run 40

Fenix 不替你生成这个磁盘检查点。 write_restart 保存状态,恢复输入中的 read_restart 才能读回。长任务可以按合适频率写检查点,并让恢复脚本读取确实存在且完整的文件。

4. 写恢复输入#

inputs/recover.in 的关键部分:

label resume
units lj
atom_style atomic
read_restart checkpoint.10
neighbor 0.3 bin
neigh_modify delay 0 every 1 check yes
atom_modify sort 0 0.0
fix integrate all nve
thermo 10
thermo_style custom step atoms pe ke etotal temp press
thermo_modify norm no format float %.17g
print "RECOVERED ${fenix_restarted}" file recovered.marker
run 40
write_restart checkpoint.50
print "COMPLETED 50" file completed.marker

重建 LAMMPS 后需重新定义积分 fix、输出等未自动恢复的设置;具体势函数和 fix 还应检查各自 restart 说明。本例从第 10 步再走 40 步到第 50 步,不会从零开始多走 50 步。恢复分支中的 fenix_restarted 为 1。

5. 运行五组对照#

已经构建好独立环境后,在分配的计算资源内执行:

bash run.sh
bash plot-results.sh
cat fenix-summary.csv

脚本依次运行普通 4 进程、3 个活动进程加 1 个备用的无故障对照、备用接替、缩减恢复和 universal 恢复。后面三组会各自结束当前示例已核对身份的一个 MPI 进程来触发恢复;脚本核对账号、工作目录、运行标记及程序路径,只处理本次启动的进程。它不关闭节点,也不操作其他任务。

查看备用接替:

cat work/spare-recovery/recovered.marker
cat work/spare-recovery/completed.marker
grep 'Loop time' work/spare-recovery/native.log
head -n 9 work/spare-recovery/after.dump

应看到 RECOVERED 1、COMPLETED 50,活动进程恢复前后都是 3;after.dump 从第 10 步起输出。work/ 已存在时整套脚本停止,避免覆盖原轨迹。要重新开始,请重新解压到另一个目录。

本例五组都完成 50 步;总能量约 -57.4337648640,50 步内能量漂移约 4.63×10⁻⁷(LJ 单位)。短轨迹用于流程对照,不用于确定生产计算的步长或统计收敛。

下一篇介绍 缩减与 universal 分区恢复。命令语义参见 LAMMPS 官方 Fenix 文档。

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

查看配图

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

100%查看原图 ↗