LAMMPS 专题

LAMMPS POD势训练实操

Cu108 EMT参考数据、训练测试分离、完整POD参数与原生fitpod,解释已有系数评估模式。

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

本组实际完成一个小型POD机器学习势流程:为32个Cu108近FCC结构计算ASE EMT参考能量和力,24个用于训练、8个独立测试;调用LAMMPS原生 fitpod,再做CPU/P100推断、描述符和导数检查。

参考标签是半经验ASE EMT,不是DFT。 这个例子用于学习输入格式和工具流程,不是可直接用于任意铜体系的第一性原理势。原生fitpod日志沿用 DFT energy/force 列名,本包这些列实际对应EMT参考值。

下载全部输入、参考标签、模型、原始结果与图片,在个人目录执行:

mkdir pod-demo
cd pod-demo
curl -fL https://yuansuan.top/assets/downloads/full-function/lammps-pod-wave81-13e715e5efcc.zip -o examples.zip
unzip examples.zip
sbatch submit.slurm

脚本申请一个CPU核、一个P100,自动生成标签、训练、分析已有模型、CPU与Kokkos推断并画图。模块为 ase/3.29.0、lammps/30Sep2026-p100-gpu 和 lammps/30Sep2026-p100-kokkos;LAMMPS基础构建使用GCC13.3、OpenMPI5.0.10、CUDA12.8,Kokkos推断为双精度。

完成后在整包目录运行:

module purge
module load ase/3.29.0
python analyze.py work
python export_descriptors.py work
python plot_results.py work
head -10 work/analysis/heldout-errors.csv

reference/ 保存已有实算,可把后处理命令的 work 换成 reference 先看结果。新计算使用新解压目录。整包一直采用单MPI进程;本版本四种POD描述符compute也要求单MPI,不要直接把它们改成多MPI提交。

1 准备结构、能量与力#

生成器从3×3×3的FCC铜出发,晶格常数3.6 Å,分别给三个方向±3%内的应变和0.01–0.04 Å位置扰动;每个结构独立随机种子,并去掉扰动的整体平移。实际参考计算的核心是:

from ase.build import bulk
from ase.calculators.emt import EMT
atoms = bulk('Cu', 'fcc', a=3.6, cubic=True).repeat((3, 3, 3))
# 配套generate_labels.py在此加入独立应变和位置扰动
atoms.calc = EMT()
energy = atoms.get_potential_energy()
forces = atoms.get_forces()

generate_labels.py 已由提交脚本调用,无需在同一work目录重复生成。训练集编号000–023,测试集024–031,结构名与种子均不重叠。DATASET.json 记录参考方法、晶胞、位置、力和数据哈希。

head -6 reference/dataset/train/Cu-000.xyz
head -6 reference/dataset/test/Cu-024.xyz

扩展XYZ的前几行如下,仅用于读懂格式;完整文件有108条原子行,不要把节选当作完整输入:

108
Lattice="10.9924470281858 0 0 0 10.62948682690623 0 0 0 10.70015054915698" Properties=species:S:1:pos:R:3:forces:R:3 energy=0.1010730089716763 pbc="T T T"
Cu 0.02682436081608444 10.62214685099069 10.69880836083531 -0.3225459450285695 0.2470728306992704 -0.1393338746397152
Cu 10.98604169794449 1.764725911028662 1.7854887593544 -0.07330354393683458 0.01193490697946162 -0.1611928873510449

第一行是原子数,第二行包含晶胞和总能量;每个原子行依次是元素、xyz位置与xyz力。位置用Å、总能量用eV、力用eV/Å。真实项目可以换成一致的DFT参考数据,但需要统一单位、元素、边界和能量基准,不能把不同设置产生的标签随意混在一起。

实际测试集Cu108结构及EMT参考力

2 POD描述符参数#

完整 params.pod:

species Cu
pbc 1 1 1
rin .5
rcut 5.0
bessel_polynomial_degree 4
inverse_polynomial_degree 8
number_of_environment_clusters 1
onebody 1
twobody_number_radial_basis_functions 6
threebody_number_radial_basis_functions 3
threebody_angular_degree 2
fourbody_number_radial_basis_functions 0
fourbody_angular_degree 0

本例只有Cu、一个环境簇,启用一体、二体和三体项,关闭四体及更高体项,实际得到16个线性系数。rcut=5.0 Å 是外截断;径向与角向基数控制模型表达与计算量。增加基数并不自动保证测试误差更小,还要检查数据覆盖和病态拟合。

3 指定数据、权重和输出#

完整 fit-data.pod:

file_format extxyz
file_extension xyz
path_to_training_data_set "../dataset/train"
path_to_test_data_set "../dataset/test"
fitting_weight_energy 100
fitting_weight_force 1
fitting_regularization_parameter 1.0e-8
error_analysis_for_training_data_set 1
error_analysis_for_test_data_set 1
precision_for_pod_coefficients 16
basename_for_output_files model

数据路径相对于运行fitpod的 work/fit/ 目录;训练和测试数据分开。能量/力权重与正则化应结合参考数据精度和目标性质选择;本例只是一个明确可复跑的起点。系数保留16位小数,参数文件与系数文件要配套保存。

work/fit/in.lammps 的完整内容:

units metal
fitpod ../params.pod ../fit-data.pod

程序在已经分配的计算资源内调用 lmp -in in.lammps,得到 model_coefficients.pod 及训练/测试误差文件。先看自己保留的测试集,不只看训练误差:

head -6 work/fit/model_coefficients.pod
tail -8 work/fit/model_training_errors.pod
tail -8 work/fit/model_test_errors.pod

4 已有系数的调用不是继续训练#

本例还实际调用了以下输入:

units metal
fitpod ../params.pod ../evaluate-data.pod ../fit/model_coefficients.pod

30Sep2026在提供第三个系数文件后跳过最小二乘拟合,按所给系数做请求的数据分析/计算。因此这里得到 evaluate_test_analysis.pod 等文件,不会新拟合一份 evaluate_coefficients.pod。不要把这个参数当作增量训练或训练续算开关。

head -8 work/evaluate/evaluate_test_analysis.pod
head -8 work/analysis/heldout-errors.csv

5 阅读这个小模型的结果#

8个独立测试结构的能量RMSE约0.000962 eV/atom,力RMSE约0.00518 eV/Å,比较对象都是EMT参考。训练样本只覆盖近FCC、较小应变和扰动,没有证明缺陷、液体、表面、大变形或长时间MD可靠。

继续:模型预测与P100精度对照、四种描述符输出与导数矩阵。原生语法见官方fitpod说明。

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

查看配图

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

100%查看原图 ↗