深度势能生成器(DP-GEN)入门讲解

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[π(rcrcs)(rjircs)]+21},0,rji<rcsrcs<rji<rcrji>rc

2.Deep Potential 模型训练

   能量: E = ∑ i E i E=\sum_{i} E_{i} E=iEi
   力: 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[RF](Ξij=k=1NRkiFki)    维里系数(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} Lpϵ,pf,pξ=pϵΔϵ2+3Npfi∣ΔFi2+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[1rl0rl(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=maxiFω,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    通过不同随机种子得到多个势函数,真实力的最大标准差总是低于预测的力偏差,因此不必在 ϵ t \epsilon_{t} ϵt很低的数据上获取DFT数据。
       基于不同的随机数训练出来的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

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.potcarsPOTCAR文件的路径。
   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):
      注:当使用原子类型嵌入(type_embedding)后,冻结(freeze)后的模型无法进行压缩(compress)操作
    1.描述符(descriptor)与拟合网络(fitting_net)设置:
           type:se_e2_a,根据原子构型的所有信息(角度和径向)构建模型,将原子间距离作为输入。
           sel:截止半径内的
    最大邻居量
    ,sel[i]表示类型i的邻居的最大邻居数。
           rcut_smth,rcut:模型的平滑起始距离截止距离。较低的rcut_smth有利于提高拟合精度。
           neuron每个隐藏层的神经元数量,从输入到输出。
           resnet_dt:如果为 true,在ResNet加入时间步长。
           axis_neuron:嵌入矩阵的子矩阵大小
           seed:随机种子,用于初始化模型参数。
    2.descriptor:将原子构型映射成一组对称不变性的描述符
        fitting_net描述符为输入预测目标的物理属性的神经网络。
    3.学习率(learning_rate)设置:
           type:学习率指数(exp)衰减
           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,则忽略力损失。推荐从低能量loss系数、高力loss系数开始。
           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":输出学习曲线的频率。
           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_incarINCAR文件

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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值