MACE专题

MACE训练样本筛选:随机与FPS

用原生mace_finetuning_select从真实Si数据中选择样本,检查描述符覆盖、全部标签和多头元数据。

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

微调时既希望保留基础数据的覆盖范围,又希望控制数据量,可以使用mace_finetuning_select筛选预训练样本。本例从已有真实DFT的32个Si训练构型中各选8个,比较随机和FPS两种方式,再与4个PBEsol训练构型组合;不读取独立测试集,也不重新训练。

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

原生MACE描述符空间中的随机与FPS样本及覆盖距离

2 准备可选FPS依赖#

随机筛选不需要额外FPS库。本例FPS采用fpsample0.3.3,在项目自己的目录安装,不改共享MACE环境:

module purge
module load mace/0.3.16
python -m pip install --no-deps --target python-deps fpsample==0.3.3
export PYTHONPATH="$PWD/python-deps${PYTHONPATH:+:$PYTHONPATH}"

如果只看参考结果和运行固定模型核对,可以先不安装它。fpsample的用法与确定性说明见项目官方文档。本例固定随机种子42,并保留已生成的模型描述符。

3 运行两种筛选#

bash tools.sh select

结果分别位于results/selection-random/和results/selection-fps/,每个目录含8个预训练构型的selected.xyz及组合后的12构型selected_combined.xyz。完整原生调用,以FPS为例:

mace_finetuning_select \
  --configs_pt inputs/data/PBE-train.xyz \
  --configs_ft selection/anchors.xyz \
  --num_samples 8 --subselect fps --seed 42 \
  --model inputs/models/scratch64-s13.model \
  --device cpu --default_dtype float64 \
  --head_pt Default --head_ft PBEsol \
  --descriptors selection/fps/PBE-train_descriptors.npy \
  --output selected.xyz

--subselect random就是随机分支。--model是本专题已经训练的自有Si模型,用于描述符,不是重新开始训练。首次从自己的数据生成描述符时,可省略--descriptors;之后在相同模型、输入顺序和原子种类条件下复用缓存。换模型或改变数据顺序后不要直接套用旧描述符文件。

当前原生FPS分支遇到异常时可能转为随机筛选;因此要看日志,确认没有FPS failed提示,不能只看到输出文件就认定确实执行了FPS。

4 为什么这里必须标记两个head#

预训练池的标签来自PBE,4个目标构型来自PBEsol。同一几何结构在不同泛函下可以有不同绝对能量,因此组合文件采用:

来源 本例head pretrained
选中的8个PBE构型 Default true
4个PBEsol目标构型 PBEsol false

Default与提供的PBE模型实际head匹配。**不要把组合文件里的两套绝对能量不加区分地用于同一个head。**原生工具只在显式指定head_pt/head_ft时写相应head;pretrained标记本身不能替代物理任务分头。

python - <<'PYCODE'
from ase.io import read
for a in read('selection-heads/fps/selected_combined.xyz', ':'):
    print(a.info['geometry_id'], a.info['xc'],
          a.info['head'], a.info['pretrained'], a.info['config_weight'])
PYCODE

本例config_weight=1,能量、所有力分量、应力、virial、坐标和晶胞保持来源数据不变。4个目标构型来自训练集,部分几何与PBE池可以相同;这是不同泛函的多任务标签,不是新增DFT,也不拿它充当独立泛化测试。

5 实际筛选结果与如何理解覆盖#

量 随机选8个 FPS选8个
32个构型到最近所选样本的平均描述符距离 0.02341565 0.01922174
最大最近距离 0.07651788 0.03589578

这里的距离是本模型特征空间数值,没有eV或Å的物理单位。PCA图仅把描述符投到两个主成分方便观察;筛选和覆盖距离使用完整描述符,不是仅用二维图坐标。

在这个数据池中,FPS降低了最大覆盖距离,但它不保证所有材料、所有数据集都更好,更不能替代DFT独立测试误差。完整结果在reference/SELECTION.json,逐样本编号可直接查看:

cat reference/SELECTION.json

筛选完成后,再参照多头模型教程构建对应训练配置;本例不把筛选后文件自动提交训练。

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

查看配图

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

100%查看原图 ↗