MACE专题

MACE从头训练与独立测试

用真实Si DFT数据训练小模型,查看损失、独立测试误差,并比较应力权重的影响。

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

下载本专题输入、Si实算数据、教学模型与工具(ZIP)。先完成数据准备,并进入解压目录。附件已提供训练好的小模型,可以先评估,再自行重训。

1 先评估现成模型#

bash calculate.sh eval
cat work/eval-metrics.json

脚本调用原生 mace_eval_configs,对8个独立测试构型输出能量、力、应力和不变描述符,结果在 work/predictions.xyz。实际命令为:

mace_eval_configs --configs data/PBE-test.xyz   --model models/scratch64-s13.model --output work/predictions.xyz   --device cpu --default_dtype float64 --batch_size 1   --compute_stress --return_descriptors

这是上面助手内部同一条命令的展开形式,二者选一个执行即可。已有同名结果时应保留或改输出路径,再重新运行。

2 提交一次从头训练#

bash train.sh scratch64-s13
squeue -u "$USER"

助手创建 work/train-scratch64-s13/,复制配置,通过Slurm申请P100单卡运行80轮。完成后查看:

tail -n 30 work/train-scratch64-s13/slurm-*.log
ls work/train-scratch64-s13/models

新模型从GPU保存后,可在GPU作业中转换为CPU副本,再测试:

bash convert-new.sh work/train-scratch64-s13/models/scratch64-s13.model
squeue -u "$USER"

转换结束后输出 work/trained-cpu.model,保留原模型。不要在作业尚未结束时读取未写完的模型。

真正训练入口是 mace_run_train --config train.yml。完整教学配置如下;文件相对路径以 work/train-scratch64-s13/ 为起点:

name: scratch64-s13
energy_key: REF_energy
forces_key: REF_forces
stress_key: REF_stress
virials_key: REF_virials
E0s: average
model: MACE
batch_size: 4
valid_batch_size: 4
max_num_epochs: 80
default_dtype: float64
seed: 13
loss: stress
energy_weight: 1.0
forces_weight: 100.0
stress_weight: 1.0
compute_stress: true
ema: true
ema_decay: 0.99
swa: false
num_workers: 0
device: cuda
log_dir: logs
model_dir: models
checkpoints_dir: checkpoints
results_dir: results
lr: 0.01
weight_decay: 0.0
config_type_weights: '{''Si2'':1.0,''Si8'':1.0}'
r_max: 5.0
hidden_irreps: 32x0e+32x1o
num_interactions: 2
correlation: 3
max_ell: 2
train_file: ../../data/PBE-train.xyz
valid_file: ../../data/PBE-valid.xyz

energy_key 等必须与extxyz一致。E0s: average 从训练数据估计元素能量基准,不代表计算了孤立Si原子。r_max 是单层局部截断,num_interactions 是消息传递层数;它们共同影响有效感受范围。hidden_irreps 控制模型通道与等变分量。这里用小模型说明操作流程,不把80轮当作通用收敛标准。

3 看训练曲线#

bash plot-training.sh
ls work/training-plot

该工具调用原生 mace_plot_train。附件的单头绘图数值副本移除了未使用的文字字段,避免当前Pandas对文字列求平均时报错;所有数值与原训练记录一致。eval 曲线是验证集,opt 是训练批次损失,二者不要混称为独立测试误差。

4 独立测试结果怎么看#

独立测试集能量、力与应力对照

本例三个随机种子各训练80轮,使用同一个独立测试集:

模型 能量RMSE(meV/原子) 力RMSE(eV/Å) 应力RMSE(GPa)
FP64 seed13 48.107 0.01994 1.955
FP64 seed29 43.70 0.01383 3.588
FP64 seed47 39.74 0.02045 1.541
双P100 DDP 41.825 0.01815 1.150

能量误差先除原子数再统计;力RMSE统计所有力分量;应力RMSE统计六个独立张量分量。随机种子、批次分配会影响短训练结果,双卡和单卡的权重不要求逐位一致。

bash train.sh scratch64-s29
bash train.sh distributed64
cat analysis/heldout-metrics.csv

双卡入口实际使用 torchrun 两进程、每进程一张P100,属于数据并行训练。这里没有给出短任务加速比。

5 力准,应力就一定准吗#

不一定。FP32 seed13使用应力权重1时,测试力RMSE为0.02064 eV/Å,应力RMSE却为5.374 GPa。保持数据、架构、随机种子和80轮不变,把 stress_weight 改为100,重新训练另一模型,得到能量RMSE41.819 meV/原子、力RMSE0.01998 eV/Å、应力RMSE0.4323 GPa。

bash train.sh scratch32-s13
bash train.sh scratch32-stress100
bash run.sh

应力权重1和100的验证曲线与独立测试误差

这是损失权重对照,不能解释成FP32天然比FP64更准。两个模型均保留在附件中,原模型没有被改写。需要变胞优化、NPT、弹性性质时,应力数据与应力误差尤其值得单独检查。

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

查看配图

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

100%查看原图 ↗