新建
借助DP Combo一键丝滑生成半导体势函数
张星辰
推荐镜像 :ABACUS:3.3.2-user-guide
推荐机型 :c2_m4_cpu
赞 4
3
目录
数据集
GaN-test(v1)
借助DP Combo一键丝滑生成半导体势函数
代码
文本
©️ Copyright 2023 @ Authors
作者: 张星辰📨
日期:2023-09-17
共享协议:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
📖 上手指南
本文档可在 Bohrium Notebook 上直接运行。你可以点击界面上方按钮
开始连接,选择 abacus-user-guide:3.3.2 镜像及 c2_m4_cpu 节点配置,稍等片刻即可运行。
代码
文本
背景
- 随着机器学习势函数的实用性逐渐被重视,面向需求开发各种各样的机器学习势函数已成为科研中的重要场景。而实际场景中,受限于数据量不足,虽然通过ABACUS或DPGEN等工具可以获取丰富构象的数据集重新训练得到模型,但花费较高,人工成本也较大。DPA-1的到来提供了大规模与训练模型/势函数,使得我们根据需求稍微调整数据集就能获得一个适合应用场景的势函数。
- 考虑到操流程较为复杂但可简化,开发者设计了DP-ComboAPP,使得用户直接跳过复杂的命令行操作,直接上传数据集,选择好对应参数就能获得需要的势函数,大大降低了用户层面的技术难度。DP Combo现有的两个功能分别是Train from scratch和Finetune via training,对应于经典DP势的从头训练以及在DPA-2数据集的基础上添加少量数据训练调优两个场景。
- 本文从用户视角出发,以半导体GaN体系为示例,手把手带大家实现
- 对预训练大模型尚不熟悉的读者可以先阅读《ddd!DPA-1遇见指南 | 固态电解质实战之模型训练篇》
代码
文本
Train from scratch
- 从头训练一个DP模型。即从已有的第一性原理标注的训练数据出发,训练一个可以直接用于DeePMD生产的模型。
- 适用于已经有足够多的训练数据,可以得到精度满足要求的DP模型
- 或已有一些数据不确定够不够,尝试训一把看下精度效果
代码
文本
训练集、测试集准备说明
训练集说明
- 本案例用到的训练集来自DPA-2半导体部分的训练集。DPA-2半导体部分的训练集共包含20种半导体(Si,Ge,SiC,BAs,BN,AlN,AlP,AlAs,InP,InAs,InSb,GaN,GaP,GaAs,CdTe,InTe-In2Te3,CdSe-CdSe2,InSe-In2Se3,ZnS,CdS-CdS2)的structure-to-energy-force labels数据,这些数据由国产开源密度泛函理论软件ABACUS生成。生成数据集并用DPGEN训练势函数的教程可以参考ABACUS中文文档
APP上传数据集的说明
- 开始训练前,需要提供带标注的数据。其中训练集必须,测试集可选。
- 文件需要tgz、tar.gz或者zip格式的压缩包,直接推动到网页对应位置或点击Browse files选取。
- 数据的格式是deepmd/npy
- 目录的层级无要求,APP会递归地搜索内部的体系。
- 以GaN为案例,上传好对应的训练集和测试集后,点击Next
代码
文本
输入过程
Train Config提供了Temlate Options和Custom Options两种选项。选择Temlate Options可以无需修改json文件,直接选择对应参数。如果参数修改不满足需求,可以在Train Config栏选择Custom Options,直接修改训练json文件
模型类型当前支持se_e2_a(光滑版的DeePMD)和se_atten(DPA-1)。选用mixing_type的数据需要注意此处选取se_atten模型,不然在训练阶段不会生成graph.pb
类型映射可以选择customize(自定义),或auto(自动生成)
- 其中自动生成可以选择all_elements(使用元素周期表序),或者auto_detect(从训练数据中自动检测出现的所有元素种类),类型映射影响最终得到的模型在生产时元素种类的对应关系,例如lammps输入文件中的类型顺序需要与模型的一致
- 此外提供了若干训练参数可以修改
- 确认无误后点击Next,选择提交的工作链接可被查看的范围,之后点击Next进入最终提交界面
- 选择任务运行的项目ID,根据需要修改Job Description
- 之后点击同意条款,点击Submit即可提交任务
- 任务提交成功后显示如下
代码
文本
任务监控
- 点击My Jobs可以看到当前在运行的所有任务的运行状态及运行时间等信息
- 点击具体的任务后进入如下界面,可以看到实时文件以及实时训练曲线
代码
文本
输出结果
- 任务运行完毕后状态显示success,注册邮箱也会收到任务运行完成的提示邮件。
- 任务详情页底部有学习曲线图
- 点击workspace中的outputs文件夹,可以获得任务的输出文件
- 其中graph.pb是输出的DP模型
代码
文本
熔点性质测试
- 将获得的DP势文件接作者原来发布在Notebook案例广场的半导体熔点性质测试工作流进行简单的熔点测试
- 以我获得的GaN的DP势函数文件为例,测试得到的熔点结果为3630K
- 注:此处仅列出了扩散系数的结果。实际上判断势函数好坏还需要查看运行DPMD的log文件以及MD_Dump文件(需要借助ASE-ABACUS可视化)的物理信息以及轨迹是否合理,读者尝试使用自己的势函数前应做一些相关性质测试确保功能性。
代码
文本
Finetune via training
- 在DPA-2预训练模型上训练调优,获得的调优后的模型可以直接用于DeePMD生产的模型。
- 适用于已有的数据量不足以从头训练一个DP模型,通过在预训练模型的基础上调优获得更高的精度。
代码
文本
训练集和测试集
- 同Train from scratch
代码
文本
输入过程
- 上传数据后,需要选择一个预训练时multi-task的分支作为调优的起点,默认是随机初始化的分支,选择与训练的目标体系尽量相近的分支能使调优更容易。
- 然后可以调整调优的训练参数
- 调优之后可以是否做蒸馏或不做,蒸馏的原理是把复杂的dpa2模型蒸馏成简单的dpa1模型。由于当前调优后的模型不能直接用于大规模生产(不做蒸馏拿到的模型是dpa2,基于pytorch框架,考虑目前的性能和接口,还不能直接用于生产,如果想获得一个能用于生产的模型,就需要做蒸馏。蒸馏的过程即使用教师模型作为标注器训练一个学生模型。蒸馏可调整的参数包括Distill Config(蒸馏的迭代过程的参数)、Train Config(学生模型的训练参数)和Lammps Config(MD采样的Lammps模板)。蒸馏完成后默认还会进行模型压缩,进一步提升模型在生产中的性能。此处需要注意根据具体的体系修改LAMMPS的时间步长等对应参数。
- 后续提交等操作与前述相同。
代码
文本
任务监控
- 确认参数无误提交后,首先进行模型调优,调优结束后可以在任务详情页看到类似第一部分的学习曲线图。
- 若选择了做蒸馏,DP-Combo会提交一个工作流,可以在https://workflows.deepmodeling.com 页面查看蒸馏工作流的进度
- 蒸馏工作流基于DP-Gen2项目,可以使用DP-Gen2的命令行工具查看蒸馏状态。如果查看的话,需要本地安装dpgen2
代码
文本
[ ]
! pip install git+https://github.com/deepmodeling/dpgen2.git lbg -i https://pypi.tuna.tsinghua.edu.cn/simple
代码
文本
[ ]
import getpass
from dflow import config, s3_config
from dflow.plugins import bohrium
from dflow.plugins.bohrium import TiefblueClient
config["host"] = "https://workflows.deepmodeling.com"
config["k8s_api_server"] = "https://workflows.deepmodeling.com"
bohrium.config["username"] = getpass.getpass("Bohrium username: ")
bohrium.config["password"] = getpass.getpass("Bohrium password: ")
bohrium.config["project_id"] = getpass.getpass("Bohrium project_id: ")
s3_config["repo_key"] = "oss-bohrium"
s3_config["storage_client"] = TiefblueClient()
代码
文本
[ ]
from dflow import Workflow
from dpgen2.utils.dflow_query import get_last_scheduler
wf = Workflow(id="dpgen-k5p24") # Replace dpgen-xxxxx with your workflow ID
wf_keys = wf.query_keys_of_steps()
scheduler = get_last_scheduler(wf, wf_keys)
if scheduler is not None:
ptr_str = scheduler.print_convergence()
print(ptr_str)
else:
logging.warn("no scheduler is finished")
代码
文本
熔点性质测试结果:
- 将GaN的数据集输入给DPA-2进行finetune后得到的势函数文件接前述工作流进行测试,得到熔点在3310K
- GaN的实验熔点为1973K,仅从偏差来看,Finetune得到的模型测试熔点的误差比Train from scratch得到的熔点误差略小。
- 这个误差真的要解释不能仅从直接加热法测试得到的熔点普遍偏高出发,还要检查数据集是否正常。因此本案例仅作为DP Combo实战的案例使用,请读者不要被涉及到的数据误导。
代码
文本
结果分析
准确度对比
scratch过程的RMSE如下:
finetune过程的RMSE如下
可以看到finetune比直接train from scratch获得的模型的RMSE更小,相比之下模型精确度更高。这也与前述熔点测试的结果finetune得到的模型测试偏差略小相符。
代码
文本
已赞4
本文被以下合集收录
App related
Charmy Niu
更新于 2024-01-17
10 篇3 人关注
MD
bohr61096f
更新于 2024-08-27
47 篇0 人关注
推荐阅读
公开
"高性能跨平台临近表实现" - 算法介绍 及 Python示例yifeng_zhao
发布于 2023-09-28
1 赞2 转存文件
公开
一篇带你了解 Bohrium Notebook 的使用Hui_Zhou
发布于 2023-11-24
3 赞