MACE模型委员会采样与停止条件
用三个真实训练的Si模型运行原生Langevin采样,逐帧读取模型分歧,明确停止指标和轨迹续算边界。
阅读本篇目录
mace_active_learning_md可以让多个MACE模型共同预测,沿采样轨迹检查它们的分歧,达到条件时停止。这里用三个已有真实Si训练模型,完成20步、0.5 fs步长的Langevin演示,并与“初始帧立即停止”的控制对照。它展示采样与停止逻辑,不会自动给新构型计算DFT或训练新模型。
1 先读取完整轨迹与指标#
下载完整数据、三个自有Si模型、原生工具示例及高清绘图包。在已分配的计算资源内执行计算和推断,登录节点用于编辑和提交。MACE是Python包,本例使用Python3.11、MACE0.3.16、PyTorch2.8.0+cu126、ASE3.29及默认e3nn计算路径;这些工具示例实际采用CPU。
python3 -m zipfile -e mace-tools-practical-wave316-*.zip .
cd mace-tools-practical
bash run.sh
bash run.sh根据保存的完整数值生成三张图,不训练模型、不计算DFT,也不重新跑动力学。想独立读取HDF5、核对筛选标签,并用三个固定模型重新计算21帧结构上的能量和力,可执行:
bash run.sh verify
cat results/checks/VALIDATION.json

module load mace/0.3.16
python - <<'PYCODE'
from ase.io import read
frames = read('active/continue-recovered.traj', ':')
for a in frames:
print(a.info['time'], a.get_potential_energy(),
a.get_kinetic_energy(), a.info['mlff_energy_var'])
PYCODE
这里有初始帧加20步,共21帧。reference/COMMITTEE-FIELDS.json保留每帧每个模型的全部力、能量以及逐原子分歧;reference/committee-observables.csv便于画图。
2 模型委员会由什么组成#
附件中的inputs/models/scratch64-s13.model、s29、s47是前面Si从头训练教程的三个自有模型,训练种子不同,采用同一个窄范围DFT数据集。**本例直接复用权重,没有再训练一次。**起始结构是Si8,盒长约5.34003 Å。
模型分歧说明模型之间意见不一致,并不等于真实DFT误差。三个模型也可能共同犯错;这些平衡附近Si模型不能据此认定适合熔化、缺陷或任意高温构型。
3 看清本版真正使用的停止指标#
对第i个原子、M个模型:
mean_force_i = mean_over_models(force_i)
force_variance_i = var_over_models(force_i, ddof=0)
force_spread_i = sqrt(sum_xyz(force_variance_i))
U_i = force_spread_i / (norm(mean_force_i) + 0.2 eV/A)
stop if max(U_i) > error_threshold
因此U_i和error_threshold都是无量纲。本例初始max(U)=0.0147889554,最后约0.0153149372。不要把--error_threshold 0.1直接解释为0.1 eV/Å的力误差。
原生控制台Ferr打印的是力方差向量的范数,Eerr来自能量方差;它们不是上述停止指标,也不是与DFT比较的RMSE。完整后处理将能量方差标为eV²、力标准差标为eV/Å,再独立重建U。
4 本例的两个控制如何设置#
| 控制 | error_threshold | 实际结果 |
|---|---|---|
| 立即停止 | 0 | 保存初始帧,在0 fs停止 |
| 允许短轨迹完成 | 1000000 | 完成20步、10 fs,共21帧 |
这两个极端值用于观察分支行为,不是推荐的生产阈值。温度参数是Maxwell初速度及Langevin热浴的目标300 K,实际瞬时温度会波动。原生--friction 0.01直接传入ASE内部时间单位,约为9.82269×10⁻⁴ fs⁻¹,不是0.01 fs⁻¹。本例是Langevin有温控采样,不能拿总能量不守恒当成NVE积分误差。
5 如何提交一次自己的新采样#
先看已有结果;确需新采样时使用:
sbatch sampling.slurm
附件是CPU整节点56核提交模板,Python示例本身只用一个线程,申请核心数不意味着线性加速。结果写入新的results/new-sampling.traj;同名文件存在时脚本拒绝覆盖。本模板使用正常停止阈值示例0.1,仍应结合自己的独立DFT误差标定,不能把本Si小例数值直接迁移到其他材料。
脚本实际调用:
python seeded_active_md.py \
--config active/start.xyz --config_index 0 \
--model 'inputs/models/scratch64-s*.model' \
--output results/new-sampling.traj \
--device cpu --default_dtype float64 \
--temperature_K 300 --friction 0.01 --timestep 0.5 \
--nsteps 20 --nsave 1 --ncheckerror 1 --error_threshold 0.1
seeded_active_md.py调用原生入口的解析器、Langevin积分器和停止规则,设置NumPy随机种子20261108,并通过独立快照及ASE显式Trajectory写出每帧,保留动力学计算器缓存。这里的引号使通配符传给模型读取器,由它组建委员会。
当前版本的nsave同时控制打印和保存频率,ncheckerror控制检查频率;nprint虽在帮助中出现,实际这条入口没有用它调节打印。
6 保存与续算需要注意什么#
本例读取全部21帧坐标、动量、势能、力和能量方差,并用三个固定模型重新计算,比较所有分量;这不等于重跑一次动力学。轨迹的10 fs只用于演示接口和停止规则,不能计算可信的扩散、热输运或稳定性统计。
原生入口遇到已有输出会按已保存帧数扣除步数,并重新建立积分器计时,因此不要把重复执行同一命令当成严格续算。本模板每次使用新输出文件。若需要严格随机动力学续算,应另外保存累计步数、时间、动量和随机数状态,并核对初始帧计数。