GPUMD专题

GNEP:用NEP5模型运行副本计算与续算

使用独立gpumd_replica入口加载真实GNEP模型,提交单卡双副本,检查能量受力与完整检查点续算。

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

训练GNEP模型后,文件首行是 nep5 1 Al。当前独立的 gpumd_replica 可以运行本例NEP5模型;它有单独的势函数实现,普通 gpumd 与普通 nep 的NEP5限制仍然存在。不要把两个入口混用,也不要改模型文件头。

本篇用同源真实铝模型,完成“准备模型→单卡双副本→完整检查点续算→对照原生能量和受力→画图”。P100和V10016G均做过实际运行。示例只有4原子、12 fs,用于学习输入与操作,不代表平衡采样或通用铝势。

1. 下载并先看参考结果#

下载副本实例包,保存为 gpumd-nep5-replica-wave222.zip:

unzip gpumd-nep5-replica-wave222.zip -d nep5-replica
cd nep5-replica
bash view.sh
cat analysis/metrics.csv
ls figures

两套模型分别来自上一篇 P100/V10016G、能量权重10、10000轮、种子13579的实际训练,保持原始参数和NEP5文件头。本篇没有再做DFT或重新训练。

inputs/p100、inputs/v100 各有匹配的 nep.txt 与四原子 model.xyz。reference-results 保留原生轨迹、热力学、模型预测和完整检查点。

2. 生成并提交一个条件#

source /etc/profile
module load ase/3.29.0
python3 prepare.py
cd cases/p100
sbatch job.slurm
squeue -u "$USER"

V10016G用户进入 cases/v100 提交。每个任务只申请一张GPU和一个CPU核心,两个副本放在这张GPU上;这里的“副本”是独立运行的系统拷贝,不是扩成更大的空间超胞。套餐用户用 yskit 匹配本人可用分区和同型号GPU环境。

展开完整P100提交脚本
#!/bin/bash
#SBATCH --job-name=GNEP5-replica
#SBATCH --partition=gpu-8p100-hs
#SBATCH --nodes=1
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=1
#SBATCH --gres=gpu:p100-16g:1
#SBATCH --time=00:15:00
#SBATCH --output=replica-%j.out
set -eo pipefail
source /etc/profile
module purge
module load cuda/12.9 gpumd/5.9.1-p100 ase/3.29.0
export OMP_NUM_THREADS=1 OPENBLAS_NUM_THREADS=1 MKL_NUM_THREADS=1 MPLBACKEND=Agg
cd "$SLURM_SUBMIT_DIR"
python3 -B ../../run_replica.py
python3 -B ../../run_force.py

脚本先运行短副本流程,再做一个独立的受力接口检查。不要在登录节点直接执行 gpumd_replica 或 gnep。

3. 第一段:40步建立完整检查点#

checkpoint40/run.in:

potential nep.txt
time_step 0.1
multi_replica remd replicas 2 2 exchange 20 temp 10 20
ensemble nvt_bdp 10 20 100
dump_xyz -1 0 20 trajectory.xyz velocity
run 40
  • potential nep.txt 加载这次真实训练得到的原始NEP5模型。
  • time_step 0.1 为0.1 fs;本段40步,即4 fs。
  • replicas 2 2 表示2个副本、每张GPU最多容纳2个。
  • exchange 20 每20步尝试交换,目标温度为10 K和20 K。
  • dump_xyz 使用本入口的格式,输出两个副本的坐标与速度;不要照搬普通 gpumd 的输出命令。

10/20 K是离子热浴温度;模型标签的电子温度固定1000 K。 本例模型没有可变电子温度输入,两者不是同一个量。

原生执行命令为:

gpumd_replica > native.out 2>&1

它已经放在提交脚本调用的程序内;平时提交 job.slurm 即可。任务结束后检查:

ls checkpoint40
head -n 8 checkpoint40/remd_thermo.out
cat checkpoint40/remd_temperature_status.out

remd_thermo.out 保存每个副本的目标温度、势能和体积;remd_temperature_status.out 保存温度标签归属。副本编号和温度标签会分离,不能始终把“副本0”当作“10 K”。

4. 第二段:从同一检查点续算#

示例将同一个40步完整检查点复制为两条分支:

目录 后续步骤 最终总步数
direct 一次继续80步 120
fork 先继续40步,再继续40步 120

一次继续80步的输入为:

potential nep.txt
time_step 0.1
multi_replica remd replicas 2 2 exchange 20 temp 10 20 resume remd
ensemble nvt_bdp 10 20 100
dump_xyz -1 0 20 trajectory.xyz velocity
run 80

关键是 resume remd;run 80 表示在保存状态之后新增80步,不是将总步数设为80。

