MACE专题

MACE模型委员会采样与停止条件

用三个真实训练的Si模型运行原生Langevin采样,逐帧读取模型分歧,明确停止指标和轨迹续算边界。

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

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

真实Si8的10fs委员会轨迹、能量方差和力分歧指标

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只用于演示接口和停止规则,不能计算可信的扩散、热输运或稳定性统计。

原生入口遇到已有输出会按已保存帧数扣除步数,并重新建立积分器计时,因此不要把重复执行同一命令当成严格续算。本模板每次使用新输出文件。若需要严格随机动力学续算,应另外保存累计步数、时间、动量和随机数状态,并核对初始帧计数。

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

查看配图

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

100%查看原图 ↗