导航菜单
首页 » 问答 » 正文

快速上手深度势能预训练模型 DPA-1

背景介绍

近日,深势科技以及北京科学智能研究院研究员张铎、毕航睿等人和合作者在arXiv上预发表了名为《DPA-1: of -based Deep Model for 》的文章,通过对元素类型更优的编码以及利用关键的注意力机制,极大提高了Deep 之前版本模型的容量和迁移能力,获得了覆盖元素周期表大多常见元素的大型预训练模型。在不同数据集上的迁移学习结果表明,模型能大幅降低新场景对数据的依赖。更多细节可见微信推送和原文。DPA-1的训练和分子动力学模拟功能均已在开源社区-kit项目开源。相关工作在深势科技科学计算云平台上完成。

因为有不少老师和同学询问如何使用这个新版本的模型,所以我和 @ipro 同学合作写了这篇介绍,欢迎大家交流讨论。

参数说明

DPA-1本质上是往-kit中新加了一些功能,从形式上来看只是新增了一个描述子 ,所以只需要改几个参数就可以把之前的输入文件转换为新模型输入,对于熟悉-kit使用的小伙伴来说几乎是无感切换。新模型一个完整的水体系输入例子可以在这里看到,接下来我们仔细来看看新模型的一些输入参数。

描述子()配置

首先是新增的描述子 ,从名称上来看是在光滑版( )的基础上采用了注意力机制(),拿水的例子来说,完整的描述子输入参数如下:

"descriptor" :{
          "type":       "se_atten",
          "rcut_smth":  0.50,
          "rcut":       6.00,
          "sel":        120,
          "neuron":     [25, 50, 100],
          "axis_neuron":    16,
          "resnet_dt":  false,
          "attn":   128,
          "attn_layer": 2,
          "attn_mask":  false,
          "attn_dotr":  true,
          "seed":   1
    }

相比于之前大家常用的 描述子来说,有以下几个参数有区别:

除此以外,还新增了一些机制相关的参数:

其他参数和大家常用的“”描述子中代表的含义保持一致,大家可以参考这里来获得更详细的解释。

其他参数注意事项

对于模型的其他部分,首先DPA-1仅支持使用“ener”类型的拟合()网络,可以参考标准拟合网络的参数设置。

其次,对于DPA-1来说,会默认启用元素类型编码(type )来编码元素相关的信息,扩大模型对元素类型的容量,默认参数如下:

"type_embedding":{
            "neuron":           [2, 4, 8],
            "resnet_dt":        false,
            "seed":             1
        },

其中的参数含义和标准元素编码参数保持一致,如果想修改这些默认参数,可以把上述参数手动加到进行自定义。

DPA-1非常适用于包含多种元素的体系,尤其是有十种以上元素的体系,这时候需要手动添加每种元素编号对应的元素种类,即参数:

"type_map": [
   "Mg",
   "Al",
   "Cu"
  ]

数据格式简述

对于数据来说,DPA-1完全支持之前的-kit的数据格式,具体的格式可以见这里,下面简单对数据格式进行说明:

一个最基本的数据单元是一个,其中一般来说包含的是同一个体系在MD轨迹上的一些采样,所以一般来说,同一个里面每一帧数据的每种元素原子个数必须相等,具体来看,一个典型的是有以下的结构:

system_example
- set.000
- - coord.npy  
- - box.npy
- - energy.npy
- - force.npy
- type_map.raw
- type.raw

其中:

set.000/coord.npy是每帧原子的坐标,保存的是numpy.array的格式,shape是[, x 3],代表这个里包含的总数据帧数,指的是原子总数;

set.000/box.npy是每帧的模拟盒子坐标轴,每帧是盒子三个方向坐标轴(x, y, z)向量,所以shape是[, 3 x 3];

set.000/.npy是每帧计算得到的势能,shape是[];

set.000/force.npy是每帧每个原子计算得到的受力,shape是[, x 3];

.raw是体系中包含的元素种类,比如:

Mg
Al
Cu

type.raw指得是这个里面原子按顺序对应的元素序号,和.raw中的元素顺序相对应,比如:

0
0
1

是指这个里面共有三个原子,按顺序分别是Mg,Mg,Al。

set.000中也可以放入等其他训练标签,更详细的介绍参见这里,也可以使用将其他数据格式转换为上述标准格式。

获得上述标准格式之后,需要对所有进行划分,分别填入输入文件中对应的位置和即可。

在多元素体系中,有时候经过上述处理之后,可能会出现单帧的,不太方便扩大的场景,其实DPA-1也支持了新的合并数据格式,可以合并具有相同原子总数的不同,相关的接口将在后续中更新,欢迎大家关注使用。

测试案例

我们上传了论文中提到的三元合金的案例,可以直接体会到DPA-1在迁移能力方面的提升,大家可以在下方链接进行下载,其中包含了案例数据、输入和说明:

百度网盘; 谷歌网盘.

下面主要介绍通过源码安装和通过平台这两种使用DPA-1模型的方式。

通过源码安装方式使用

DPA-1的代码和使用说明可以在这份pull 中看到,因为还没有被合并进仓库(iPro同学加油),所以我们先使用iPro同学的仓库获取源码。