完整检查点除两个 remd_replica_*_restart.xyz 外,还包含 remd_restart.meta 里的积分、随机数、热浴和温度标签状态,以及后续追加使用的同源输出。请保留整个同源计算目录,不要只复制一个结构,也不要混入不同模型或不同参数的文件。

cat direct/remd_restart.meta
head -n 2 direct/remd_replica_0_restart.xyz
head -n 2 fork/remd_replica_0_restart.xyz

脚本已自动完成两条分支,不需要手工多次提交。两条独立新启动的短任务会有不同随机初态,因此本例比较的是同一完整检查点分叉,不要求两次全新启动逐帧相同。

同检查点两种续算路径,以及副本温度标签的实际变化

本次两平台最终能量在原生输出精度下完全一致,位置最大差分别约4.9×10⁻¹⁵ Å和8.9×10⁻¹⁶ Å,速度最大差低于7×10⁻¹⁹ Å/fs。它说明该例的完整状态续算一致,不代表任意改变参数后都能逐帧一致。

5. 原生副本能量与GNEP预测对照#

脚本从实际副本轨迹取出12帧,加上初始结构,共13帧,固定同一个 nep.txt 由GNEP重新预测:

head -n 5 GNEP-same-frames/gnep.in
head -n 4 GNEP-same-frames/energy_train.out
cat GNEP-same-frames/FRAME-INDEX.json

这些预测输入没有新DFT标签,参考列的零值是格式占位,并已标记 ReferenceStatus=unknown_model_interface_only。本篇只比较同一模型、同一构型的两种入口;不把零值参考列用于计算DFT精度。

每个平台的初始两副本和12个真实轨迹帧均找到同时间点原生热力学输出,共14行对照;不通过插值补数据。副本总势能除以4后,才与GNEP的eV/原子输出比较。

原始NEP5模型在副本入口与GNEP中的实际能量对照

本次最大差:P100为 4.7161×10⁻⁶ eV/原子,V10016G为 3.7480×10⁻⁶ eV/原子。原生GNEP文本只有6位有效数字,这一输出精度也会进入两入口的数值差。

6. 受力也做独立的接口检查#

本包的 force-control 是一个专门的三步积分检查,步长0.01 fs,保留第1/2/3步原生速度。BDP耦合时间取1e30,使当前FP64实现中的 exp(-1/tau) 舍入为1,速度缩放为1;三步内也不尝试交换。

这个设置只是短步积分一致性控制,不是生产热浴参数,不用于热平衡采样。 通过第1、3步速度的中心差分,在第2步检查力:

F_acceleration = m × (10.18051)^2 × [v(step3)-v(step1)] / (2×0.01)
m(Al) = 26.9815385

这里使用程序自身的Al质量与自然时间换算,原生输出速度单位是Å/fs,最终力为eV/Å。第2步同一结构再由GNEP给出解析力;中心差分仍有O(dt²)截断误差。

cat force-control/run.in
head -n 4 force-control/GNEP-middle-frames/force_train.out

GNEP解析力与原生MD速度变化得到的受力对照

两个副本、4原子、3个方向,每个平台24个受力分量。本次最大差为P100 3.604×10⁻⁶ eV/Å、V10016G 3.924×10⁻⁶ eV/Å。这说明本例NEP5受力入口与GNEP预测一致;是否符合DFT仍需看独立测试,不能拿接口一致性代替势函数准确性。

7. 分析自己的新结果#

在任务结束后回到包根目录:

cd ../..
module load ase/3.29.0
python3 analyze.py --new --case p100
cat analysis-new/metrics.csv
head -n 8 analysis-new/native-GNEP-energy.csv
head -n 8 analysis-new/native-GNEP-forces.csv
ls figures-new

V100条件将最后的 p100 替换为 v100。参考结果用 bash view.sh 读取,重跑使用新解压目录,不覆盖旧数据。

后续正式计算需选择适合目标构型与物性的势,并增加体系规模、平衡时间和采样长度。本例的12 fs、四原子结构与微小位移不提供扩散、相变或热输运结果。更多副本与输出操作见带电模型副本与检查点。

参考:GPUMD副本入口、本版本独立副本实现。

按模型选择入口,再做PRD#

先按模型与四个程序入口区分普通NEP、GNEP/NEP5、性质模型和当前未启用接口,再看硅间隙原子PRD与事件时钟、完整检查点。提供真实盆地重排和单卡双副本短例,保留所有早期关联事件,不把几何事件与时钟累计当作迁移速率或墙钟加速。普通XYZ/NetCDF/分组输出与副本输出格式分别使用。

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

查看配图

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

100%查看原图 ↗