DeePMD Hessian检查点与结果分析
区分PyTorch检查点和冻结模型的输出能力,比较能量力、二阶导数、坐标变换和设备结果。
阅读本篇目录
完成训练篇后,先分清要读取哪个文件。本篇使用同一个完整实例包,无需再提交训练。
1 要取Hessian,用检查点#
ls new-work/*-h2-hessian/model.pt
本例安装版本的实际行为:
| 文件 | 能量与力 | Hessian |
|---|---|---|
PyTorch model.pt 检查点 |
有 | 有 |
TorchScript frozen_model.pth |
有,与检查点一致 | 本冻结路线不保留 |
原生冻结命令为 dp --pt freeze -c model.pt -o frozen_model.pth。随后 dp --pt test -m frozen_model.pth -s ../data/test -n 6 -d frozen 测能量/力,不应把这条命令的完成理解为冻结文件也输出了二阶矩阵。
本例CLI测试不加 -a。本安装版本 -a 要求额外的原子能标签;它的含义是比较原子输出,并不等于“启用Hessian”。检查点自身有Hessian能力且提供了 hessian.npy 时,不加 -a 也会生成 checkpoint.h.out。不要为让命令运行而人为分摊总能量充当量化原子能。
checkpoint.e.out、.f.out、.h.out 分别保存能量、力与完整矩阵对照。原生程序也可能写出 .v.out,但本例没有virial参考标签,里面的参考占位不能当作真实应力数据。
2 重绘实际能量与力#
bash plot.sh
读取已提供的参考结果重新绘图,不运行训练。原始NPZ中含6个测试姿态的能量、力、Hessian,及新旋转/平移和相同原子交换后的预测。

同一权重的检查点和冻结图给出一致的能量/力,差异约10⁻¹⁶ eV或eV/Å量级。图左是分子总能量,而结果表的能量误差按每原子归一;H₂中两者相差2倍。
head -n 8 tables-new/your-Hessian-results.csv
3 如何取出并核对矩阵#
程序使用 from deepmd.infer import DeepPot,先查看 model.has_hessian。本例检查点的 model.eval(coords, None, [0,0], atomic=False) 返回能量、力、virial及附加的Hessian,最后一项重排为“帧数×6×6”;冻结能量图则没有最后这一项。不能拿固定的元组下标把两种模型混读。
对同一冻结能量模型的力再做±10⁻⁴ Å坐标差分,得到的矩阵与检查点Hessian最大差异约3.41×10⁻⁶ eV/Ų。这是同一个学习模型的导数一致性,与模型对量化Hessian约0.09945 eV/Ų的误差是两个问题。
head -n 8 tables/Hessian-results.csv
CPU/GPU使用同一个检查点分别推断,能量、力、二阶矩阵一致到本例数值精度。整体旋转后Hessian按AHAᵀ变化,整体平移不改变结果;交换两个同种H原子时,对应3×3块随原子顺序交换。包内保留实际变换矩阵和原始预测,没有把不同坐标系的分量直接硬比。
4 从局部曲率到振动,还差什么#

灰色点来自10个真实量化结构,连线仅连接离散样本;蓝绿标记是两个测试键长的模型预测。相对能量以这些采样结构中最低的HF能量为零,没有据此拟合平衡态或宣称完成结构优化。中图为第一个H指向另一个H的原子力分量。
这些固定几何通常受力非零,不能把每个矩阵的特征值直接当成平衡振动频率。实际振动计算应先达到合适的平衡结构,再做质量加权、单位换算并处理平移/转动模式;本例没有计算平衡振动谱、零点能或MD轨迹。更大体系的Hessian有(3N)²个分量,适合先从小体系熟悉标签和输出方式。输出路线可查DeePMD官方Hessian教程。