Calorine配置NEP89微调
用真实Si数据演示NEP89微调输入、原生训练、独立测试与模型选择。
阅读本篇目录
下载模型、真实数据、完整脚本与参考图片。相关教程:偶极与极化率 · 红外与拉曼谱 · NEP89微调 · 模型编辑 · GPUMD数据读写 · 完整接口索引
1 准备与运行#
先解压并重画已经完成的参考结果:
unzip calorine-response-workflows-wave266-*.zip
cd calorine-response-workflows-wave266
bash run.sh
六张参考图在figures,CSV在analysis。若要自己重新计算,在新解压目录以普通账号执行:
bash prepare.sh
bash calculate.sh
bash status.sh
calculate通过Slurm分配一张P100,自动完成本包所有计算;新结果在work,参考图与新算结果分开。已提交时继续查看status,不要删除记录重复提交。结束后:
cat work/COMPLETE.json
ls work/analysis
本例环境为Calorine 4.0、Python 3.11、GPUMD 5.9.1;GPUMD采用GCC 13.3/CUDA 12.9系列环境。可以用module show calorine/4.0和module show gpumd/5.9.1-p100查看当前模块。下面的Python片段在计算完成后的work目录执行;MD和训练由calculate提交。
2 数据先划分,再训练#
本例复用集群真实计算的Si2/Si8小晶体PBE数据:32帧训练、8帧内部验证、8帧外部测试。包含小变形和部分受压晶胞,不是覆盖缺陷、熔化或所有相的生产数据集。能量是VASP自由能F,单位eV/构型;力eV/Å;virial是整个构型的eV总量,ASE拉伸为正的应力满足W=−Vσ。
在动手前查看数据说明和划分:
cat data/SPLIT.json
head -n 4 data/train.xyz
head -n 4 data/test.xyz
完整NEP89父模型与restart在models。微调需要二者;不要用一个新建的随机restart替代已训练父模型的搜索状态。架构参数应与父模型一致,训练预算和损失权重可以按目标任务调整。
3 用API生成输入#
calculate会自动配置并训练两组200代示例。若要理解输入生成,可以在work里为一个新目录执行:
from pathlib import Path
from ase.io import read
from calorine.nep import setup_fine_tuning_nep89
setup_fine_tuning_nep89(
dict(type=[1,'Si'], generation=200, population=20, batch=32,
seed=13579, lambda_e=1, lambda_f=1, lambda_v=0.1,
lambda_1=0, lambda_2=0),
nep=Path('models/nep89_20250409.txt'),
restart=Path('models/nep89_20250409.restart'),
train_structures=read('data/train.xyz', ':'),
test_structures=read('data/valid.xyz', ':'),
rootdir='my-finetune', mode='fixed', seed=13579)
生成输入不等于已经训练。下面是本例实际训练输入,路径以work/NEP89-s13579/nepmodel为起点:
fine_tune ../../models/nep89_20250409.txt ../../models/nep89_20250409.restart
type 1 Si
generation 200
population 20
batch 32
seed 13579
lambda_e 1.0
lambda_f 1.0
lambda_v 0.1
lambda_1 0.0
lambda_2 0.0
version 4
zbl 2
cutoff 6 5
n_max 4 4
basis_size 8 8
l_max 4 2 1
neuron 80
4 训练后读哪些文件#
本包在Slurm作业中进入每个nepmodel目录调用原生nep;平时使用calculate提交即可。完成后查看:
cat work/NEP89-s13579/nepmodel/native.exit
tail -n 4 work/NEP89-s13579/nepmodel/loss.out
cat work/analysis/CALORINE-NEP89-independent.csv
native.exit为0说明程序正常结束;还要检查独立误差和目标结构范围。loss.out是训练过程,不能拿它代替外部测试。calorine.nep.read_loss返回以代数为索引的DataFrame,需要普通generation列时用rename_axis('generation').reset_index()。

| 模型 | 能量RMSE/eV·atom⁻¹ | 力RMSE/eV·Å⁻¹ | 压力张量RMSE/GPa |
|---|---|---|---|
| NEP89父模型 | 0.10944 | 0.16385 | 2.3790 |
| 微调,种子13579 | 0.04029 | 0.04311 | 0.7175 |
| 微调,种子24680 | 0.04053 | 0.04447 | 0.7307 |
参考两种子分别在P100和V10016G训练,种子与设备同时变化,不能据此判断平台精度差别。资料包完整复跑在P100上执行两种子;小数可能略有变化。200代只展示流程,不能据此声称生产势收敛。