ABACUS DeePKS:模型自洽、能量与力
把实际训练的模型加入LDA自洽势,读取最终能量和力,对照独立检查构型与一个能量差分例子。
阅读本篇目录
本篇在训练完成后,把模型加入ABACUS的电子自洽过程,实际重新求解八个水分子的电子密度和总能。固定密度预测与自洽推断分别保留,便于看清模型使用方式。
unzip abacus-deepks-water-wave680-*.zip
cd abacus-deepks-water
bash results.sh
bash plot.sh
以上仅读取已完成的参考数据并重绘,未启动新计算。reference-data/是本集群实算参考,重新执行的原生结果放在work/、提取的数值和图片放在analysis/。每次完整重算使用新解压的目录,避免覆盖已有结果。
本组使用独立CPU环境。先编译一次,再在本资料包目录选择它:
bash use-toolchain.sh ../abacus-ml-env/toolchain
程序为固定ABACUS 3.11.0-beta10;编译器icx/icpx/ifx 2024.2、Intel MPI 2021.13、顺序MKL 2024.2,链接现有PyTorch 2.8.0+cu126,本文实际使用CPU。公共3.10.1模块保持原用途。计算脚本通过cpu-8173m申请56核独占整节点,小例内部采用少量进程,仍按整节点计费;本篇不作CPU节点性能对照。CPU资源暂不可用时可先查看参考数据。
1. 加载已经训练好的模型#
ls training/model.ptg
sbatch scf.slurm
脚本为每个构型创建独立的inference/water编号,复制同一个模型;在基础LDA输入中启用:
dft_functional lda
deepks_scf 1
deepks_model model.ptg
deepks_out_labels 1
cal_force 1
其余完整输入与标签篇一致。模型的元素、基组、投影文件和描述符约定都应匹配;不能随意把另一个项目的模型替换进来。
cat inference/water6/INPUT
grep FINAL_ETOT_IS inference/water6/OUT.dk/running_scf.log
grep -A9 TOTAL-FORCE inference/water6/OUT.dk/running_scf.log
inference/water6与water7对应两个未用于训练的几何。脚本最多并发四个单进程SCF,并使用当前Slurm分配的CPU范围。
2. 固定密度与自洽结果分别看#
| 数据范围 | LDA总能MAE / eV | 固定密度修正MAE / eV | 修正自洽MAE / eV |
|---|---|---|---|
| 六个训练几何 | 2.676302 | 0.0002619 | 0.0002613 |
| 两个独立检查几何 | 2.673150 | 0.0003046 | 0.0001962 |
这是相对本例PBE目标的分子总能差,未除以原子数。小误差只对应所列有限几何,不代表达到通用化学精度。模型未使用力标签;独立检查两帧的平均力分量RMSE约0.01950 eV/Å,只描述这两帧。
cat analysis/DeePKS-energy-results.csv
head analysis/DeePKS-forces.csv
本版本的deepks_etot.npy与deepks_ebase.npy单位均为Ha。自洽末态的二者之差,对应在末态描述符上求得的学习能量项;它不同于把最初LDA密度上的预测值直接加到最终结果上。
总能差会包含相同分子组成的常量偏置,因此还应比较构型之间的相对能量。以构型0为共同参照,两个独立检查构型的相对能量MAE:LDA为0.006550 eV,固定密度修正为0.000581 eV,修正自洽为0.000576 eV。这个比较更直接反映本组几何变化的能量差,也仍只对应两个检查点。
可直接从已有参考CSV重算,无需DFT:
python3 - <<'EOF'
import csv
rows=list(csv.DictReader(open('reference-data/DeePKS-energy-results.csv')))
ref=rows[0]
for key in ['LDA_eV','frozen_corrected_eV','selfconsistent_corrected_eV']:
errors=[]
for row in rows:
if row['role']!='heldout':
continue
de=float(row[key])-float(ref[key])
target=float(row['PBE_target_eV'])-float(ref['PBE_target_eV'])
errors.append(abs(de-target))
print(key, sum(errors)/len(errors), 'eV')
EOF
3. 用一个真实差分例检查力#
本包还对独立检查构型6的O原子x坐标作±0.001 Å扰动,每个结构都使用同一模型重新自洽。中心差分为:
F_x = -[E(x+0.001 Å)-E(x-0.001 Å)] / 0.002 Å
grep FINAL_ETOT_IS force-check/plus/OUT.dk/running_scf.log
grep FINAL_ETOT_IS force-check/minus/OUT.dk/running_scf.log
cat analysis/DeePKS-force-difference.csv
原生力为−0.431813905 eV/Å,能量差分为−0.429642660 eV/Å,差约0.00217 eV/Å。它检查当前已学习泛函的能量导数与力输出;对PBE力的准确性另看前面的实际力误差表。

4. 使用自己的模型时保留什么#
保存训练数据与划分、基础和目标泛函、势文件/基组/投影文件版本、训练参数、原模型和导出的TorchScript。改变投影定义、元素或软件接口后,应先用小构型检查输入输出,再用于目标任务。需要迭代训练时,用修正密度生成新描述符并重新组织训练,而不是把一次小数据演示当成所有结构都适用的模型。