下文将以 Cu 系统为例,介绍如何使用 PWMLFF Deep Potential Model 进行训练及 lammps 模拟。
整个程序运行逻辑大致分为:
graph TD; A(PWMLFF)-->|产生数据集|AIMD; A(PWMLFF)-->|Deep Potential Model|MLFF; A(PWMLFF)-->LAMMPS; AIMD-->atom.config; AIMD-->|原子运动轨迹|MOVEMENT; MLFF-->|提取特征|generate_data; MLFF-->|力场训练|load_and_train; MLFF-->|提取力场|extract_force_field; extract_force_field-->*forcefield.ff; *forcefield.ff-->LAMMPS; LAMMPS-->|pair_style pwmatmlff|in.lammps; LAMMPS-->|pair_coeff * * 5 1 myforcefield.ff 29|in.lammps;
以 PWmat AIMD 模拟得到的 Cu 数据为例,数据文件为MOVEMENT300
, MOVEMENT1500
,各包含 100 个结构,每个结构包含 72 个 Cu 原子。
etot.input输入文件示例:
8 1 JOB = MD MD_DETAIL = 2 100 1 300 300 XCFUNCTIONAL = PBE ECUT = 60 ECUT2 = 240 MP_N123 = 2 2 3 0 0 0 3 IN.ATOM = atom.config IN.PSP1 = Cu.SG15.PBE.UPF ENERGY_DECOMP = T OUT.STRESS = F
ENERGY_DECOMP
:是否将总 DFT 能量分解为属于每个原子的能量(原子能量)。结果输出在MOVEMENT
文件中。如需使用或训练原子能量,需要将其设置为T
。OUT.STRESS
:是否输出应力信息,如需训练Virial
,则需要将其设置为T
。
新建目录,放置MOVEMENT*
文件。或者MOVEMENT*
文件也可以放置在其他目录下,只需要通过修改输入文件*.json
中的train_movement_path
路径进行训练。
当前目录下,新建*.json
文件(如dp_cu.json
),该文件包含一系列需要传入的参数。
输入文件示例 (输入文件其他参数说明):
{ "train_movement_file":["0_300_MOVEMENT", "1_500_MOVEMENT"], "model_type": "DP", "atom_type":[29] }
train_movement_file
: MOVEMENT
文件存放名。可以设置同时多个文件。请根据实际情况进行修改。model_type
:模型类型,现在训练所使用的模型。其他模型类型的训练及参数配置参考参数细节。atom_type
:原子类型,Cu 的原子序数为 29。以下 slurm 示例脚本适用于 Mcloud,提交任务时确保已经加载必要的环境和模块。
#!/bin/sh #SBATCH --partition=3090 #SBATCH --job-name=mlff #SBATCH --nodes=1 #SBATCH --ntasks-per-node=1 #SBATCH --gres=gpu:1 #SBATCH --gpus-per-task=1 PWMLFF train dp_cu.json > log
交互式运行:
$ srun -p 3090 --pty /bin/bash $ PWMLFF train dp_cu.json
产生feature与train可以单独运行:
PWMLFF gen_feat dp_cu.json
- 仅用于产生特征。PWMLFF train dp_cu.json
- 用于加载特征,对特征进行处理后开始训练。直接运行train
会自动调用gen_feat
。如果gen_feat
已经运行过,可以在.json
文件中设置train_feature_path
来指定feature所在路径,同时注释掉train_movement_file
在训练期间,可以通过检查训练模型文件存放的目录(model_record
)的日志来查看训练情况。
该目录下存在以下三个文件:
checkpoint.pth.tar
为模型文件,用于继续训练。对应于最后一次训练的模型。epoch_train.dat
和 epoch_valid.dat
日志文件中包含每个 epoch 的训练误差和验证误差。
将训练完成后生成的*.ff
力场文件用于 lammps 模拟。(需使用经过修改的版本重新编译)
为了使用 PWMLFF 生成的力场文件,需要在 lammps 的输入文件中设置以下内容:
pair_style pwmatmlff pair_coeff * * 5 1 forcefield.ff 29
其中5
表示使用 DP 模型产生的力场,1
表示读取 1 个力场文件,forcefield.ff
为 PWMLFF 生成的力场文件名称,29
为 Cu 的原子序数。
以下是lammps输入文件示例(nvt系综):
units metal boundary p p p atom_style atomic processors * * * neighbor 2.0 bin neigh_modify every 10 delay 0 check no read_data POSCAR.lmp pair_style pwmatmlff pair_coeff * * 5 1 forcefield.ff 29 velocity all create 1500 206952 dist gaussian timestep 0.001 fix 1 all nvt temp 1500 1500 0.1 thermo_style custom step pe ke etotal temp vol press thermo 1 dump 1 all custom 1 traj.xyz id type x y z vx vy vz fx fy fz run 1000
如果有多个力场文件(如主动学习时),(例如 4 个)可以修改为:
pair_style pwmatmlff pair_coeff * * 5 4 ./1.ff ./2.ff ./3.ff ./4.ff 29
{ "recover_train":false, "work_dir":"./work_train_dir", "reserve_work_dir": false, "train_movement_file":["0_300_MOVEMENT", "1_500_MOVEMENT"], "forcefield_name": "forcefield.ff", "forcefield_dir": "forcefield", "train_valid_ratio":0.8, "model_type": "DP", "atom_type":[29], "max_neigh_num":100, "seed": 1234, "model":{ "descriptor": { "Rmax":6.0, "Rmin":0.5, "M2":16, "network_size":[25, 25, 25] }, "fitting_net": { "network_size": [50, 50, 50, 1] } }, "optimizer":{ "optimizer":"LKF", "block_size":5120, "kalman_lambda":0.98, "kalman_nue":0.99870, "nselect":24, "groupsize":6, "batch_size": 4, "epochs":20, "start_epoch":1, "print_freq":10, "train_energy":true, "train_force":true, "train_ei":false, "train_virial":false, "train_egroup":false, "pre_fac_force":2.0, "pre_fac_etot":1.0, "pre_fac_ei":1.0, "pre_fac_virial":1.0, "pre_fac_egroup":0.1 } }
work_dir
: 训练过程中的中间文件保存目录。训练完成后自动删除。reserve_work_dir
为true
时,训练完成后不删除该目录。train_movement_file
: MOVEMENT
文件存放名。可以设置同时多个文件。请根据实际情况进行修改。forcefield_name
: 生成的力场文件名称。forcefield_dir
: 生成的力场文件存放的目录。train_valid_ratio
: 训练集和验证集的比例。0.8
表示训练集占80%
,验证集占20%
。model_type
:模型类型,现在训练所使用的模型。其他模型类型的训练及参数配置参考参数细节。atom_type
:原子类型,Cu 的原子序数为 29。max_neigh_num
:最大近邻原子数。seed
: 随机数种子。model
: 模型参数,具体参数配置参考参数细节。batch_size
:每批次用于训练的数据大小。如 1, 2, 5, 10。n_epoch
:训练迭代次数。根据MOVEMENT
总的 images 数量修改,images 少时可适当增加,如 50。