DeePMD虚拟原子与掩码模型
讲清四个真实原子与五个容量槽,逐帧推断、虚拟原子操作和真实原子误差统计。
阅读本篇目录
se_a_mask用于非周期体系中的真实/虚拟原子掩码。本例仍是NH₃,只有4个真实原子,额外增加1个H类型的容量槽,用aparam=0排除。它没有变成NH₄,也没有增加电子或改变量子化学标签。先完成公共准备与训练,本篇继续读取同一个新作业。下载三个实例的完整资料包。
1 查看掩码输入#
cat inputs/se_a_mask.json
实际模型设置为:
{
"type": "standard",
"type_map": [
"N",
"H"
],
"descriptor": {
"type": "se_a_mask",
"sel": [
1,
4
],
"neuron": [
8,
16
],
"axis_neuron": 4,
"resnet_dt": false,
"precision": "float64",
"seed": 600001
},
"fitting_net": {
"type": "ener",
"neuron": [
32,
32
],
"resnet_dt": false,
"precision": "float64",
"seed": 600002,
"numb_aparam": 1,
"use_aparam_as_mask": true
}
}
这里sel=[1,4]表示最多一个N槽和四个H槽,含那个虚拟槽;不要套用其他描述符的近邻容量含义。numb_aparam=1给每个原子一个附加标记,use_aparam_as_mask=true把它解释为真实/虚拟标记。输入数据非周期,没有压力或virial训练标签。

2 直接检查数组#
bash masks.sh
会显示type.raw中的0 1 1 1 1和第一帧aparam中的1 1 1 1 0。最后一个H类型槽的坐标为(4,3,2)Å,力标签为0;它只是输入容量的一部分。数据同时提供atom_pref.npy掩码,便于进一步按原子的损失设置使用;本例使用所附完整的能量/力训练输入。
包内推断程序逐帧调用原生接口。在这个版本中,直接把多帧掩码数据一起交给原生批量测试,会遇到非周期virial输出的形状问题;单帧路径能正常读取能量与力。程序相应设置DP_INFER_BATCH_SIZE=5,一次对应五个容量槽,客户无需手工拆文件。
如果在Slurm脚本中自己编写Python,加载对应DeePMD模块后,单帧调用方式为:
import numpy as np
from deepmd.infer import DeepPot
coordinates = np.load("data-mask/test/set.000/coord.npy")[0]
model = DeepPot("new-work/p100-se_a_mask/frozen_model.pb")
energy, force, virial = model.eval(
coordinates.reshape(1, 15), None,
[0, 1, 1, 1, 1], aparam=[[1, 1, 1, 1, 0]]
)
coordinates是你从相应一帧coord.npy读出的坐标;None表示非周期。本例只使用能量与原子力,不能把这个旧非周期接口提供的virial占位结果解释为压力。
3 比较自己的CPU和GPU结果#
cat tables-new/cpu-gpu-errors.csv
表格将同一模型分别放到CPU和Slurm分配的GPU上计算,再比较能量与力。还检查平移、旋转、H换序、合力及两档能量差分。掩码另外检查移动虚拟槽、交换同类型真实/虚拟槽后,真实物理预测是否保持一致。

本次掩码模型在P100、V10016G上的真实原子力RMSE约0.08201eV/Å,总能量RMSE约0.0008396eV/真实原子。tables-new的能量和力误差都按4个真实原子统计。dp test和学习日志可能按5个输入槽归一,因而原生力RMSE约0.07335eV/Å;两者分母不同,不是计算丢了一个真实原子。虚拟槽不能用来降低物理误差数值。
4 重画参考图#
bash plot.sh
这里只重画reference中的六张真实结果图,不重新训练。自己的预测继续看tables-new与new-work。依据:DeePMD官方掩码文档、DeePMD3.2.0版本。