ABACUS 专题

ABACUS DeePKS:模型自洽、能量与力

把实际训练的模型加入LDA自洽势,读取最终能量和力,对照独立检查构型与一个能量差分例子。

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

本篇在训练完成后,把模型加入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力的准确性另看前面的实际力误差表。

真实修正自洽力与能量差分,以及新版Hartree数组与eV日志的对应

4. 使用自己的模型时保留什么#

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

参考数据下载#

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

查看配图

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

100%查看原图 ↗