查看原文
其他

【DP系列教程-04】训练数据不会搞怎么办?深度势能模型一跑就崩怎么办?

DP君 深度势能 2022-09-11

上两次推送DP君带大家回顾了如何训练,以及如何使用一个深度势能模型。掌握了这些基本技能后大家经常遇到的一个问题是,模型质量到底怎么样啊?为什么我的模型一跑模拟就崩啊??下面将为大家讲解如何鉴定以及改进模型质量。
首先大家需要明白的一点是,所有机器学习方法,包括深度势能,都只能学会我们教过它的事情。也就是说,如果我们用模型去干训练数据集之外的模拟,那么这个模型大概率是做不好的。比如我们的训练数据是300K下的一个MD模拟产生的,用这个数据集训练出来的模型去做400K的MD很可能是不准的。
然而有些时候我们很难通过直观判断预测是否在训练数据之内(比如我要用模型去做结构优化),该怎么判断模型质量呢?鉴定模型质量当然可以进行DFT计算,再将DFT结果和DP结果做对比来检验(使用dp test工具)。但是这样做需要进行昂贵的DFT计算,有时体系大了DFT也算不起了,怎么办?这时需要使用model deviation这个非常好用的工具。这个工具的想法是,我们对同一组数据,同时训练多个DP模型,每个DP模型的训练过程完全相同,唯一不同的是模型参数初始化的随机种子不同。这样,如果我们要预测数据点在数据覆盖范围,那么多个模型的预测一致,模型质量很好。如果要预测的数据点不在数据范围之内,那么由于初始化的随机种子不同,多个DP模型本质是不同的,在这个数据点上的预测也会差别很大。基于这个思想,我们就可以使用模型预测值的标准差来判断模型的预测质量。比如我要用LAMMPS跑一个分子动力学模拟,我想在模拟过程中随时通过model deviation 检验这个模型的质量,我们可以在LAMMPS的输入脚本中做如下设置:
pair_style deepmd graph_0.pb graph_1.pb graph_2.pb graph_3.pb out_file md.out out_freq 10graph_0.pb  graph_1.pb  graph_2.pb  graph_3.pb 是DP君通过不同的随机种子设置训练出来的四个模型,其中第一个模型被用来跑MD,四个模型一起来给出model deviation。model deviation 每10个MD步算一次,计算结果被输出到一个叫 md.out 的文件中。

让我们看一下这个神奇文件中都写了什么:文件的第一列是当时的MD步,按我们的设置每10步测试一次,正确。2-4列请忽略,这三列的信息已经没有用了,但由于历史原因仍然给出打印。5-7三列是我们希望看的信息:对于每个原子的受力,4个模型的预测能给出四个数值,这样我们就能对这个原子算出一个model deviation。第5列给出了所有原子model deviation 中的最大值,第6列给出了最小值,第7列给出了平均值。一般来说,第5列最大值给出的指示最为敏感,是我们判断模型是否靠谱的关键准则。当发现model deviation很大,模型预测不靠谱了该怎么办?当然是将这个构型拿出来进行DFT计算,加入到数据集中重新训练改进模型质量了。如果构型数少还好说,当有很多构型需要做第一性原理计算时,怎么看都是巨大的工作量。为了解决这个问题DP君早就为大家准备好工具了,这就是dpgen。他能够帮大家批量做MD模拟,判断model deviation,进行DFT计算,数据转换重新训练模型。大家是不是已经跃跃欲试了?首先下载dpgen代码:
git clone http://github.com/deepmodeling/dpgen.git

安装非常简单:

cd dpgenpip install.

运行dpgen 需要提供两个json 格式的配置文件,一个规定了dpgen工作流程,一个规定了dpgen使用的计算资源。一般命名为param.json和 machine.json。

DP君先带大家看一下工作流配置文件。一个例子可以在

examples/run/dp-lammps-vasp/Al/param_al_all_gpu_deepmd_kit_1.1.0.json

中找到。这个文件中的参数说明可以在官网找到,我们看一下几个关键参数。

首先是如何定义做了哪些MD模拟,相应的参数是model_devi_jobs,这是一个list,list中的每个元素是一个dict,这个dict规定了一组MD模拟。包含如下参数:

  • ensemble:做MD模拟使用的系综

  • nsteps:MD模拟步数

  • traj_freq:MD轨道上每个这个步数检查一次 model deviation

  • press MD:模拟的压强,是一个list

  • temps MD:模拟的温度,是一个list

  • sys_idx:模拟的初始构型,是一个list,list中每个元素是一个int, 对应`sys_configs`这个数组中一个元素的index。比如sys_idx: [0, 8, 16] 是用 sys_configs[0], sys_configs[8]和sys_configs[6]这三个list中定义的构型做初始构型做MD模拟。

比如sys_configs[0]中有10个构型,sys_configs[8]中有5个构型,sys_configs[16]中有5个构型,temps中有4个温度,press中有8个压强,那么这组MD一共有 (10+5+5)*4*8=640个MD模拟。是不是很自动样子。。

dpgen会帮大家运行这些MD模拟,然后根据每一帧最大的model deviation 确定哪些构型需要做DFT计算。选取准则由如下两个参数确定:

  • model_devi_f_trust_lo是model deviation的下界,小于这个值认为是准确构型,不需要DFT计算

  • model_devi_f_trust_hi是model deviation 的上界,大于这个值构型被认为非常不靠谱(比如两个原子距离过近等情况,这时DP质量很差),不会进行DFT计算。

因此只有当 model deviation 落到上下界之间,才可能会进行DFT计算,此时这个构型被称为candidate。dpgen会在这些candidate构型中随机选取不多于fp_task_max个构型,不少于fp_task_min个构型进行DFT计算。

dpgen会帮大家自动运行DFT计算。我们以vasp("fp_style": "vasp")为例,需要提供一个INCAR模板,由参数fp_incar指定;为每个元素提供一个POTCAR,由fp_pp_files这个list指定,这些POTCAR的路径由fp_pp_path指定。由于示例文件中是一个纯铝体系,我们只用在 fp_pp_files中提供铝的POTCAR就行了。VASP计算结果会被dpgen自动转换为 DeePMD-kit使用的数据格式,并由dpgen自动运行 DeePMD-kit训练任务。DeePMD-kit的训练参数由default_training_param给定,我们把某个自己设置好的DeePMD-kit输入文件中的内容抄过来就好了。用于计算model deviation的DP模型的个数由参数numb_models给出。

dpgen在做第一轮MD模拟之前,需要一组初始数据,以训练DP模型。这组初始数据由init_data_sys这个参数给出。

dpgen的计算资源机制非常灵活和强大,比如我们可以在GPU集群A上进行DeePMD-kit训练,在GPU集群B上进行MD模拟,在CPU集群C上进行VASP计算。这些都可以通过machine.json文件配置。更详细的配置方法大家可以查寻官网。这里就不做过多介绍了。


end


DP视角


强大的DP-gen不仅能给你更准确的模型,还能让你同时处理多个体系,真香!


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存