Skip to main content
Version: 1.0

Bulk Cu system

下文将以 Cu 系统为例,介绍如何使用 PWMLFF Deep Potential Model 进行训练及 lammps 模拟。

整个过程分为以下几个步骤:

1. 产生数据集

以 PWmat AIMD 模拟得到的 Cu 数据为例,数据文件为MOVEMENT,包含 1000 个结构,每个结构包含 72 个 Cu 原子。

etot.input输入文件示例:

8  1
JOB = MD
MD_DETAIL = 2 1000 1 300 300
XCFUNCTIONAL = PBE
ECUT = 60
ECUT2 = 240
MP_N123 = 2 2 3 0 0 0 3
ENERGY_DECOMP = T
IN.ATOM = atom.config
IN.PSP1 = Cu.SG15.PBE.UPF
OUT.STRESS = T
  • 必选项ENERGY_DECOMP:把总 DFT 能量分解为属于每个原子的能量(原子能量)。结果输出在MOVEMENT文件中。
  • 可选项OUT.STRESS:是否输出应力信息,如需训练Virial,则需要将其设置为T
  • 其他参数含义参考PWmat manual

2. 训练力场

2.1 准备数据集

新建目录PWdata,将MOVEMENT文件复制到该目录中。

tip

如果有多个MOVEMENT文件,需要在PWdata目录下分别新建目录(名称任意),并将 MOVEMENT 文件分别放入其中。每个目录只能放一个MOVEMENT

2.2 输入文件

PWdata同级目录下,新建main.py文件,执行该文件提取特征并训练力场。

输入文件示例:

from PWMLFF.dp_network import dp_network

if __name__ == "__main__":

atom_type = [29]

"""
command line option:
python main.py --gpu 0 -b 10 --opt LKF --epochs 20 -s record
"""

dp_trainer = dp_network(
atom_type = atom_type,
optimizer = "LKF",
gpu_id = 0,
session_dir = "record",
n_epoch = 20,
batch_size = 10,
max_neigh_num = 100,
Rmax = 6.0,
Rmin = 0.5,
M2 = 16,
block_size= 10240,
is_resume = False,
# model_name = 'checkpoint.pth.tar',
pre_fac_force = 1.,
pre_fac_etot = .5,
embedding_net_size = [25, 25, 25],
fitting_net_size = [50, 50, 50, 1],
)
# pre-process trianing data. ONLY NEED TO BE DONE ONCE
dp_trainer.generate_data()

# load data and train
dp_trainer.load_and_train()

dp_trainer.extract_force_field("1.ff")

  • atom_type:原子类型,Cu 的原子序数为 29。多个元素时,统一设置为MOVEMENT中的原子排序。
  • optimizer:优化器,推荐使用LKFADAM。默认为ADAM,此时建议使用更多的 epoch,如 1000。通常情况下,对于大体系大网络,使用LKF优化器可以加速训练。
  • gpu_id:使用的 GPU 编号,目前仅支持单 GPU 训练。
  • session_dir:训练过程中的记录文件保存目录。具体文件说明见下文。
  • n_epoch:训练迭代次数。根据MOVEMENT总的 images 数量修改,images 少时可适当增加,如 50。
  • batch_size:用于产生特征的数据大小。如 1, 2, 5, 10。
  • max_neigh_num:最大近邻原子数。
  • Rmax:DP 平滑函数最大截断半径。
  • Rmin:DP 平滑函数最小截断半径。
  • M2:DP 模型网络参数。决定 embedding net 输出尺寸(25*16), fitting net 输入尺寸(400)。
  • block_size:KF 优化器参数。保持默认即可。
  • is_resume:是否从上次训练中断/完成处继续训练。
  • model_name:模型名称,结合is_resume用于继续训练。
  • pre_fac_force:用于 KF 训练时的更新力的缩放因子。
  • pre_fac_etot:用于 KF 训练时的更新总能的缩放因子。
  • embedding_net_size:embedding net 网络结构。保持默认即可。
  • fitting_net_size:fitting net 网络结构。保持默认即可。
tip

以下三个函数可根据实际使用情况选择执行:

  • dp_trainer.generate_data() - 用于产生特征,仅需运行一次。例如需要重新训练,修改相应的设置后,只需注释掉该行再次执行程序即可。
  • dp_trainer.load_and_train() - 用于加载特征,对特征进行处理后训练力场。
  • dp_trainer.extract_force_field("1.ff") - 用于提取力场,并生成1.ff文件。可自行修改文件名。

2.3 运行

以下适用于 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

python main.py > log

交互式运行:

$ srun -p 3090 --pty /bin/bash
$ python main.py

在训练期间,可以通过检查指定的目录中(/record)的日志来查看训练情况。

该目录下存在以下四个文件:

  • best.pth.tarcheckpoint.pth.tar 为模型文件,用于继续训练。分别对应于最佳模型和最后一次训练的模型。
  • epoch_train.datepoch_valid.dat 日志文件中包含每个 epoch 的训练误差和验证误差。
epoch_train.dat&epoch_valid.dat

  • loss 对应训练总误差
  • RMSE_Etot_per_atom 对应训练能量误差,建议达到 ~103eV/atom10^{-3} eV/atom 数量级
  • RMSE_F 对应训练力误差, 建议达到 ~102eV/A˚10^{-2} eV/\text{\AA} 数量级
如果训练集的误差比验证集的误差明显偏小,表明训练过拟合,可适当增加训练集的大小或调整 batch_size 的数量。

3. Lammps 模拟

将训练完成后生成的*.ff力场文件用于 lammps 模拟。(需使用经过修改的版本重新编译)

为了使用 PWMLFF 生成的力场文件,需要在 lammps 的输入文件中设置以下内容:

pair_style      pwmatmlff
pair_coeff * * 5 1 ./1.ff 29

其中5表示使用 DP 模型产生的力场,1表示读取 1 个力场文件,1.ff为 PWMLFF 生成的力场文件名称,29为 Cu 的原子序数。

如果有多个力场文件(如主动学习时),(例如 4 个)可以修改为:

pair_style      pwmatmlff
pair_coeff * * 5 4 ./1.ff ./2.ff ./3.ff ./4.ff 29