cd /some/workspace
git clone --recursive https://github.com/iProzd/deepmd-kit.git deepmd-kit
cd deepmd-kit
git checkout devel
deepmd_source_dir=`pwd`

获取正确版本的源码之后,就可以参考源码安装-kit的标准流程在自己的机器上进行安装了。

通过平台使用

是由深势科技打造的科学计算云平台,其主要的特点是开箱即用、算力充沛、开发灵活、协作便利。

我们在上准备好了DPA-1模型的镜像,并将其命名为-,因此的用户可以直接使用这个镜像,不需要自己再安装软件。

上算力资源通过系统管理,因此可以在个人笔记本或者的管理节点上下载一个lbg工具包帮助进行任务提交,lbg与Slurm调度系统中的或PBS调度系统中的qsub功能相似,但是可以向将任务提交到云端的计算资源上。

# 在有python3的环境中使用pip下载软件
pip3 install lbg -U
# 使用Bohrium的账号进行账号配置
lbg config account

下面我们要配置好计算任务的参数文件,并将其命名为job.json,其中我们在 中指定任务运行使用的镜像为"-", 在 中指定这个任务使用12CPU核92G内存的V100 GPU机器,在 中指定运行的命令(为了方便上手测试,我们将样例数据集也放在了镜像中,因此我们拷贝一下镜像中已经存好的数据集到当前路径),在 中指定运行结束后下载的文件。

如果你希望参考这篇介绍快速复现出文献结果,你可以只修改 为你自己的项目ID。

{
    "job_name": "DPA1-test",
    "image_name": "LBG_DeePMD-kit_DPA1_v1",
    "machine_type": "c12_m92_1 * NVIDIA V100",
    "platform": "ali",
    "project_id": YourProjectID, 
    "command": "cp -r /root/DPA1_example/ ./ ; cd DPA1_example/AlMgCu/se_atten_DPA1; dp train input.json; dp freeze -o DPA1.pb",
    "log_file": "DPA1_example/AlMgCu/se_atten_DPA1/lcurve.out",
    "backward_files": ["DPA1_example/AlMgCu/se_atten_DPA1/lcurve.out", "DPA1_example/AlMgCu/se_atten_DPA1/DPA1.pb"],
    "job_group_id": "",
    "disk_size": 200
}

配置好job.json参数后,使用以下的命令即可提交。

lbg job submit -i job.json -p .

如果你希望训练自己的体系,你需要准备好-kit格式的训练数据和输入文件input.json,并把输入文件放到和job.json 同一级目录下,此时你可以参考这篇文档 如何在中使用-kit 2.1.3进行计算任务。

成功提交后,可以在自己的任务界面中上查看DPA-1任务运行状态

在任务结束后,你可以使用lbg下载结果并进行分析。

lbg job download 
# 如在这个例子中把更换为 1968864

测试结果

为了对比DPA-1与模型的效果,文章中选取了//10.1088/1674-1056/ 这篇工作作为一个测试集。我们尝试使用Al, Mg, Cu单质和Al-Cu, Al-Mg, Mg-Cu的二元合金的数据进行训练,并比较两个模型在任意比例混合的Al-Mg-Cu三元合金上的预测表现。(注意单质和二元合金的数据量仅仅只占总数据量的约1/10)。

下面是提交模型的脚本,你仍然可以使用lbg job 的方式进行提交。

{
    "job_name": "se_e2_a_test",
    "image_name": "LBG_DeePMD-kit_DPA1_v1",
    "machine_type": "c12_m92_1 * NVIDIA V100",
    "platform": "ali",
    "command": "cp -r /root/DPA1_example/ ./ ; cd DPA1_example/AlMgCu/se_e2_a; dp train input.json; dp freeze -o se_e2_a.pb",
    "log_file": "DPA1_example/AlMgCu/se_e2_a/lcurve.out",
    "backward_files": ["DPA1_example/AlMgCu/se_e2_a/lcurve.out", "DPA1_example/AlMgCu/se_e2_a/se_e2_a.pb"],
    "project_id": YourProjectID, 
    "job_group_id": "",
    "disk_size": 200
}

为了节省时间,我们将镜像中的-kit输入文件中的训练步数设置为了步(实际生产中一般设置为4m以上),在一张V100卡上训练约需要40分钟。测试结果见下,可以看出在这个测试体系上,DPA-1模型的精度和收敛速度都好于模型。

使用Al, Mg, Cu单质和二元合金训练出的模型在Al-Mg-Cu三元合金上的力预测精度。红色为DPA-1模型,蓝色为模型。后续

未来我们将继续致力于势能函数自动化生产、自动化测试,也会继续关注比如多任务训练、无监督学习、模型压缩、蒸馏等操作,方便用户一键生成下游任务所需的势能函数。此外,更大更全的数据库、下游任务与dflow工作流框架的结合也是未来极具发展性的方向。

欢迎感兴趣的老师与同学测试并使用该模型,也欢迎感兴趣势能函数预训练模型开发的小伙伴与我们联系。

如果有老师与同学希望使用平台进行快速测试,也欢迎邮件@dp.tech或联系我。

评论(0)

二维码