文章目录
- 1.原子间相互作用
- 1.为什么研究原子间相互作用
- 2.研究原子间相互作用的传统方法
- 2.深度学习研究原子间相互作用
- 1.深度势能平滑模型(DeepPot-se)
- 2.Deep Potential 模型训练
- 3.同步学习→充足采样&筛选样本
- 3.DP-GEN操作及运行
- 1.DP-GEN主流程
- 2.DP-GEN基本命令
- 3.生成初始数据
- 4.DP-GEN案例:气态甲烷CH~4~
- 1.init_bulk 过程
- 2.run 过程
- 3.machine.json文件
1.原子间相互作用
1.为什么研究原子间相互作用
计算模拟在材料性质研究和设计中发挥日益重要的作用,其关键科学问题是材料的微观结构,而微观结构由原子间相互作用决定的。 E = E ( r 1 , r 2 , r 3 , . . . ) E=E(r1,r2,r3,...) E=E(r1,r2,r3,...) 其中 E E E为势能, r 1 , r 2 , r 3 r1,r2,r3 r1,r2,r3为原子坐标。
2.研究原子间相互作用的传统方法
-
第一性原理计算
KS-DFT: E [ ρ ] = F H K [ ρ ] + ∫ ρ ( r ) v e x t ( r ) d r E[\rho ]=F_{HK}[\rho]+\int \rho(r)v_{ext}(r)dr E[ρ]=FHK[ρ]+∫ρ(r)vext(r)dr F H K [ ρ ] = T [ ρ ] + V e e [ ρ ] F_{HK}[\rho]=T[\rho]+V_{ee}[\rho] FHK[ρ]=T[ρ]+Vee[ρ] -
经验力场
Lennard-Jones 势: V L J = 4 ε [ ( σ r ) 12 − ( σ r ) 6 ] V_{LJ}=4\varepsilon [(\frac{\sigma }{r})^{12}-(\frac{\sigma }{r})^{6}] VLJ=4ε[(rσ)12−(rσ)6]
2.深度学习研究原子间相互作用
E = E ( r 1 , r 2 , r 3 , . . . ) E=E(r1,r2,r3,...) E=E(r1,r2,r3,...) 原子间相互作用的研究在数学上是高维函数的表示和逼近问题,而传统数学工具对高维函数缺乏有效手段,深度学习为高维函数的逼近提供了有力工具。
1.深度势能平滑模型(DeepPot-se)
笛卡尔坐标描述原子
i
i
i截断半径内的局域环境:
R
i
=
{
r
l
i
T
,
.
.
.
,
r
j
i
T
,
.
.
.
,
r
N
i
T
,
i
}
T
,
r
j
i
=
(
x
j
i
,
y
j
i
,
z
j
i
)
\mathcal{R}^{i}=\left \{ r_{l_{i}}^{T},...,r_{j_{i}}^{T},...,r_{N_{i}}^{T},i \right \} ^{T},r_{ji}=(x_{ji},y_{ji},z_{ji})
Ri={rliT,...,rjiT,...,rNiT,i}T,rji=(xji,yji,zji)
广义坐标:
{
x
j
i
,
y
j
i
,
z
j
i
}
→
{
s
(
r
j
i
)
,
x
^
j
i
,
y
^
j
i
,
z
^
j
i
}
\left \{x_{ji},y_{ji},z_{ji}\right \}\to \left \{ s(r_{ji}),\hat{x}_{ji},\hat{y}_{ji},\hat{z}_{ji}\right \}
{xji,yji,zji}→{s(rji),x^ji,y^ji,z^ji}
x
^
j
i
=
s
(
r
j
i
)
x
j
i
r
j
i
,
y
^
j
i
=
s
(
r
j
i
)
y
j
i
r
j
i
,
z
^
j
i
=
s
(
r
j
i
)
z
j
i
r
j
i
,
a
n
d
s
(
r
j
i
)
\hat{x}_{ji}=\frac{s(r_{ji})x_{ji}}{r_{ji}},\hat{y}_{ji}=\frac{s(r_{ji})y_{ji}}{r_{ji}},\hat{z}_{ji}=\frac{s(r_{ji})z_{ji}}{r_{ji}},and\quad s(r_{ji})
x^ji=rjis(rji)xji,y^ji=rjis(rji)yji,z^ji=rjis(rji)zji,ands(rji)
s
(
r
j
i
)
=
{
1
r
j
i
,
r
j
i
<
r
c
s
1
r
j
i
{
1
2
c
o
s
[
π
(
r
j
i
−
r
c
s
)
(
r
c
−
r
c
s
)
]
+
1
2
}
,
r
c
s
<
r
j
i
<
r
c
0
,
r
j
i
>
r
c
s(r_{ji})=\left\{\begin{matrix} \frac{1}{r_{ji}},\quad \quad \quad \quad \quad \quad \quad \quad \quad \quad & r_{ji}<r_{cs}\quad \quad \\ \frac{1}{r_{ji}}\left\{\frac{1}{2}cos[\pi \frac{(r_{ji}-r_{cs})}{(r_{c}-r{cs})}]+\frac{1}{2} \right\}, & r_{cs}<r_{ji}<r_{c}\\ 0,\quad \quad \quad \quad \quad \quad \quad \quad \quad \quad & r_{ji}>r_{c}\quad \quad \end{matrix}\right.
s(rji)=⎩
⎨
⎧rji1,rji1{21cos[π(rc−rcs)(rji−rcs)]+21},0,rji<rcsrcs<rji<rcrji>rc
2.Deep Potential 模型训练
能量:
E
=
∑
i
E
i
E=\sum_{i} E_{i}
E=i∑Ei
力:
F
=
−
∇
R
E
(
F
i
j
=
−
∇
R
i
j
E
)
\mathcal{F}=-\nabla _{\mathcal{R}}E\quad (\mathcal{F}_{ij}=-\nabla_{\mathcal{R}_{ij}}E)
F=−∇RE(Fij=−∇RijE)
维里:
Ξ
=
t
r
[
R
⊗
F
]
(
Ξ
i
j
=
∑
k
=
1
N
R
k
i
F
k
i
)
\Xi =tr[\mathcal{R}\otimes \mathcal{F}]\quad (\Xi_{ij}=\sum_{k=1}^{N}\mathcal{R}_{ki}\mathcal{F}_{ki})
Ξ=tr[R⊗F](Ξij=k=1∑NRkiFki) 维里系数(Virial coefficient)
B
i
B_{i}
Bi是热力学状态方程按密度展开(称为维里展开)各项的系数。维里系数与分子间势能函数相关,体现多体相互作用对理想气体状态方程的修正。
损失函数:
L
(
p
ϵ
,
p
f
,
p
ξ
)
=
p
ϵ
Δ
ϵ
2
+
p
f
3
N
∑
i
∣
Δ
F
i
∣
2
+
p
ξ
9
∣
∣
Δ
ξ
∣
∣
2
L(p_{\epsilon},p_{f},p_{\xi})=p_{\epsilon}\Delta \epsilon^{2}+\frac{p_{f}}{3N}\sum_{i}|\Delta F_{i}|^{2}+\frac{p_{\xi}}{9}||\Delta \xi||^{2}
L(pϵ,pf,pξ)=pϵΔϵ2+3Npfi∑∣ΔFi∣2+9pξ∣∣Δξ∣∣2
p
(
t
)
=
p
l
i
m
i
t
[
1
−
r
l
(
t
)
r
l
0
]
+
p
s
t
a
r
t
[
r
l
(
t
)
r
l
0
]
p(t)=p^{limit}[1-\frac{r_{l}(t)}{r_{l}^{0}}]+p^{start}[\frac{r_{l}(t)}{r_{l}^{0}}]
p(t)=plimit[1−rl0rl(t)]+pstart[rl0rl(t)] 方法:利用昂贵的第一性原理计算数据,通过神经网络进行训练,获得深度势能模型,从而精准预测势能面。
3.同步学习→充足采样&筛选样本
- 采样器:DPMD
DPMD势能面采样优势:高效、更新模型改进采样质量、改变MD条件拓展采样范围
可拓展的采样策略:增强采样、蒙特卡洛、结构搜索… - 误差判据:模型偏差(model deviation)
模型偏差: ϵ t = m a x i ⟨ ∣ ∣ F ω , i ( R i ) − ⟨ F ω , i ( R i ) ⟩ ∣ ∣ 2 ⟩ \epsilon_{t}=max_{i}\sqrt{\left \langle \left || F_{\omega ,i}(\mathcal{R}_{i})-\left \langle F_{\omega ,i}(\mathcal{R}_{i})\right \rangle \right ||^{2} \right \rangle} ϵt=maxi⟨∣∣Fω,i(Ri)−⟨Fω,i(Ri)⟩∣∣2⟩ 真实“力”偏差: ϵ ^ t = m a x i ⟨ ∣ ∣ F ω , i ( R i ) − F ~ ω , i ( R i ) ∣ ∣ 2 ⟩ \hat{\epsilon}_{t}=max_{i}\sqrt{\left \langle || F_{\omega ,i}(\mathcal{R}_{i})- \tilde{F}_{\omega ,i}(\mathcal{R}_{i}) ||^{2} \right \rangle} ϵ^t=maxi⟨∣∣Fω,i(Ri)−F~ω,i(Ri)∣∣2⟩ 基于不同的随机数训练出来的4个DP力场graph.pb,跑LAMMPS轨迹。如果4个DP力场对同一结构预测有分歧,则被标记该结构。 - 用DP-GEN标记数据点(相较于AIMD)的优势:
1.速度快,只需要跑LAMMPS,对于特定结构计算DFT的单点能即可。如果采用AIMD标记数据点,则会浪费更多的算力。
2.探索相空间更大,降低重复性数据。如果采用AIMD,则相邻帧之间相关性太强,相空间中部分区域数据重复出现,而部分区域又探索不到。
3.DP-GEN操作及运行
1.DP-GEN主流程
- Exploration:探索样本空间,调用MD模拟软件
- Labeling:增加标记样本,调用DFT计算软件
- Training:训练新的模型,调用DeePMD-kit
2.DP-GEN基本命令
- DP-GEN基本命令:
dpgen sub-command PARAM MACHINE - sub-command为DP-GEN支持的任务类型,基本流程包括init_bulk/init_surf,run,test
init_bulk/init_surf:为体相/表面体系准备初始数据
run:深度势能生成器主流程
test:计算模型在参考体系性质测试中的表现 - PARAM:输入参数文件,各类型任务需要独立的参数文件
- MACHINE:机器配置文件
- Run主流程:dpgen run param machine
多次迭代,每次迭代包括三个步骤:00.tran(Training,训练新的模型)、01.model_devi(Exploration,探索样本空间)、02.fp(Labeling,增加样本标记)
3.生成初始数据
- 直接跑AIMD
1.AIMD的温度要高于LAMMPS采样实际温度。
2.多选择不相干的初始结构跑,扩大相空间初始范围。
3.间隔取点保存成数据集,避免相邻数据过于重复。 - dpgen init_bulk/dpgen init_surf
对原始晶胞进行压缩/扩展/畸变,对原子结构进行微扰,以模拟极端情况,扩大搜索相空间范围。
4.DP-GEN案例:气态甲烷CH4
- 甲烷案例下载:https://dp-public.oss-cn-beijing.aliyuncs.com/community/dpgen_example.tar.xz
1.init_bulk 过程
- 运行命令:dpgen init_bulk param.json machine.json
- param.json文件
{ "stages": [1,2,3,4], "cell_type": "diamond", "super_cell": [1, 1, 1], "elements": ["H","C"], "from_poscar": true, "from_poscar_path": "./CH4.POSCAR", "potcars": ["../run/POTCAR_H", "../run/POTCAR_C"], "relax_incar": "./INCAR_methane.rlx", "md_incar" : "./INCAR_methane.md", "scale": [1.00], "skip_relax": false, "pert_numb": 30, "md_nstep" : 10, "pert_box": 0.03, "pert_atom": 0.01, "coll_ndata": 5000, "_comment": "that's all" }
1.stage:init_bulk 分为4个阶段,用数字1至4表示:1-初始结构的优化,2-对优化后结构进行微扰和缩放,3-对2的结构进行AIMD,4-收集AIMD数据。可将任意阶段组合,如[1,2,3,4]或[2,3]等。
2.cell_type:晶体结构类型,目前仅支持:fcc, hcp, bcc, sc, diamond 5种。可删掉,dpgen init_bulk 通过 from_poscar 和 from_poscar_path获得结构信息。
3.super_cell:向xyz方向扩胞,[1, 1, 1]表示不扩胞。
4.elements:元素,与POSCAR文件一一对应
5.from_poscar:是否使用给定的POSCAR文件作为弛豫的初始结构。如果为False,需设置cell_type和latt参数确定结构信息。
6.from_poscar_path:VASP的POSCAR文件的路径。如果 from_poscar 为 true,则必需。
7.potcars:POTCAR文件的路径。
8.relax_incar:VASP中弛豫的INCAR文件的路径。如果包括阶段1,则必需。
9.md_incar:VASP中AIMD的INCAR文件的路径。如果包括阶段3,则必需。
10.scale:保持各向同性时的等比例缩放因子,[1.00]默认不缩放。
11.skip_relax:如果为 true,则直接使用未弛豫的POSCAR文件进行阶段2(微扰和缩放)
12.pert_numb:POSCAR文件的扰动结构的数目
13.md_nstep:阶段3的AIMD步数。如果与md_incar中NSW不同,则遵循NSW。
14.pert_box:盒子尺寸的扰动,从均匀分布 [-pert_box, pert_box] 中随机采样。
15.pert_atom:原子坐标的扰动,单位埃,从均匀分布 [-pert_atom, pert_atom] 中随机采样。
16.coll_ndata:最大数据收集量。
17._comment:注释信息。
2.run 过程
- 运行命令:dpgen run param.json machine.json
- param.json文件
{ "type_map": ["H","C"], "mass_map": [1,12], "init_data_prefix": "../", "init_data_sys": ["init/CH4.POSCAR.01x01x01/02.md/sys-0004-0001/deepmd"], "sys_configs_prefix": "../", "sys_configs": [ ["init/CH4.POSCAR.01x01x01/01.scale_pert/sys-0004-0001/scale-1.000/00000*/POSCAR"], ["init/CH4.POSCAR.01x01x01/01.scale_pert/sys-0004-0001/scale-1.000/00001*/POSCAR"] ], "_comment": " that's all ", "numb_models": 4, "default_training_param": { "model": { "type_map": ["H","C"], "descriptor": { "type": "se_e2_a", "sel": [16,4], "rcut_smth": 0.5, "rcut": 5.0, "neuron": [120,120,120], "resnet_dt": true, "axis_neuron": 12, "seed": 1 }, "fitting_net": { "neuron": [25,50,100], "resnet_dt": false, "seed": 1 } }, "learning_rate": { "type": "exp", "start_lr": 0.001, "decay_steps": 5000 }, "loss": { "start_pref_e": 0.02, "limit_pref_e": 2, "start_pref_f": 1000, "limit_pref_f": 1, "start_pref_v": 0.0, "limit_pref_v": 0.0 }, "training": { "stop_batch": 2000, "disp_file": "lcurve.out", "disp_freq": 1000, "numb_test": 4, "save_freq": 1000, "save_ckpt": "model.ckpt", "disp_training": true, "time_training": true, "profiling": false, "profiling_file": "timeline.json", "_comment": "that's all" } }, "model_devi_dt": 0.002, "model_devi_skip": 0, "model_devi_f_trust_lo": 0.05, "model_devi_f_trust_hi": 0.15, "model_devi_clean_traj": true, "model_devi_jobs": [ {"sys_idx": [0],"temps": [100],"press": [1.0],"trj_freq": 10,"nsteps": 300,"ensemble": "nvt","_idx": "00"}, {"sys_idx": [1],"temps": [100],"press": [1.0],"trj_freq": 10,"nsteps": 3000,"ensemble": "nvt","_idx": "01"} ], "fp_style": "vasp", "shuffle_poscar": false, "fp_task_max": 20, "fp_task_min": 5, "fp_pp_path": "./", "fp_pp_files": ["POTCAR_H","POTCAR_C"], "fp_incar": "./INCAR_methane" }
- I 基础参数设置:
1.type_map,mass_map:原子类型、相对原子质量,两者与type.raw文件一一对应。
2.init_data_prefix,init_data_sys:训练模型初始数据的位置,prefix为路径前缀。
3.sys_configs_prefix,sys_configs:分子动力学模拟和计算model deviation的结构位置,prefix为路径前缀。
4.numb_models:训练模型的数量,推荐4个。 - II Deepmd-kit参数设置(default_training_param):
1.描述符(descriptor)与拟合网络(fitting_net)设置:
type:se_e2_a,根据原子构型的所有信息(角度和径向)构建模型,将原子间距离作为输入。
sel:截止半径内的最大邻居量,sel[i]表示类型i的邻居的最大邻居数。
rcut_smth,rcut:模型的平滑起始距离,截止距离。
neuron:每个隐藏层的神经元数量,从输入到输出。
resnet_dt:如果为 true,在ResNet加入时间步长。
axis_neuron:嵌入矩阵的子矩阵大小。
seed:随机种子,用于初始化模型参数。
2.descriptor:将原子构型映射成一组对称不变性的描述符。
fitting_net:描述符为输入,预测目标的物理属性的神经网络。
3.学习率(learning_rate)设置:
start_lr:训练初始学习率。
decay_steps:学习率衰减步数。
4.损失函数(loss)设置:
start_pref_e:训练开始时能量损失的前因子,大于等于0。如果start_pref_e和limit_pref_e均为0,则忽略能量损失。
limit_pref_e:训练极限时能量损失的前因子,大于等于0。
start_pref_f:训练开始时力损失的前因子,大于等于0。如果start_pref_f和limit_pref_f均为0,则忽略力损失。
limit_pref_f:训练极限时力损失的前因子,大于等于0。
start_pref_v:训练开始时维里损失的前因子,大于等于0。如果start_pref_v和limit_pref_v均为0,则忽略维里损失。
limit_pref_v:训练极限时维里损失的前因子,大于等于0。
5.训练(training)设置:
stop_batch/numb_steps::训练的停止批次或步数。
disp_file": 保存学习曲线的文件路径。
disp_freq":输出学习曲线的频率。
numb_test": 4,
save_freq:保存检查点的频率,检查点是指在训练过程中定期保存的模型参数快照。
save_ckpt:检查点文件的保存路径。
disp_training:是否输出训练的详细信息。
time_training:是否记录训练时间。
profiling:是否记录训练中的性能分析数据。
profiling_file:性能分析数据保存文件路径。 - III LAMMPS相关设置:
model_devi_dt:MD 的时间步长,建议为0.002,单位ps。
model_devi_skip:MD 中跳过的fp(First Principles)结构数。
model_devi_f_trust_lo:选取结构的力偏差最小值。
model_devi_f_trust_hi:选取结构的力偏差最大值,最大值一般为最小值的3、4倍。
model_devi_clean_traj:是否清理 MD 中的 traj(轨迹)文件夹。
model_devi_jobs:
sys_idx:MD初始结构的系统ID,该ID与 sys_configs 一一对应。
temps:MD模拟的温度(K)。
press:在npt系综下,MD模拟的压力(Bar)。
trj_freq:保存MD轨迹的频率。
nsteps:MD模拟的步数,逐轮增大步数。
ensemble:系综设置(nvt/npt)。
_idx:注释id。 - IIII VASP相关设置:
fp_style:第一性原理计算软件类型。
shuffle_poscar:模拟前是否每帧打乱原子。
fp_task_max:每次迭代计算的最多结构数。
fp_task_min:每次迭代计算的最少结构数,低于此数值将直接进行下次迭代。
fp_pp_path:赝势文件的路径。
fp_pp_files:赝势文件名,与type_map一一对应。
fp_incar:INCAR文件。
3.machine.json文件
{
"api_version": "1.0",
"deepmd_version": "2.2.10",
"train" :[
{
"command": "dp",
"machine": {
"batch_type": "Shell",
"context_type": "local",
"local_root" : "./",
"remote_root": "/home/ecust/lws"
},
"resources": {
"number_node": 1,
"cpu_per_node": 4,
"gpu_per_node": 1,
"group_size": 1
}
}
],
"model_devi":[
{
"command": "mpirun -n 4 lmp_mpi -i input.lammps",
"machine": {
"batch_type": "Shell",
"context_type": "local",
"local_root" : "./",
"remote_root": "/home/ecust/lws"
},
"resources": {
"number_node": 1,
"cpu_per_node": 4,
"gpu_per_node": 1,
"group_size": 5
}
}
],
"fp":[
{
"command": "mpirun -n 4 vasp_std",
"machine": {
"batch_type": "Shell",
"context_type": "local",
"local_root" : "./",
"remote_root": "./"
},
"resources": {
"number_node": 1,
"cpu_per_node": 4,
"gpu_per_node": 1,
"group_size": 125
}
}
]
}
- api_version:api版本,1.0
- deepmd_version:DeePMD-kit版本
- train/model_devi/fp设置:
1.command:提交任务的命令。
2.batch_type:批处理作业系统类型,PBS(PBS队列)、Slurm(Slurm队列)、LSF(LSF队列)、Shell(无队列系统,直接用shell运行任务)。
3.context_type:远程机器连接类型,local(通过本地文件存储系统拷贝传输)、ssh(通过ssh和远程服务器通信上传和下载数据)。
4.local_root:本地运行任务的目录,推荐设置为“./”。
5.remote_root:远程计算机上运行任务的目录,如果本地运行则写本地任务的运行目录。
6.number_node:每个作业需要的节点数。
7.cpu_per_node:分配给每个作业的每个节点的 cpu 数。
8.gpu_per_node:分配给每个作业的每个节点的 gpu 数。
9.group_size:作业中的任务数量,把多少任务放到一个提交脚本里, 0 表示无穷大。
参考文献:Wen T, Zhang L, Wang H, et al. Deep potentials for materials science[J]. Materials Futures, 2022, 1(2): 022601.