NepTrain用VASP补标并自动再训练
展开实际INCAR、KSPACING及标签定义,追踪四个候选到36帧训练集。
阅读本篇目录
下载输入、模型、真实数据和短命令脚本(ZIP)。本例补标阶段将四个入选Si8构型分成两个Slurm任务,每个任务顺序处理两帧。总共四次真实VASP单点,不做结构优化。
1 先统一标签标准#
cat inputs/INCAR
head data/train.xyz
cat data/SPLIT.json
完整INCAR:
SYSTEM=Si actual labels PBE
ENCUT=450
EDIFF=1E-6
PREC=Accurate
ISYM=0
ISIF=2
NSW=0
IBRION=-1
ISMEAR=0
SIGMA=0.05
LWAVE=.FALSE.
LCHARG=.FALSE.
LREAL=.FALSE.
ADDGRID=.TRUE.
ALGO=Normal
NELM=120
NCORE=1
GGA=PE
KSPACING=0.5
KGAMMA=.TRUE.
NSW=0、IBRION=-1 表示当前构型的静态单点;ISIF=2 需要应力输出,供virial标签转换。EDIFF=1E-6 是电子收敛阈值。450 eV、PBE和Si赝势与原有48帧保持一致,不要补标时随意换成另一套参考标准。
本例用 KSPACING=0.5、KGAMMA=.TRUE. 生成Γ中心网格,因此不另提供一个声称实际使用过的固定KPOINTS。对自己的金属、大晶胞或高精度目标,应先检查网格和展宽收敛,再统一生成全部标签。
2 赝势准备与完整提交#
bash prepare.sh
bash workflow.sh
bash status.sh
prepare只在新目录执行一次;其中VASPKIT 103依据POSCAR元素顺序生成授权Si POTCAR。附件不分发POTCAR。已经有restart.yaml时继续同一个workflow入口,不要重新创建工作区。
find dispatcher -name OSZICAR
find dispatcher -name CONTCAR
find loop/cache -name all_learn_calculated.xyz
查看自己的原始输出时,确认电子迭代达到阈值且输出完整,不要只看Slurm显示结束或有一个结果文件。
3 能量、力和virial如何进入数据#
本例能量为VASP自由能F,每构型eV;力为eV/Å。virial总量满足 W = -V × stress_ASE,单位eV;ASE以拉伸应力为正,GPUMD输出的压力以压缩为正。
同一种材料若把F、E0、不同赝势或不同泛函混在一起,会引入标签不一致。这里在导出时固定F,按同一构型核对原始单点能量和力后再合并。
head reference/four-new-DFT-labels.xyz
cat analysis/neptrain-DFT-labels.csv
head loop/cache/Generation-2/nep/train.xyz
完成后训练集32+4=36帧;验证仍为8帧,独立测试仍为8帧。另一个初始结构单点标签单独保存在 reference/initial-structure-singlepoint.xyz,没有混入这36帧。
4 补标后实际改善了什么#
四个新增点的回算误差:
| 模型 | 能量RMSE / eV·atom⁻¹ | 力RMSE / eV·Å⁻¹ |
|---|---|---|
| 补标前第一代 | 0.038854 | 0.090729 |
| 并入训练后的第二代 | 0.030133 | 0.025985 |
cat analysis/neptrain-newlabel-errors.csv
bash evaluate.sh
cat analysis/my-model-errors.json
这四点加入了第二代训练,误差降低属于训练数据回算。真正独立八帧的力误差也改善,但能量和压力略有增大,详见训练与误差教程。不能把训练点改善替代泛化测试。
5 换后端时需要哪些条件#
安装版有 dft --vasp、dft --abacus 和独立 vasp 入口。本例端到端使用VASP;直接使用ABACUS入口还需与这个版本兼容的ASE-ABACUS插件及匹配的赝势/轨道文件,不能因为集群装有ABACUS就认定NepTrain对应Python插件也已具备。
module load gpumdkit/1.5.8
NepTrain dft --help
NepTrain vasp --help
跨后端时先保持几何、泛函和数据定义一致,单独对照能量差、力和应力。不同程序或赝势的绝对能量不能直接拼成同一训练基准。