GPUMDkit 电荷模型输出头与 qNEP 单点
给NEP4势添加两种电荷输出头,导出、读取电荷和BEC,并在CPU/P100上比较。
阅读本篇目录
下载模型、实际数据与操作资料包。解压进入目录,inputs / conversion-inputs 是输入,reference 保存集群参考结果。每次运行在 work 建立新目录,结果位置写入 LAST-RUN.txt。耗时预测和 GPU 对照请在分配好的计算资源内执行。
添加输出头以后,还缺什么#
普通 NEP 势输出能量与力。带电荷输出头的 qNEP 模型还可提供原子电荷与 Born 有效电荷(BEC)相关输出。GPUMDkit 可以为已有 NEP4 势增加这部分模型结构,再为后续训练准备成组文件。
本篇从公开 Te-Pb 势模型出发,分别新增两种电荷模式并进行真实单点计算。新增参数采用初始化值;零电荷和零 BEC 是初始化结果,不是 PbTe 的物性结论。

1. 准备模型和新优化器#
module purge
module load gpumdkit/1.5.8
python init_optimizer.py
gpumdkit.sh -nep_modifier model-input/nep.txt \
model-input/nep.restart model-input/nep.in
如果已经生成 model-input,使用现有副本即可。这个初始化用公开势的现有权重建立新的 SNES 均值,并设置搜索标准差,不复制原训练优化器。
2. 新增模式 1#
依次选择 1 扩容 → 8 电荷输出头 → 1 电荷模式 → 回车接受本次 SNES 设置 → y 确认 → 7 记录 → 8 导出 → charge-mode1 → y → 0。
head -n 6 charge-mode1/nep_modified.txt
cat charge-mode1/nep_modified.in
模型头部会包含:
nep4_charge1 2 Te Pb
cutoff 8 4 73 8
n_max 6 6
basis_size 6 6
l_max 4 2 0
ANN 30 0
本例导出的配套训练输入:
type 2 Te Pb
generation 1000
batch 1000
version 4
model_type 0
cutoff 8 4
n_max 6 6
basis_size 6 6
l_max 4 2
neuron 30
charge_mode 1
模式 1 对应程序提供的实空间与倒空间电荷模型路线。不要只手改 nep.txt 第一行来代替新增参数和重启状态。
3. 独立新增模式 2#
退出后,重新从原始 model-input 打开编辑器;选择同一菜单,但电荷模式输入 2,导出到 charge-mode2。
head -n 1 charge-mode2/nep_modified.txt
grep charge_mode charge-mode2/nep_modified.in
输出头为 nep4_charge2,输入含 charge_mode 2。这是倒空间路线。两种模式都从 3075 增至 3136 个总系数;保留 30 个神经元和原有势能部分。
4. 在实际结构上读取电荷与 BEC#
分配计算资源后,可用如下 Python 脚本:
from ase.io import read
from calorine.calculators import CPUNEP
atoms = read('inputs/probe-PbTe.xyz')
atoms.calc = CPUNEP('charge-mode1/nep_modified.txt')
print('Energy (eV):', atoms.get_potential_energy())
print('Forces (eV/Angstrom):', atoms.get_forces())
print('Charges (e):', atoms.get_charges())
bec_flat = atoms.calc.get_property('born_effective_charges', atoms)
print('Raw BEC shape:', bec_flat.shape) # (250,9) in this example
bec = bec_flat.reshape(len(atoms), 3, 3)
print('BEC tensors (e):', bec)
本集群 Calorine 4.0 返回的原始 BEC 数组为 (原子数,9),本例即 (250,9)。每原子的九分量按 xx xy xz yx yy yz zx zy zz 展开,可按上面的代码重排为 3×3 张量。BEC 不必对称,不要压成应力常用的六分量。
完整 CPU 操作入口:
bash run.sh models
两种模式都对 250 原子 PbTe 结构实际求值。新头给出最大原子电荷 0 e、最大 BEC 分量 0 e;已有势能、力和应力在这个结构上保持。高频介电相关新增参数也来自初始化,不能作为拟合好的介电响应。
5. P100 上交叉计算#
sbatch run.sbatch
使用 GPUMD 5.9.1 P100 构建与 Calorine 4.0。包内 GPU 脚本通过 GPUNEP(..., gpu_identifier_index=None) 保留 Slurm 的 GPU 分配,并读取电荷与 BEC 输出。两种新头的电荷/BEC 与 CPU 结果一致,都是初始化的零值。
这一步证明模型文件和计算路径可衔接。若要研究离子性、介电响应或红外性质,应提供对应结构与电荷/BEC 标签,设置训练权重,完成训练并用独立数据验证;只增加输出头不会产生这些能力。
6. 去掉电荷输出头#
打开某种模式的成组导出文件,在主菜单选择 2 裁剪 → 8 电荷输出头 → 回车 → y → 7 → 8 → 新目录 → y → 0。
本次两种移除流程均回到普通势模型的 3075 个系数,对已有探针恢复相同输出。保留新旧各组文件,后续根据自己的训练目标选择;本例不启动新的电荷模型训练。