GPUMD专题

GNEP:预测结果、力梯度与模型接口

读懂GNEP能量和受力输出,使用预测模式检查模型梯度,明确未知标签占位及NEP5接口限制。

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

先完成真实铝标签训练。本篇继续读预测输出,区分两件事:模型是否接近真实DFT结果,以及同一模型的能量导数是否等于它的解析力。两者都应检查,不能互相替代。

1. 模型文件先看哪一行#

在实例包根目录执行:

head -n 6 reference-results/E10-p100-base-s13579/training/nep.txt

本例首行是 nep5 1 Al,后面有 cutoff 4.5 3.5、n_max 4 4、basis_size 4 4、l_max 4 0 0 和 ANN 16 0 等信息。这是 GNEP输出的NEP5模型,不能因文件名叫 nep.txt 就认定所有NEP运行器均能加载。

当前GPUMD5.9.1入口 本例NEP5模型如何使用
gnep,prediction 1 可以;本例全部预测与力来自这个入口
普通 nep 当前只接受version4;与本例NEP5版本不一致
gpumd 当前运行器不识别此NEP5势,不能据此启动MD
修改文件头为nep4 不采用;改字样并不转换模型布局或算法

P100和V10016G均做过原生入口检查,即使普通NEP的截断、描述符和网络参数逐项匹配,仍存在版本不一致。请使用本例已支持的GNEP预测入口。若要开展MD,应另选已验证可被 gpumd 加载的普通NEP训练路线,并检查对应模型的实际精度。

2. GNEP预测需要哪些文件#

以已经训练结束的一个作业目录为例:

cd cases/E10-p100-base-s13579
ls prediction-heldout
cat prediction-heldout/gnep.in
head -n 2 prediction-heldout/train.xyz

预测目录包含训练生成的 nep.txt、待预测帧 train.xyz、以下 gnep.in:

type 1 Al
cutoff 4.5 3.5
n_max 4 4
basis_size 4 4
l_max 4
neuron 16
lambda_v 0
prediction 1

prediction 1 固定模型参数,只输出预测结果;不继续训练。type、截断、描述符和神经元数要与该模型一致。GNEP的 l_max 输入只写一个值,不把输出头中的三项格式照抄回输入。

上一页提交的 job.slurm 已经在GPU资源中按以下顺序执行;平时只需提交脚本并等待,不在登录节点手动运行 gnep:

# 以下是作业在 prediction-heldout 目录里的原生步骤
cp ../training/nep.txt nep.txt
cp ../heldout.xyz train.xyz
gnep > native.out 2>&1

对未知结构预测时,同样准备 train.xyz 的几何、元素和周期边界,匹配模型输入。当前读入格式还要求能量和力字段;若没有DFT结果,要明确标记未知,零值只能占位,不能拿来算精度。本例下一节已经实际走过这条无标签预测路径。

3. 能量和力分别读哪几列#

head -n 3 prediction-heldout/energy_train.out
head -n 4 prediction-heldout/force_train.out
  • energy_train.out:每帧一行,第一列预测能量,第二列参考能量,单位都是 eV/原子。
  • force_train.out:每原子一行,前3列预测Fx/Fy/Fz,后3列参考Fx/Fy/Fz,单位 eV/Å。

这些文件名中的 train 是预测入口的输出约定。本例输入实际是独立测试集,不能据文件名将它改称训练集。参考列来自数据输入,预测未知结构时参考列并不是DFT结果。

回到包根目录可查看逐构型原始值:

cd ../..
head -n 8 analysis/parity.csv
cat analysis/metrics.csv

参考结果包含全部32个条件。重新训练后的分析用 analysis-new;命令见上一篇。每原子能量RMSE与力分量RMSE使用各自单位,不用一个数字代表两种精度。

4. 构造模型内部梯度检查#

本例从3个独立父构型出发,对第0个原子做x/y/z方向位移,使用0.005、0.01、0.02 Å三种步长,每个正负各一帧,共 3×3×3×2=54帧。

cd cases/E10-p100-base-s13579
head -n 6 gradient-probes.xyz
ls prediction-gradient-probes

一个实际输入帧如下:

4
Lattice="4.1032951197914 -0.008026874895206 0 0 4.1249488796877 0.0056839357292893 -0.0083993286417636 0 4.1126614803091" Properties=species:S:1:pos:R:3:force:R:3 pbc="T T T" ReferenceStatus=unknown_model_gradient_only PredictionOnly=true energy=0
Al -0.028133781182689 -0.013836638830516 0.001486583490748 0 0 0
Al -0.030069296283425 2.0783207524281 2.0329237190336 0 0 0
Al 2.0576967101589 -0.028445767743723 2.0746064263288 0 0 0
Al 2.046490738317 2.0638922107968 -0.028930588438549 0 0 0

ReferenceStatus=unknown_model_gradient_only 和 PredictionOnly=true 说明这里没有新DFT标签。energy=0、零 force 仅为格式占位;不参与训练、不参与DFT误差统计。脚本使用其中的预测能量求导,再与未位移父构型的模型解析力比较。

中心差分公式:

F_x(FD) = -[E_total(x+h) - E_total(x-h)] / (2h)
E_total = 4 × E_per_atom     # 本例每胞4个原子

这里必须先乘原子数。直接对 eV/原子的能量差求导,会让力差一个原子数因子;负号也不能丢。

5. 提取并画梯度对照#

作业脚本已经完成全部54帧的GNEP预测。回到包根目录运行:

cd ../..
module load ase/3.29.0
python3 analyze.py --new --case E10-p100-base-s13579
head -n 10 analysis-new/model-force-gradients.csv
ls figures-new

若上一篇已经生成 analysis-new 与 figures-new,直接查看已有结果;脚本不会覆盖。看包内参考结果可运行 bash view.sh 后查看 analysis/model-force-gradients.csv。

其中一个P100/普通余弦/种子13579的x方向例子为:

项目 本次实际值
父构型 g06-T1000
差分步长 0.01 Å
模型解析力 0.1241730 eV/Å
模型总能差分得到的力 0.1240000 eV/Å
两者绝对差 0.0001730 eV/Å

全部E10模型的模型解析力与能量导数,以及不同位移步长的实际残差

16个E10模型、3个父构型、每个3个方向,在固定 h=0.01 Å 时最大绝对差为 0.002503 eV/Å。另两种步长全部保留在CSV与图里,没有只挑误差最小的步长。

原生文本能量只有6位有效数字。步长过小会放大输出舍入误差,过大又会增加中心差分截断误差,因此“位移越小越好”不成立。这是模型内部一致性检查;是否接近真实DFT,仍看上一篇的独立能量与受力误差。

6. 换成自己的体系时#

先检查元素、局域环境和目标温度/应变是否在训练覆盖内。本例仅15个小扰动固态Al父构型;不包括液体、表面、空位或高压相,不能直接拿它做这些生产模拟。当前模型也不是可变电子温度势,不应将标签电子温度1000 K误读为可输入任意温度。

完整数据和代码仍在同一实例包。GNEP训练算法和当前输入说明见GPUMD官方介绍,版本匹配以本版本源代码和实际可执行入口为准。

NEP5模型的独立副本入口#

当前独立gpumd_replica有NEP5实现,按NEP5模型副本与续算提交单卡双副本,比较同模型能量与受力,并从完整检查点续算。P100/V10016G均有真实短例;普通gpumd与nep的NEP5限制保持,不能将不同入口混用。四原子12fs只演示流程,不提供平衡统计或通用铝势结论。

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

查看配图

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

100%查看原图 ↗