
DP-GEN 使用入门
简介
Deep Potential Generator (DP-GEN) 是一个将神经网络势能(machine learning potential)和主动学习(active learing)结合起来的工作流。该包主要由张林峰(普林斯顿大学),王涵(北京应用物理与计算数学研究所)开发。如有问题,可以向他们询问。使用DP-GEN之前,应尽量掌握DeepMD-kit、VASP、LAMMPS等软件的使用或拥有一定了解。以下为参考信息:
DP-GEN的工作流是由以下三步组成的循环:
- 训练:DeePMD-kit同时训练多条(一般是4条)参数初始化不同的势函数(GPU)。
- 采样和筛选:基于训练得到的势函数和指定的初始结构利用LAMMPS进行classical MD,扩展构型空间。然后对MD中得到的构型依照特定指标(对某个构型用不同的势函数预测所得的原子力的标准差)进行筛选(GPU)。
- 标记:将筛选所得的构型进行DFTMD单点能计算,得到力和能量,加入训练集进行新一轮的训练(51或52)。
安装
通过下列命令可以下载dpgen源码
然后可通过下列命令进行安装
pip install通过这个命令,dpgen被安装在
$HOME/.local/bin/dpgen目录下
. 更新环境变量以使用dpgen通过下列命令查看是否安装成功
输入文件
为了使dpgen运行起来,我们需要准备如下的文件:
param.json
三步计算中所用的参数,具体指神经网络训练的参数,lammps中MD的参数和DFTMD计算单点能的参数。
machine.json
制定上述三个步骤分别在哪个服务器计算。
注:machine.json
只指定计算执行的地址,计算生成的数据存储在param.json
和machine.json
所在文件夹下,计算所需的训练集和结构文件在param.json
中指定路径(位于dpgen run
命令所在服务服务器上)。初始训练集数据
放在提交dpgen所在的服务器(E.T.Lab集群)上,用于训练势函数,参照DeePMD-kit中方法生
MD采样的初始结构
放在提交dpgen所在的服务器(E.T.Lab集群)上,一般由POSCAR转换而来,可通过dpgen init生成。
此外,使用VASP进行标记过程时,还需要在文件夹中准备INCAR文件,POTCAR文件,KPOINTS通过在INCAR中的参数进行指定。
输出文件
在提交dpgen的文件夹下会出现以下输出文件,用于指示任务运行的状况:
dpgen.log
包括了运行轮数,单个任务提交的情况,采样准确度等详细的信息。
record.dpgen
由多行
x y
组成,记录任务进程。其中x
为运行的轮数(iteration),从0开始;y
取0-8,其中0-2指代训练,3-5指代采样和筛选,6-8指代标记。dpgen通过读取这个文件来决定从哪里重启计算,所以我们可以通过手动修改这个文件来决定重启的点。例如,在第
x
轮中我们发现采样的准确度过低,需要增加初始结构的数量重新跑MD,我们就可以把record.dpgen
文件在x 2
之后的内容删除,重新提交dpgen任务。nohup.out
这个并不是必要输出,但是建议使用nohup命令把dpgen挂在后台运行。这个文件中输出的信息和
dpgen.log
的基本一致。
例子
下面进行分段讲解,实际运行时,所有段落包含在同一个文件param.json中- 基本参数设置
{"type_map": ["O", "H", "Pt"],"mass_map": [15.999, 1.0079, 195.08],"_comment": " atoms in your systems ","init_data_prefix": "/data/kmr/edl/pzc/hydroxide/ml_potential/pt-oh","init_data_sys": ["init/system-000","init/system-001"],"_comment": " path of training set ","init_batch_size": [1,1],"sys_configs": [["/data/kmr/edl/pzc/hydroxide/ml_potential/pt-oh/init/configs/POSCAR_0[0-9]"], ["/data/kmr/edl/pzc/hydroxide/ml_potential/pt-oh/init/configs/POSCAR_1[0-9]"]],"_comment": " path of initial structure for sampling ","sys_batch_size": [1,1],......}type_map顺序要严格对应训练集的type_map顺序,后文的各项涉及元素相关设置顺序都应保持一致,如POTCAR。- 势函数训练(DPMD)
{......"numb_models": 4,"_comment": " number of NNP for model deviation ","train_param": "input.json","_comment": " name of automatically generated input file for DPMD ","default_training_param": {"model": {"descriptor": {"type": "se_e2_a","_comment": "could be bigger than the number of atoms of the very element","sel": [68, 136, 64],"rcut_smth": 0.50,"rcut": 5.00,"neuron": [25, 50, 100],"resnet_dt": false,"axis_neuron": 16,"seed": 1},"fitting_net": {"n_neuron": [240, 240, 240],"resnet_dt": true,"seed": 1}},"learning_rate": {"type": "exp","start_lr": 0.005,"decay_steps": 2000,"_comment": "last 20000 or 400000","decay_rate": 0.95},"loss": {"start_pref_e": 0.02,"limit_pref_e": 1,"start_pref_f": 1000,"limit_pref_f": 1,"start_pref_v": 0,"limit_pref_v": 0 },"training": {"systems": [ ],"set_prefix": "set","stop_batch": 400000,"batch_size": 1,"seed": 1,"disp_file": "lcurve.out","disp_freq": 100,"numb_test": 4,"save_freq": 1000,"save_ckpt": "model.ckpt","load_ckpt": "model.ckpt","disp_training": true,"time_training": true,"profiling": false,"profiling_file": "timeline.json"}},"_comment": "modify according your systems!",......}- 采样和筛选(Lammps)
{"model_devi_dt": 0.0005,"_comment": "model_devi_dt: Timesteps for MD. Consistent with DFTMD!","model_devi_skip": 0,"_comment": "model_devi_skip: the first x frames of the recorded frames","model_devi_f_trust_lo": 0.075,"model_devi_f_trust_hi": 0.10,"_comment": "modify according to the error distribution of system","model_devi_e_trust_lo": 1e10,"model_devi_e_trust_hi": 1e10,"model_devi_clean_traj": false,"model_devi_jobs": [{"sys_idx": [0,1],"temps": [300,400],"press": [1.0],"trj_freq": 30,"nsteps": 300,"ensemble": "nvt","_idx": "00"},{"sys_idx": [0,1],"temps": [300,400],"press": [0.98,1.0,1.02],"trj_freq": 100,"nsteps": 300,"ensemble": "npt","_idx": "01"}],"_comment": "sys_idx should correspond to sys_configs in the beginning","_comment": "add the _idx step by step","_comment": "modify nsteps and sys_idx based on model deviation accuracy",......}- 标记(计算单点能,此处以VASP为例)
"_comment": "02.fp",
"fp_style": "vasp",
"shuffle_poscar": false,
"fp_task_max": 1000,
"fp_task_min": 8,
"fp_pp_path": "./",
"fp_pp_files": ["POTCAR_Ga","POTCAR_N"],
"fp_incar": "INCAR"INCAR文件例子
#给计算体系起名字,可以随便写
SYSTEM=example#此标记确定将写入文件 OUTCAR(“详细标记”)的量。
NWRITE = 2
#继续作业:“以恒定的能量切断重新启动”。轨道是从WAVECAR文件中读取的(在并行版本中的使用受到限制)。如果缺少 WAVECAR 文件,或者如果 WAVECAR 文件包含不适当的波段数和/或 k 点,则标志 ISTART 将恢复为 ISTART=0(见上文)。
ISTART=0
#从 CHGCAR 文件中读取电荷密度,并使用原子电荷密度的线性组合从旧位置(在 CHGCAR 上)推断到新位置。
ICHARG=0
#平面波截断能,默认:ENCUT = largest ENMAX on the POTCAR file
ENCUT=600
#使用更有效的存储器来保存电荷密度的对称性(与 ISYM=1 相比)。这减少了内存需求,特别是对于并行版本。
ISYM=2
#电子最优化的算法,即决定求解能量本征值的算法。默认:ALGO=Normal,即使用blocked Davidson迭代法,#电子迭代计算波函数时使用的算法,Normal->IALGO=38 , Very_Fast->IALGO=48 , Fast->初相使用38,之后使用48
ALGO=Normal
#控制计算精度的参数,在一般计算中,默认选择PREC=Normal或者Medium,但如果需要提高计算精度时,如声子计算,建议设置PREC=Accurate
PREC=Accurate
#建议在做高精度计算时,设置LREAL=.FALSE.,否则在超过20个原子系统中可设置LREAL=Auto
LREAL=Auto
#Electronic steps
#NELM 设置电子 SC(自洽)步骤的最大数量。
NELM=60
#NELMIN 指定电子自洽步骤的最小数量。
NELMIN=8
#控制自洽优化优化收敛的能量标准,默认值:1E-4 eV
EDIFF=1E-6#Ionic steps
NSW=0
#ISIF确定是否计算应力张量,以及允许哪些主自由度在弛豫和分子动力学运行中发生变化。
ISIF=0
#离子位置优化算法,如果NSW=0/1,则默认值为1,否则为0,可赋予值-1,0,1,2,3,5
IBRION=-1DOS related values:
#SIGMA的取值和ISMEAR息息相关,也就是和ISMEAR这个参数同时出现,设定
#建议:金属 ISMEAR=1或者2;SIGMA=0.2左右。绝缘体或半导体ISMEAR=0;SIGMA=0.05左右。分子计算:ISMEAR=0;SIGMA=0.01。计算态密度时使用ISMEAR=-5,同时不设置SIGMA
ISMEAR=0;SIGMA=0.05
#确定是否输入波函数
LWAVE=.FALSE.
#确定是否输入电荷密度
LCHARG=.FALSE.
#ADDGRID 确定是否使用额外的支持网格来评估增强费用。
ADDGRID=.TRUE.
#将NPAR值设为你计算节点核数的平方根
NPAR=2
KSPACING=0.300000
KGAMMA=.FALSE.针对E.T.Lab的
machine.json
示例{
"train": [
{
"machine": {
"batch": "pbs",
"work_path": "./dp"
},
"resources": {
"numb_node": 7,
"task_per_node": 1,
"with_mpi": true,
"numb_gpu": 0,
"partition": "gpu"
},
"command": "dp",
"group_size": 1
}
],
"model_devi": [
{
"machine": {
"batch": "pbs",
"work_path": "./lmp"
},
"resources": {
"numb_node": 7,
"task_per_node":1,
"with_mpi": true,
"numb_gpu": 0,
"partition": "gpu"
},
"command": "lmp",
"group_size": 250
}
],
"fp": [
{
"machine": {
"batch": "pbs",
"work_path": "./fp"
},
"resources": {
"task_per_node": 24,
"with_mpi": true,
"partition": "fast",
"numb_node": 8
},
"command": "vasp610",
"group_size": 250
}
]
}为了使用上述
machine.json文件,需修改dpgen源码,以达到通过
"numb_node"控制提交任务的节点,来使用gpu节点(007,008)来加速训练。操作如下,首先找到~/.local/lib/python3.9/site-packages/dpgen/dispatcher目录下的文件PBS.py文件,找到def sub_script_head(self, res):
section,通过修改该部分中类似的位置
if res['numb_gpu'] == 0:
ret += '#PBS -l nodes=node00%d:ppn=%d\n' % (res['numb_node'], res['task_per_node'])
else :
ret += '#PBS -l nodes=node00%d:ppn=%d:gpus=%d\n' % (res['numb_node'], res['task_per_node'], res['numb_gpu'])来达到指定节点的目的,在
ret += '#PBS -l walltime=%s\n' % (res['time_limit'])
前加入#号,取消任务的时间限制,在
def sub_script_cmd(self,
cmd,
arg,
res) :section,将该部分中类似的位置修改为
if res['with_mpi']:
ret = 'mpirun -machinefile $PBS_NODEFILE -n %d %s %s' % (
res['task_per_node'], cmd, arg)即可通过task_per_node指定调用的cpu核数。以此使用上述的
machine.json文件。
由于参数过多,上述输入文件相关参数具体内容可查看deepmodeling/dpgen: The deep potential generator (github.com)
准备好输入文件后,可用
dpgen run param.json machine.json
运行dpgen主程序。使用
nohup dpgen run param.json machine.json 1>log 2>&1 &
命令可使进程在后台运行,同时将运行的过程信息和报错信息输出在log文件中。使用
ps -aux|grep 用户名/deepmd
可检索在后台运行的dpgen进程。
初始训练集的生成
初始训练集可使用dpgen init功能生成,其主要输入文件类似于run主程序,例子:
{
"stages" : [1,2,3,4],
"cell_type": "hcp",
"latt": 5.482,
"from_poscar": true,
"from_poscar_path": "./POSCAR",
"super_cell": [2, 2, 1],
"elements": ["Ga","N"],
"potcars": ["./POTCAR_Ga","./POTCAR_N"],
"relax_incar": "./INCAR.rlx",
"md_incar" : "./INCAR.md",
"scale": [0.980,1.00,1.020],
"skip_relax": true,
"pert_numb": 10,
"md_nstep" : 10,
"pert_box": 0.02,
"pert_atom": 0.01,
"coll_ndata": 2000,
"type_map" : [ "Ga","N"],
"_comment": "that's all"
}各参数的主要内容见deepmodeling/dpgen: The deep potential generator (github.com)
训练集收集
DP-GEN代码迭代生成的训练集是分散储存的。可以用DP-GEN自带的collect函数进行数据收集。首先可以使用
dpgen collect -h
查看使用说明。常用用法是dpgen collect JOB_DIR OUTPUT_DIR -p param.json
JOB_DIR就是DP-GEN的输出目录,包含有
iter.0000*
一系列的目录。OUTPUT_DIR就是收集的数据准备放到哪。param.json就是运行DP-GEN跑的param文件。例如:dpgen collect ./ ./collect -p param-ruo2.json
以上命令会把当前文件夹的DP-GEN数据收集好放入collect目录里。
init.000 init.001 sys.000 sys.001
init.*
是初始训练集,sys.*
是后来DP-GEN生成的训练集,按照param的sys分类。