Molecure Ethylene carbonate system
下文将以 C3H4O3 孤立体系为例,介绍如何使用 PWMLFF Neural Network Model 进行训练,以及如何使用训练好的模型进行预测。该例位于源码/example/EC
整个程序运行逻辑大致分为:
1. 产生数据集
以 PWmat AIMD 模拟得到的 C3H4O3 数据为例,数据文件为MOVEMENT
,包含 200 个结构,每个结构包含 10 个原子。
etot.input输入文件示例:
8 1
JOB = MD
MD_DETAIL = 2 200 1 400 400
XCFUNCTIONAL = PBE
Ecut = 60
ECUT2 = 240
MP_N123 = 1 1 1 0 0 0 3
ENERGY_DECOMP = T
OUT.STRESS = F
IN.ATOM = atom.config
IN.PSP1 = C.SG15.PBE.UPF
IN.PSP2 = H.SG15.PBE.UPF
IN.PSP3 = O.SG15.PBE.UPF
- 可选项
ENERGY_DECOMP
:是否将总 DFT 能量分解为属于每个原子的能量(原子能量)。结果输出在MOVEMENT
文件中。如需使用或训练原子能量,需要将其设置为T
。 - 可选项
OUT.STRESS
:是否输出应力信息,如需训练Virial
,则需要将其设置为T
。 - 其他参数含义参考PWmat manual。
2. 训练过程
2.1 提取特征
新建目录,放置MOVEMENT*
文件。或者MOVEMENT*
文件也可以放置在其他目录下,只需要通过修改输入文件*.json
中的 raw_files
参数(或者train_movement_file
,为NN 2024.5前的版本
参数) 路径进行训练。
2.2 训练输入文件
当前目录下,新建*.json
文件(如train.json
),该文件包含一系列需要传入的参数。
输入文件示例 (输入文件其他参数说明):
{
"raw_files":["./EC_MOVEMENT"],
"model_type": "NN",
"atom_type":[8,6,1]
}
raw_files
:MOVEMENT
文件存放名。可以设置同时多个文件。请根据实际情况进行修改。2024.5前的版本
该参数为train_movement_file
,新版本兼容该参数。model_type
:模型类型,现在训练所使用的模型。其他模型类型的训练及参数配置参考参数细节。atom_type
:原子类型,8, 6 和 1 分别为 O, C 和 H 的原子序数.
2.3 运行
以下 slurm 示例脚本适用于 Mcloud,提交任务时确保已经加载必要的环境和模块。
#!/bin/sh
#SBATCH --partition=3080ti
#SBATCH --job-name=mlff
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=1
#SBATCH --gres=gpu:1
#SBATCH --gpus-per-task=1
# mcloud 已安装环境加载
# 这里推荐
source /share/app/PWMLFF/PWMLFF2024.5/env.sh
# 或者采用以下方式分步加载
# source /share/app/anaconda3/etc/profile.d/conda.sh
# module load conda/3-2020.07
# conda deactivate
# conda activate PWMLFF
# module load pwmlff/2024.5
PWMLFF train train.json > log
交互式运行:
$ srun -p 3080ti --gres=gpu:1 --pty /bin/bash
# mcloud 已安装环境加载
$ source /share/app/PWMLFF/PWMLFF2024.5/env.sh
$ PWMLFF train train.json
产生feature与train可以单独运行:
PWMLFF gen_feat train.json
- 仅用于产生特征。PWMLFF train train.json
- 用于加载特征,对特征进行处理后开始训练。直接运行train
会自动调用gen_feat
。如果gen_feat
已经运行过,可以在.json
文件中设置train_feature_path
来指定feature所在路径,同时注释掉raw_files
(2024.5前的版本
该参数为train_movement_file
)。
程序运行后,会在程序执行目录下生成forcefield
和model_record
目录:
EC_system/
└── dir
├── forcefield
│ ├── forcefield.ff
│ ├── fread_dfeat
│ │ ├── data_scaler.txt
│ │ ├── feat.info
│ │ ├── vdw_fitB.ntype
│ │ └── Wij.txt
│ ├── input
│ │ ├── (egroup.in) # 仅对MOVEMENT中存在ATOMIC ENERGY时起作用
│ │ └── *feature.in
│ └── (output)
│ └── grid* # feature 1, 2时使用
│
└── model_record
│ ├── epoch_train.dat # 每个 epoch 的训练误差
│ ├── epoch_valid.dat # 每个 epoch 的验证误差
│ ├── iter_train.dat # 每个 batch 的训练误差
│ ├── iter_valid.dat # 每个 batch 的验证误差
│ ├── nn_model.ckpt # 模型文件
│ └── scaler.pkl # extracting scaler values of the model
loss
对应训练总误差RMSE_Etot
对应训练能量误差RMSE_F
对应训练力误差
3. 验证/测试
训练完成后,可以对模型进行验证/测试,以确定模型的拟合效果。
新建目录(如MD
),将另一个的MOVEMENT
文件复制到该目录中。同时在.json
文件中设置raw_files
(2024.5前的版本
该参数为test_movement_file
,新版本兼容该参数),test_dir_name
参数以及添加model_load_file
参数。
相关输入示例:
"raw_files":["./MD/MOVEMENT"],
"test_dir_name":"test_dir",
"model_load_file":"./model_record/nn_model.ckpt",
验证程序运行示例:
将PWMLFF train train.json中的train
修改为test
:
PWMLFF test train.json
程序运行完成后,验证结果保存在test_dir_name
设置的test_dir/
目录下
4. Lammps 模拟
将训练完成后生成的*.ff
力场文件用于 lammps 模拟。(需使用经过修改的版本重新编译)
为了使用 PWMLFF 生成的力场文件,需要在 lammps 的输入文件中设置以下内容:
pair_style pwmatmlff
pair_coeff * * 3 1 forcefield.ff 8 6 1
其中3
表示使用 Neural Network 模型产生的力场,1
表示读取 1 个力场文件,forcefield.ff
为 PWMLFF 生成的力场文件名称,8
, 6
, 1
分别为 O, C, H 的原子序数。
以下是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 * * 3 1 forcefield.ff 8 6 1
velocity all create 300 206952 dist gaussian
timestep 0.001
fix 1 all nvt temp 300 300 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
5. 输入文件其他参数说明
{
"recover_train":false,
"work_dir":"./work_train_dir",
"reserve_work_dir": false,
"raw_files":["./PWdata/MOVEMENT"],
"forcefield_name": "forcefield.ff",
"forcefield_dir": "forcefield",
"raw_files":["./MD/MOVEMENT"],
"test_dir_name":"test_dir",
"train_valid_ratio":0.8,
"model_type": "NN",
"atom_type":[8,6,1],
"feature_type":[7],
"max_neigh_num":100,
"model":{
"fitting_net": {
"network_size": [15, 15, 1]
},
"descriptor": {
"Rmax":6.0,
"Rmin":0.5,
"1":{
"numOf2bfeat": 24,
"iflag_grid": 3,
"fact_base": 0.2,
"dR1": 0.5,
"iflag_ftype": 3
},
"2":{
"numOf3bfeat1" : 3,
"numOf3bfeat2" : 3,
"iflag_grid" : 3,
"fact_base" : 0.2,
"dR1" : 0.5,
"dR2" : 0.5,
"iflag_ftype" : 3
},
"3":{
"n2b": 6,
"w": [1.0, 1.5, 2.0]
},
"4":{
"n3b": 20,
"zeta": 2.0,
"w": [0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0]
},
"5":{
"n_MTP_line":5
},
"6":{
"J":3.0,
"n_w_line":2,
"w1":[0.9, 0.1, 0.8, 0.2, 0.7, 0.3, 0.6, 0.4],
"w2":[0.1, 0.9, 0.2, 0.8, 0.3, 0.7, 0.3, 0.6]
},
"7":{
"M":25,
"M2":4,
"weight_r":1.0
},
"8": {
"M":8,
"weight_r":1.0,
"w":[1.0, 1.5, 2.0, 2.5]
}
}
},
"optimizer":{
"optimizer":"LKF",
"block_size":5120,
"kalman_lambda":0.98,
"kalman_nue":0.99870,
"nselect":24,
"groupsize":6,
"batch_size": 1,
"epochs":5,
"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
}
}
recover_train
: 是否从上次训练中断/完成处继续训练。如果为true
,读取默认model_load_path
和model_name
,程序则会从上次训练中断/完成处继续训练。见参数细节。work_dir
: 训练过程中的中间文件保存目录。训练完成后自动删除。reserve_work_dir
为true
时,训练完成后不删除该目录。raw_files
: 用于训练或者训练后验证模型的MOVEMENT
文件。(详情见验证测试部分),2024.5前的版本
该参数训练为train_movement_file
, 测试为test_movement_file
,新版本兼容该参数。可以设置同时多个文件。请根据实际情况进行修改。forcefield_name
: 生成的力场文件名称。可不设置。forcefield_dir
: 生成的力场文件存放的目录。可不设置。raw_files
: 用于训练完成后验证模型的MOVEMENT
文件。(详情见验证测试部分),2024.5前的版本
该参数为test_movement_file
,新版本兼容该参数。test_dir_name
: 训练完成后验证模型的MOVEMENT
文件的存放目录。model_type
:模型类型,现在训练所使用的模型。其他模型类型的训练及参数配置参考参数细节。atom_type
:原子类型,8, 6 和 1 分别为 O, C 和 H 的原子序数.max_neigh_num
:最大近邻原子数。model
: 模型参数,具体参数配置参考参数细节。Rmax
:特征的最大截断半径。Rmin
:特征的最小截断半径。feature_type
:特征类型,7 对应 DP-Chebyshev feature,详见特征类型optimizer
:优化器参数,推荐使用LKF
。通常情况下,对于大体系大网络,使用LKF
优化器可以加速训练。其他优化器及更多的参数配置参考参数细节。epochs
:训练迭代次数。根据MOVEMENT
总的 images 数量修改,images 少时可适当增加,如 30。