跳到主要内容
版本:Next

Bulk Cu system

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

整个程序运行逻辑大致分为:

1. 产生数据集

以 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
  • 其他参数含义参考PWmat manual

2. 训练力场

2.1 处理数据集

工作目录下新建*.json文件(如extract.json),该文件用于调用 pwdata 对分子动力学轨迹文件进行处理,提取标签。

示例如下:

{
"valid_shuffle": true,
"train_valid_ratio": 0.8,
"raw_files": ["./MOVEMENT300", "./MOVEMENT1500"],
"format": "pwmat/movement"
}

其中:

  • valid_shuffle: 是否对全部数据进行随机打乱。例如,分子动力学步长为 10,存在 10 个 images,valid_shuffletrue 时,将对 10 个 images 进行随机打乱,然后按照 train_valid_ratio 的比例划分训练集和验证集。valid_shufflefalse 时,将按照 train_valid_ratio 的比例按顺序划分训练集和验证集。默认为 True
  • train_valid_ratio: 训练集和验证集的比例
  • raw_files: 原始数据的路径
  • format: 原始数据的格式,用于训练集的生成,所以支持的格式有 movement, outcar, cp2k/md

执行命令pwdata extract.json,将会在当前目录下生成PWdata文件夹,包含trainvalid两个子文件夹,分别存放训练集和验证集的数据。

然后需要修改力场训练输入控制文件*.json(如dp_cu.json)中的datasets_path路径,指定标签文件所在路径。(见下文)

2.2 输入文件

当前目录下,力场训练输入控制文件包含一系列需要传入的参数。

输入文件示例 (输入文件其他参数说明):

{
"raw_files": ["/Cu/PWdata/Cu72", "/Cu/PWdata/Cu72_1"],
"model_type": "DP",
"atom_type": [29]
}
  • datasets_path: 标签文件存放路径。可以设置同时多个路径,路径下包含训练集和验证集子目录。请根据实际情况进行修改。
  • model_type:模型类型,现在训练所使用的模型。其他模型类型的训练及参数配置参考参数细节
  • atom_type:原子类型,Cu 的原子序数为 29。

2.3 运行

以下 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
# mcloud 已安装环境加载
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 dp_cu.json > log

交互式运行:

$ srun -p 3090 --pty /bin/bash
# mcloud 已安装环境加载
$ 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 dp_cu.json
提示

大多数情况下,可以使用raw_files参数直接调用pwdata进行数据处理并进行训练:

这种情况下,可以跳过单独运行pwdata extract.json,直接运行PWMLFF train dp_cu.json。例如:

{
"raw_files": ["./MOVEMENT300", "./MOVEMENT1500"],
"format": "pwmat/movement",
"valid_shuffle": true,
"train_valid_ratio": 0.8,
"model_type": "DP",
"atom_type": [29]
}

在训练期间,可以通过检查训练模型文件存放的目录(model_record)的日志来查看训练情况。

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

  • dp_model.ckpt 为模型文件,可用于继续训练或提取力场。对应于最后一次训练的模型。
  • 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 的数量。

2.4 提取力场

提示

推荐使用 Libtorch 版本的力场模型,该版本的力场模型在训练完成后手动执行PWMLFF script dp_model.ckpt命令生成jit_dp_cpu.pt文件或jit_dp_gpu.pt,该文件用于 lammps 模拟。 如果您的设备包含GPU环境,执行 PWMLFF script将会生成jit_dp_gpu.pt文件,否则为jit_dp_cpu.pt

注意:jit_dp_gpu.pt只能在 GPU 环境下运行lammps;jit_dp_cpu.pt只能在 CPU 环境下运行lammps。

训练完成后,默认会在当前目录下生成forcefield文件夹,包含*.ff力场文件。该力场文件需使用该版本编译及使用可查阅之前的手册教程。

3. Lammps 模拟

将训练完成后生成的pt力场文件用于 lammps 模拟。

为了使用 PWMLFF 生成的力场文件,lammps 的输入文件示例如下:

pair_style      pwmlff 1 ../model_record/jit_dp_gpu.pt
pair_coeff * * 29

其中:

  • pair_style pwmlff 1 表示使用 PWMLFF 生成的力场文件,1表示读取 1 个力场文件, ../model_record/jit_dp_gpu.pt 为 PWMLFF 生成的力场文件,可以根据实际情况修改路径。
  • pair_coeff * * 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 lmp.init

pair_style pwmlff 1 ../model_record/jit_dp_gpu.pt
pair_coeff * * 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 #1ps
信息
  1. 使用 GPU 运行 lammps 时,执行程序为lmp_mpi_gpu; 使用 CPU 运行 lammps 时,执行程序为lmp_mpi

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

    pair_style      pwmlff 4 1.pt 2.pt 3.pt 4.pt
    pair_coeff * * 29

4. 输入文件其他参数说明

{
"recover_train": false,

"raw_files": ["0_300_MOVEMENT", "1_500_MOVEMENT"],
"format": "pwmat/movement",
"valid_shuffle": true,
"train_valid_ratio": 0.8,

"model_load_file": "./model_record/dp_model.ckpt",
"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.9987,
"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
}
}
  • recover_train: 是否从上次训练中断/完成处继续训练。如果为true,读取默认model_load_pathmodel_name,程序则会从上次训练中断/完成处继续训练。见参数细节
  • raw_files: 分子动力学轨迹文件存放路径及名称。可以设置同时多个文件。请根据实际情况进行修改。
  • train_valid_ratio: 训练集和验证集的比例。0.8表示训练集占80%,验证集占20%
  • model_load_file: 模型文件路径。则读取该路径下的模型文件,程序则会从该模型文件处继续训练/测试。见参数细节
  • model_type:模型类型,现在训练所使用的模型。其他模型类型的训练及参数配置参考参数细节
  • atom_type:原子类型,Cu 的原子序数为 29。
  • max_neigh_num:最大近邻原子数。
  • seed: 随机数种子。
  • model: 模型参数,具体参数配置参考参数细节
  • optimizer:优化器参数,推荐使用LKFADAM。通常情况下,对于大体系大网络,使用LKF优化器可以加速训练。其他优化器及更多的参数配置参考参数细节
  • batch_size:每批次用于训练的数据大小。如 1, 2, 5, 10。
  • epochs:训练迭代次数。根据总的动力学轨迹 images 数量修改,images 少时可适当增加,如 50。