Bulk Si system (Active Leanring)
下文将以 Bulk Si 系统为例,介绍如何使用 PWMLFF Deep Potential Model 进行训练,同时结合主动学习加强模型泛化性,并进行 lammps 模拟。
力场训练结束时得到的力场文件为*.ff
,该文件包含了训练得到的所有参数,可用于 lammps 模拟。模拟时发现模型在同一个体系,不同温度下的表现是不同的,因此需要针对不同温度下的体系进行训练。在本例中,我们首先测试模型在 3 个不同温度下的表现,分别为 300K、500K、900K。根据下述教程可以发现,模型在 900K 下的表现非常差,因此我们需要针对 900K 下的体系进行训练,以提高模型的泛化性,准确描述该体系在300K - 900K 区间的动力学行为。
主动学习流程如下图所示:
主动学习工作目录整体结构示意
Si_system/adaptive_trainer
└── dir
├── 00.initdata # 初始数据集(AIMD)
│ ├── perturb.py # 微扰结构,执行文件
│ └── Structure ( Si64 ) # 初始结构 'atom.config' 存放目录,以Si64为例
│ ├── atom.config # 初始结构,用于产生数据集
│ ├── structures # 执行perturb.py后产生的结构所存放的目录
│ └── AIMD # AIMD(初始数据集)结果存放目录
│ ├──md-0 # 从structures中提取的结构文件存放目录
│ └──md-..
│
├── 01.Iteration1 # 初次迭代目录
│ ├── 00.train # 初始训练集(generate_data),必须为00.train
│ │ ├── 000 # 4个力场训练(load_and_train & extract_force_field)
│ │ ├── 001 # 可以训练多个力场
│ │ ├── 002 # 但是必须以 00x 的格式命名
│ │ └── 003
│ ├── 01.explore # 探索目录
│ │ ├── explore.py # 探索执行文件
│ │ ├── explore
│ │ ├── model # 存放力场文件的目录
│ │ ├── result # 存放lammps计算后筛选出的结构文件的目录
│ │ └── subsys # 从Strucutre中获取结构文件,并进行lammps计算
│ └── etot.input # 用于完成PWmat自洽计算
│
├── 02.Iteration2 # 第二次迭代目录...再原有数据集基础上添加新的训练集再次进行训练及探索
│ ├── 00.train
│ └── 01.explore
│
│
├── 03.Iteration3 # 第三次迭代目录...
│ ├── 00.train
│ └── 01.explore
│
└── 04.Iteration4 # 第四次迭代目录...
├── 00.train
└── 01.explore
1. 初始数据准备
为了获取相同体系下不同的初始结构,用于进行 AIMD 计算,获取原子运动轨迹。在本例中,我们提供了一个方式,将使用perturb.py
对原子进行晶格及原子位置微扰,生成 50 个初始结构,用于进行 AIMD 计算。perturb.py
的使用方法如下:
主动学习模块引入了新的接口,需要提前在 PWMLFF package 中安装:
在线安装:
$ conda activate PWMLFF
$ cd path_to/PWMLFF/src
$ git clone https://github.com/lhycms/MaterSDK.git
$ cd MaterSDK
$ pip install .
源码:
https://github.com/lhycms/MaterSDK
新建Si64
目录,将并在目录下存放初始结构atom.config
。准备完成后直接执行python perturb.py
即可,执行后会在Si64
目录下生成structures
目录,其中存放了扰动后的结构文件,同时在Si64
目录下生成AIMD
目录,其中同样存放了扰动后的结构文件,之后用于 AIMD 计算获取原子运动轨迹。
以下是perturb.py
的示例:
from MaterSDK.matersdk.adalearn.generator.perturbation import BatchPerturbStructure
import os
if __name__ == "__main__":
"""
1. only need to run once!!!
2. perturb the structure
3. seed for adaptive sampling
"""
Perturbed = ['Si64']
pert_num = 50
cell_pert_fraction = 0.03
atom_pert_distance = 0.01
BatchPerturbStructure.batch_perturb(
Perturbed=Perturbed,
pert_num=pert_num,
cell_pert_fraction=cell_pert_fraction,
atom_pert_distance=atom_pert_distance,
)
aimd_directory = os.path.join(os.path.abspath(Perturbed[0]), 'AIMD')
if not os.path.exists(aimd_directory):
os.makedirs(aimd_directory)
# Create 'md-0', 'md-1', ..., 'md49' directories under 'AIMD' directory
for i in range(pert_num):
md_directory = os.path.join(aimd_directory, f'md-{i}')
if not os.path.exists(md_directory):
os.makedirs(md_directory)
# Link the corresponding config file from 'structures' directory to 'md-{i}' directory
config_file = os.path.join(os.path.abspath(Perturbed[0]), 'structures', f'{i}.config')
link_file = os.path.join(md_directory, 'atom.config')
if os.path.islink(link_file):
os.remove(link_file)
os.symlink(config_file, link_file)
Perturbed
需要指定所存放的atom.config
所在目录的名称pert_num
为每个体系的扰动结构数目,即需要根据提供的atom.config
对结构进行包括晶格和原子位置的扰动,以增强结构的采样变化cell_pert_fraction
为扰动的晶胞尺寸atom_pert_distance
为扰动的原子位置
进入AIMD
目录,准备一个etot.input
文件,内容示例如下,用户可以根据具体的体系完成设置,参数意义参考PWmat manual:
4 1
job = MD
MD_DETAIL = 2 10 1 1000 1000
XCFUNCTIONAL = PBE
in.atom = atom.config
mp_n123 = 2 2 2 0 0 0 3
ecut = 60
ecut2 = 240
ENERGY_DECOMP = T
OUT.STRESS = T
in.psp1 = Si.SG15.PBE.UPF
-
这里仅使用 10fs 的时间步长,实际使用中需要根据体系进行设置。50 个结构拼接起来的
MOVEMENT
轨迹有 500 帧,即 500fs. -
可以使用以下命令将 PWmat 输入文件
etot.input
及 slurm 作业脚本slurm.sh
拷贝到md-0, md-1, ..., md-49
目录下:for i in {0..49}
do
cd md-$i
ln -s ../etot.input
ln -s ../slurm.sh
ln -s ../Si.SG15.PBE.UPF
sbatch slurm.sh
cd ..
done -
计算完成后,可以使用以下命令将所有结构的
MOVEMENT
拼接起来:for i in {0..49}
do
cat md-$i/MOVEMENT >> MOVEMENT
done
该MOVEMENT
文件将用于后续的训练。